Referentie
Elk endpoint van de Schedulinq API — parameters, request bodies, antwoorden, foutmeldingen en het recht dat elk nodig heeft — gemaakt uit de API-beschrijving.
OpenAPI 3.1 · versie v1 · API-beschrijving van 4 oktober 2026
De live API levert dezelfde beschrijving op https://api.schedulinq.com/api/v1/openapi.json.
Basisadres
https://api.schedulinq.com/api/v1, alleen over HTTPS. Elk verzoek draagt een
API-sleutel in de header Authorization; zie
Authenticatie.
Conventies
- Namen zijn camelCase; id's zijn UUID's.
- Tijden zijn ISO 8601 met hun offset, in de tijdzone van je organisatie, en een afspraak
noemt ook zijn
timeZone. - Waarden van een opsomming zijn in HOOFDLETTERS.
- Een ontbrekend veld betekent "niet ingesteld". De API laat een veld weg in plaats van
nullte sturen. - Een request body met een veld dat de API niet kent, wordt geweigerd met een 400 die
het veld noemt (
errors.validation.unknownField), zodat een typfout nooit onopgemerkt blijft.
Pagina's
Lijsten worden per pagina opgehaald met een cursor:
limitbepaalt de grootte van een pagina, van 1 tot 100 (standaard 25);cursoris denextCursorvan de vorige pagina, precies zoals je hem kreeg;- een pagina antwoordt
{ "data": [...], "hasMore": true, "nextCursor": "..." }.
Pagina's staan op volgorde van aanmaken. Stop als hasMore false is.
Headers bij elk antwoord
Elk antwoord draagt X-Request-Id, en elk geauthenticeerd antwoord de drie
RateLimit-*-headers (zie Limieten). De endpoints hieronder
noemen alleen hun eigen headers.
Request-id's
Stuur je eigen X-Request-Id mee (1 tot 128 tekens uit A-Z, a-z, 0-9, ., _ en
-) om een verzoek in je eigen logs terug te vinden; anders maakt de API er een. Elke
foutmelding herhaalt hem als requestId. Noem hem als je mailt naar
support@schedulinq.com.
De beschrijvingen per endpoint zijn in het Engels, net als de API zelf. Er is hier geen console om verzoeken uit te proberen: gebruik curl, of importeer de API-beschrijving in een programma zoals Postman.
Fouten bij elk endpoint
Naast de fouten per endpoint kan elk endpoint antwoorden met:
errors.api.apiKeyExpired· 401 — This API key has expired. Ask an admin of the organisation for a new key.errors.api.apiKeyInvalid· 401 — The API key is not valid. Check that you copied the whole key.errors.api.apiKeyMissing· 401 — Send your API key in the Authorization header: Authorization: Bearer sq_live_...errors.api.apiKeyRevoked· 401 — This API key has been revoked. Ask an admin of the organisation for a new key.errors.api.insufficientScope· 403 — This API key does not have the scope this operation needs.errors.api.rateLimitExceeded· 429 — Too many requests for this API key. Wait for the number of seconds in Retry-After and try again.errors.api.tooManyFailedAuthentications· 429 — Too many failed authentications from this address. Wait for the number of seconds in Retry-After before trying again.errors.api.unexpectedError· 500 — Something went wrong on our side. Try again later; if it keeps happening, contact support with the requestId.
Users
The organisation's colleagues and the invitations they have not accepted yet.
List colleagues
GET/api/v1/users
The organisation's colleagues (active and switched off) and its open invitations, oldest first. Archived colleagues and expired, accepted or withdrawn invitations are left out.
Parameters
limitHow many to return, 1 to 100.
cursorThe nextCursor of the previous page.
Voorbeeldverzoek
curl "https://api.schedulinq.com/api/v1/users?limit=25" \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Antwoorden
200 · OK
Geeft een pagina terug van User
{
"data": [
{
"admin": false,
"calendarConnected": true,
"createdAt": "2026-10-01T08:30:00Z",
"customFields": {
"bedrijf": "Installatiebedrijf Jansen"
},
"email": "sanne@installatiebedrijf-jansen.example",
"firstName": "Sanne",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"invitationExpiresAt": "2026-10-08T08:30:00Z",
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e05",
"lastName": "de Vries",
"metadata": {
"campaignId": "C-42"
},
"name": "Sanne de Vries",
"roleId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e04",
"schedulable": true,
"status": "ACTIVE"
}
],
"hasMore": false,
"nextCursor": "MjAyNi0xMC0wMVQwODozMDowMFp8M2YwYzhhNTItNmIxZS00ZDdhLTljM2UtMWEyYjNjNGQ1ZTAz"
}400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.validation.limitOutOfRange— limit must be a whole number from 1 to 100.
Invite a colleague
POST/api/v1/users
Invites a colleague by e-mail with one of the roles this key may assign; Schedulinq sends the invitation mail. Idempotent by e-mail too: a colleague or a pending invitation with this address in this organisation is answered with 200 and left as it is (no mail). Without users:read a 200 is a receipt: the status, the id, the address and an invitation's expiry. Every call that passes the request checks counts against the organisation's hourly colleague-invitation budget (200 by default), repeats included. A seat is never bought.
Parameters
Idempotency-KeyA unique value per user action; a retry with the same value and body answers the first call again and sends nothing.
hoogstens 255 tekens
Request body
customFieldsThe colleague's custom fields, by key (Settings → Custom fields, colleague fields). Types are checked; required fields are not enforced here. An unknown key is refused.
hoogstens 30 sleutels
emailThe colleague's e-mail address; the invitation goes there. At most 100 characters.
minstens 0 tekens · hoogstens 100 tekens
firstNameFirst name, at most 100 characters.
minstens 0 tekens · hoogstens 100 tekens
lastNameLast name, at most 100 characters.
minstens 0 tekens · hoogstens 100 tekens
localeThe language of the invitation mail and the page it opens. Absent = the organisation's language.
Een van: en, nl, de, fr, es, it, pl, ar
metadataKenmerken: the CRM's references, kept on the invitation. Keys are 1 to 40 characters of a-z, A-Z, 0-9 and _; values are strings on one line, at most 500 characters; at most 20 keys with a value.
hoogstens 40 sleutels
roleIdThe role the colleague gets on accepting: one of the roles this API key may assign (GET /api/v1/roles).
{
"customFields": {
"bedrijf": "Loodgieter Bakker"
},
"email": "piet+ov@loodgieter-bakker.example",
"firstName": "Piet",
"lastName": "Bakker",
"locale": "nl",
"metadata": {
"campaignId": "C-42"
},
"roleId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e04"
}Voorbeeldverzoek
IDEMPOTENCY_KEY=$(uuidgen) # once per action; to retry, run only the curl line again (same key)
curl -X POST https://api.schedulinq.com/api/v1/users \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
-d '{
"customFields": {
"bedrijf": "Loodgieter Bakker"
},
"email": "piet+ov@loodgieter-bakker.example",
"firstName": "Piet",
"lastName": "Bakker",
"locale": "nl",
"metadata": {
"campaignId": "C-42"
},
"roleId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e04"
}'Antwoorden
200 · The address already belongs to a colleague (ACTIVE or INACTIVE) or a pending invitation (INVITED) here; nothing changed, nothing was sent.
Geeft terug User
Voorbeeld · active
{
"email": "sanne@installatiebedrijf-jansen.example",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"status": "ACTIVE"
}Voorbeeld · invited
{
"email": "piet+ov@loodgieter-bakker.example",
"invitationExpiresAt": "2026-10-08T09:12:00Z",
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e05",
"status": "INVITED"
}Headers: Idempotent-Replayed
201 · A new invitation was sent (also when it replaced an expired one).
Geeft terug User
{
"admin": false,
"createdAt": "2026-10-01T09:12:00Z",
"customFields": {
"bedrijf": "Loodgieter Bakker"
},
"email": "piet+ov@loodgieter-bakker.example",
"firstName": "Piet",
"invitationExpiresAt": "2026-10-08T09:12:00Z",
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e05",
"lastName": "Bakker",
"metadata": {
"campaignId": "C-42"
},
"name": "Piet Bakker",
"roleId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e04",
"status": "INVITED"
}Headers: Idempotent-Replayed
400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.api.idempotencyKeyRequired— Send an Idempotency-Key header with this request, a unique value per operation.errors.api.idempotencyKeyTooLong— The Idempotency-Key header is longer than 255 characters.errors.validation.emailRequired— Email is requirederrors.validation.emailInvalid— Invalid email addresserrors.validation.emailNonAscii— Use an email address without special characters before the @.errors.validation.userEmailTooLong— Email must not exceed 100 characterserrors.validation.firstNameRequired— First name is requirederrors.validation.firstNameTooLong— First name must not exceed 100 characterserrors.validation.lastNameRequired— Last name is requirederrors.validation.lastNameTooLong— Last name must not exceed 100 characterserrors.validation.roleRequired— A role is required.errors.validation.localeInvalid— A language is a two-letter code, such as nl or en.errors.validation.supportedLocalesInvalid— Only English, Dutch, German, French, Spanish, Italian, Polish and Arabic are supported: en, nl, de, fr, es, it, pl or ar.errors.validation.customFieldsTooMany— customFields holds at most 30 keys.errors.validation.customFieldKeyFormat— A custom field key is at most 64 characters: a lowercase letter, then a-z, 0-9 and _.errors.validation.metadataTooManyKeys— metadata holds at most 20 keys with a value, and at most 40 entries in all.errors.validation.metadataKeyInvalid— A metadata key is 1 to 40 characters: a-z, A-Z, 0-9 and _.errors.validation.metadataValueInvalid— A metadata value is a string on one line.errors.validation.metadataValueTooLong— A metadata value is at most 500 characters.errors.api.custom_field_unknown_key— There is no custom field with this key.errors.api.custom_field_invalid— This value is not valid for this custom field.errors.validation.nameRequired— A name is required.
402 · Fouten
errors.api.trialUserLimit— The organisation is on a trial and cannot add more users.
403 · Fouten
errors.api.roleNotAssignable— This API key may not give this role. Use one of the roles the key may assign (GET /api/v1/roles).
409 · Fouten
errors.api.duplicateRequestInProgress— A request with this Idempotency-Key is still being processed. Try again in a moment.errors.api.emailInUseElsewhere— This e-mail address belongs to a Schedulinq account outside this organisation. Invite the colleague with another address; a plus-alias such as name+yourcompany@example.com works.errors.api.colleagueArchived— An archived colleague of this organisation has this e-mail address. Restore them in Schedulinq, or invite with another address.errors.api.noSeatsAvailable— The organisation has no free seat for another user. An admin can add seats under Billing.errors.api.organisationScheduledForDeletion— This organisation is scheduled for deletion and accepts no changes.
422 · Fouten
errors.api.idempotencyKeyReused— This Idempotency-Key was already used for a different request. Use a new key for a new request.
429 · Fouten
errors.api.colleagueInvitationLimit— The organisation has sent the maximum number of colleague invitations through the API for now. Wait for the number of seconds in Retry-After and try again.
Resend a colleague invitation
POST/api/v1/users/invitations/{id}/resend
Sends the invitation again with a new link, valid seven more days; the previous link stops working. Only for an invitation this key could have made: never an admin invitation, and only one whose role is among the key's. An expired invitation is renewed (and needs a seat) until the nightly clean-up removes it; after that, create it again. At most 3 resends of one invitation an hour.
Parameters
Idempotency-KeyA unique value per user action; a retry with the same value answers the first call again and sends nothing.
hoogstens 255 tekens
idThe invitation's id (invitationId).
Voorbeeldverzoek
IDEMPOTENCY_KEY=$(uuidgen) # once per action; to retry, run only the curl line again (same key)
curl -X POST https://api.schedulinq.com/api/v1/users/invitations/3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e05/resend \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY"Antwoorden
200 · Sent again. Without users:read a receipt: the status, the invitation's id, the address and the new expiry.
Geeft terug User
{
"email": "piet+ov@loodgieter-bakker.example",
"invitationExpiresAt": "2026-10-08T09:12:00Z",
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e05",
"status": "INVITED"
}Headers: Idempotent-Replayed
400 · Fouten
errors.api.idempotencyKeyRequired— Send an Idempotency-Key header with this request, a unique value per operation.errors.api.idempotencyKeyTooLong— The Idempotency-Key header is longer than 255 characters.
402 · Fouten
errors.api.trialUserLimit— The organisation is on a trial and cannot add more users.
403 · Fouten
errors.api.roleNotAssignable— This API key may not give this role. Use one of the roles the key may assign (GET /api/v1/roles).
404 · Fouten
errors.api.resourceNotFound— There is no resource at this path.
409 · Fouten
errors.api.duplicateRequestInProgress— A request with this Idempotency-Key is still being processed. Try again in a moment.errors.api.colleagueInvitationAccepted— This invitation has already been accepted: the colleague is in the organisation.errors.api.noSeatsAvailable— The organisation has no free seat for another user. An admin can add seats under Billing.errors.api.organisationScheduledForDeletion— This organisation is scheduled for deletion and accepts no changes.
422 · Fouten
errors.api.idempotencyKeyReused— This Idempotency-Key was already used for a different request. Use a new key for a new request.
429 · Fouten
errors.api.colleagueInvitationLimit— The organisation has sent the maximum number of colleague invitations through the API for now. Wait for the number of seconds in Retry-After and try again.
Services
The services (appointment types) the organisation offers.
List services
GET/api/v1/services
The organisation's services, oldest first. Archived services are left out.
Parameters
limitHow many to return, 1 to 100.
cursorThe nextCursor of the previous page.
Voorbeeldverzoek
curl "https://api.schedulinq.com/api/v1/services?limit=25" \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Antwoorden
200 · OK
Geeft een pagina terug van Service
{
"data": [
{
"colleagueIds": [
"3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
],
"createdAt": "2026-09-01T08:00:00Z",
"durationMinutes": 60,
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"identifier": "offertebezoek",
"name": "Offertebezoek",
"names": {
"en": "Quote visit",
"nl": "Offertebezoek"
}
}
],
"hasMore": false,
"nextCursor": "MjAyNi0wOS0wMVQwODowMDowMFp8M2YwYzhhNTItNmIxZS00ZDdhLTljM2UtMWEyYjNjNGQ1ZTAx"
}400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.validation.limitOutOfRange— limit must be a whole number from 1 to 100.
Roles
The roles an API key with users:write may give a colleague it invites.
List assignable roles
GET/api/v1/roles
The roles this API key may assign, oldest first. A role deleted since the key was made is left out.
Parameters
limitHow many to return, 1 to 100.
cursorThe nextCursor of the previous page.
Voorbeeldverzoek
curl "https://api.schedulinq.com/api/v1/roles?limit=25" \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Antwoorden
200 · OK
Geeft een pagina terug van Role
{
"data": [
{
"createdAt": "2026-09-01T08:00:00Z",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e04",
"name": "Leadkoper"
}
],
"hasMore": false,
"nextCursor": "MjAyNi0wOS0wMVQwODowMDowMFp8M2YwYzhhNTItNmIxZS00ZDdhLTljM2UtMWEyYjNjNGQ1ZTA0"
}400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.validation.limitOutOfRange— limit must be a whole number from 1 to 100.
Planning links
Open Schedulinq's planner from your CRM, for one customer.
Create a planning link
POST/api/v1/planning-links
A one-time link that opens Schedulinq's planner for this customer, on this service and colleague — or, without a colleague, on everyone who does the service. Create one per click and send the colleague's browser to url at once: it works for 15 minutes, for the first colleague who opens it. The customer is an existing one by id, or found by e-mail address or created; the kenmerken are copied onto every appointment booked from the link.
Parameters
Idempotency-KeyA unique value per planning link; a retry with the same value and body answers the first link again.
hoogstens 255 tekens
Request body
addressWhere the appointment happens, when at the customer's. Never stored on the customer.
Velden tonen · Address
cityCity.
minstens 0 tekens · hoogstens 100 tekens
countryISO 3166-1 alpha-2 country code; the organisation's country when absent.
line1Street and house number.
minstens 0 tekens · hoogstens 255 tekens
postalCodePostal code.
minstens 0 tekens · hoogstens 20 tekens
appointmentTypeIdThe service the planner opens on (GET /api/v1/services).
customerThe customer.
Velden tonen · CustomerInput
companyNameCompany name; required for a BUSINESS.
minstens 0 tekens · hoogstens 255 tekens
customerTypePERSON (the default) or BUSINESS.
Een van: PERSON, BUSINESS
emailE-mail address, required without an id: how the customer is found, and where the invitation goes.
minstens 0 tekens · hoogstens 255 tekens
firstNameFirst name; for a BUSINESS, the contact person's.
minstens 0 tekens · hoogstens 100 tekens
idAn existing customer of the organisation, by its id (customerId on an appointment, an invitation or a planning link). Send it alone: with an id, no other field.
lastNameLast name; required for a PERSON. For a BUSINESS, the contact person's.
minstens 0 tekens · hoogstens 100 tekens
phonePhone number: E.164 (a + and the country code), or national in the organisation's country.
minstens 0 tekens · hoogstens 20 tekens
metadataKenmerken: the CRM's references, copied onto every appointment booked from the link. Keys are 1 to 40 characters of a-z, A-Z, 0-9 and _; values are strings on one line, at most 500 characters; at most 20 keys with a value.
hoogstens 40 sleutels
returnUrlWhere "Back to CRM" goes after the booking: an https URL whose origin is on the organisation's list of allowed return addresses.
minstens 0 tekens · hoogstens 2048 tekens
userThe colleague the planner opens on; the caller may still book another. Absent: the planner opens on every colleague who does the service.
Velden tonen · ColleagueRef
emailThe colleague's e-mail address; matched whatever its case.
minstens 0 tekens · hoogstens 255 tekens
idThe colleague's id (GET /api/v1/users).
{
"appointmentTypeId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"customer": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"returnUrl": "https://crm.example.com/deals/D-123"
}Voorbeeldverzoek
IDEMPOTENCY_KEY=$(uuidgen) # once per action; to retry, run only the curl line again (same key)
curl -X POST https://api.schedulinq.com/api/v1/planning-links \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
-d '{
"appointmentTypeId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"customer": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"returnUrl": "https://crm.example.com/deals/D-123"
}'Antwoorden
201 · Created
Geeft terug PlanningLink
{
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"expiresAt": "2026-10-14T09:15:00+02:00",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e07",
"url": "https://app.schedulinq.com/plan-link#EXAMPLE-TOKEN",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}Headers: Idempotent-Replayed
400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.api.idempotencyKeyRequired— Send an Idempotency-Key header with this request, a unique value per operation.errors.api.idempotencyKeyTooLong— The Idempotency-Key header is longer than 255 characters.errors.validation.colleagueIdOrEmail— Name the colleague by id or by e-mail address — one of the two.errors.validation.customerIdOrDetails— Name the customer by id alone, or by its details — not both.errors.validation.emailRequired— Email is requirederrors.validation.redirectUrlInvalid— Enter a full web address starting with https://errors.validation.redirectUrlTooLong— The web address must not exceed 2048 characterserrors.validation.returnUrlOriginNotAllowed— This return address is not on the organisation's list of allowed return addresses (Integrations → API).errors.validation.addressRequired— Address is requirederrors.validation.phoneInvalid— Invalid phone numbererrors.validation.lastNameRequired— Last name is requirederrors.validation.companyNameRequired— Company name is requirederrors.validation.metadataValueInvalid— A metadata value is a string on one line.errors.validation.nameRequired— A name is required.
404 · Fouten
errors.api.colleagueNotFound— No colleague of this organisation has this id or e-mail address.errors.api.serviceNotFound— This service does not exist, or it is archived.errors.api.customerNotFound— No customer of this organisation has this id.
409 · Fouten
errors.api.duplicateRequestInProgress— A request with this Idempotency-Key is still being processed. Try again in a moment.errors.api.colleagueNotActive— This colleague can't be booked: they have not accepted their invitation yet, or they are deactivated, archived or not schedulable.errors.api.organisationScheduledForDeletion— This organisation is scheduled for deletion and accepts no changes.
422 · Fouten
errors.api.idempotencyKeyReused— This Idempotency-Key was already used for a different request. Use a new key for a new request.errors.validation.userCannotDoEveryService— This colleague does not do this service (or one of its add-ons).
Invitations
Invitations a customer books an appointment with.
List invitations by kenmerken
GET/api/v1/invitations
The organisation's invitations carrying every kenmerk asked for, oldest first. A single pass: to reconcile, run the lookup again; follow changes through webhooks.
Parameters
statusOnly invitations in this status.
Een van: PENDING, USED, CANCELLED, EXPIRED
metadata[<key>]Kenmerken to look up by, as metadata[]=; at least one, all must match. Brackets may be sent raw or as %5B and %5D.
limitHow many to return, 1 to 100.
cursorThe nextCursor of the previous page.
Voorbeeldverzoek
curl --globoff "https://api.schedulinq.com/api/v1/invitations?metadata[dealId]=D-123&limit=25" \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Antwoorden
200 · OK
Geeft een pagina terug van Invitation
{
"data": [
{
"address": {
"city": "Amsterdam",
"country": "NL",
"line1": "Keizersgracht 100",
"postalCode": "1015 AA"
},
"bookingPageClosed": false,
"bookingUrl": "https://schedulinq.com/i/EXAMPLE-INVITATION",
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
}
],
"createdAt": "2026-10-01T09:00:00+02:00",
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"initialEmailDeferred": false,
"lineageRootId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"location": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"locationMode": "VIDEO",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"rescheduledFromAppointmentId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"status": "PENDING",
"updatedAt": "2026-10-01T09:00:00+02:00",
"validUntil": "2026-10-31"
}
],
"hasMore": false,
"nextCursor": "MjAyNi0xMC0wMVQwODozMDowMFp8M2YwYzhhNTItNmIxZS00ZDdhLTljM2UtMWEyYjNjNGQ1ZTA4"
}400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.validation.metadataFilterRequired— A list needs at least one metadata filter, for example metadata[dealId]=D-123.errors.validation.unknownField— This field does not exist.errors.validation.invalidValue— This value has the wrong type or format.errors.validation.limitOutOfRange— limit must be a whole number from 1 to 100.errors.validation.cursorInvalid— The cursor is not valid. Use the nextCursor of a previous page as it was given.
Send an invitation
POST/api/v1/invitations
Sends the customer an invitation to book this service with one of these colleagues: the booking page offers the times any of them is free. The first message is queued at once. The name and the duration are the service's (plus its add-ons). The customer is an existing one by id, or found by e-mail address or created. A second invitation for the same customer and service is simply another invitation. bookingUrl is in this answer only: keep it.
Parameters
Idempotency-KeyA unique value per invitation; a retry with the same value and body answers the first invitation again and sends nothing.
hoogstens 255 tekens
Request body
addOnsAdd-ons of the service, pinned on the invitation; each id once.
Velden tonen · AddOnRef
idThe add-on's id (GET /api/v1/services).
quantityHow many, 1 to 99; above 1 only for an add-on that allows several. Absent = 1.
minstens 1 · hoogstens 99
addressWhere the appointment happens, when at the customer's. Never stored on the customer.
Velden tonen · Address
cityCity.
minstens 0 tekens · hoogstens 100 tekens
countryISO 3166-1 alpha-2 country code; the organisation's country when absent.
line1Street and house number.
minstens 0 tekens · hoogstens 255 tekens
postalCodePostal code.
minstens 0 tekens · hoogstens 20 tekens
appointmentTypeIdThe service (GET /api/v1/services).
customerThe customer.
Velden tonen · CustomerInput
companyNameCompany name; required for a BUSINESS.
minstens 0 tekens · hoogstens 255 tekens
customerTypePERSON (the default) or BUSINESS.
Een van: PERSON, BUSINESS
emailE-mail address, required without an id: how the customer is found, and where the invitation goes.
minstens 0 tekens · hoogstens 255 tekens
firstNameFirst name; for a BUSINESS, the contact person's.
minstens 0 tekens · hoogstens 100 tekens
idAn existing customer of the organisation, by its id (customerId on an appointment, an invitation or a planning link). Send it alone: with an id, no other field.
lastNameLast name; required for a PERSON. For a BUSINESS, the contact person's.
minstens 0 tekens · hoogstens 100 tekens
phonePhone number: E.164 (a + and the country code), or national in the organisation's country.
minstens 0 tekens · hoogstens 20 tekens
metadataKenmerken: the CRM's references, copied onto the appointment the customer books. Keys are 1 to 40 characters of a-z, A-Z, 0-9 and _; values are strings on one line, at most 500 characters; at most 20 keys with a value.
hoogstens 40 sleutels
usersThe colleagues the customer may book with, each by id or by e-mail address and each once. The booking page offers the times any of them is free; the appointment is booked with one of them. Every one must be active, schedulable and do the service and its add-ons.
minstens 1 items · hoogstens 100 items
Velden tonen · ColleagueRef
emailThe colleague's e-mail address; matched whatever its case.
minstens 0 tekens · hoogstens 255 tekens
idThe colleague's id (GET /api/v1/users).
validUntilThe last day the invitation can be booked, in the organisation's time zone. Absent = the organisation's default.
{
"address": {
"city": "Amsterdam",
"country": "NL",
"line1": "Keizersgracht 100",
"postalCode": "1015 AA"
},
"appointmentTypeId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"customer": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"users": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
]
}Voorbeeldverzoek
IDEMPOTENCY_KEY=$(uuidgen) # once per action; to retry, run only the curl line again (same key)
curl -X POST https://api.schedulinq.com/api/v1/invitations \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": {
"city": "Amsterdam",
"country": "NL",
"line1": "Keizersgracht 100",
"postalCode": "1015 AA"
},
"appointmentTypeId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"customer": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"users": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
]
}'Antwoorden
201 · Created
Geeft terug Invitation
{
"address": {
"city": "Amsterdam",
"country": "NL",
"line1": "Keizersgracht 100",
"postalCode": "1015 AA"
},
"bookingPageClosed": false,
"bookingUrl": "https://schedulinq.com/i/EXAMPLE-INVITATION",
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
}
],
"createdAt": "2026-10-01T09:00:00+02:00",
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"initialEmailDeferred": false,
"lineageRootId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"location": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"locationMode": "VIDEO",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"rescheduledFromAppointmentId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"status": "PENDING",
"updatedAt": "2026-10-01T09:00:00+02:00",
"validUntil": "2026-10-31"
}Headers: Idempotent-Replayed
400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.api.idempotencyKeyRequired— Send an Idempotency-Key header with this request, a unique value per operation.errors.api.idempotencyKeyTooLong— The Idempotency-Key header is longer than 255 characters.errors.validation.userRequired— Name at least one colleague.errors.validation.usersOutOfRange— users names 1 to 100 colleagues.errors.validation.colleagueIdOrEmail— Name the colleague by id or by e-mail address — one of the two.errors.validation.colleagueRepeated— This colleague is listed more than once.errors.validation.customerIdOrDetails— Name the customer by id alone, or by its details — not both.errors.validation.emailRequired— Email is requirederrors.validation.addressRequired— Address is requirederrors.validation.phoneInvalid— Invalid phone numbererrors.validation.lastNameRequired— Last name is requirederrors.validation.companyNameRequired— Company name is requirederrors.validation.invitationValidUntilInPast— The expiry date cannot be in the past.errors.validation.invitationValidUntilTooFar— The expiry date can be at most ten years ahead.errors.validation.addOnRepeated— This add-on is listed more than once.errors.validation.addOnQuantityInvalid— Choose a quantity between 1 and 99 for each add-on.errors.validation.metadataValueInvalid— A metadata value is a string on one line.errors.validation.nameRequired— A name is required.
404 · Fouten
errors.api.colleagueNotFound— No colleague of this organisation has this id or e-mail address.errors.api.serviceNotFound— This service does not exist, or it is archived.errors.api.customerNotFound— No customer of this organisation has this id.
409 · Fouten
errors.api.duplicateRequestInProgress— A request with this Idempotency-Key is still being processed. Try again in a moment.errors.api.colleagueNotActive— This colleague can't be booked: they have not accepted their invitation yet, or they are deactivated, archived or not schedulable.errors.api.customerDeactivated— This customer is deactivated and can't book online. Reactivate them in Schedulinq first.errors.api.organisationScheduledForDeletion— This organisation is scheduled for deletion and accepts no changes.
422 · Fouten
errors.api.idempotencyKeyReused— This Idempotency-Key was already used for a different request. Use a new key for a new request.errors.validation.userCannotDoEveryService— This colleague does not do this service (or one of its add-ons).errors.validation.addOnNotOffered— This add-on does not exist, or it is not offered with this service.errors.validation.addOnQuantityNotAllowed— This add-on can only be booked once per appointment.errors.validation.serviceHasNoDuration— This service has no duration of its own. Give it one in Schedulinq, or add an add-on with a duration.
429 · Fouten
errors.api.customerInvitationLimit— This customer has received the maximum number of invitations through the API for now. Try again later.
Get an invitation
GET/api/v1/invitations/{id}
One invitation of the organisation, with the appointments booked from it.
Parameters
idThe invitation's id.
Voorbeeldverzoek
curl https://api.schedulinq.com/api/v1/invitations/3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08 \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Antwoorden
200 · OK
Geeft terug Invitation
{
"address": {
"city": "Amsterdam",
"country": "NL",
"line1": "Keizersgracht 100",
"postalCode": "1015 AA"
},
"bookingPageClosed": false,
"bookingUrl": "https://schedulinq.com/i/EXAMPLE-INVITATION",
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
}
],
"createdAt": "2026-10-01T09:00:00+02:00",
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"initialEmailDeferred": false,
"lineageRootId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"location": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"locationMode": "VIDEO",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"rescheduledFromAppointmentId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"status": "PENDING",
"updatedAt": "2026-10-01T09:00:00+02:00",
"validUntil": "2026-10-31"
}404 · Fouten
errors.api.invitationNotFound— This invitation could not be found.
Appointments
The organisation's appointments, read back by kenmerken.
List appointments by kenmerken
GET/api/v1/appointments
The organisation's appointments carrying every kenmerk asked for, oldest first. A single pass: to reconcile, run the lookup again; follow changes through webhooks.
Parameters
statusOnly appointments in this status.
Een van: PENDING, CONFIRMED, COMPLETED, NO_SHOW, CANCELLED
fromOnly appointments starting at or after this moment (an offset date-time; send + as %2B, or use Z).
toOnly appointments starting before this moment.
metadata[<key>]Kenmerken to look up by, as metadata[]=; at least one, all must match. Brackets may be sent raw or as %5B and %5D.
limitHow many to return, 1 to 100.
cursorThe nextCursor of the previous page.
Voorbeeldverzoek
curl --globoff "https://api.schedulinq.com/api/v1/appointments?from=2026-10-01T00:00:00Z&to=2026-11-01T00:00:00Z&metadata[dealId]=D-123&limit=25" \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Antwoorden
200 · OK
Geeft een pagina terug van Appointment
{
"data": [
{
"address": {
"city": "Amsterdam",
"country": "NL",
"line1": "Keizersgracht 100",
"postalCode": "1015 AA"
},
"cancellationReason": "Ziek",
"cancelledAt": "2026-10-12T15:30:00+02:00",
"cancelledBy": "CUSTOMER",
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
}
],
"createdAt": "2026-10-01T09:00:00+02:00",
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"end": "2026-10-14T11:00:00+02:00",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"lineageRootId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"location": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"locationMode": "AT_CUSTOMER",
"meetingProvider": "GOOGLE_MEET",
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"planningLinkId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e07",
"rescheduledFromId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"start": "2026-10-14T10:00:00+02:00",
"status": "CONFIRMED",
"timeZone": "Europe/Amsterdam",
"updatedAt": "2026-10-01T09:00:00+02:00"
}
],
"hasMore": false,
"nextCursor": "MjAyNi0xMC0wMVQwODozMDowMFp8M2YwYzhhNTItNmIxZS00ZDdhLTljM2UtMWEyYjNjNGQ1ZTA5"
}400 · Fouten
errors.api.validationFailed— One or more fields are not valid. The errors list names each field.errors.api.invalidParameter— A parameter has a value of the wrong type.errors.validation.metadataFilterRequired— A list needs at least one metadata filter, for example metadata[dealId]=D-123.errors.validation.unknownField— This field does not exist.errors.validation.invalidValue— This value has the wrong type or format.errors.validation.limitOutOfRange— limit must be a whole number from 1 to 100.errors.validation.cursorInvalid— The cursor is not valid. Use the nextCursor of a previous page as it was given.
Get an appointment
GET/api/v1/appointments/{id}
One appointment of the organisation.
Parameters
idThe appointment's id.
Voorbeeldverzoek
curl https://api.schedulinq.com/api/v1/appointments/3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09 \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Antwoorden
200 · OK
Geeft terug Appointment
{
"address": {
"city": "Amsterdam",
"country": "NL",
"line1": "Keizersgracht 100",
"postalCode": "1015 AA"
},
"cancellationReason": "Ziek",
"cancelledAt": "2026-10-12T15:30:00+02:00",
"cancelledBy": "CUSTOMER",
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
}
],
"createdAt": "2026-10-01T09:00:00+02:00",
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"end": "2026-10-14T11:00:00+02:00",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"lineageRootId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"location": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"locationMode": "AT_CUSTOMER",
"meetingProvider": "GOOGLE_MEET",
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"planningLinkId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e07",
"rescheduledFromId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"start": "2026-10-14T10:00:00+02:00",
"status": "CONFIRMED",
"timeZone": "Europe/Amsterdam",
"updatedAt": "2026-10-01T09:00:00+02:00"
}404 · Fouten
errors.api.appointmentNotFound— This appointment does not exist, or it belongs to another organisation.
Schema's
User
adminWhether the colleague is (or will be) an admin of the organisation.
calendarConnectedWhether the colleague has a calendar connected that Schedulinq reads. Absent on an invitation.
createdAtWhen the colleague was added, or the invitation sent.
customFieldsThe colleague's custom fields, by key; only fields that still exist.
emailE-mail address.
firstNameFirst name.
idThe colleague's id. Absent on an invitation.
invitationExpiresAtWhen an invitation stops being valid. Present only while status is INVITED.
invitationIdThe invitation's id. Present only while status is INVITED.
lastNameLast name. Absent when the colleague has none.
metadataKenmerken the invitation was created with through the API. Present only on an invitation that has them.
nameFirst and last name.
roleIdThe colleague's role. Absent for an admin and for an invitation without a role.
schedulableWhether customers can be booked with this colleague. Absent on an invitation.
statusACTIVE, INACTIVE or INVITED.
Een van: ACTIVE, INACTIVE, INVITED
Service
colleagueIdsThe colleagues who perform the service.
createdAtWhen the service was created.
durationMinutesHow long the service takes, in minutes. Absent when it has no length of its own.
idThe service's id.
identifierThe identifier the organisation gave the service.
nameThe name in the organisation's own language.
namesThe name per language, by language code.
Role
createdAtWhen the role was created.
idThe role's id.
nameThe role's name.
PlanningLink
customerIdThe customer: the one named by id, or the one found or created.
expiresAtUntil when the link can be opened, in the organisation's time zone.
idThe link's id; appointments booked from it carry it as planningLinkId.
urlThe one-time URL. Never store it, never show it in a list: mint a new one per click.
userIdThe colleague the planner opens on; absent when the link names none.
Invitation
addressWhere the appointment happens; absent when the customer gives it.
Velden tonen · Address
cityCity.
minstens 0 tekens · hoogstens 100 tekens
countryISO 3166-1 alpha-2 country code; the organisation's country when absent.
line1Street and house number.
minstens 0 tekens · hoogstens 255 tekens
postalCodePostal code.
minstens 0 tekens · hoogstens 20 tekens
appointmentIdsThe appointments booked from this invitation, earliest first; [] while none.
bookingPageClosedIn the create's answer: true while the organisation's booking page takes no bookings; the first message is then queued but not sent.
bookingUrlThe customer's booking link. Only in the answer to the create; keep it from there.
colleaguesThe colleagues the customer can book with, by name.
Velden tonen · NamedRef
idIts id.
nameIts name.
createdAtWhen it was created.
customerIdThe customer.
idThe invitation's id.
initialEmailDeferredIn the create's answer: true when the first message was not sent because the customer has no e-mail address.
lineageRootIdWhen the invitation moves an earlier booking: the first appointment of that booking.
locationThe organisation's location the appointment is pinned to; absent when none.
Velden tonen · NamedRef
idIts id.
nameIts name.
locationModeVIDEO or PHONE when the invitation is for a call; absent for a visit.
Een van: AT_CUSTOMER, ON_LOCATION, VIDEO, PHONE
metadataKenmerken, in key order; {} when none.
rescheduledFromAppointmentIdWhen the invitation moves an earlier booking: the cancelled appointment it replaces.
serviceThe service.
Velden tonen · NamedRef
idIts id.
nameIts name.
statusPENDING (can be booked), USED (booked), CANCELLED or EXPIRED.
Een van: PENDING, USED, CANCELLED, EXPIRED
updatedAtWhen it last changed.
validUntilThe last day it can be booked, in the organisation's time zone. Absent = no end date.
Appointment
addressWhere it happens; absent for a call.
Velden tonen · Address
cityCity.
minstens 0 tekens · hoogstens 100 tekens
countryISO 3166-1 alpha-2 country code; the organisation's country when absent.
line1Street and house number.
minstens 0 tekens · hoogstens 255 tekens
postalCodePostal code.
minstens 0 tekens · hoogstens 20 tekens
cancellationReasonThe reason given when it was cancelled, if any.
cancelledAtWhen it was cancelled; absent unless CANCELLED.
cancelledByWho cancelled it: CUSTOMER, STAFF, SYSTEM, or STAFF_RESCHEDULE (cancelled by a colleague to be booked again); absent unless CANCELLED.
Een van: CUSTOMER, STAFF, SYSTEM, STAFF_RESCHEDULE
colleaguesThe colleagues booked, by name.
Velden tonen · NamedRef
idIts id.
nameIts name.
createdAtWhen it was created.
customerIdThe customer; absent for an appointment without one.
endThe end, in the organisation's time zone.
idThe appointment's id.
invitationIdThe invitation it was booked from, if any.
lineageRootIdThe first appointment of the booking this one moves; absent when it was booked, not moved.
locationThe organisation's location it happens at; absent when none.
Velden tonen · NamedRef
idIts id.
nameIts name.
locationModeAT_CUSTOMER, ON_LOCATION, VIDEO or PHONE.
Een van: AT_CUSTOMER, ON_LOCATION, VIDEO, PHONE
meetingProviderWho made the meeting link: GOOGLE_MEET, TEAMS or MANUAL.
Een van: GOOGLE_MEET, TEAMS, MANUAL
meetingUrlA video call's meeting link; absent until one exists.
metadataKenmerken, in key order; {} when none.
planningLinkIdThe planning link it was booked from, if any.
rescheduledFromIdThe appointment this one replaced when it was moved.
serviceThe service.
Velden tonen · NamedRef
idIts id.
nameIts name.
startThe start, in the organisation's time zone.
statusCONFIRMED, COMPLETED or CANCELLED (PENDING and NO_SHOW are reserved).
Een van: PENDING, CONFIRMED, COMPLETED, NO_SHOW, CANCELLED
timeZoneThe organisation's time zone (IANA).
updatedAtWhen it last changed.