The machine-readable contract lives in the repository, in packages/openapi/openapi.yaml (OpenAPI 3.1). This page summarizes what you can use with an API key. Areas marked "dashboard-only" use the session of a team member (see Authentication).
| Method | Path | Scope | Description |
|---|
| GET | /slots | slots:read | Available times for a service |
| POST | /holds | bookings:write | Create a 10-minute hold |
| POST | /holds/{id}/confirm | bookings:write | Confirm (or pending_payment if a deposit is required) |
| DELETE | /holds/{id} | bookings:write | Release a hold |
| POST | /bookings | bookings:write | Hold and confirmation in one call |
| GET | /bookings | bookings:read | List (from, to, status, resource_id, customer_id) |
| GET / PATCH | /bookings/{id} | bookings:read / write | Read, update notes or intake data |
| POST | /bookings/{id}/cancel, /reschedule, /check-in, /no-show, /complete, /fail | bookings:write | Change the state |
A booking is a task with stages. Tasks without a time (for example deliveries) sit in a group's queue until someone takes them. See Work and actions.
| Method | Path | Scope | Description |
|---|
| GET | /work-items | bookings:read | Unified query: filters by view (inbox, today, upcoming), status, stage, unassigned, priority, tag, origin, q, date range and geographic box |
| PATCH | /work-items/{id} | bookings:write | Change priority, tags or due date (with optional expected_version) |
| POST | /bookings/{id}/actions/{key} | bookings:write | Run a stage action (take, release, complete, "not home"…) with Idempotency-Key |
| GET | /bookings/{id}/stage-history | bookings:read | Stage history |
| GET | /bookings/{id}/comments, /timeline | bookings:read | Comments and timeline |
| GET | /bookings/{id}/attachments, /location-events | bookings:read | Work evidence |
| GET | /conversations/{id}/work-items | bookings:read | Tasks created from a conversation |
| GET | /team/overview, /resources/{id}/stats | bookings:read | Team occupancy and statistics |
| Method | Path | Scope |
|---|
| GET / POST | /services, /resources, /resource-groups, /schedules | config:read / config:write |
| GET / PATCH / DELETE | /services/{id}, /resources/{id}, /resource-groups/{id}, /schedules/{id} | config:read / config:write |
| POST / DELETE | /schedules/{id}/overrides, /schedules/{id}/overrides/{date} | config:write |
| GET | /schedule-overrides | config:read |
| GET | /stage-config, /stage-config/versions, /stage-config/versions/{version} | config:read |
| PUT | /stage-config | settings:write |
| POST | /stage-config/versions/{version}/revert | settings:write |
| Method | Path | Scope | Description |
|---|
| GET | /customers | customers:read | List and search (q: name, email, company, tag or phone; phone, tag) |
| POST | /customers | customers:write | Manual creation. The phone is unique: if it exists, 409 customer_exists |
| GET / PATCH | /customers/{id} | customers:read / write | Read or edit (includes address with formatted, lat and lng) |
| GET | /customers/{id}/bookings, /summary, /timeline, /comments | customers:read | History, live summary, timeline and comments |
A customer can have several identities (WhatsApp, Telegram, WebChat) in identities[].
| Method | Path | Scope |
|---|
| GET | /conversations, /conversations/{id}, /conversations/{id}/messages | messages:read |
| POST | /conversations/{id}/messages | messages:write (answers 409 channel_paused if the channel is paused) |
| POST | /conversations/{id}/mode, /read, /resolve | messages:write |
| Method | Path | Scope |
|---|
| GET / PUT | /bot | config:read / config:write |
| GET / POST | /knowledge, /knowledge/files | config:read / config:write |
| POST | /knowledge/search | config:read |
| PATCH / DELETE | /knowledge/{id} | config:write |
| GET / POST / PATCH | /automations, /automations/{id} | config:read / config:write |
| Method | Path | Scope |
|---|
| GET / POST | /webhook-endpoints | webhooks:manage |
| GET / PATCH / DELETE | /webhook-endpoints/{id} | webhooks:manage |
| POST | /webhook-endpoints/{id}/rotate-secret, /ping, /deliveries/{delivery_id}/resend | webhooks:manage |
| GET | /webhook-endpoints/{id}/deliveries | webhooks:manage |
Details in Webhooks.
| Area | Routes |
|---|
| Channels and pauses | /channels, /channels/whatsapp, /channels/telegram, /channels/service-status, /channels/pauses, /channels/{channel}/pause and /resume; see Pauses and Status |
| Per-channel bot policy | /bot/channel-policies (see WebChat) |
| Knowledge sources | /knowledge/sources (see Knowledge) |
| Flows | /automation-flows (see Flows) |
| Project AI | /ai/usage, /ai/pause, /ai/resume, /ai/spam-guard, /ai/notices |
| Wagy | /assistant/*, the dashboard's setup assistant |
| Team and account | /team/*, /api-keys, /workspaces, /me/telegram, /me/notification-preferences |
| WebChat | /webchat-site (management) and /public/webchat/* (public, with the widget's publishable key) |
GET /v1/slots?service_id=svc_laser&from=2026-10-20T09:00:00-03:00&to=2026-10-20T20:00:00-03:00&around=2026-10-20T18:00:00-03:00
{
"data": [
{ "start": "2026-10-20T17:45:00-03:00", "end": "2026-10-20T18:30:00-03:00", "resource_ids": ["res_ana", "res_laser1", "res_room2"] },
{ "start": "2026-10-20T18:45:00-03:00", "end": "2026-10-20T19:30:00-03:00", "resource_ids": ["res_carla", "res_laser1", "res_room1"] }
],
"unavailable_reason": null
}
{
"id": "bkg_7Qx1",
"status": "confirmed",
"stage": "confirmed",
"service_id": "svc_laser",
"start": "2026-10-20T17:45:00-03:00",
"end": "2026-10-20T18:30:00-03:00",
"party_size": 1,
"customer": { "id": "cus_31", "name": "Marina", "phone": "+5521988887777", "locale": "pt" },
"allocations": [
{ "resource_id": "res_ana", "start": "2026-10-20T17:45:00-03:00", "end": "2026-10-20T18:40:00-03:00" },
{ "resource_id": "res_laser1", "start": "2026-10-20T17:45:00-03:00", "end": "2026-10-20T18:40:00-03:00" },
{ "resource_id": "res_room2", "start": "2026-10-20T17:45:00-03:00", "end": "2026-10-20T18:40:00-03:00" }
],
"priority": "normal",
"tags": [],
"source": "whatsapp",
"created_at": "2026-10-19T11:02:13-03:00"
}
Allocations include the buffer (here, 10 minutes after the service). On queue tasks, start and end are null until someone takes them.
These are the API's new features, all additive. The full history lives in the repository (docs/api/CHANGELOG.md).
- Customers: manual creation, extended data, address with
formatted, lat and lng, and multichannel identities[]. - Tasks and actions: unified
GET /work-items query, action executor with effects (take, release, outcomes) and 409 already_claimed. - Messages with location: WhatsApp, Telegram and WebChat store the shared location in the conversation.
- Pauses: when a channel is paused, sending a message answers
409 channel_paused. - Knowledge: site-type sources with
max_pages and errors by cause.