Colleagues
Read your team members, create a buyer per campaign, and know when they are ready to be planned.
A buyer or installer who receives work from your CRM is a team member in Schedulinq, with their own working hours, service areas and calendar. This guide covers reading your team members and inviting new ones — the Create buyer button. What a team member sees and does in Schedulinq is in Invite your team and Team members.
Words
In the API a team member is a user: the endpoints are /api/v1/users. Webhooks call
them colleague, as in colleague.activated.
Reading
GET /api/v1/users (scope users:read) lists your team members and the open
invitations for new ones. Each item has a status:
ACTIVE— a team member;INACTIVE— a team member who was deactivated;INVITED— an invitation that has not been accepted yet, with itsinvitationIdandinvitationExpiresAt.
A team member also carries schedulable (whether customers can be booked with them),
calendarConnected (whether Schedulinq reads a calendar of theirs) and their custom
fields.
GET /api/v1/roles (scope users:write) lists the roles this key may give a new team
member. Use one of their ids as roleId.
Example request · GET /api/v1/users
curl "https://api.schedulinq.com/api/v1/users?limit=25" \
-H "Authorization: Bearer $SCHEDULINQ_API_KEY"Creating
POST /api/v1/users (scope users:write) invites someone by e-mail address.
Schedulinq sends the invitation mail.
Request body · POST /api/v1/users
{
"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"
}email, firstName, lastName and roleId are required. There is no field to make
someone an admin. There are three answers:
201: invited. A new invitation was made and the mail is on its way. This is also the
answer when an expired invitation for the same address was replaced; the
invitationId is then new. The body is the full item.
Response · 201
{
"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"
}200 with ACTIVE or INACTIVE: already a team member. Nothing changes and no mail
goes out. An INACTIVE team member is deactivated: planning links and invitations
refuse them until an admin activates them again.
Response · 200
{
"email": "sanne@installatiebedrijf-jansen.example",
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"status": "ACTIVE"
}200 with INVITED: already invited. The open invitation stays as it is, and no
second mail goes out.
Response · 200
{
"email": "piet+ov@loodgieter-bakker.example",
"invitationExpiresAt": "2026-10-08T09:12:00Z",
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e05",
"status": "INVITED"
}A 200 is a receipt — the status, the id, the email and an invitation's
invitationExpiresAt — unless the key also holds users:read; then it is the full
item.
The refusals you are most likely to meet:
- 409
errors.api.colleagueArchived: an archived team member has this address. Restore them in Schedulinq, or invite with another address. - 409
errors.api.emailInUseElsewhere: the address belongs to an account outside your organisation, which is never named. An address is only trimmed and lowercased, so a plus-address such aspiet+ov@…is a different address frompiet@…. If you use plus-addresses, check that your mail provider delivers them. - 400
errors.validation.roleRequired:roleIdis missing. - 403
errors.api.roleNotAssignable: the role is not among the key's roles, was deleted since, or belongs to another organisation. This problem has noerrors[]. - 409
errors.api.organisationScheduledForDeletion: the organisation accepts no changes. - 429
errors.api.colleagueInvitationLimit, withRetry-After: at most 200 create calls an hour per organisation by default — every create counts, repeats included — and 3 resends an hour per invitation. See Rate limits.
Seats and subscription
- During the trial there is no limit on team members.
- After the trial, a pending invitation takes a seat. A 409
errors.api.noSeatsAvailablemeans the paid seats are full, pending invitations included. The API never buys a seat; an admin adds one in Schedulinq. See Subscription and seats. - A 402
errors.api.trialUserLimitmeans the organisation has no access: the trial ended without a subscription, or the subscription lapsed. Then every create answers 402, also for someone who is already a team member. - After either is fixed, send a new
Idempotency-Key. The same key replays the refusal for 24 hours. See Idempotency.
The invitation mail
The mail goes out in the language you give as locale, else in your organisation's
language, and names your organisation. The link in it is valid for seven days.
Resending
POST /api/v1/users/invitations/{id}/resend (scope users:write) sends the invitation
again, with the invitationId from the list or the create answer.
- It sends a new link, valid for seven more days; the previous link stops working.
- An expired invitation is renewed — and then needs a seat — until the nightly clean-up deletes it. After that the resend answers 404: create the team member again.
- Once the invitation is accepted, the resend answers 409
errors.api.colleagueInvitationAccepted. - A key may resend only an invitation it could have made: never an admin invitation, and only one whose role is among the key's roles.
Idempotency-Keyis required, because a replayed resend would mail twice.
Example request · POST /api/v1/users/invitations/{id}/resend
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"Custom fields
customFields takes the values of your organisation's custom fields for team members,
by key. They are copied to the team member when they accept. Types are checked;
"required" is not enforced here. A key that is no custom field of your organisation is
refused with errors.api.custom_field_unknown_key. See
Custom fields.
After accepting
- If your organisation has Connect calendar on activation switched on (Team → Members → Actions), the new team member connects their Google or Microsoft calendar first.
- The webhook
colleague.activatedtells you the invitation was accepted, with itsinvitationIdand its metadata — your campaign id, for example. See Webhook events. calendarConnectedand the webhookscolleague.calendar_connectedandcolleague.calendar_disconnectedtell you about the calendar.- Services, service areas and working hours are set by an admin in Schedulinq.
schedulabletells you when customers can be booked with the team member.
A role for buyers
A buyer typically needs to see only their own appointments and no customers: a role with appointments at Own and no customer access. Create it once under Roles and permissions, and give your CRM's key only that role.
Frequently asked questions
Can I make a team member an admin through the API?
No. Admin is never a role a key can assign; an admin makes someone an admin in Schedulinq.
A buyer changed e-mail address. What now?
Change it in Schedulinq. A create with the new address would invite a second team member.
How do I undo an invitation my CRM sent by mistake?
Cancel it on the Team page in Schedulinq: it says "Via API" with the key's name. The API does not cancel invitations.