REST integrations
Integration API reference
OAuth
1 operationPOST/integrations/oauth/tokenIssue an M2M access token (OAuth2 client_credentials)
Exchanges a `client_id` and `client_secret` for a short-lived JWT bearer token. Use the token in the `Authorization: Bearer <token>` header on Integration API endpoints.
- Authorization
- Public token endpoint
- Inputs
- No path or query parameters
{
"client_id": "umovi_voicebot_abc123",
"client_secret": "generated-secret-visible-only-once",
"grant_type": "client_credentials",
"scope": "slots:read reservations:create"
}Catalog
4 operationsGET/integrations/v1/providers/{providerId}/catalogGet booking catalog for voicebot and external booking clients
- Authorization
catalog:read- Inputs
providerIdpath · required
GET/integrations/v1/providers/{providerId}/catalog/employees/searchSearch active employees by name, optionally for a service
- Authorization
catalog:read- Inputs
providerIdpath · requiredqquery · requiredemployeeIdqueryserviceIdquerylimitquery
POST/integrations/v1/providers/{providerId}/catalog/resolveResolve spoken service and employee names into booking candidates
- Authorization
catalog:read- Inputs
providerIdpath · required
{
"serviceName": "",
"employeeName": "",
"limit": 10
}GET/integrations/v1/providers/{providerId}/catalog/services/searchSearch active services by name, optionally for an employee
- Authorization
catalog:read- Inputs
providerIdpath · requiredqquery · requiredemployeeIdqueryserviceIdquerylimitquery
Clients
5 operationsPOST/integrations/v1/providers/{providerId}/clientsCreate provider client
Creates a provider-scoped client record for external CRM and booking flows. The integration token must contain the `clients:create` scope.
- Authorization
clients:create- Inputs
providerIdpath · required
{
"firstName": "",
"lastName": "",
"email": "",
"phone": "",
"emailNotificationsEnabled": true,
"smsNotificationsEnabled": true,
"marketingEnabled": false,
"marketingConsentEvidence": {
"method": "IN_PERSON",
"statementVersion": "",
"note": ""
},
"isReturningClientManual": false,
"consentGiven": false,
"sendInvite": false
}POST/integrations/v1/providers/{providerId}/clients/identifyIdentify a provider client by an exact caller phone number
Returns a minimal, provider-scoped result for voicebot caller recognition. Caller ID is a recognition signal, not authentication, and this endpoint never returns client contact or profile data.
- Authorization
clients:identify- Inputs
providerIdpath · required
{
"phone": "+48123456789"
}GET/integrations/v1/providers/{providerId}/clients/searchSearch provider clients by name, email, or phone
Returns full provider-scoped client records for trusted CRM and provider-operated booking flows. For caller recognition use the minimal exact-phone identify endpoint. The integration token must contain the `clients:read` scope.
- Authorization
clients:read- Inputs
providerIdpath · requiredsearchquerylimitquery
PATCH/integrations/v1/providers/{providerId}/clients/{id}Update provider client
Updates a provider-scoped client record for external CRM and booking flows. The integration token must contain the `clients:update` scope.
- Authorization
clients:update- Inputs
providerIdpath · requiredidpath · required
{
"firstName": "",
"lastName": "",
"email": "",
"phone": "",
"emailNotificationsEnabled": false,
"smsNotificationsEnabled": false,
"marketingEnabled": false,
"marketingConsentEvidence": {
"method": "IN_PERSON",
"statementVersion": "",
"note": ""
},
"isReturningClientManual": false,
"consentGiven": false,
"sendInvite": false
}DELETE/integrations/v1/providers/{providerId}/clients/{id}Delete provider client
Soft-deletes a provider-scoped client record. The integration token must contain the `clients:delete` scope.
- Authorization
clients:delete- Inputs
providerIdpath · requiredidpath · required
Reservations
7 operationsGET/integrations/v1/providers/{providerId}/reservationsList reservations for the authenticated provider
- Authorization
reservations:read- Inputs
startsAfterquerystartsBeforequeryemployeeIdqueryserviceIdquerypagequerypageSizequeryproviderIdpath · required
POST/integrations/v1/providers/{providerId}/reservationsCreate a reservation
- Authorization
reservations:create- Inputs
providerIdpath · requiredIdempotency-Keyheader
{
"serviceId": "00000000-0000-4000-8000-000000000000",
"employeeId": "00000000-0000-4000-8000-000000000000",
"employeeSelectionMode": "SPECIFIC",
"startAt": "2026-05-17T10:00:00+02:00",
"startsAt": "2026-05-17T10:00:00+02:00",
"providerClientId": "00000000-0000-4000-8000-000000000000",
"internalNote": "",
"source": "",
"externalReservationId": ""
}GET/integrations/v1/providers/{providerId}/reservations/{reservationId}Get a single reservation
- Authorization
reservations:read- Inputs
reservationIdpath · requiredproviderIdpath · required
PATCH/integrations/v1/providers/{providerId}/reservations/{reservationId}Modify a reservation time or duration
- Authorization
reservations:update- Inputs
reservationIdpath · requiredproviderIdpath · required
{
"startAt": "2026-05-17T11:00:00+02:00",
"startsAt": "2026-05-17T11:00:00+02:00",
"serviceDurationMinutes": 0,
"ignoreBuffer": false
}POST/integrations/v1/providers/{providerId}/reservations/{reservationId}/cancelCancel a reservation
- Authorization
reservations:cancel- Inputs
reservationIdpath · requiredproviderIdpath · required
{
"reason": "Cancelled by external system"
}GET/integrations/v1/providers/{providerId}/reservations/{reservationId}/eventsList reservation lifecycle events
- Authorization
reservations:history:read- Inputs
reservationIdpath · requiredproviderIdpath · required
PATCH/integrations/v1/providers/{providerId}/reservations/{reservationId}/rescheduleReschedule a reservation using client-side provider policy rules
- Authorization
reservations:reschedule- Inputs
reservationIdpath · requiredproviderIdpath · required
{
"startAt": "2026-05-17T11:00:00+02:00",
"startsAt": "2026-05-17T11:00:00+02:00",
"serviceDurationMinutes": 0,
"ignoreBuffer": false
}Slots
2 operationsGET/integrations/v1/providers/{providerId}/slotsList available slots for a service in a date range
Returns slots grouped by date for the given service. The integration token must contain the `slots:read` scope and match the provider in the path.
- Authorization
slots:read- Inputs
providerIdpath · requiredserviceIdquery · requireddateFromquery · requireddateToquery · requiredemployeeIdquerytimezonequerytimeFromquerytimeToquery
GET/integrations/v1/providers/{providerId}/slots/first-availableFind the first available slot for a service
Returns the first available slot within the requested horizon. The integration token must contain the `slots:read` scope and match the provider in the path.
- Authorization
slots:read- Inputs
providerIdpath · requiredserviceIdquery · requiredemployeeIdqueryinDaysquerytimezonequerydateFromquerydateToquerydirectionqueryslotPreferencequerytimeFromquerytimeToquery
Webhooks
7 operationsGET/integrations/v1/providers/{providerId}/webhooksList webhooks owned by the authenticated integration client
- Authorization
webhooks:read- Inputs
providerIdpath · required
POST/integrations/v1/providers/{providerId}/webhooksCreate a webhook owned by the authenticated integration client
The webhook is automatically linked to the OAuth client. The signing secret is returned exactly once.
- Authorization
webhooks:write- Inputs
providerIdpath · required
{
"url": "https://example.com/umovi/webhooks",
"events": [
"booking.created"
],
"isActive": true
}PATCH/integrations/v1/providers/{providerId}/webhooks/{id}Update a webhook owned by the authenticated integration client
- Authorization
webhooks:write- Inputs
providerIdpath · requiredidpath · required
{
"url": "",
"events": [
"booking.created"
],
"isActive": false
}DELETE/integrations/v1/providers/{providerId}/webhooks/{id}Delete a webhook owned by the authenticated integration client
- Authorization
webhooks:write- Inputs
providerIdpath · requiredidpath · required
GET/integrations/v1/providers/{providerId}/webhooks/{id}/deliveriesList recent delivery attempts for a webhook
- Authorization
webhooks:read- Inputs
providerIdpath · requiredidpath · requiredlimitquery
POST/integrations/v1/providers/{providerId}/webhooks/{id}/rotate-secretRotate a webhook signing secret
Returns the replacement secret exactly once. Requires the separate `webhooks:secret:rotate` scope.
- Authorization
webhooks:secret:rotate- Inputs
providerIdpath · requiredidpath · required
POST/integrations/v1/providers/{providerId}/webhooks/{id}/testEnqueue a test webhook delivery
- Authorization
webhooks:test- Inputs
providerIdpath · requiredidpath · required