API: links
Create, change and delete booking links, for you or a team, and choose your handle.
All paths are under https://api.quorumcal.com. Send Authorization: Bearer <token>, and optionally Quorum-Version: 2026-10-20. Body properties are listed as arguments with In = body.
handle set
Section titled “handle set”Choose your handle: PUT /v1/me/handle
Claims your address in the shared namespace (quorumcal.com/{handle}); personal links and polls need it. Set once: renames aren’t supported yet, so a second call answers 409 handle_already_set. Reserved names, taken handles and handles held for 90 days after release are refused. Needs a session or a credential with links:write that isn’t limited to orgs.
- Needs:
links:write(not for credentials limited to some orgs) - CLI:
quorum handle set - MCP tool:
handle_set - Returns:
200 Me
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
handle |
body | string | yes |
links create
Section titled “links create”Create a booking link: POST /v1/me/links
The link is yours, public at quorumcal.com/{your handle}/{link slug}. The link is public once it is ready. Its slug must be free among the owner’s links; at an org’s root (publishAtRoot, teams with root publishing only) it must also be free among the org’s team slugs and root links.
- Needs:
links:write(not for credentials limited to some orgs) - CLI:
quorum links create - MCP tool:
links_create - Returns:
201 BookingLink
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
slug |
body | string | yes | |
publishAtRoot |
body | boolean | Team links only, and only for a team with root publishing: publish at quorumcal.com/{org}/{slug} instead of under the team. The other address redirects. Root slugs share one namespace with the org’s team slugs. Defaults to false | |
title |
body | string | yes | |
description |
body | string | ||
durationMinutes |
body | integer | yes | |
intervalMinutes |
body | integer | Start times are offered every this many minutes. Defaults to 30 | |
minNoticeMinutes |
body | integer | Defaults to 60 | |
bufferBeforeMinutes |
body | integer | ||
bufferAfterMinutes |
body | integer | ||
timezone |
body | string | yes | |
hoursMode |
body | LinkHoursMode | schedules: each person’s default schedule applies. link: only the link’s own weekly hours apply | |
weekly |
body | WeeklyInterval[] | The link’s own hours, used when hoursMode is link | |
hostId |
body | string (uuid) | Optional. A host must be free and never counts toward a pool. Without one, a slot needs only the pools | |
organizer |
body | LinkOrganizer | Whose calendar holds the event when there is no host: the link’s creator (default) or the first person assigned. A creator who isn’t attending sees the event as free | |
meet |
body | boolean | Null follows the workspace default | |
pools |
body | LinkPoolInput[] | ||
cc |
body | LinkCcInput[] | Invited to every booking as optional and never reserved |
links delete
Section titled “links delete”Delete a booking link: DELETE /v1/me/links/{linkId}
Past and upcoming bookings stay (and keep their reservations); the link just stops taking new ones.
- Needs:
links:write(not for credentials limited to some orgs) - CLI:
quorum links delete - MCP tool:
links_delete - Returns: no body
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
linkId |
path | string (uuid) | yes |
links get
Section titled “links get”Get a booking link: GET /v1/me/links/{linkId}
- Needs:
links:read(not for credentials limited to some orgs) - CLI:
quorum links get - MCP tool:
links_get - Returns:
200 BookingLink
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
linkId |
path | string (uuid) | yes |
links update
Section titled “links update”Change a booking link: PATCH /v1/me/links/{linkId}
Send only what changes. pools and cc, when sent, replace the whole list: pools carrying an existing id keep their assignment history, and pools left out are deleted. Existing bookings are unaffected. Changing the slug leaves a permanent redirect from the old address.
- Needs:
links:write(not for credentials limited to some orgs) - CLI:
quorum links update - MCP tool:
links_update - Returns:
200 BookingLink
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
linkId |
path | string (uuid) | yes | |
slug |
body | string | ||
publishAtRoot |
body | boolean | Team links only, and only for a team with root publishing: publish at quorumcal.com/{org}/{slug} instead of under the team. The other address redirects. Root slugs share one namespace with the org’s team slugs. Defaults to false | |
title |
body | string | ||
description |
body | string | ||
durationMinutes |
body | integer | ||
intervalMinutes |
body | integer | Start times are offered every this many minutes. Defaults to 30 | |
minNoticeMinutes |
body | integer | Defaults to 60 | |
bufferBeforeMinutes |
body | integer | ||
bufferAfterMinutes |
body | integer | ||
timezone |
body | string | ||
hoursMode |
body | LinkHoursMode | schedules: each person’s default schedule applies. link: only the link’s own weekly hours apply | |
weekly |
body | WeeklyInterval[] | The link’s own hours, used when hoursMode is link | |
hostId |
body | string (uuid) | Optional. A host must be free and never counts toward a pool. Without one, a slot needs only the pools | |
organizer |
body | LinkOrganizer | Whose calendar holds the event when there is no host: the link’s creator (default) or the first person assigned. A creator who isn’t attending sees the event as free | |
meet |
body | boolean | Null follows the workspace default | |
pools |
body | LinkPoolInput[] | ||
cc |
body | LinkCcInput[] | Invited to every booking as optional and never reserved |
team links create
Section titled “team links create”Create a booking link: POST /v1/orgs/{handle}/teams/{teamPath}/links
Team admins and org admins only. The link is public at its team’s address. The link is public once it is ready. Its slug must be free among the owner’s links; at an org’s root (publishAtRoot, teams with root publishing only) it must also be free among the org’s team slugs and root links.
- Needs:
links:write - CLI:
quorum team links create - MCP tool:
team_links_create - Returns:
201 BookingLink
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
handle |
path | string | yes | |
teamPath |
path | string | yes | The team’s slug or id |
slug |
body | string | yes | |
publishAtRoot |
body | boolean | Team links only, and only for a team with root publishing: publish at quorumcal.com/{org}/{slug} instead of under the team. The other address redirects. Root slugs share one namespace with the org’s team slugs. Defaults to false | |
title |
body | string | yes | |
description |
body | string | ||
durationMinutes |
body | integer | yes | |
intervalMinutes |
body | integer | Start times are offered every this many minutes. Defaults to 30 | |
minNoticeMinutes |
body | integer | Defaults to 60 | |
bufferBeforeMinutes |
body | integer | ||
bufferAfterMinutes |
body | integer | ||
timezone |
body | string | yes | |
hoursMode |
body | LinkHoursMode | schedules: each person’s default schedule applies. link: only the link’s own weekly hours apply | |
weekly |
body | WeeklyInterval[] | The link’s own hours, used when hoursMode is link | |
hostId |
body | string (uuid) | Optional. A host must be free and never counts toward a pool. Without one, a slot needs only the pools | |
organizer |
body | LinkOrganizer | Whose calendar holds the event when there is no host: the link’s creator (default) or the first person assigned. A creator who isn’t attending sees the event as free | |
meet |
body | boolean | Null follows the workspace default | |
pools |
body | LinkPoolInput[] | ||
cc |
body | LinkCcInput[] | Invited to every booking as optional and never reserved |
team links delete
Section titled “team links delete”Delete a booking link: DELETE /v1/orgs/{handle}/teams/{teamPath}/links/{linkId}
Past and upcoming bookings stay (and keep their reservations); the link just stops taking new ones.
- Needs:
links:write - CLI:
quorum team links delete - MCP tool:
team_links_delete - Returns: no body
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
handle |
path | string | yes | |
teamPath |
path | string | yes | The team’s slug or id |
linkId |
path | string (uuid) | yes |
team links get
Section titled “team links get”Get a booking link: GET /v1/orgs/{handle}/teams/{teamPath}/links/{linkId}
- Needs:
links:read - CLI:
quorum team links get - MCP tool:
team_links_get - Returns:
200 BookingLink
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
handle |
path | string | yes | |
teamPath |
path | string | yes | The team’s slug or id |
linkId |
path | string (uuid) | yes |
team links update
Section titled “team links update”Change a booking link: PATCH /v1/orgs/{handle}/teams/{teamPath}/links/{linkId}
Send only what changes. pools and cc, when sent, replace the whole list: pools carrying an existing id keep their assignment history, and pools left out are deleted. Existing bookings are unaffected. Changing the slug leaves a permanent redirect from the old address.
- Needs:
links:write - CLI:
quorum team links update - MCP tool:
team_links_update - Returns:
200 BookingLink
| Argument | In | Type | Required | Description |
|---|---|---|---|---|
handle |
path | string | yes | |
teamPath |
path | string | yes | The team’s slug or id |
linkId |
path | string (uuid) | yes | |
slug |
body | string | ||
publishAtRoot |
body | boolean | Team links only, and only for a team with root publishing: publish at quorumcal.com/{org}/{slug} instead of under the team. The other address redirects. Root slugs share one namespace with the org’s team slugs. Defaults to false | |
title |
body | string | ||
description |
body | string | ||
durationMinutes |
body | integer | ||
intervalMinutes |
body | integer | Start times are offered every this many minutes. Defaults to 30 | |
minNoticeMinutes |
body | integer | Defaults to 60 | |
bufferBeforeMinutes |
body | integer | ||
bufferAfterMinutes |
body | integer | ||
timezone |
body | string | ||
hoursMode |
body | LinkHoursMode | schedules: each person’s default schedule applies. link: only the link’s own weekly hours apply | |
weekly |
body | WeeklyInterval[] | The link’s own hours, used when hoursMode is link | |
hostId |
body | string (uuid) | Optional. A host must be free and never counts toward a pool. Without one, a slot needs only the pools | |
organizer |
body | LinkOrganizer | Whose calendar holds the event when there is no host: the link’s creator (default) or the first person assigned. A creator who isn’t attending sees the event as free | |
meet |
body | boolean | Null follows the workspace default | |
pools |
body | LinkPoolInput[] | ||
cc |
body | LinkCcInput[] | Invited to every booking as optional and never reserved |