Documentation menu

API reference

86 operations in scheduling. Raw spec: openapi.json.

GET/api/v1/appointment-requests

GET /api/appointment-requests — the staff queue (optionally narrowed by status), newest first.

Parameters

NameInTypeRequiredDescription
statusquerynull | AppointmentRequestStatusNoExact status: `pending | approved | declined | cancelled`.
limitqueryintegerNo
offsetqueryintegerNo

Responses

StatusDescription
200

Security: bearer

POST/api/v1/appointment-requests/{id}/approve

POST /api/appointment-requests/{id}/approve — book the requested slot on the staff member's calendar. Re-validates availability + conflicts at decision time (the client's listing may be stale); a slot that stopped being free is a typed 409, never a wedged booking. Emits BOTH `appointment.created` (the booking enters the world through the normal creation event) and `appointment_request.approved`.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

DecideAppointmentRequest

Responses

StatusDescription
200
404request not found in scope
409not pending, slot no longer free, double-booking backstop, version conflict, or idempotency key reused

Security: bearer

POST/api/v1/appointment-requests/{id}/decline

POST /api/appointment-requests/{id}/decline — refuse a pending request. No calendar effect; the note reaches the client.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

DecideAppointmentRequest

Responses

StatusDescription
200
404request not found in scope
409not pending, version conflict, or idempotency key reused

Security: bearer

POST/api/v1/appointments

POST /api/appointments — create a booking (409 on overlap).

Request body

CreateAppointmentRequest

Responses

StatusDescription
201
409slot already booked

Security: bearer

GET/api/v1/appointments/{id}

GET /api/appointments/{id} — fetch one booking in the caller's org.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

PATCH/api/v1/appointments/{id}

PATCH /api/appointments/{id} — edit fields/status (times unchanged; moves use the dedicated endpoint so clients get rescheduled events).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

PatchAppointmentRequest

Responses

StatusDescription
200
404

Security: bearer

POST/api/v1/appointments/{id}/cancel

POST /api/appointments/{id}/cancel — frees the slot (status flip, never deletion, so history survives).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

POST/api/v1/appointments/{id}/move

POST /api/appointments/{id}/move — reschedule with re-validation (dry-run semantics inline: a conflicting move is rejected atomically and emits a `rescheduled` event only when it lands).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

MoveAppointmentRequest

Responses

StatusDescription
200
404
409target slot already booked

Security: bearer

GET/api/v1/availability

GET /api/availability — list one user's weekly templates.

Parameters

NameInTypeRequiredDescription
user_idquery—NoWhose windows. Defaults to the caller; another user requires owner/admin.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/availability

POST /api/availability — add a weekly template for a user.

Request body

CreateAvailabilityRequest

Responses

StatusDescription
201

Security: bearer

DELETE/api/v1/availability/{id}

DELETE /api/availability/{id}?user_id= — remove one template.

Parameters

NameInTypeRequiredDescription
idpathstringYes
user_idquerystringYesOwner of the row being deleted (must match self-or-admin rule).

Responses

StatusDescription
204
404

Security: bearer

GET/api/v1/calendar-exclusions

GET /api/calendar-exclusions?user_id=&from=&to=

Parameters

NameInTypeRequiredDescription
user_idquery—No
fromquery—No
toquery—No

Responses

StatusDescription
200

Security: bearer

POST/api/v1/calendar-exclusions

POST /api/calendar-exclusions — record time-off.

Request body

CreateExclusionRequest

Responses

StatusDescription
201

Security: bearer

DELETE/api/v1/calendar-exclusions/{id}

DELETE /api/calendar-exclusions/{id}?user_id=

Parameters

NameInTypeRequiredDescription
idpathstringYes
user_idquerystringYesOwner of the row being deleted (must match self-or-admin rule).

Responses

StatusDescription
204
404

Security: bearer

GET/api/v1/calendar-sync

GET /api/calendar-sync — the caller's (or target user's) connections.

Parameters

NameInTypeRequiredDescription
user_idquery—NoWhose windows. Defaults to the caller; another user requires owner/admin.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/calendar-sync

POST /api/calendar-sync — create a connection. Outbound-capable directions get a feed token generated immediately (returned once).

Request body

CreateConnectionRequest

Responses

StatusDescription
201

Security: bearer

GET/api/v1/calendar-sync/feed/{token}

GET /api/calendar-sync/feed/{token} — the OUTBOUND direction: the user's live appointments as a subscribable iCalendar document. Unauthenticated but token-scoped and rate-limited (the scheduling-links pattern); the token resolves org + user, then the read is org-scoped. The token-to-org resolution runs through the `app_resolve_calendar_feed_target` SECURITY DEFINER bridge (migration 0132) — the token is in the URL with no session, so the row is default-deny off the bare pool under RLS.

Parameters

NameInTypeRequiredDescription
tokenpathstringYes

Responses

StatusDescription
200
404unknown token
429
PATCH/api/v1/calendar-sync/{id}

PATCH /api/calendar-sync/{id} — edit name/direction/feed_url/status.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

UpdateConnectionRequest

Responses

StatusDescription
200
404

Security: bearer

DELETE/api/v1/calendar-sync/{id}

DELETE /api/calendar-sync/{id} — the connection, its mirror rows, and the exclusion rows the sync owns all go away (external busy time frees the calendar).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
204
404

Security: bearer

GET/api/v1/calendar-sync/{id}/events

GET /api/calendar-sync/{id}/events — the inbound mirror (the conflict/duplicate surface Wave 14 lane 7 renders).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

POST/api/v1/calendar-sync/{id}/rotate-token

POST /api/calendar-sync/{id}/rotate-token — invalidates the old outbound feed URL and returns the new raw token once.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

POST/api/v1/calendar-sync/{id}/sync

POST /api/calendar-sync/{id}/sync — poll now (manual trigger; the worker lane calls the same seam on its schedule). Network fetch happens OUTSIDE the transaction; the apply + poll-state record + event emission run inside ONE org transaction.

Parameters

NameInTypeRequiredDescription
idpathstringYes
forcepathbooleanYesForce a poll even when the connection is disabled (admin repair).

Responses

StatusDescription
200
404
503external calendar unreachable/unreadable

Security: bearer

GET/api/v1/calendar/day

GET /api/calendar/day — one local day for one user.

Parameters

NameInTypeRequiredDescription
user_idquery—NoWhose calendar. Defaults to the caller; another user requires owner/admin.
datequery—NoLocal date in the TARGET user's timezone. Day view: the day itself. Week view: any date inside the week (Monday-start). Defaults to today in that timezone.

Responses

StatusDescription
200

Security: bearer

GET/api/v1/calendar/deadlines

GET /api/calendar/deadlines — the ORG-WIDE ticket-deadline read model (Wave 17 lane 13): /calendar team mode overlays THIS instead of the bounded page-1 tickets fetch. Alive tickets only (category not closed) whose due date falls in the window; hydrated in the row itself.

Parameters

NameInTypeRequiredDescription
fromquery—NoAbsolute UTC window [from, to); capped at 62 days like the team view (a deadline overlay never walks quarterly ranges).
toquery—No
assignee_idquery—NoOptional per-person narrowing (personal mode rides the same model).

Responses

StatusDescription
200
422validation failed

Security: bearer

GET/api/v1/calendar/team

GET /api/calendar/team — every org member over an absolute UTC range.

Parameters

NameInTypeRequiredDescription
fromquery—NoInclusive window start (default: today's UTC midnight minus 1 day).
toquery—NoExclusive window end (default: `from` + 8 days).

Responses

StatusDescription
200

Security: bearer

GET/api/v1/calendar/week

GET /api/calendar/week — Monday-start local week for one user.

Parameters

NameInTypeRequiredDescription
user_idquery—NoWhose calendar. Defaults to the caller; another user requires owner/admin.
datequery—NoLocal date in the TARGET user's timezone. Day view: the day itself. Week view: any date inside the week (Monday-start). Defaults to today in that timezone.

Responses

StatusDescription
200

Security: bearer

GET/api/v1/day-pack

day_pack_read

Parameters

NameInTypeRequiredDescription
datequery—NoThe day to assemble; defaults to today (UTC). Callers with a local timezone pass their own date so the panel agrees with the wall clock.

Responses

StatusDescription
200

Security: bearer

GET/api/v1/day-pack/picks

day_pack_picks_list

Parameters

NameInTypeRequiredDescription
ticket_idquerystringYes

Responses

StatusDescription
200

Security: bearer

POST/api/v1/day-pack/picks

day_pack_pick_create

Request body

CreatePickRequest

Responses

StatusDescription
200
409
422

Security: bearer

DELETE/api/v1/day-pack/picks/{id}

day_pack_pick_delete

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

GET/api/v1/day-pack/rules

day_pack_rules_list

Responses

StatusDescription
200

Security: bearer

POST/api/v1/day-pack/rules

day_pack_rule_create

Request body

CreateRuleRequest

Responses

StatusDescription
200
409
422

Security: bearer

PATCH/api/v1/day-pack/rules/{id}

day_pack_rule_patch

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

PatchRuleRequest

Responses

StatusDescription
200
404

Security: bearer

DELETE/api/v1/day-pack/rules/{id}

day_pack_rule_delete

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

POST/api/v1/day-pack/ticks

day_pack_tick_create

Request body

CreateTickRequest

Responses

StatusDescription
200
422

Security: bearer

DELETE/api/v1/day-pack/ticks

day_pack_tick_delete

Parameters

NameInTypeRequiredDescription
datequerystringYes
line_keyquerystringYes

Responses

StatusDescription
200
404

Security: bearer

POST/api/v1/dispatch/assign

POST /api/dispatch/assign — place an unassigned ticket on a technician's board: creates the booking AND flips the ticket assignee in one transaction.

Request body

AssignRequest

Responses

StatusDescription
201
409slot already booked

Security: bearer

POST/api/v1/dispatch/bulk-move

POST /api/dispatch/bulk-move — atomic batch reschedule.

Every move is re-validated against the TARGET user's live bookings in the union window (each moved booking vacates its old slot, so swaps are legal); the first violating move rejects the WHOLE batch with a typed 409 naming the move index and blocking booking.

Request body

BulkMoveRequest

Responses

StatusDescription
200
409target slot already booked (typed conflict)

Security: bearer

GET/api/v1/dispatch/capacity

GET /api/dispatch/capacity — multi-day capacity horizon: the day view's capacity math repeated per UTC day over the window, one org-wide availability read + one exclusion read + one appointment read.

Parameters

NameInTypeRequiredDescription
fromquery—No
daysquery—NoHorizon length in days (1..=31).

Responses

StatusDescription
200

Security: bearer

GET/api/v1/dispatch/day

GET /api/dispatch/day — the whole board for one day.

Parameters

NameInTypeRequiredDescription
datequery—NoThe day to assemble; defaults to today (UTC).

Responses

StatusDescription
200

Security: bearer

GET/api/v1/dispatch/journey-start

GET /api/dispatch/journey-start — the resolved start point plus the explicit override, if any.

Parameters

NameInTypeRequiredDescription
user_idquery—NoWhose journey; defaults to the caller (another user requires owner/admin).
datequery—NoThe day; defaults to today (UTC).

Responses

StatusDescription
200

Security: bearer

PUT/api/v1/dispatch/journey-start

PUT /api/dispatch/journey-start — set (or replace) the technician's start point for one day.

Request body

SetJourneyStartRequest

Responses

StatusDescription
200
404site not found in scope
409idempotency key reused
422invalid start point

Security: bearer

GET/api/v1/dispatch/match

GET /api/dispatch/match — for every unassigned open ticket carrying required skills, the active technicians sorted best-first by how many required skills they are missing (0 = fully qualified). Expired certifications never count as held.

Parameters

NameInTypeRequiredDescription
limitquery—No

Responses

StatusDescription
200

Security: bearer

GET/api/v1/dispatch/planning/allocations

GET /api/dispatch/planning/allocations — who is committed to which phase.

Parameters

NameInTypeRequiredDescription
project_idquery—No

Responses

StatusDescription
200

Security: bearer

PUT/api/v1/dispatch/planning/allocations

PUT /api/dispatch/planning/allocations — state (or restate) a technician's commitment to a phase.

Upsert on `(phase_id, user_id)`, so restating a share updates the row. Appending instead would leave two contradictory shares that SUM in the forecast and report a technician as over-committed by construction.

Request body

PhaseAllocationMutation

Responses

StatusDescription
200

Security: bearer

DELETE/api/v1/dispatch/planning/allocations/{allocation_id}

DELETE /api/dispatch/planning/allocations/{id} — release a commitment.

Parameters

NameInTypeRequiredDescription
allocation_idpathstringYes

Responses

StatusDescription
200
404no such allocation

Security: bearer

GET/api/v1/dispatch/planning/forecast

GET /api/dispatch/planning/forecast — committed project load per technician over a window.

Parameters

NameInTypeRequiredDescription
fromquery—No
daysquery—NoHorizon length in days (1..=31).

Responses

StatusDescription
200

Security: bearer

GET/api/v1/dispatch/queue

GET /api/dispatch/queue — the full unassigned queue with dispatcher overrides applied: overridden tickets sort by explicit rank first (ties fall back to the computed order), then everything else in the computed order (priority rank, then effective SLA/due deadline).

Parameters

NameInTypeRequiredDescription
limitquery—NoPage size, clamped to [1, 500].

Responses

StatusDescription
200

Security: bearer

PUT/api/v1/dispatch/queue/{ticket_id}

PUT /api/dispatch/queue/{ticket_id} — pin a ticket's queue position. The ticket must exist and still be open+unassigned (an override for a placed ticket is meaningless); idempotent via the instant envelope.

Parameters

NameInTypeRequiredDescription
ticket_idpathstringYes

Request body

SetQueueRankRequest

Responses

StatusDescription
200
404ticket not visible or not open/unassigned
409version conflict or idempotency key reused

Security: bearer

DELETE/api/v1/dispatch/queue/{ticket_id}

DELETE /api/dispatch/queue/{ticket_id} — clear a rank override. Idempotent: clearing an unset override still returns 200 with `cleared: false` (the dispatcher's intent is already satisfied).

Parameters

NameInTypeRequiredDescription
ticket_idpathstringYes

Responses

StatusDescription
200
404ticket not visible

Security: bearer

GET/api/v1/dispatch/reconciliation

GET /api/dispatch/reconciliation — planned-vs-actual rollup over the existing travel drafts and their linked expenses: mileage, time, and reimbursements per technician, in the org's base currency.

Parameters

NameInTypeRequiredDescription
fromquery—NoInclusive window start (default: 14 days before `to`).
toquery—NoExclusive window end (default: now). Capped at 366 days.
user_idquery—No

Responses

StatusDescription
200

Security: bearer

GET/api/v1/dispatch/routing

GET /api/dispatch/routing — the day's journey plans, typed warnings, and (measured providers only) suggestion-grade route improvements.

Parameters

NameInTypeRequiredDescription
datequery—NoThe day to assemble; defaults to today (UTC), matching the board.

Responses

StatusDescription
200

Security: bearer

GET/api/v1/dispatch/skills

GET /api/dispatch/skills — the org's skill/certification catalog.

Responses

StatusDescription
200

Security: bearer

PUT/api/v1/dispatch/tickets/{ticket_id}/required-skills

PUT /api/dispatch/tickets/{ticket_id}/required-skills — full-replace the job's required-skill set. The ticket must exist and be open + unassigned (requirements on placed work are history, not planning).

Parameters

NameInTypeRequiredDescription
ticket_idpathstringYes

Request body

ReplaceTicketSkillsRequest

Responses

StatusDescription
200
404ticket not visible in scope (rls_sparse)
409version conflict or idempotency key reused
422validation failed (labels, duplicates, count)

Security: bearer

GET/api/v1/dispatch/travel-drafts

GET /api/dispatch/travel-drafts — the caller's drafts (all users for owner/admin via `user_id`), newest first.

Parameters

NameInTypeRequiredDescription
user_idquery—No
statusquery—No`draft` | `submitted`.
limitquery—NoPage size, clamped to [1, 200].

Responses

StatusDescription
200

Security: bearer

POST/api/v1/dispatch/travel-drafts

POST /api/dispatch/travel-drafts — a draft mileage row against a ticket. Instant-first (IF1/IF2): idempotency-keyed, version-gated, write-trailed.

Request body

CreateTravelDraftRequest

Responses

StatusDescription
200
404ticket not visible in scope (rls_sparse)
409version conflict or idempotency key reused
422validation failed

Security: bearer

PATCH/api/v1/dispatch/travel-drafts/{id}

PATCH /api/dispatch/travel-drafts/{id} — edit a draft. Submitted drafts are frozen (the time entry already exists).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

PatchTravelDraftRequest

Responses

StatusDescription
200
404not visible, or already submitted
409version conflict or idempotency key reused
422validation failed

Security: bearer

DELETE/api/v1/dispatch/travel-drafts/{id}

DELETE /api/dispatch/travel-drafts/{id} — discard a draft. Submitted drafts are immutable history (delete the TIME ENTRY through invoicing corrections, never the draft's backlink).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404not visible, or already submitted

Security: bearer

POST/api/v1/dispatch/travel-drafts/{id}/expense

POST /api/dispatch/travel-drafts/{id}/expense — book the draft's mileage as a ticket expense at the org rate (the reimbursement the business owes the technician or bills the client). One expense per draft, idempotent through the standard envelope.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

CreateTravelExpenseRequest

Responses

StatusDescription
200
404draft not found in scope
409draft already expensed or key reused
422invalid amount

Security: bearer

POST/api/v1/dispatch/travel-drafts/{id}/submit

POST /api/dispatch/travel-drafts/{id}/submit — convert a draft into a real time entry through the EXISTING time-entry path (`insert_time_entry` + the `time_entry.created` event), then freeze the draft with the entry backlink. The entry's notes carry the machine-readable provenance marker (`travel_draft:<id>`); the write trail records the full before/after so "who did this" and undo stay queryable. Idempotent: the same submit replays the SAME entry.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

SubmitTravelDraftRequest

Responses

StatusDescription
200
404draft not visible in scope (rls_sparse)
409already submitted, version conflict, or idempotency key reused

Security: bearer

PUT/api/v1/dispatch/users/{user_id}/skills

PUT /api/dispatch/users/{user_id}/skills — full-replace the technician's skill set. The technician must be an active member of this org.

Parameters

NameInTypeRequiredDescription
user_idpathstringYes

Request body

ReplaceUserSkillsRequest

Responses

StatusDescription
200
404user not visible in scope
409version conflict or idempotency key reused
422validation failed (labels, expiry, duplicates)

Security: bearer

GET/api/v1/dispatch/work-next

GET /api/dispatch/work-next — the caller's curated queue, or another technician's when the caller may see theirs.

Parameters

NameInTypeRequiredDescription
user_idquery—NoWhose queue to read. Admins may read another technician's (a dispatcher setting up a shift); anyone may read their own, and a non-admin asking for someone else is refused rather than silently served their own.

Responses

StatusDescription
200

Security: bearer

PUT/api/v1/dispatch/work-next

PUT /api/dispatch/work-next — add a ticket to a technician's queue at a position, or move it there if the pair already exists.

Request body

WorkNextMutation

Responses

StatusDescription
200

Security: bearer

DELETE/api/v1/dispatch/work-next

DELETE /api/dispatch/work-next?ticket_id=… — drop a ticket from one technician's queue, or from every queue when `user_id` is absent.

Parameters

NameInTypeRequiredDescription
ticket_idquerystringYes
user_idquerystringNo

Responses

StatusDescription
200

Security: bearer

POST/api/v1/dispatch/work-next/reorder

POST /api/dispatch/work-next/reorder — move an entry and return the densified queue.

Returns the WHOLE queue rather than just the moved row because the move shifts everything between the old and new rank. A response with only the moved entry would leave the client guessing the positions of everything it did not drag, which is exactly the state a drag-and-drop list must not be in.

Request body

WorkNextMutation

Responses

StatusDescription
200

Security: bearer

GET/api/v1/meeting-types

GET /api/meeting-types

Responses

StatusDescription
200

Security: bearer

POST/api/v1/meeting-types

POST /api/meeting-types

Request body

MeetingTypeBody

Responses

StatusDescription
201
422validation failure

Security: bearer

PATCH/api/v1/meeting-types/{id}

PATCH /api/meeting-types/{id}

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

MeetingTypeBody

Responses

StatusDescription
200
404
409version conflict or idempotency key reused

Security: bearer

DELETE/api/v1/meeting-types/{id}

DELETE /api/meeting-types/{id} — HARD delete with audit (Wave 17 lane 13): unlike the Pause toggle (PATCH `is_active`), this removes the template outright. A scheduling link still referencing the row refuses with a typed conflict (the FK RESTRICT surfaces) — pause the links FIRST or re-target them; history rows (bookings) are untouched by the template's deletion.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404meeting type not visible in scope
409a scheduling link still references this meeting type

Security: bearer

GET/api/v1/on-call-blocks

GET /api/on-call-blocks?user_id=&from=&to=

Parameters

NameInTypeRequiredDescription
user_idpath—YesWhose calendar. Defaults to the caller; another user requires owner/admin.
datepath—YesLocal date in the TARGET user's timezone. Day view: the day itself. Week view: any date inside the week (Monday-start). Defaults to today in that timezone.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/on-call-blocks

POST /api/on-call-blocks — add a rotation segment (409 when stacking).

Request body

CreateOnCallRequest

Responses

StatusDescription
201
409overlapping rotation

Security: bearer

DELETE/api/v1/on-call-blocks/{id}

DELETE /api/on-call-blocks/{id}?user_id=

Parameters

NameInTypeRequiredDescription
idpathstringYes
user_idquerystringYesOwner of the row being deleted (must match self-or-admin rule).

Responses

StatusDescription
204
404

Security: bearer

GET/api/v1/scheduling-groups

GET /api/scheduling-groups — the org's free-form groups (availability pools; deliberately NOT the org chart).

Responses

StatusDescription
200

Security: bearer

POST/api/v1/scheduling-groups

POST /api/scheduling-groups — create a pool.

Request body

CreateGroupRequest

Responses

StatusDescription
201
409name already taken

Security: bearer

GET/api/v1/scheduling-groups/{id}

GET /api/scheduling-groups/{id}

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

PATCH/api/v1/scheduling-groups/{id}

PATCH /api/scheduling-groups/{id}

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

UpdateGroupRequest

Responses

StatusDescription
200
404
409version conflict or idempotency key reused

Security: bearer

DELETE/api/v1/scheduling-groups/{id}

DELETE /api/scheduling-groups/{id} — removes the pool (memberships go with it; meeting types pointed at it retire with their FK CASCADE, mirroring Calendly's delete semantics).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
204
404

Security: bearer

POST/api/v1/scheduling-groups/{id}/members

POST /api/scheduling-groups/{id}/members — add a calendar to the pool.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

AddMemberRequest

Responses

StatusDescription
200
404

Security: bearer

DELETE/api/v1/scheduling-groups/{id}/members/{user_id}

DELETE /api/scheduling-groups/{id}/members/{user_id}

Parameters

NameInTypeRequiredDescription
idpathstringYes
user_idpathstringYes

Responses

StatusDescription
200
404

Security: bearer

POST/api/v1/scheduling/conflict-check

POST /api/scheduling/conflict-check — dry-run overlap probe that writes nothing: returns every blocking booking for the candidate slot.

Request body

ConflictCheckRequest

Responses

StatusDescription
200

Security: bearer