SchedulinqDocs
Go to Schedulinq

Reference

Every endpoint of the Schedulinq API — parameters, request bodies, responses, errors and the scope each needs — generated from the API description.

Download openapi.json

OpenAPI 3.1 · version v1 · API description of October 4, 2026

The live API serves the same description at https://api.schedulinq.com/api/v1/openapi.json.

Base URL

https://api.schedulinq.com/api/v1, over HTTPS only. Every request carries an API key in the Authorization header; see Authentication.

Conventions

  • Names are camelCase; ids are UUIDs.
  • Times are ISO 8601 with their offset, in your organisation's time zone, and an appointment also names its timeZone.
  • Enum values are UPPER_CASE.
  • An absent field means "not set". The API leaves a field out rather than sending null.
  • A request body with a field the API does not know is refused with a 400 that names the field (errors.validation.unknownField), so a typo never goes unnoticed.

Pagination

Lists page with a cursor:

  • limit sets the page size, from 1 to 100 (default 25);
  • cursor is the nextCursor of the previous page, passed exactly as you received it;
  • a page answers { "data": [...], "hasMore": true, "nextCursor": "..." }.

Pages are ordered by when the item was created. Stop when hasMore is false.

Headers on every response

Every answer carries X-Request-Id, and every authenticated one the three RateLimit-* headers (see Rate limits). The endpoints below list only the headers of their own.

Request ids

Send your own X-Request-Id (1 to 128 characters of A-Z, a-z, 0-9, ., _ and -) to find a request back in your own logs; otherwise the API makes one. Every error repeats it as requestId. Quote it when you write to support@schedulinq.com.

The descriptions per endpoint are in English, like the API itself. There is no console to try requests here: use curl, or import the API description into a tool such as Postman.

Errors on every endpoint

Besides the errors listed per endpoint, every endpoint can answer with:

Users

The organisation's colleagues and the invitations they have not accepted yet.

List colleagues

GET/api/v1/users

Scope: users:read

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

limit
queryinteger · int32Optional

How many to return, 1 to 100.

cursor
querystringOptional

The nextCursor of the previous page.

Example request

curl "https://api.schedulinq.com/api/v1/users?limit=25" \
  -H "Authorization: Bearer $SCHEDULINQ_API_KEY"

Responses

200 · OK

Returns a page of 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 · Errors

Invite a colleague

POST/api/v1/users

Scope: users:write · Idempotency-Key required

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-Key
headerstringRequired

A unique value per user action; a retry with the same value and body answers the first call again and sends nothing.

at most 255 characters

Request body

customFields
map of anyOptional

The 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.

at most 30 keys

email
string · emailRequired

The colleague's e-mail address; the invitation goes there. At most 100 characters.

at least 0 characters · at most 100 characters

firstName
stringRequired

First name, at most 100 characters.

at least 0 characters · at most 100 characters

lastName
stringRequired

Last name, at most 100 characters.

at least 0 characters · at most 100 characters

locale
stringOptional

The language of the invitation mail and the page it opens. Absent = the organisation's language.

One of: en, nl, de, fr, es, it, pl, ar

metadata
map of stringOptional

Kenmerken: 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.

at most 40 keys

roleId
string · uuidRequired

The 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"
}

Example request

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"
}'

Responses

200 · The address already belongs to a colleague (ACTIVE or INACTIVE) or a pending invitation (INVITED) here; nothing changed, nothing was sent.

Returns User

Example · active

{
  "email": "sanne@installatiebedrijf-jansen.example",
  "id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
  "status": "ACTIVE"
}

Example · 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).

Returns 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 · Errors

402 · Errors

403 · Errors

409 · Errors

422 · Errors

429 · Errors

  • 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

Scope: users:write · Idempotency-Key required

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-Key
headerstringRequired

A unique value per user action; a retry with the same value answers the first call again and sends nothing.

at most 255 characters

id
pathstring · uuidRequired

The invitation's id (invitationId).

Example request

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"

Responses

200 · Sent again. Without users:read a receipt: the status, the invitation's id, the address and the new expiry.

Returns 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 · Errors

402 · Errors

403 · Errors

404 · Errors

409 · Errors

422 · Errors

429 · Errors

  • 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

Scope: services:read

The organisation's services, oldest first. Archived services are left out.

Parameters

limit
queryinteger · int32Optional

How many to return, 1 to 100.

cursor
querystringOptional

The nextCursor of the previous page.

Example request

curl "https://api.schedulinq.com/api/v1/services?limit=25" \
  -H "Authorization: Bearer $SCHEDULINQ_API_KEY"

Responses

200 · OK

Returns a page of 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 · Errors

Roles

The roles an API key with users:write may give a colleague it invites.

List assignable roles

GET/api/v1/roles

Scope: users:write

The roles this API key may assign, oldest first. A role deleted since the key was made is left out.

Parameters

limit
queryinteger · int32Optional

How many to return, 1 to 100.

cursor
querystringOptional

The nextCursor of the previous page.

Example request

curl "https://api.schedulinq.com/api/v1/roles?limit=25" \
  -H "Authorization: Bearer $SCHEDULINQ_API_KEY"

Responses

200 · OK

Returns a page of Role

{
  "data": [
    {
      "createdAt": "2026-09-01T08:00:00Z",
      "id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e04",
      "name": "Leadkoper"
    }
  ],
  "hasMore": false,
  "nextCursor": "MjAyNi0wOS0wMVQwODowMDowMFp8M2YwYzhhNTItNmIxZS00ZDdhLTljM2UtMWEyYjNjNGQ1ZTA0"
}

400 · Errors

Open Schedulinq's planner from your CRM, for one customer.

POST/api/v1/planning-links

Scope: planning_links:write · Idempotency-Key required

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-Key
headerstringRequired

A unique value per planning link; a retry with the same value and body answers the first link again.

at most 255 characters

Request body

address
AddressOptional

Where the appointment happens, when at the customer's. Never stored on the customer.

Show fields · Address
city
stringOptional

City.

at least 0 characters · at most 100 characters

country
stringOptional

ISO 3166-1 alpha-2 country code; the organisation's country when absent.

line1
stringOptional

Street and house number.

at least 0 characters · at most 255 characters

postalCode
stringOptional

Postal code.

at least 0 characters · at most 20 characters

appointmentTypeId
string · uuidOptional

The service the planner opens on (GET /api/v1/services).

customer
CustomerInputRequired

The customer.

Show fields · CustomerInput
companyName
stringOptional

Company name; required for a BUSINESS.

at least 0 characters · at most 255 characters

customerType
stringOptional

PERSON (the default) or BUSINESS.

One of: PERSON, BUSINESS

email
string · emailOptional

E-mail address, required without an id: how the customer is found, and where the invitation goes.

at least 0 characters · at most 255 characters

firstName
stringOptional

First name; for a BUSINESS, the contact person's.

at least 0 characters · at most 100 characters

id
string · uuidOptional

An 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.

lastName
stringOptional

Last name; required for a PERSON. For a BUSINESS, the contact person's.

at least 0 characters · at most 100 characters

phone
stringOptional

Phone number: E.164 (a + and the country code), or national in the organisation's country.

at least 0 characters · at most 20 characters

metadata
map of stringOptional

Kenmerken: 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.

at most 40 keys

returnUrl
stringOptional

Where "Back to CRM" goes after the booking: an https URL whose origin is on the organisation's list of allowed return addresses.

at least 0 characters · at most 2048 characters

user
ColleagueRefOptional

The colleague the planner opens on; the caller may still book another. Absent: the planner opens on every colleague who does the service.

Show fields · ColleagueRef
email
string · emailOptional

The colleague's e-mail address; matched whatever its case.

at least 0 characters · at most 255 characters

id
string · uuidOptional

The 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"
}

Example request

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"
}'

Responses

201 · Created

Returns 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 · Errors

404 · Errors

409 · Errors

422 · Errors

Invitations

Invitations a customer books an appointment with.

List invitations by kenmerken

GET/api/v1/invitations

Scope: invitations:read

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

status
querystringOptional

Only invitations in this status.

One of: PENDING, USED, CANCELLED, EXPIRED

metadata[<key>]
querymap of stringRequired

Kenmerken to look up by, as metadata[]=; at least one, all must match. Brackets may be sent raw or as %5B and %5D.

limit
queryintegerOptional

How many to return, 1 to 100.

cursor
querystringOptional

The nextCursor of the previous page.

Example request

curl --globoff "https://api.schedulinq.com/api/v1/invitations?metadata[dealId]=D-123&limit=25" \
  -H "Authorization: Bearer $SCHEDULINQ_API_KEY"

Responses

200 · OK

Returns a page of 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 · Errors

Send an invitation

POST/api/v1/invitations

Scope: invitations:write · Idempotency-Key required

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-Key
headerstringRequired

A unique value per invitation; a retry with the same value and body answers the first invitation again and sends nothing.

at most 255 characters

Request body

addOns
list of AddOnRefOptional

Add-ons of the service, pinned on the invitation; each id once.

Show fields · AddOnRef
id
string · uuidRequired

The add-on's id (GET /api/v1/services).

quantity
integer · int32Optional

How many, 1 to 99; above 1 only for an add-on that allows several. Absent = 1.

at least 1 · at most 99

address
AddressOptional

Where the appointment happens, when at the customer's. Never stored on the customer.

Show fields · Address
city
stringOptional

City.

at least 0 characters · at most 100 characters

country
stringOptional

ISO 3166-1 alpha-2 country code; the organisation's country when absent.

line1
stringOptional

Street and house number.

at least 0 characters · at most 255 characters

postalCode
stringOptional

Postal code.

at least 0 characters · at most 20 characters

appointmentTypeId
string · uuidRequired

The service (GET /api/v1/services).

customer
CustomerInputRequired

The customer.

Show fields · CustomerInput
companyName
stringOptional

Company name; required for a BUSINESS.

at least 0 characters · at most 255 characters

customerType
stringOptional

PERSON (the default) or BUSINESS.

One of: PERSON, BUSINESS

email
string · emailOptional

E-mail address, required without an id: how the customer is found, and where the invitation goes.

at least 0 characters · at most 255 characters

firstName
stringOptional

First name; for a BUSINESS, the contact person's.

at least 0 characters · at most 100 characters

id
string · uuidOptional

An 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.

lastName
stringOptional

Last name; required for a PERSON. For a BUSINESS, the contact person's.

at least 0 characters · at most 100 characters

phone
stringOptional

Phone number: E.164 (a + and the country code), or national in the organisation's country.

at least 0 characters · at most 20 characters

metadata
map of stringOptional

Kenmerken: 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.

at most 40 keys

users
list of ColleagueRefRequired

The 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.

at least 1 items · at most 100 items

Show fields · ColleagueRef
email
string · emailOptional

The colleague's e-mail address; matched whatever its case.

at least 0 characters · at most 255 characters

id
string · uuidOptional

The colleague's id (GET /api/v1/users).

validUntil
string · dateOptional

The 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"
    }
  ]
}

Example request

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"
    }
  ]
}'

Responses

201 · Created

Returns 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 · Errors

404 · Errors

409 · Errors

422 · Errors

429 · Errors

Get an invitation

GET/api/v1/invitations/{id}

Scope: invitations:read

One invitation of the organisation, with the appointments booked from it.

Parameters

id
pathstring · uuidRequired

The invitation's id.

Example request

curl https://api.schedulinq.com/api/v1/invitations/3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08 \
  -H "Authorization: Bearer $SCHEDULINQ_API_KEY"

Responses

200 · OK

Returns 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 · Errors

Appointments

The organisation's appointments, read back by kenmerken.

List appointments by kenmerken

GET/api/v1/appointments

Scope: appointments:read

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

status
querystringOptional

Only appointments in this status.

One of: PENDING, CONFIRMED, COMPLETED, NO_SHOW, CANCELLED

from
querystring · date-timeOptional

Only appointments starting at or after this moment (an offset date-time; send + as %2B, or use Z).

to
querystring · date-timeOptional

Only appointments starting before this moment.

metadata[<key>]
querymap of stringRequired

Kenmerken to look up by, as metadata[]=; at least one, all must match. Brackets may be sent raw or as %5B and %5D.

limit
queryintegerOptional

How many to return, 1 to 100.

cursor
querystringOptional

The nextCursor of the previous page.

Example request

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"

Responses

200 · OK

Returns a page of 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 · Errors

Get an appointment

GET/api/v1/appointments/{id}

Scope: appointments:read

One appointment of the organisation.

Parameters

id
pathstring · uuidRequired

The appointment's id.

Example request

curl https://api.schedulinq.com/api/v1/appointments/3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09 \
  -H "Authorization: Bearer $SCHEDULINQ_API_KEY"

Responses

200 · OK

Returns 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 · Errors

Schemas

User

admin
booleanOptional

Whether the colleague is (or will be) an admin of the organisation.

calendarConnected
booleanOptional

Whether the colleague has a calendar connected that Schedulinq reads. Absent on an invitation.

createdAt
string · date-timeOptional

When the colleague was added, or the invitation sent.

customFields
map of anyOptional

The colleague's custom fields, by key; only fields that still exist.

email
stringOptional

E-mail address.

firstName
stringOptional

First name.

id
string · uuidOptional

The colleague's id. Absent on an invitation.

invitationExpiresAt
string · date-timeOptional

When an invitation stops being valid. Present only while status is INVITED.

invitationId
string · uuidOptional

The invitation's id. Present only while status is INVITED.

lastName
stringOptional

Last name. Absent when the colleague has none.

metadata
map of stringOptional

Kenmerken the invitation was created with through the API. Present only on an invitation that has them.

name
stringOptional

First and last name.

roleId
string · uuidOptional

The colleague's role. Absent for an admin and for an invitation without a role.

schedulable
booleanOptional

Whether customers can be booked with this colleague. Absent on an invitation.

status
stringOptional

ACTIVE, INACTIVE or INVITED.

One of: ACTIVE, INACTIVE, INVITED

Service

colleagueIds
list of string · uuidOptional

The colleagues who perform the service.

createdAt
string · date-timeOptional

When the service was created.

durationMinutes
integer · int32Optional

How long the service takes, in minutes. Absent when it has no length of its own.

id
string · uuidOptional

The service's id.

identifier
stringOptional

The identifier the organisation gave the service.

name
stringOptional

The name in the organisation's own language.

names
map of stringOptional

The name per language, by language code.

Role

createdAt
string · date-timeOptional

When the role was created.

id
string · uuidOptional

The role's id.

name
stringOptional

The role's name.

customerId
string · uuidOptional

The customer: the one named by id, or the one found or created.

expiresAt
string · date-timeOptional

Until when the link can be opened, in the organisation's time zone.

id
string · uuidOptional

The link's id; appointments booked from it carry it as planningLinkId.

url
stringOptional

The one-time URL. Never store it, never show it in a list: mint a new one per click.

userId
string · uuidOptional

The colleague the planner opens on; absent when the link names none.

Invitation

address
AddressOptional

Where the appointment happens; absent when the customer gives it.

Show fields · Address
city
stringOptional

City.

at least 0 characters · at most 100 characters

country
stringOptional

ISO 3166-1 alpha-2 country code; the organisation's country when absent.

line1
stringOptional

Street and house number.

at least 0 characters · at most 255 characters

postalCode
stringOptional

Postal code.

at least 0 characters · at most 20 characters

appointmentIds
list of string · uuidOptional

The appointments booked from this invitation, earliest first; [] while none.

bookingPageClosed
booleanOptional

In the create's answer: true while the organisation's booking page takes no bookings; the first message is then queued but not sent.

bookingUrl
stringOptional

The customer's booking link. Only in the answer to the create; keep it from there.

colleagues
list of NamedRefOptional

The colleagues the customer can book with, by name.

Show fields · NamedRef
id
string · uuidOptional

Its id.

name
stringOptional

Its name.

createdAt
string · date-timeOptional

When it was created.

customerId
string · uuidOptional

The customer.

id
string · uuidOptional

The invitation's id.

initialEmailDeferred
booleanOptional

In the create's answer: true when the first message was not sent because the customer has no e-mail address.

lineageRootId
string · uuidOptional

When the invitation moves an earlier booking: the first appointment of that booking.

location
NamedRefOptional

The organisation's location the appointment is pinned to; absent when none.

Show fields · NamedRef
id
string · uuidOptional

Its id.

name
stringOptional

Its name.

locationMode
stringOptional

VIDEO or PHONE when the invitation is for a call; absent for a visit.

One of: AT_CUSTOMER, ON_LOCATION, VIDEO, PHONE

metadata
map of stringOptional

Kenmerken, in key order; {} when none.

rescheduledFromAppointmentId
string · uuidOptional

When the invitation moves an earlier booking: the cancelled appointment it replaces.

service
NamedRefOptional

The service.

Show fields · NamedRef
id
string · uuidOptional

Its id.

name
stringOptional

Its name.

status
stringOptional

PENDING (can be booked), USED (booked), CANCELLED or EXPIRED.

One of: PENDING, USED, CANCELLED, EXPIRED

updatedAt
string · date-timeOptional

When it last changed.

validUntil
string · dateOptional

The last day it can be booked, in the organisation's time zone. Absent = no end date.

Appointment

address
AddressOptional

Where it happens; absent for a call.

Show fields · Address
city
stringOptional

City.

at least 0 characters · at most 100 characters

country
stringOptional

ISO 3166-1 alpha-2 country code; the organisation's country when absent.

line1
stringOptional

Street and house number.

at least 0 characters · at most 255 characters

postalCode
stringOptional

Postal code.

at least 0 characters · at most 20 characters

cancellationReason
stringOptional

The reason given when it was cancelled, if any.

cancelledAt
string · date-timeOptional

When it was cancelled; absent unless CANCELLED.

cancelledBy
stringOptional

Who cancelled it: CUSTOMER, STAFF, SYSTEM, or STAFF_RESCHEDULE (cancelled by a colleague to be booked again); absent unless CANCELLED.

One of: CUSTOMER, STAFF, SYSTEM, STAFF_RESCHEDULE

colleagues
list of NamedRefOptional

The colleagues booked, by name.

Show fields · NamedRef
id
string · uuidOptional

Its id.

name
stringOptional

Its name.

createdAt
string · date-timeOptional

When it was created.

customerId
string · uuidOptional

The customer; absent for an appointment without one.

end
string · date-timeOptional

The end, in the organisation's time zone.

id
string · uuidOptional

The appointment's id.

invitationId
string · uuidOptional

The invitation it was booked from, if any.

lineageRootId
string · uuidOptional

The first appointment of the booking this one moves; absent when it was booked, not moved.

location
NamedRefOptional

The organisation's location it happens at; absent when none.

Show fields · NamedRef
id
string · uuidOptional

Its id.

name
stringOptional

Its name.

locationMode
stringOptional

AT_CUSTOMER, ON_LOCATION, VIDEO or PHONE.

One of: AT_CUSTOMER, ON_LOCATION, VIDEO, PHONE

meetingProvider
stringOptional

Who made the meeting link: GOOGLE_MEET, TEAMS or MANUAL.

One of: GOOGLE_MEET, TEAMS, MANUAL

meetingUrl
stringOptional

A video call's meeting link; absent until one exists.

metadata
map of stringOptional

Kenmerken, in key order; {} when none.

planningLinkId
string · uuidOptional

The planning link it was booked from, if any.

rescheduledFromId
string · uuidOptional

The appointment this one replaced when it was moved.

service
NamedRefOptional

The service.

Show fields · NamedRef
id
string · uuidOptional

Its id.

name
stringOptional

Its name.

start
string · date-timeOptional

The start, in the organisation's time zone.

status
stringOptional

CONFIRMED, COMPLETED or CANCELLED (PENDING and NO_SHOW are reserved).

One of: PENDING, CONFIRMED, COMPLETED, NO_SHOW, CANCELLED

timeZone
stringOptional

The organisation's time zone (IANA).

updatedAt
string · date-timeOptional

When it last changed.

Last updated October 2, 2026