Developers

REST integrations

Integration API reference

All public integration operations, generated from the versioned narrow contract. Expand an operation for scopes and inputs, or open it preselected in the API tester.

OAuth

1 operation
POST/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
Example JSON body
{
  "client_id": "umovi_voicebot_abc123",
  "client_secret": "generated-secret-visible-only-once",
  "grant_type": "client_credentials",
  "scope": "slots:read reservations:create"
}
Open in API tester

Catalog

4 operations
GET/integrations/v1/providers/{providerId}/catalogGet booking catalog for voicebot and external booking clients

Includes timezone, the provider IANA time zone. Use it for local date selection and display; callers do not need to choose a time zone.

Authorization
catalog:read
Inputs
providerId path · required
Open in API tester
GET/integrations/v1/providers/{providerId}/catalog/employees/searchSearch active employees by name, optionally for a service
Authorization
catalog:read
Inputs
providerId path · requiredq query · requiredemployeeId queryserviceId querylimit query
Open in API tester
POST/integrations/v1/providers/{providerId}/catalog/resolveResolve spoken service and employee names into booking candidates
Authorization
catalog:read
Inputs
providerId path · required
Example JSON body
{
  "serviceName": "",
  "employeeName": "",
  "limit": 10
}
Open in API tester
GET/integrations/v1/providers/{providerId}/catalog/services/searchSearch active services by name, optionally for an employee
Authorization
catalog:read
Inputs
providerId path · requiredq query · requiredemployeeId queryserviceId querylimit query
Open in API tester

Clients

5 operations
POST/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
providerId path · required
Example JSON body
{
  "firstName": "",
  "lastName": "",
  "email": "",
  "phone": "",
  "emailNotificationsEnabled": true,
  "smsNotificationsEnabled": true,
  "marketingEnabled": false,
  "marketingConsentEvidence": {
    "method": "IN_PERSON",
    "statementVersion": "",
    "note": ""
  },
  "isReturningClientManual": false,
  "consentGiven": false,
  "sendInvite": false
}
Open in API tester
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. With clients:read, a unique match also includes the provider-scoped client profile in client. Without that scope, or for unmatched/ambiguous numbers, no profile is returned.

Authorization
clients:identify
Inputs
providerId path · required
Example JSON body
{
  "phone": "+48123456789"
}
Open in API tester
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
providerId path · requiredid path · required
Example JSON body
{
  "firstName": "",
  "lastName": "",
  "email": "",
  "phone": "",
  "emailNotificationsEnabled": false,
  "smsNotificationsEnabled": false,
  "marketingEnabled": false,
  "marketingConsentEvidence": {
    "method": "IN_PERSON",
    "statementVersion": "",
    "note": ""
  },
  "isReturningClientManual": false,
  "consentGiven": false,
  "sendInvite": false
}
Open in API tester
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
providerId path · requiredid path · required
Open in API tester

Reservations

9 operations
GET/integrations/v1/providers/{providerId}/reservationsList reservations for the authenticated provider
Authorization
reservations:read
Inputs
startsAfter querystartsBefore queryemployeeId queryserviceId queryproviderClientId querystatus querysortOrder querypage querypageSize queryproviderId path · required
Open in API tester
POST/integrations/v1/providers/{providerId}/reservationsCreate a reservation
Authorization
reservations:create
Inputs
providerId path · requiredIdempotency-Key header
Example JSON body
{
  "serviceId": "00000000-0000-4000-8000-000000000000",
  "employeeId": "00000000-0000-4000-8000-000000000000",
  "employeeSelectionMode": "SPECIFIC",
  "startsAt": "2026-05-17T10:00:00+02:00",
  "providerClientId": "00000000-0000-4000-8000-000000000000",
  "walkIn": false,
  "initialMessage": "",
  "internalNote": "",
  "source": "",
  "externalReservationId": "",
  "clientDataUseConfirmed": true
}
Open in API tester
POST/integrations/v1/providers/{providerId}/reservations/duplicate-checkCheck for a similar active reservation for one provider client

Returns only a boolean. Matches the same service and provider client within a symmetric time window, including only PENDING and CONFIRMED reservations. Caller phone recognition alone is not identity verification.

Authorization
reservations:read
Inputs
providerId path · required
Example JSON body
{
  "providerClientId": "00000000-0000-4000-8000-000000000000",
  "serviceId": "00000000-0000-4000-8000-000000000000",
  "startsAt": "2026-10-02T10:00:00+02:00",
  "windowMinutes": 1440
}
Open in API tester
GET/integrations/v1/providers/{providerId}/reservations/{reservationId}Get a single reservation
Authorization
reservations:read
Inputs
reservationId path · requiredproviderId path · required
Open in API tester
PATCH/integrations/v1/providers/{providerId}/reservations/{reservationId}Modify a reservation time or duration
Authorization
reservations:update
Inputs
reservationId path · requiredproviderId path · required
Example JSON body
{
  "startsAt": "2026-05-17T11:00:00+02:00",
  "serviceDurationMinutes": 0,
  "ignoreBuffer": false
}
Open in API tester
POST/integrations/v1/providers/{providerId}/reservations/{reservationId}/assign-clientAssign an anonymous walk-in reservation to a provider client

Requires an existing provider-scoped client. Only a reservation without any assigned client can be linked; changing an existing client is not supported.

Authorization
reservations:update
Inputs
reservationId path · requiredproviderId path · required
Example JSON body
{
  "providerClientId": "00000000-0000-4000-8000-000000000000"
}
Open in API tester
POST/integrations/v1/providers/{providerId}/reservations/{reservationId}/cancelCancel a reservation
Authorization
reservations:cancel
Inputs
reservationId path · requiredproviderId path · required
Example JSON body
{
  "reason": "Cancelled by external system"
}
Open in API tester
GET/integrations/v1/providers/{providerId}/reservations/{reservationId}/eventsList reservation lifecycle events
Authorization
reservations:history:read
Inputs
reservationId path · requiredproviderId path · required
Open in API tester
PATCH/integrations/v1/providers/{providerId}/reservations/{reservationId}/rescheduleReschedule a reservation using client-side provider policy rules
Authorization
reservations:reschedule
Inputs
reservationId path · requiredproviderId path · required
Example JSON body
{
  "startsAt": "2026-05-17T11:00:00+02:00",
  "serviceDurationMinutes": 0,
  "ignoreBuffer": false
}
Open in API tester

Slots

2 operations
GET/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
providerId path · requiredrescheduleReservationId queryserviceId query · requireddateFrom query · requireddateTo query · requiredemployeeId querytimezone querytimeFrom querytimeTo query
Open in API tester
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
providerId path · requiredserviceId query · requiredemployeeId queryinDays querytimezone querydateFrom querydateTo querydirection queryslotPreference querytimeFrom querytimeTo query
Open in API tester

Webhooks

7 operations
GET/integrations/v1/providers/{providerId}/webhooksList webhooks owned by the authenticated integration client
Authorization
webhooks:read
Inputs
providerId path · required
Open in API tester
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
providerId path · required
Example JSON body
{
  "url": "https://example.com/umovi/webhooks",
  "events": [
    "booking.created"
  ],
  "isActive": true
}
Open in API tester
PATCH/integrations/v1/providers/{providerId}/webhooks/{id}Update a webhook owned by the authenticated integration client
Authorization
webhooks:write
Inputs
providerId path · requiredid path · required
Example JSON body
{
  "url": "",
  "events": [
    "booking.created"
  ],
  "isActive": false
}
Open in API tester
DELETE/integrations/v1/providers/{providerId}/webhooks/{id}Delete a webhook owned by the authenticated integration client
Authorization
webhooks:write
Inputs
providerId path · requiredid path · required
Open in API tester
GET/integrations/v1/providers/{providerId}/webhooks/{id}/deliveriesList recent delivery attempts for a webhook
Authorization
webhooks:read
Inputs
providerId path · requiredid path · requiredlimit query
Open in API tester
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
providerId path · requiredid path · required
Open in API tester
POST/integrations/v1/providers/{providerId}/webhooks/{id}/testEnqueue a test webhook delivery
Authorization
webhooks:test
Inputs
providerId path · requiredid path · required
Open in API tester