API reference
Me
The signed-in user
| Method | Path | Summary |
|---|---|---|
GET | /v1/me | The signed-in user, their account, role, groups, vocabulary and permissions |
POST | /v1/me/accept-invite | Accept a pending invite after signing in from the invite email. Refresh the session afterwards. |
GET | /v1/me/actions | My tasks: the action items assigned to me, open and snoozed, due soonest first. Items come from fixed rules, never the model |
POST | /v1/me/actions/{actionId}/dismiss | Dismiss one of my tasks, with a note for the team saying why |
POST | /v1/me/actions/{actionId}/done | Mark one of my tasks done, with an optional note for the team |
POST | /v1/me/actions/{actionId}/hand-back | Give one of my tasks back: it goes to the booking's assignee, else the community's backup contacts |
POST | /v1/me/actions/{actionId}/snooze | Snooze one of my tasks until a time, up to 30 days away |
GET | /v1/me/api-tokens | Your personal API tokens |
POST | /v1/me/api-tokens | Make a personal API token, up to your own role. It is shown once and ends in 30, 90 or 365 days |
DELETE | /v1/me/api-tokens/{tokenId} | Revoke one of your tokens. It stops working at once |
GET | /v1/me/availability | My hours: when I take meetings, on calls and on booking pages |
POST | /v1/me/availability | Add a named schedule; the first one becomes my default |
GET | /v1/me/availability/preview | My open hours over the next seven days: my default hours with busy time on my calendar taken out |
PUT | /v1/me/availability/{scheduleId} | Change one of my schedules |
DELETE | /v1/me/availability/{scheduleId} | Remove a schedule that is not my default |
POST | /v1/me/availability/{scheduleId}/default | Use this schedule on calls and by default on pages |
PUT | /v1/me/booking-link | Change my link name. My old links keep working for 90 days |
GET | /v1/me/booking-pages | My booking pages, my link name, and the groups and schedules a page can use |
POST | /v1/me/booking-pages | Make a booking page; my link name is made from my staff name the first time |
PATCH | /v1/me/booking-pages/{pageId} | Change one of my pages: its settings, link or group. An old link keeps working for 90 days |
DELETE | /v1/me/booking-pages/{pageId} | Remove one of my pages. One with meetings is archived, so they keep their history |
POST | /v1/me/booking-pages/{pageId}/pause | Stop taking bookings on one of my pages; meetings already booked stay |
POST | /v1/me/booking-pages/{pageId}/resume | Take bookings on one of my pages again, unless an admin paused it |
GET | /v1/me/calendar | My own calendar, where the tours I am assigned are booked, and how I can connect one |
DELETE | /v1/me/calendar | Disconnect my calendar: no more tours are booked on it |
POST | /v1/me/calendar/confirm | Finish connecting my own calendar, with the token the sign-in callback handed the browser. Only the person who started it can (ADR 0111) |
POST | /v1/me/calendar/connect | Start signing in with Google or Microsoft to connect my own calendar |
GET | /v1/me/calendar/crm | The CRMs I can use as my calendar, and my CRM user at my primary group |
PUT | /v1/me/calendar/crm | Keep my meetings in the CRM instead of my own calendar (disconnects my own calendar) |
POST | /v1/me/calendar/test | Check that my calendar still works, and record the result |
GET | /v1/me/direct-phone | The phone a transfer to me rings |
PUT | /v1/me/direct-phone | Set or clear the phone a transfer to me rings |
GET | /v1/me/handoffs | The calls handed to me: live ones first, then the last 30 days |
GET | /v1/me/handoffs/{callId} | A call handed to me: the caller, why, what the agent learned, the questions and answers, the notes and the words (logs call.view) |
POST | /v1/me/handoffs/{callId}/done | I am done with the notes: once the call has ended, the CRM log goes now with them (or, after it went, one update) |
PATCH | /v1/me/handoffs/{callId}/fields/{fieldKey} | Set, confirm or clear one answer on a call handed to me. Send the answer's version as read (null when there was none); a stale one is refused with 409 |
POST | /v1/me/handoffs/{callId}/fields/{fieldKey}/suggestion | Take the listener's suggestion as the answer, or leave it |
POST | /v1/me/handoffs/{callId}/heartbeat | My notes page is open: the call's CRM log waits for my Done instead of going as soon as the call ends |
PUT | /v1/me/handoffs/{callId}/notes | Save the notes on a call handed to me (the Markdown subset with checklists). Send the version as read (null for the first save); a stale one is refused with 409 |
POST | /v1/me/handoffs/{callId}/text-link | Text the notes link to the rep the call was handed to: the link only, once a minute (logs call.notes.text_link) |
GET | /v1/me/handoffs/{callId}/turns | The lines of a call handed to me after the one the page already has, with the signal version they are at least as fresh as |
GET | /v1/me/meetings | The meetings assigned to me: upcoming, past or cancelled |
GET | /v1/me/meetings/{bookingId} | One of my meetings: who is coming, how to reach them, and what they told us |
GET | /v1/me/meetings/{bookingId}/brief | The visit brief for one of my meetings: who is coming, their timeline and interests, objections and answers, open commitments and talking points (logs call.view) |
POST | /v1/me/meetings/{bookingId}/cancel | Cancel one of my upcoming meetings, in the calendar and for the caller |
POST | /v1/me/meetings/{bookingId}/reschedule | Move one of my meetings to another of my free times; the caller is told |
GET | /v1/me/meetings/{bookingId}/times | Times I could move one of my meetings to, from my own hours and calendar |
GET | /v1/me/meetings/{bookingId}/visit | A visit I give, or one at a community I can see: its notes, newest first, and what I may do |
POST | /v1/me/meetings/{bookingId}/visit/actions | Add a next step to a visit: an item from the community’s list (actionKey), or one typed (label). The same clientKey again returns the first item |
POST | /v1/me/meetings/{bookingId}/visit/finish | Send the visit’s notes and next steps to the CRM now, as one activity. After it went, sends one update with the visit as it now stands |
POST | /v1/me/meetings/{bookingId}/visit/notes | Add a note to a visit (the Markdown subset with checklists). The same clientKey again returns the first note |
PATCH | /v1/me/meetings/{bookingId}/visit/notes/{noteId} | Change one of my notes on a visit. Send the version as read; a stale one is refused with 409 |
DELETE | /v1/me/meetings/{bookingId}/visit/notes/{noteId} | Remove a note from a visit: my own while the visit takes notes, or anyone’s at a community I manage |
POST | /v1/me/meetings/{bookingId}/visit/photo-consent | Confirm the family agreed to have photos taken and shared with them, including on links they forward |
POST | /v1/me/meetings/{bookingId}/visit/photos | Start adding a photo: returns the photo and a one-time link to PUT its bytes to (null when they are already there). The same clientKey again returns the same photo |
PUT | /v1/me/meetings/{bookingId}/visit/photos/order | Put a visit’s photos in a new order, in one go: every photo the visit shows, each once |
PATCH | /v1/me/meetings/{bookingId}/visit/photos/{photoId} | Change a photo’s caption, whether it is shared with the family, or its place in the order |
DELETE | /v1/me/meetings/{bookingId}/visit/photos/{photoId} | Remove a photo: hidden at once, its files deleted by the daily sweep. My own, or anyone’s at a community I manage |
POST | /v1/me/meetings/{bookingId}/visit/photos/{photoId}/complete | Finish adding a photo once its bytes are sent: checks them, then its copies are made (status processing, then ready) |
POST | /v1/me/meetings/{bookingId}/visit/publish | Show the visit’s shared photos on the family’s page, making an on-demand page if it has none. Returns a fresh link and QR code for an on-demand page (each call: Show the link again), or none for a call’s page |
POST | /v1/me/meetings/{bookingId}/visit/unpublish | Take every photo of the visit off the family’s page at once, without removing any |
GET | /v1/me/mfa | Which second sign-in steps this login has, and what its account asks for |
POST | /v1/me/mfa/challenge | Send a passcode for one of this login’s methods (an authenticator app sends none) |
POST | /v1/me/mfa/methods | Start setting a second sign-in step up. Setting the same kind up again replaces it, but only once the new one is confirmed. |
DELETE | /v1/me/mfa/methods/{factorId} | Remove a second sign-in step. Refused when it is the last one and one is required. |
POST | /v1/me/mfa/methods/{factorId}/confirm | Finish setting a second sign-in step up. The first one also returns recovery codes, shown once. |
POST | /v1/me/mfa/recovery | Spend a recovery code to get into this session when no method is to hand. Set a method up again afterwards. |
POST | /v1/me/mfa/recovery-codes | Replace every recovery code with ten new ones. The old ones stop working at once. |
POST | /v1/me/mfa/verify | Confirm a code for this session. Refresh the Supabase session afterwards to pick up the new claims. |
GET | /v1/me/oauth-grants | Apps you gave access to your account |
DELETE | /v1/me/oauth-grants/{grantId} | Take access away from an app you connected |
PUT | /v1/me/primary-group | Pick the group my defaults come from, among the groups whose staff I am on |
PATCH | /v1/me/profile | Change your own name and the time zone you read times in |
GET | /v1/me/taking-calls | Whether ring groups ring me (Taking calls) or skip me (Away) |
PUT | /v1/me/taking-calls | Switch myself to Taking calls or Away. Away skips me in every ring group; transfers the agent makes to me still ring |
GET | /v1/me/token-scopes | The scopes a token can have, in plain words, and which this role may give. Owners and admins may ask for another role (a service identity’s ceiling) |
GET | /v1/me/visit-actions | My open next steps from visits, soonest due first, and the ones waiting for a backup contact where I am one |
PATCH | /v1/me/visit-actions/{actionId} | Mark a next step done, dismiss it, reopen it, move it to another day, change its note or hand it on. Send the version as read; a stale one is refused with 409 |
DELETE | /v1/me/visit-actions/{actionId} | Take back a next step I added by mistake: within ten minutes, and only while nobody has changed it |
POST | /v1/me/visit-actions/{actionId}/take | Take a next step that is waiting for one of the community’s backup contacts |
The signed-in user, their account, role, groups, vocabulary and permissions#
GET /v1/me
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
aal | enum | Yes | One of: "aal1", "aal2". |
account | object | null | Yes | — |
account.id | string (acct_… ID) | Yes | ID (acct_…) |
account.name | string | Yes | — |
account.recordingPolicy | enum | Yes | One of: "always", "never", "optional". |
account.slug | string | Yes | — |
account.status | enum | Yes | One of: "active", "suspended", "deleted". |
account.vocabulary | object | Yes | — |
account.vocabulary.contact | string | Yes | 1–40 characters. Default: "contact". |
account.vocabulary.contactPlural | string | Yes | 1–40 characters. Default: "contacts". |
account.vocabulary.group | string | Yes | 1–40 characters. Default: "location". |
account.vocabulary.groupPlural | string | Yes | 1–40 characters. Default: "locations". |
account.vocabulary.meeting | string | Yes | 1–40 characters. Default: "meeting". |
account.vocabulary.meetingPlural | string | Yes | 1–40 characters. Default: "meetings". |
account.vocabulary.service | string | Yes | 1–40 characters. Default: "service". |
account.vocabulary.servicePlural | string | Yes | 1–40 characters. Default: "services". |
account.vocabulary.special | string | Yes | 1–40 characters. Default: "special". |
account.vocabulary.specialPlural | string | Yes | 1–40 characters. Default: "specials". |
groupIds | array<string (grp_… ID)> | Yes | — |
groups | array<object> | Yes | — |
groups[].id | string (grp_… ID) | Yes | ID (grp_…) |
groups[].name | string | Yes | — |
groups[].status | enum | Yes | One of: "active", "archived". |
memberStatus | enum | null | Yes | One of: "invited", "active", "deactivated". |
mfa | object | Yes | — |
mfa.enrolled | boolean | Yes | — |
mfa.required | boolean | Yes | — |
mfa.satisfied | boolean | Yes | — |
permissions | array<enum> | Yes | Items: "members.manage", "emails.manage", "billing.manage", "playbooks.publish", "playbooks.edit", "playbooks.locks", "groups.manage", "groups.customize", "knowledge.manage", "connections.manage", "numbers.assign", "testcall.run", "calls.read", "analytics.read", "insights.manage", "insights.correct", "insights.topics", "insights.gaps", "experiments.manage", "leads.manage", "insights.actions", "usage.read", "account.read", "pricing.catalog", "pricing.edit", "pricing.approve", "followup.revoke", "widget.manage", "widget.read", "tools.manage", "tools.read", "calendar.own", "calendars.read", "availability.own", "meetings.own", "availability.any", "booking_pages.own", "booking_pages.any", "booking_pages.group", "booking_pages.read", "actions.own", "handoffs.own", "visits.work", "visits.moderate", "brands.read", "brands.manage", "brands.group", "media.read", "media.manage", "media.edit", "media.settings". |
platformMfaRequired | boolean | Yes | — |
platformRole | enum | null | Yes | One of: "platform_owner", "platform_support". |
role | enum | null | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
signupPending | boolean | Yes | — |
user | object | Yes | — |
user.email | string | null | Yes | — |
user.id | string (usr_… ID) | Yes | ID (usr_…) |
user.name | string | null | Yes | — |
user.timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me" \
-H "Authorization: Bearer $ACCESS_TOKEN"Accept a pending invite after signing in from the invite email. Refresh the session afterwards.#
POST /v1/me/accept-invite
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
accountId | string (acct_… ID) | Yes | ID (acct_…) |
status | enum | Yes | One of: "active". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/accept-invite" \
-H "Authorization: Bearer $ACCESS_TOKEN"My tasks: the action items assigned to me, open and snoozed, due soonest first. Items come from fixed rules, never the model#
GET /v1/me/actions
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
tasks | array<MyTask> | Yes | — |
tasks[].commitment | object | null | Yes | — |
tasks[].commitment.dueAt | string (date-time) | Yes | — |
tasks[].commitment.kind | enum | Yes | One of: "callback", "specialist_confirm", "send_information", "other". |
tasks[].dueAt | string (date-time) | Yes | — |
tasks[].firedAt | string (date-time) | Yes | — |
tasks[].groupId | string (grp_… ID) | null | Yes | — |
tasks[].groupName | string | null | Yes | — |
tasks[].id | string (iact_… ID) | Yes | ID (iact_…) |
tasks[].lead | object | Yes | — |
tasks[].lead.email | string | null | Yes | — |
tasks[].lead.name | string | null | Yes | — |
tasks[].lead.phone | string | null | Yes | — |
tasks[].meeting | object | null | Yes | — |
tasks[].meeting.id | string (bkg_… ID) | Yes | ID (bkg_…) |
tasks[].meeting.start | string (date-time) | Yes | — |
tasks[].reasonWords | string | Yes | — |
tasks[].rule | enum | Yes | One of: "hot_target_open", "commitment_due", "urgent_timeline", "operations_miss", "cancelled_no_rebook", "unopened_before_visit", "negative_end", "agent_miss", "no_show_recovery", "anonymous_hot_chat", "recurring_gap", "performance_regression". |
tasks[].ruleLabel | string | Yes | — |
tasks[].severity | enum | Yes | One of: "high", "medium", "low". |
tasks[].snoozedUntil | string (date-time) | null | Yes | — |
tasks[].state | enum | Yes | One of: "open", "snoozed". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/actions" \
-H "Authorization: Bearer $ACCESS_TOKEN"Dismiss one of my tasks, with a note for the team saying why#
POST /v1/me/actions/{actionId}/dismiss
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
actionId | string (iact_… ID) | Yes | ID (iact_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
note | string | No | Up to 1000 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
task | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/actions/{actionId}/dismiss" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"note": "string"
}'Mark one of my tasks done, with an optional note for the team#
POST /v1/me/actions/{actionId}/done
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
actionId | string (iact_… ID) | Yes | ID (iact_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
note | string | No | Up to 1000 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
task | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/actions/{actionId}/done" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"note": "string"
}'Give one of my tasks back: it goes to the booking's assignee, else the community's backup contacts#
POST /v1/me/actions/{actionId}/hand-back
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
actionId | string (iact_… ID) | Yes | ID (iact_…) |
Request body
application/json, required.
Type: object
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
task | null | Yes | — |
to | object | Yes | — |
to.name | string | null | Yes | — |
to.source | enum | Yes | One of: "rep", "booking_assignee", "human_backup", "editors", "staff". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/actions/{actionId}/hand-back" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'Snooze one of my tasks until a time, up to 30 days away#
POST /v1/me/actions/{actionId}/snooze
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
actionId | string (iact_… ID) | Yes | ID (iact_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
until | any | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
task | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/actions/{actionId}/snooze" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"until": {}
}'Your personal API tokens#
GET /v1/me/api-tokens
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
tokens | array<ApiToken> | Yes | — |
tokens[].createdAt | string (date-time) | Yes | — |
tokens[].expiresAt | string (date-time) | null | Yes | — |
tokens[].groupIds | array<string (grp_… ID)> | null | Yes | — |
tokens[].id | string (tok_… ID) | Yes | ID (tok_…) |
tokens[].ipAllowlist | array<string> | null | Yes | — |
tokens[].kind | enum | Yes | One of: "personal", "service". |
tokens[].lastFour | string | Yes | — |
tokens[].lastUsedAt | string (date-time) | null | Yes | — |
tokens[].lastUsedIp | string | null | Yes | — |
tokens[].name | string | Yes | — |
tokens[].prefix | string | Yes | — |
tokens[].scopes | array<string> | Yes | — |
tokens[].serviceIdentityId | string (svc_… ID) | null | Yes | — |
tokens[].serviceIdentityName | string | null | Yes | — |
tokens[].userEmail | string | null | Yes | — |
tokens[].userId | string (usr_… ID) | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/api-tokens" \
-H "Authorization: Bearer $ACCESS_TOKEN"Make a personal API token, up to your own role. It is shown once and ends in 30, 90 or 365 days#
POST /v1/me/api-tokens
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
days | enum | enum | enum | Yes | — |
groupIds | array<string (grp_… ID)> | null | No | Up to 200 items. |
name | string | Yes | 1–80 characters. |
scopes | array<string> | Yes | Up to 30 items. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
apiToken | ApiToken | Yes | — |
apiToken.createdAt | string (date-time) | Yes | — |
apiToken.expiresAt | string (date-time) | null | Yes | — |
apiToken.groupIds | array<string (grp_… ID)> | null | Yes | — |
apiToken.id | string (tok_… ID) | Yes | ID (tok_…) |
apiToken.ipAllowlist | array<string> | null | Yes | — |
apiToken.kind | enum | Yes | One of: "personal", "service". |
apiToken.lastFour | string | Yes | — |
apiToken.lastUsedAt | string (date-time) | null | Yes | — |
apiToken.lastUsedIp | string | null | Yes | — |
apiToken.name | string | Yes | — |
apiToken.prefix | string | Yes | — |
apiToken.scopes | array<string> | Yes | — |
apiToken.serviceIdentityId | string (svc_… ID) | null | Yes | — |
apiToken.serviceIdentityName | string | null | Yes | — |
apiToken.userEmail | string | null | Yes | — |
apiToken.userId | string (usr_… ID) | null | Yes | — |
token | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/api-tokens" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"scopes": [
"string"
],
"days": 30
}'Revoke one of your tokens. It stops working at once#
DELETE /v1/me/api-tokens/{tokenId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
tokenId | string (tok_… ID) | Yes | ID (tok_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
revoked | enum | Yes | One of: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/api-tokens/{tokenId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"My hours: when I take meetings, on calls and on booking pages#
GET /v1/me/availability
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
groups | array<object> | Yes | — |
groups[].id | string (grp_… ID) | Yes | ID (grp_…) |
groups[].name | string | Yes | — |
groups[].timeZone | string | Yes | — |
matchEmail | string | null | Yes | — |
primaryGroupId | string (grp_… ID) | null | Yes | — |
schedules | array<AvailabilitySchedule> | Yes | — |
schedules[].chosen | boolean | Yes | — |
schedules[].hours | object | Yes | — |
schedules[].hours.overrides | array<object> | Yes | Up to 366 items. |
schedules[].hours.overrides[].date | string (date) | Yes | — |
schedules[].hours.overrides[].windows | array<object> | Yes | Up to 12 items. |
schedules[].hours.timeZone | string | Yes | — |
schedules[].hours.weekly | array<object> | Yes | Up to 50 items. |
schedules[].hours.weekly[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
schedules[].hours.weekly[].end | string | constant | Yes | — |
schedules[].hours.weekly[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
schedules[].id | string (avs_… ID) | Yes | ID (avs_…) |
schedules[].isDefault | boolean | Yes | — |
schedules[].name | string | Yes | — |
schedules[].updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/availability" \
-H "Authorization: Bearer $ACCESS_TOKEN"Add a named schedule; the first one becomes my default#
POST /v1/me/availability
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
hours | object | Yes | — |
hours.overrides | array<object> | Yes | Up to 366 items. |
hours.overrides[].date | string (date) | Yes | — |
hours.overrides[].windows | array<object> | Yes | Up to 12 items. |
hours.overrides[].windows[].end | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
hours.overrides[].windows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
hours.timeZone | string | Yes | — |
hours.weekly | array<object> | Yes | Up to 50 items. |
hours.weekly[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
hours.weekly[].end | string | enum | Yes | — |
hours.weekly[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
name | string | Yes | 1–60 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
schedule | AvailabilitySchedule | Yes | — |
schedule.chosen | boolean | Yes | — |
schedule.hours | object | Yes | — |
schedule.hours.overrides | array<object> | Yes | Up to 366 items. |
schedule.hours.overrides[].date | string (date) | Yes | — |
schedule.hours.overrides[].windows | array<object> | Yes | Up to 12 items. |
schedule.hours.timeZone | string | Yes | — |
schedule.hours.weekly | array<object> | Yes | Up to 50 items. |
schedule.hours.weekly[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
schedule.hours.weekly[].end | string | constant | Yes | — |
schedule.hours.weekly[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
schedule.id | string (avs_… ID) | Yes | ID (avs_…) |
schedule.isDefault | boolean | Yes | — |
schedule.name | string | Yes | — |
schedule.updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/availability" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"hours": {
"timeZone": "string",
"weekly": [
{
"days": [
"mon"
],
"start": "string",
"end": "string"
}
],
"overrides": [
{
"date": "2026-01-15",
"windows": [
{
"start": "string",
"end": "string"
}
]
}
]
}
}'My open hours over the next seven days: my default hours with busy time on my calendar taken out#
GET /v1/me/availability/preview
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
calendar | enum | Yes | One of: "checked", "not_connected", "unavailable". |
days | array<object> | Yes | — |
days[].date | string | Yes | — |
days[].stretches | array<object> | Yes | — |
days[].stretches[].end | string | Yes | — |
days[].stretches[].start | string | Yes | — |
timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/availability/preview" \
-H "Authorization: Bearer $ACCESS_TOKEN"Change one of my schedules#
PUT /v1/me/availability/{scheduleId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
scheduleId | string (avs_… ID) | Yes | ID (avs_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
hours | object | Yes | — |
hours.overrides | array<object> | Yes | Up to 366 items. |
hours.overrides[].date | string (date) | Yes | — |
hours.overrides[].windows | array<object> | Yes | Up to 12 items. |
hours.overrides[].windows[].end | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
hours.overrides[].windows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
hours.timeZone | string | Yes | — |
hours.weekly | array<object> | Yes | Up to 50 items. |
hours.weekly[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
hours.weekly[].end | string | enum | Yes | — |
hours.weekly[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
name | string | Yes | 1–60 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
schedule | AvailabilitySchedule | Yes | — |
schedule.chosen | boolean | Yes | — |
schedule.hours | object | Yes | — |
schedule.hours.overrides | array<object> | Yes | Up to 366 items. |
schedule.hours.overrides[].date | string (date) | Yes | — |
schedule.hours.overrides[].windows | array<object> | Yes | Up to 12 items. |
schedule.hours.timeZone | string | Yes | — |
schedule.hours.weekly | array<object> | Yes | Up to 50 items. |
schedule.hours.weekly[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
schedule.hours.weekly[].end | string | constant | Yes | — |
schedule.hours.weekly[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
schedule.id | string (avs_… ID) | Yes | ID (avs_…) |
schedule.isDefault | boolean | Yes | — |
schedule.name | string | Yes | — |
schedule.updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/availability/{scheduleId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"hours": {
"timeZone": "string",
"weekly": [
{
"days": [
"mon"
],
"start": "string",
"end": "string"
}
],
"overrides": [
{
"date": "2026-01-15",
"windows": [
{
"start": "string",
"end": "string"
}
]
}
]
}
}'Remove a schedule that is not my default#
DELETE /v1/me/availability/{scheduleId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
scheduleId | string (avs_… ID) | Yes | ID (avs_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
deleted | enum | Yes | One of: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/availability/{scheduleId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Use this schedule on calls and by default on pages#
POST /v1/me/availability/{scheduleId}/default
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
scheduleId | string (avs_… ID) | Yes | ID (avs_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
schedule | AvailabilitySchedule | Yes | — |
schedule.chosen | boolean | Yes | — |
schedule.hours | object | Yes | — |
schedule.hours.overrides | array<object> | Yes | Up to 366 items. |
schedule.hours.overrides[].date | string (date) | Yes | — |
schedule.hours.overrides[].windows | array<object> | Yes | Up to 12 items. |
schedule.hours.timeZone | string | Yes | — |
schedule.hours.weekly | array<object> | Yes | Up to 50 items. |
schedule.hours.weekly[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
schedule.hours.weekly[].end | string | constant | Yes | — |
schedule.hours.weekly[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
schedule.id | string (avs_… ID) | Yes | ID (avs_…) |
schedule.isDefault | boolean | Yes | — |
schedule.name | string | Yes | — |
schedule.updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/availability/{scheduleId}/default" \
-H "Authorization: Bearer $ACCESS_TOKEN"Change my link name. My old links keep working for 90 days#
PUT /v1/me/booking-link
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
slug | string | Yes | 2–60 characters. Pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
accountSlug | string | Yes | — |
bookingAppUrl | string | Yes | — |
groupPages | array<object> | Yes | — |
groupPages[].groupName | string | Yes | — |
groupPages[].id | string (bpg_… ID) | Yes | ID (bpg_…) |
groupPages[].status | enum | Yes | One of: "active", "paused", "archived". |
groupPages[].title | string | Yes | — |
groupPages[].url | string | null | Yes | — |
groups | array<object> | Yes | — |
groups[].id | string (grp_… ID) | Yes | ID (grp_…) |
groups[].name | string | Yes | — |
matchEmail | string | null | Yes | — |
pages | array<BookingPageSummary> | Yes | — |
pages[].bookingsThisMonth | integer | Yes | — |
pages[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
pages[].groupName | string | Yes | — |
pages[].id | string (bpg_… ID) | Yes | ID (bpg_…) |
pages[].pausedBy | enum | null | Yes | One of: "owner", "admin". |
pages[].settings | BookingPageSettings | Yes | — |
pages[].settings.assignment | object | object | Yes | Default: \{"mode":"round_robin","strategy":"equal"\}. |
pages[].settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
pages[].settings.assignment.strategy | enum | Yes | (variant 1) One of: "equal", "most_available". Default: "equal". |
pages[].settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
pages[].settings.brandId | string (brd_… ID) | null | Yes | — |
pages[].settings.bufferAfterMinutes | integer | Yes | Between 0 and 120. Default: 0. |
pages[].settings.bufferBeforeMinutes | integer | Yes | Between 0 and 120. Default: 0. |
pages[].settings.color | string | null | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
pages[].settings.coverPhoto | string (uri) | string (uri) | null | Yes | — |
pages[].settings.dailyLimit | integer | null | Yes | Between 1 and 50. |
pages[].settings.description | string | Yes | Up to 1000 characters. Default: "". |
pages[].settings.durations | array<constant | constant | constant | constant> | Yes | Up to 4 items. Default: [30]. |
pages[].settings.increment | constant | constant | constant | constant | Yes | Default: 30. |
pages[].settings.location | object | object | object | object | object | Yes | Default: \{"kind":"in_person"\}. |
pages[].settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
pages[].settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
pages[].settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
pages[].settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
pages[].settings.location.kind | constant | Yes | (variant 4) Always "video". |
pages[].settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
pages[].settings.location.kind | constant | Yes | (variant 5) Always "custom". |
pages[].settings.location.text | string | Yes | (variant 5) 1–200 characters. |
pages[].settings.meetingType | string | null | Yes | Up to 64 characters. |
pages[].settings.minNoticeMinutes | integer | Yes | Between 0 and 43200. Default: 240. |
pages[].settings.pageHours | array<object> | null | Yes | Up to 50 items. |
pages[].settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
pages[].settings.pageHours[].end | string | constant | Yes | — |
pages[].settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
pages[].settings.preferLeadRep | boolean | Yes | Default: true. |
pages[].settings.questions | array<object> | Yes | Up to 10 items. Default: []. |
pages[].settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
pages[].settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
pages[].settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
pages[].settings.questions[].label | string | Yes | 1–200 characters. |
pages[].settings.questions[].options | array<string> | No | Up to 20 items. |
pages[].settings.questions[].required | boolean | Yes | Default: false. |
pages[].settings.redirectUrl | string (uri) | null | Yes | Up to 2000 characters. |
pages[].settings.reminderDayBefore | boolean | Yes | Default: true. |
pages[].settings.reminderTwoHours | boolean | Yes | Default: true. |
pages[].settings.requireEmail | boolean | Yes | Default: true. |
pages[].settings.requirePhone | boolean | Yes | Default: true. |
pages[].settings.scheduleId | string | null | Yes | Up to 40 characters. |
pages[].settings.service | object | object | object | Yes | Default: \{"kind":"none"\}. |
pages[].settings.service.kind | constant | Yes | (variant 1) Always "none". |
pages[].settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
pages[].settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
pages[].settings.service.kind | constant | Yes | (variant 3) Always "ask". |
pages[].settings.serviceCoverPhoto | boolean | Yes | Default: false. |
pages[].settings.title | string | Yes | 1–80 characters. |
pages[].settings.window | object | object | Yes | Default: \{"days":30,"kind":"rolling"\}. |
pages[].settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
pages[].settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
pages[].settings.window.from | string (date) | Yes | (variant 2) |
pages[].settings.window.kind | constant | Yes | (variant 2) Always "range". |
pages[].settings.window.to | string (date) | Yes | (variant 2) |
pages[].slug | string | Yes | — |
pages[].status | enum | Yes | One of: "active", "paused", "archived". |
pages[].updatedAt | string (date-time) | Yes | — |
pages[].url | string | null | Yes | — |
primaryGroupId | string (grp_… ID) | null | Yes | — |
repSlug | string | null | Yes | — |
schedules | array<object> | Yes | — |
schedules[].id | string (avs_… ID) | Yes | ID (avs_…) |
schedules[].isDefault | boolean | Yes | — |
schedules[].name | string | Yes | — |
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/booking-link" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"slug": "string"
}'My booking pages, my link name, and the groups and schedules a page can use#
GET /v1/me/booking-pages
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
accountSlug | string | Yes | — |
bookingAppUrl | string | Yes | — |
groupPages | array<object> | Yes | — |
groupPages[].groupName | string | Yes | — |
groupPages[].id | string (bpg_… ID) | Yes | ID (bpg_…) |
groupPages[].status | enum | Yes | One of: "active", "paused", "archived". |
groupPages[].title | string | Yes | — |
groupPages[].url | string | null | Yes | — |
groups | array<object> | Yes | — |
groups[].id | string (grp_… ID) | Yes | ID (grp_…) |
groups[].name | string | Yes | — |
matchEmail | string | null | Yes | — |
pages | array<BookingPageSummary> | Yes | — |
pages[].bookingsThisMonth | integer | Yes | — |
pages[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
pages[].groupName | string | Yes | — |
pages[].id | string (bpg_… ID) | Yes | ID (bpg_…) |
pages[].pausedBy | enum | null | Yes | One of: "owner", "admin". |
pages[].settings | BookingPageSettings | Yes | — |
pages[].settings.assignment | object | object | Yes | Default: \{"mode":"round_robin","strategy":"equal"\}. |
pages[].settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
pages[].settings.assignment.strategy | enum | Yes | (variant 1) One of: "equal", "most_available". Default: "equal". |
pages[].settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
pages[].settings.brandId | string (brd_… ID) | null | Yes | — |
pages[].settings.bufferAfterMinutes | integer | Yes | Between 0 and 120. Default: 0. |
pages[].settings.bufferBeforeMinutes | integer | Yes | Between 0 and 120. Default: 0. |
pages[].settings.color | string | null | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
pages[].settings.coverPhoto | string (uri) | string (uri) | null | Yes | — |
pages[].settings.dailyLimit | integer | null | Yes | Between 1 and 50. |
pages[].settings.description | string | Yes | Up to 1000 characters. Default: "". |
pages[].settings.durations | array<constant | constant | constant | constant> | Yes | Up to 4 items. Default: [30]. |
pages[].settings.increment | constant | constant | constant | constant | Yes | Default: 30. |
pages[].settings.location | object | object | object | object | object | Yes | Default: \{"kind":"in_person"\}. |
pages[].settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
pages[].settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
pages[].settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
pages[].settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
pages[].settings.location.kind | constant | Yes | (variant 4) Always "video". |
pages[].settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
pages[].settings.location.kind | constant | Yes | (variant 5) Always "custom". |
pages[].settings.location.text | string | Yes | (variant 5) 1–200 characters. |
pages[].settings.meetingType | string | null | Yes | Up to 64 characters. |
pages[].settings.minNoticeMinutes | integer | Yes | Between 0 and 43200. Default: 240. |
pages[].settings.pageHours | array<object> | null | Yes | Up to 50 items. |
pages[].settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
pages[].settings.pageHours[].end | string | constant | Yes | — |
pages[].settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
pages[].settings.preferLeadRep | boolean | Yes | Default: true. |
pages[].settings.questions | array<object> | Yes | Up to 10 items. Default: []. |
pages[].settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
pages[].settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
pages[].settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
pages[].settings.questions[].label | string | Yes | 1–200 characters. |
pages[].settings.questions[].options | array<string> | No | Up to 20 items. |
pages[].settings.questions[].required | boolean | Yes | Default: false. |
pages[].settings.redirectUrl | string (uri) | null | Yes | Up to 2000 characters. |
pages[].settings.reminderDayBefore | boolean | Yes | Default: true. |
pages[].settings.reminderTwoHours | boolean | Yes | Default: true. |
pages[].settings.requireEmail | boolean | Yes | Default: true. |
pages[].settings.requirePhone | boolean | Yes | Default: true. |
pages[].settings.scheduleId | string | null | Yes | Up to 40 characters. |
pages[].settings.service | object | object | object | Yes | Default: \{"kind":"none"\}. |
pages[].settings.service.kind | constant | Yes | (variant 1) Always "none". |
pages[].settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
pages[].settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
pages[].settings.service.kind | constant | Yes | (variant 3) Always "ask". |
pages[].settings.serviceCoverPhoto | boolean | Yes | Default: false. |
pages[].settings.title | string | Yes | 1–80 characters. |
pages[].settings.window | object | object | Yes | Default: \{"days":30,"kind":"rolling"\}. |
pages[].settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
pages[].settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
pages[].settings.window.from | string (date) | Yes | (variant 2) |
pages[].settings.window.kind | constant | Yes | (variant 2) Always "range". |
pages[].settings.window.to | string (date) | Yes | (variant 2) |
pages[].slug | string | Yes | — |
pages[].status | enum | Yes | One of: "active", "paused", "archived". |
pages[].updatedAt | string (date-time) | Yes | — |
pages[].url | string | null | Yes | — |
primaryGroupId | string (grp_… ID) | null | Yes | — |
repSlug | string | null | Yes | — |
schedules | array<object> | Yes | — |
schedules[].id | string (avs_… ID) | Yes | ID (avs_…) |
schedules[].isDefault | boolean | Yes | — |
schedules[].name | string | Yes | — |
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/booking-pages" \
-H "Authorization: Bearer $ACCESS_TOKEN"Make a booking page; my link name is made from my staff name the first time#
POST /v1/me/booking-pages
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
settings | BookingPageSettingsInput | Yes | — |
settings.assignment | object | object | No | Default: \{"mode":"round_robin","strategy":"equal"\}. |
settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
settings.assignment.strategy | enum | No | (variant 1) One of: "equal", "most_available". Default: "equal". |
settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
settings.brandId | string (brd_… ID) | null | No | — |
settings.bufferAfterMinutes | integer | No | Between 0 and 120. Default: 0. |
settings.bufferBeforeMinutes | integer | No | Between 0 and 120. Default: 0. |
settings.color | string | null | No | Pattern: ^#[0-9a-f]\{6\}$. |
settings.coverPhoto | string (uri) | string (uri) | null | No | — |
settings.dailyLimit | integer | null | No | Between 1 and 50. |
settings.description | string | No | Up to 1000 characters. Default: "". |
settings.durations | array<constant | constant | constant | constant> | No | Up to 4 items. Default: [30]. |
settings.increment | constant | constant | constant | constant | No | Default: 30. |
settings.location | object | object | object | object | object | No | Default: \{"kind":"in_person"\}. |
settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
settings.location.kind | constant | Yes | (variant 4) Always "video". |
settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
settings.location.kind | constant | Yes | (variant 5) Always "custom". |
settings.location.text | string | Yes | (variant 5) 1–200 characters. |
settings.meetingType | string | null | No | Up to 64 characters. |
settings.minNoticeMinutes | integer | No | Between 0 and 43200. Default: 240. |
settings.pageHours | array<object> | null | No | Up to 50 items. |
settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
settings.pageHours[].end | string | constant | Yes | — |
settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
settings.preferLeadRep | boolean | No | Default: true. |
settings.questions | array<object> | No | Up to 10 items. Default: []. |
settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
settings.questions[].label | string | Yes | 1–200 characters. |
settings.questions[].options | array<string> | No | Up to 20 items. |
settings.questions[].required | boolean | No | Default: false. |
settings.redirectUrl | string (uri) | null | No | Up to 2000 characters. |
settings.reminderDayBefore | boolean | No | Default: true. |
settings.reminderTwoHours | boolean | No | Default: true. |
settings.requireEmail | boolean | No | Default: true. |
settings.requirePhone | boolean | No | Default: true. |
settings.scheduleId | string | null | No | Up to 40 characters. |
settings.service | object | object | object | No | Default: \{"kind":"none"\}. |
settings.service.kind | constant | Yes | (variant 1) Always "none". |
settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
settings.service.kind | constant | Yes | (variant 3) Always "ask". |
settings.serviceCoverPhoto | boolean | No | Default: false. |
settings.title | string | Yes | 1–80 characters. |
settings.window | object | object | No | Default: \{"days":30,"kind":"rolling"\}. |
settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
settings.window.from | string (date) | Yes | (variant 2) |
settings.window.kind | constant | Yes | (variant 2) Always "range". |
settings.window.to | string (date) | Yes | (variant 2) |
slug | string | No | 2–60 characters. Pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
page | BookingPageSummary | Yes | — |
page.bookingsThisMonth | integer | Yes | — |
page.groupId | string (grp_… ID) | Yes | ID (grp_…) |
page.groupName | string | Yes | — |
page.id | string (bpg_… ID) | Yes | ID (bpg_…) |
page.pausedBy | enum | null | Yes | One of: "owner", "admin". |
page.settings | BookingPageSettings | Yes | — |
page.settings.assignment | object | object | Yes | Default: \{"mode":"round_robin","strategy":"equal"\}. |
page.settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
page.settings.assignment.strategy | enum | Yes | (variant 1) One of: "equal", "most_available". Default: "equal". |
page.settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
page.settings.brandId | string (brd_… ID) | null | Yes | — |
page.settings.bufferAfterMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.bufferBeforeMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.color | string | null | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
page.settings.coverPhoto | string (uri) | string (uri) | null | Yes | — |
page.settings.dailyLimit | integer | null | Yes | Between 1 and 50. |
page.settings.description | string | Yes | Up to 1000 characters. Default: "". |
page.settings.durations | array<constant | constant | constant | constant> | Yes | Up to 4 items. Default: [30]. |
page.settings.increment | constant | constant | constant | constant | Yes | Default: 30. |
page.settings.location | object | object | object | object | object | Yes | Default: \{"kind":"in_person"\}. |
page.settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
page.settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
page.settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
page.settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
page.settings.location.kind | constant | Yes | (variant 4) Always "video". |
page.settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
page.settings.location.kind | constant | Yes | (variant 5) Always "custom". |
page.settings.location.text | string | Yes | (variant 5) 1–200 characters. |
page.settings.meetingType | string | null | Yes | Up to 64 characters. |
page.settings.minNoticeMinutes | integer | Yes | Between 0 and 43200. Default: 240. |
page.settings.pageHours | array<object> | null | Yes | Up to 50 items. |
page.settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
page.settings.pageHours[].end | string | constant | Yes | — |
page.settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
page.settings.preferLeadRep | boolean | Yes | Default: true. |
page.settings.questions | array<object> | Yes | Up to 10 items. Default: []. |
page.settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
page.settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
page.settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
page.settings.questions[].label | string | Yes | 1–200 characters. |
page.settings.questions[].options | array<string> | No | Up to 20 items. |
page.settings.questions[].required | boolean | Yes | Default: false. |
page.settings.redirectUrl | string (uri) | null | Yes | Up to 2000 characters. |
page.settings.reminderDayBefore | boolean | Yes | Default: true. |
page.settings.reminderTwoHours | boolean | Yes | Default: true. |
page.settings.requireEmail | boolean | Yes | Default: true. |
page.settings.requirePhone | boolean | Yes | Default: true. |
page.settings.scheduleId | string | null | Yes | Up to 40 characters. |
page.settings.service | object | object | object | Yes | Default: \{"kind":"none"\}. |
page.settings.service.kind | constant | Yes | (variant 1) Always "none". |
page.settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
page.settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
page.settings.service.kind | constant | Yes | (variant 3) Always "ask". |
page.settings.serviceCoverPhoto | boolean | Yes | Default: false. |
page.settings.title | string | Yes | 1–80 characters. |
page.settings.window | object | object | Yes | Default: \{"days":30,"kind":"rolling"\}. |
page.settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
page.settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
page.settings.window.from | string (date) | Yes | (variant 2) |
page.settings.window.kind | constant | Yes | (variant 2) Always "range". |
page.settings.window.to | string (date) | Yes | (variant 2) |
page.slug | string | Yes | — |
page.status | enum | Yes | One of: "active", "paused", "archived". |
page.updatedAt | string (date-time) | Yes | — |
page.url | string | null | Yes | — |
Errors: 400, 401, 402, 403, 404, 409, 422, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/booking-pages" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"settings": {
"title": "string"
}
}'Change one of my pages: its settings, link or group. An old link keeps working for 90 days#
PATCH /v1/me/booking-pages/{pageId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string (bpg_… ID) | Yes | ID (bpg_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
settings | BookingPageSettingsInput | No | — |
settings.assignment | object | object | No | Default: \{"mode":"round_robin","strategy":"equal"\}. |
settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
settings.assignment.strategy | enum | No | (variant 1) One of: "equal", "most_available". Default: "equal". |
settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
settings.brandId | string (brd_… ID) | null | No | — |
settings.bufferAfterMinutes | integer | No | Between 0 and 120. Default: 0. |
settings.bufferBeforeMinutes | integer | No | Between 0 and 120. Default: 0. |
settings.color | string | null | No | Pattern: ^#[0-9a-f]\{6\}$. |
settings.coverPhoto | string (uri) | string (uri) | null | No | — |
settings.dailyLimit | integer | null | No | Between 1 and 50. |
settings.description | string | No | Up to 1000 characters. Default: "". |
settings.durations | array<constant | constant | constant | constant> | No | Up to 4 items. Default: [30]. |
settings.increment | constant | constant | constant | constant | No | Default: 30. |
settings.location | object | object | object | object | object | No | Default: \{"kind":"in_person"\}. |
settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
settings.location.kind | constant | Yes | (variant 4) Always "video". |
settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
settings.location.kind | constant | Yes | (variant 5) Always "custom". |
settings.location.text | string | Yes | (variant 5) 1–200 characters. |
settings.meetingType | string | null | No | Up to 64 characters. |
settings.minNoticeMinutes | integer | No | Between 0 and 43200. Default: 240. |
settings.pageHours | array<object> | null | No | Up to 50 items. |
settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
settings.pageHours[].end | string | constant | Yes | — |
settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
settings.preferLeadRep | boolean | No | Default: true. |
settings.questions | array<object> | No | Up to 10 items. Default: []. |
settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
settings.questions[].label | string | Yes | 1–200 characters. |
settings.questions[].options | array<string> | No | Up to 20 items. |
settings.questions[].required | boolean | No | Default: false. |
settings.redirectUrl | string (uri) | null | No | Up to 2000 characters. |
settings.reminderDayBefore | boolean | No | Default: true. |
settings.reminderTwoHours | boolean | No | Default: true. |
settings.requireEmail | boolean | No | Default: true. |
settings.requirePhone | boolean | No | Default: true. |
settings.scheduleId | string | null | No | Up to 40 characters. |
settings.service | object | object | object | No | Default: \{"kind":"none"\}. |
settings.service.kind | constant | Yes | (variant 1) Always "none". |
settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
settings.service.kind | constant | Yes | (variant 3) Always "ask". |
settings.serviceCoverPhoto | boolean | No | Default: false. |
settings.title | string | Yes | 1–80 characters. |
settings.window | object | object | No | Default: \{"days":30,"kind":"rolling"\}. |
settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
settings.window.from | string (date) | Yes | (variant 2) |
settings.window.kind | constant | Yes | (variant 2) Always "range". |
settings.window.to | string (date) | Yes | (variant 2) |
slug | string | No | 2–60 characters. Pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
page | BookingPageSummary | Yes | — |
page.bookingsThisMonth | integer | Yes | — |
page.groupId | string (grp_… ID) | Yes | ID (grp_…) |
page.groupName | string | Yes | — |
page.id | string (bpg_… ID) | Yes | ID (bpg_…) |
page.pausedBy | enum | null | Yes | One of: "owner", "admin". |
page.settings | BookingPageSettings | Yes | — |
page.settings.assignment | object | object | Yes | Default: \{"mode":"round_robin","strategy":"equal"\}. |
page.settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
page.settings.assignment.strategy | enum | Yes | (variant 1) One of: "equal", "most_available". Default: "equal". |
page.settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
page.settings.brandId | string (brd_… ID) | null | Yes | — |
page.settings.bufferAfterMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.bufferBeforeMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.color | string | null | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
page.settings.coverPhoto | string (uri) | string (uri) | null | Yes | — |
page.settings.dailyLimit | integer | null | Yes | Between 1 and 50. |
page.settings.description | string | Yes | Up to 1000 characters. Default: "". |
page.settings.durations | array<constant | constant | constant | constant> | Yes | Up to 4 items. Default: [30]. |
page.settings.increment | constant | constant | constant | constant | Yes | Default: 30. |
page.settings.location | object | object | object | object | object | Yes | Default: \{"kind":"in_person"\}. |
page.settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
page.settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
page.settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
page.settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
page.settings.location.kind | constant | Yes | (variant 4) Always "video". |
page.settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
page.settings.location.kind | constant | Yes | (variant 5) Always "custom". |
page.settings.location.text | string | Yes | (variant 5) 1–200 characters. |
page.settings.meetingType | string | null | Yes | Up to 64 characters. |
page.settings.minNoticeMinutes | integer | Yes | Between 0 and 43200. Default: 240. |
page.settings.pageHours | array<object> | null | Yes | Up to 50 items. |
page.settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
page.settings.pageHours[].end | string | constant | Yes | — |
page.settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
page.settings.preferLeadRep | boolean | Yes | Default: true. |
page.settings.questions | array<object> | Yes | Up to 10 items. Default: []. |
page.settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
page.settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
page.settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
page.settings.questions[].label | string | Yes | 1–200 characters. |
page.settings.questions[].options | array<string> | No | Up to 20 items. |
page.settings.questions[].required | boolean | Yes | Default: false. |
page.settings.redirectUrl | string (uri) | null | Yes | Up to 2000 characters. |
page.settings.reminderDayBefore | boolean | Yes | Default: true. |
page.settings.reminderTwoHours | boolean | Yes | Default: true. |
page.settings.requireEmail | boolean | Yes | Default: true. |
page.settings.requirePhone | boolean | Yes | Default: true. |
page.settings.scheduleId | string | null | Yes | Up to 40 characters. |
page.settings.service | object | object | object | Yes | Default: \{"kind":"none"\}. |
page.settings.service.kind | constant | Yes | (variant 1) Always "none". |
page.settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
page.settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
page.settings.service.kind | constant | Yes | (variant 3) Always "ask". |
page.settings.serviceCoverPhoto | boolean | Yes | Default: false. |
page.settings.title | string | Yes | 1–80 characters. |
page.settings.window | object | object | Yes | Default: \{"days":30,"kind":"rolling"\}. |
page.settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
page.settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
page.settings.window.from | string (date) | Yes | (variant 2) |
page.settings.window.kind | constant | Yes | (variant 2) Always "range". |
page.settings.window.to | string (date) | Yes | (variant 2) |
page.slug | string | Yes | — |
page.status | enum | Yes | One of: "active", "paused", "archived". |
page.updatedAt | string (date-time) | Yes | — |
page.url | string | null | Yes | — |
Errors: 400, 401, 402, 403, 404, 409, 422, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/me/booking-pages/{pageId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"groupId": "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"settings": {
"title": "string"
},
"slug": "string"
}'Remove one of my pages. One with meetings is archived, so they keep their history#
DELETE /v1/me/booking-pages/{pageId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string (bpg_… ID) | Yes | ID (bpg_…) |
Response 204
No content.
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/booking-pages/{pageId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Stop taking bookings on one of my pages; meetings already booked stay#
POST /v1/me/booking-pages/{pageId}/pause
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string (bpg_… ID) | Yes | ID (bpg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
page | BookingPageSummary | Yes | — |
page.bookingsThisMonth | integer | Yes | — |
page.groupId | string (grp_… ID) | Yes | ID (grp_…) |
page.groupName | string | Yes | — |
page.id | string (bpg_… ID) | Yes | ID (bpg_…) |
page.pausedBy | enum | null | Yes | One of: "owner", "admin". |
page.settings | BookingPageSettings | Yes | — |
page.settings.assignment | object | object | Yes | Default: \{"mode":"round_robin","strategy":"equal"\}. |
page.settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
page.settings.assignment.strategy | enum | Yes | (variant 1) One of: "equal", "most_available". Default: "equal". |
page.settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
page.settings.brandId | string (brd_… ID) | null | Yes | — |
page.settings.bufferAfterMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.bufferBeforeMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.color | string | null | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
page.settings.coverPhoto | string (uri) | string (uri) | null | Yes | — |
page.settings.dailyLimit | integer | null | Yes | Between 1 and 50. |
page.settings.description | string | Yes | Up to 1000 characters. Default: "". |
page.settings.durations | array<constant | constant | constant | constant> | Yes | Up to 4 items. Default: [30]. |
page.settings.increment | constant | constant | constant | constant | Yes | Default: 30. |
page.settings.location | object | object | object | object | object | Yes | Default: \{"kind":"in_person"\}. |
page.settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
page.settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
page.settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
page.settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
page.settings.location.kind | constant | Yes | (variant 4) Always "video". |
page.settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
page.settings.location.kind | constant | Yes | (variant 5) Always "custom". |
page.settings.location.text | string | Yes | (variant 5) 1–200 characters. |
page.settings.meetingType | string | null | Yes | Up to 64 characters. |
page.settings.minNoticeMinutes | integer | Yes | Between 0 and 43200. Default: 240. |
page.settings.pageHours | array<object> | null | Yes | Up to 50 items. |
page.settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
page.settings.pageHours[].end | string | constant | Yes | — |
page.settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
page.settings.preferLeadRep | boolean | Yes | Default: true. |
page.settings.questions | array<object> | Yes | Up to 10 items. Default: []. |
page.settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
page.settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
page.settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
page.settings.questions[].label | string | Yes | 1–200 characters. |
page.settings.questions[].options | array<string> | No | Up to 20 items. |
page.settings.questions[].required | boolean | Yes | Default: false. |
page.settings.redirectUrl | string (uri) | null | Yes | Up to 2000 characters. |
page.settings.reminderDayBefore | boolean | Yes | Default: true. |
page.settings.reminderTwoHours | boolean | Yes | Default: true. |
page.settings.requireEmail | boolean | Yes | Default: true. |
page.settings.requirePhone | boolean | Yes | Default: true. |
page.settings.scheduleId | string | null | Yes | Up to 40 characters. |
page.settings.service | object | object | object | Yes | Default: \{"kind":"none"\}. |
page.settings.service.kind | constant | Yes | (variant 1) Always "none". |
page.settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
page.settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
page.settings.service.kind | constant | Yes | (variant 3) Always "ask". |
page.settings.serviceCoverPhoto | boolean | Yes | Default: false. |
page.settings.title | string | Yes | 1–80 characters. |
page.settings.window | object | object | Yes | Default: \{"days":30,"kind":"rolling"\}. |
page.settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
page.settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
page.settings.window.from | string (date) | Yes | (variant 2) |
page.settings.window.kind | constant | Yes | (variant 2) Always "range". |
page.settings.window.to | string (date) | Yes | (variant 2) |
page.slug | string | Yes | — |
page.status | enum | Yes | One of: "active", "paused", "archived". |
page.updatedAt | string (date-time) | Yes | — |
page.url | string | null | Yes | — |
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/booking-pages/{pageId}/pause" \
-H "Authorization: Bearer $ACCESS_TOKEN"Take bookings on one of my pages again, unless an admin paused it#
POST /v1/me/booking-pages/{pageId}/resume
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string (bpg_… ID) | Yes | ID (bpg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
page | BookingPageSummary | Yes | — |
page.bookingsThisMonth | integer | Yes | — |
page.groupId | string (grp_… ID) | Yes | ID (grp_…) |
page.groupName | string | Yes | — |
page.id | string (bpg_… ID) | Yes | ID (bpg_…) |
page.pausedBy | enum | null | Yes | One of: "owner", "admin". |
page.settings | BookingPageSettings | Yes | — |
page.settings.assignment | object | object | Yes | Default: \{"mode":"round_robin","strategy":"equal"\}. |
page.settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
page.settings.assignment.strategy | enum | Yes | (variant 1) One of: "equal", "most_available". Default: "equal". |
page.settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
page.settings.brandId | string (brd_… ID) | null | Yes | — |
page.settings.bufferAfterMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.bufferBeforeMinutes | integer | Yes | Between 0 and 120. Default: 0. |
page.settings.color | string | null | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
page.settings.coverPhoto | string (uri) | string (uri) | null | Yes | — |
page.settings.dailyLimit | integer | null | Yes | Between 1 and 50. |
page.settings.description | string | Yes | Up to 1000 characters. Default: "". |
page.settings.durations | array<constant | constant | constant | constant> | Yes | Up to 4 items. Default: [30]. |
page.settings.increment | constant | constant | constant | constant | Yes | Default: 30. |
page.settings.location | object | object | object | object | object | Yes | Default: \{"kind":"in_person"\}. |
page.settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
page.settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
page.settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
page.settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
page.settings.location.kind | constant | Yes | (variant 4) Always "video". |
page.settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
page.settings.location.kind | constant | Yes | (variant 5) Always "custom". |
page.settings.location.text | string | Yes | (variant 5) 1–200 characters. |
page.settings.meetingType | string | null | Yes | Up to 64 characters. |
page.settings.minNoticeMinutes | integer | Yes | Between 0 and 43200. Default: 240. |
page.settings.pageHours | array<object> | null | Yes | Up to 50 items. |
page.settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
page.settings.pageHours[].end | string | constant | Yes | — |
page.settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
page.settings.preferLeadRep | boolean | Yes | Default: true. |
page.settings.questions | array<object> | Yes | Up to 10 items. Default: []. |
page.settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
page.settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
page.settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
page.settings.questions[].label | string | Yes | 1–200 characters. |
page.settings.questions[].options | array<string> | No | Up to 20 items. |
page.settings.questions[].required | boolean | Yes | Default: false. |
page.settings.redirectUrl | string (uri) | null | Yes | Up to 2000 characters. |
page.settings.reminderDayBefore | boolean | Yes | Default: true. |
page.settings.reminderTwoHours | boolean | Yes | Default: true. |
page.settings.requireEmail | boolean | Yes | Default: true. |
page.settings.requirePhone | boolean | Yes | Default: true. |
page.settings.scheduleId | string | null | Yes | Up to 40 characters. |
page.settings.service | object | object | object | Yes | Default: \{"kind":"none"\}. |
page.settings.service.kind | constant | Yes | (variant 1) Always "none". |
page.settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
page.settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
page.settings.service.kind | constant | Yes | (variant 3) Always "ask". |
page.settings.serviceCoverPhoto | boolean | Yes | Default: false. |
page.settings.title | string | Yes | 1–80 characters. |
page.settings.window | object | object | Yes | Default: \{"days":30,"kind":"rolling"\}. |
page.settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
page.settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
page.settings.window.from | string (date) | Yes | (variant 2) |
page.settings.window.kind | constant | Yes | (variant 2) Always "range". |
page.settings.window.to | string (date) | Yes | (variant 2) |
page.slug | string | Yes | — |
page.status | enum | Yes | One of: "active", "paused", "archived". |
page.updatedAt | string (date-time) | Yes | — |
page.url | string | null | Yes | — |
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/booking-pages/{pageId}/resume" \
-H "Authorization: Bearer $ACCESS_TOKEN"My own calendar, where the tours I am assigned are booked, and how I can connect one#
GET /v1/me/calendar
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
calendar | any | null | Yes | — |
matchEmail | string | null | Yes | — |
providers | array<object> | Yes | — |
providers[].displayName | string | Yes | — |
providers[].key | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/calendar" \
-H "Authorization: Bearer $ACCESS_TOKEN"Disconnect my calendar: no more tours are booked on it#
DELETE /v1/me/calendar
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
disconnected | enum | Yes | One of: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/calendar" \
-H "Authorization: Bearer $ACCESS_TOKEN"Finish connecting my own calendar, with the token the sign-in callback handed the browser. Only the person who started it can (ADR 0111)#
POST /v1/me/calendar/confirm
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
confirm | string | Yes | 20–200 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
connection | string | No | — |
reason | enum | No | One of: "unauthorized", "forbidden", "not_found", "rate_limited", "unavailable", "timeout", "misconfigured", "missing_permissions", "calendar_not_found", "calendar_read_only", "personal_account", "mailbox_access_denied", "failed". |
result | enum | Yes | One of: "ok", "denied", "expired", "missing_scopes", "failed", "error", "wrong_user". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/calendar/confirm" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"confirm": "string"
}'Start signing in with Google or Microsoft to connect my own calendar#
POST /v1/me/calendar/connect
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | Yes | Pattern: ^[a-z][a-z0-9_]\{1,40\}$. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
authorizationUrl | string | Yes | — |
expiresInSeconds | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/calendar/connect" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider": "string"
}'The CRMs I can use as my calendar, and my CRM user at my primary group#
GET /v1/me/calendar/crm
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
crmUserId | string | null | Yes | — |
options | array<object> | Yes | — |
options[].connectionId | string (conn_… ID) | Yes | ID (conn_…) |
options[].name | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/calendar/crm" \
-H "Authorization: Bearer $ACCESS_TOKEN"Keep my meetings in the CRM instead of my own calendar (disconnects my own calendar)#
PUT /v1/me/calendar/crm
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
connectionId | string (conn_… ID) | Yes | ID (conn_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
provider | enum | Yes | One of: "crm". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/calendar/crm" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"connectionId": "conn_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'Check that my calendar still works, and record the result#
POST /v1/me/calendar/test
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
calendar | MyCalendar | Yes | — |
calendar.accountEmail | string | null | Yes | — |
calendar.connectedAt | string (date-time) | Yes | — |
calendar.lastCheckedAt | string (date-time) | null | Yes | — |
calendar.lastError | string | null | Yes | — |
calendar.provider | string | Yes | — |
calendar.status | enum | Yes | One of: "connected", "error", "pending". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/calendar/test" \
-H "Authorization: Bearer $ACCESS_TOKEN"The phone a transfer to me rings#
GET /v1/me/direct-phone
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
directPhone | string | null | Yes | Pattern: ^\+[1-9]\d\{6,14\}$. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/direct-phone" \
-H "Authorization: Bearer $ACCESS_TOKEN"Set or clear the phone a transfer to me rings#
PUT /v1/me/direct-phone
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
directPhone | string | null | Yes | Pattern: ^\+[1-9]\d\{6,14\}$. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
directPhone | string | null | Yes | Pattern: ^\+[1-9]\d\{6,14\}$. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/direct-phone" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"directPhone": "string"
}'The calls handed to me: live ones first, then the last 30 days#
GET /v1/me/handoffs
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Between 1 and 100. Default: 50. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
handoffs | array<HandoffSummary> | Yes | — |
handoffs[].callId | string (call_… ID) | Yes | ID (call_…) |
handoffs[].callerName | string | null | Yes | — |
handoffs[].callerNumber | string | null | Yes | — |
handoffs[].endedAt | string (date-time) | null | Yes | — |
handoffs[].fromRingStep | boolean | Yes | — |
handoffs[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
handoffs[].groupName | string | Yes | — |
handoffs[].handoffReason | enum | null | Yes | One of: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". |
handoffs[].isTest | boolean | Yes | — |
handoffs[].startedAt | string (date-time) | Yes | — |
handoffs[].state | enum | Yes | One of: "live", "ended". |
handoffs[].transferredAt | string (date-time) | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/handoffs" \
-H "Authorization: Bearer $ACCESS_TOKEN"A call handed to me: the caller, why, what the agent learned, the questions and answers, the notes and the words (logs call.view)#
GET /v1/me/handoffs/{callId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
turns | enum | No | One of: "all", "none". Default: "all". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
callerName | string | null | Yes | — |
callerNumber | string | null | Yes | — |
endedAt | string (date-time) | null | Yes | — |
fromRingStep | boolean | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
groupName | string | Yes | — |
handoffReason | enum | null | Yes | One of: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". |
isTest | boolean | Yes | — |
lines | array<HandoffLine> | Yes | — |
lines[].id | string | Yes | — |
lines[].name | string | Yes | — |
lines[].questions | array<HandoffQuestion> | Yes | — |
lines[].questions[].key | string | Yes | — |
lines[].questions[].label | string | Yes | — |
lines[].questions[].options | array<object> | Yes | — |
lines[].questions[].options[].label | string | Yes | — |
lines[].questions[].options[].value | string | Yes | — |
lines[].questions[].required | boolean | Yes | — |
lines[].questions[].sensitivity | enum | Yes | One of: "standard", "sensitive". |
lines[].questions[].source | enum | null | Yes | One of: "agent", "heard", "rep". |
lines[].questions[].status | enum | null | Yes | One of: "confirmed", "provisional". |
lines[].questions[].suggested | any | null | Yes | — |
lines[].questions[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
lines[].questions[].value | any | null | Yes | — |
lines[].questions[].version | integer | null | Yes | — |
lines[].questions[].withheld | boolean | Yes | — |
lines[].used | boolean | Yes | — |
live | HandoffLive | Yes | — |
live.canEdit | boolean | Yes | — |
live.crm | object | Yes | — |
live.crm.held | boolean | Yes | — |
live.crm.sent | boolean | Yes | — |
live.crm.updates | integer | Yes | — |
live.mine | boolean | Yes | — |
live.notes | object | null | Yes | — |
live.notes.body | string | Yes | — |
live.notes.version | integer | Yes | — |
live.open | boolean | Yes | — |
live.state | enum | null | Yes | One of: "connected", "ended", "done". |
live.text | object | Yes | — |
live.text.available | boolean | Yes | — |
live.text.sentAt | string (date-time) | null | Yes | — |
live.version | integer | Yes | — |
notetaker | HandoffNotetaker | Yes | — |
notetaker.offReason | string | null | Yes | — |
notetaker.status | enum | null | Yes | One of: "listening", "finished", "unavailable". |
otherAnswers | array<object> | Yes | — |
otherAnswers[].key | string | Yes | — |
otherAnswers[].value | any | null | Yes | — |
startedAt | string (date-time) | Yes | — |
state | enum | Yes | One of: "live", "ended". |
summary | string | null | Yes | — |
transcriptStored | boolean | Yes | — |
transferredAt | string (date-time) | null | Yes | — |
turns | array<HandoffTurn> | Yes | — |
turns[].at | string (date-time) | null | Yes | — |
turns[].seq | integer | Yes | — |
turns[].speaker | enum | Yes | One of: "agent", "caller", "rep". |
turns[].text | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"I am done with the notes: once the call has ended, the CRM log goes now with them (or, after it went, one update)#
POST /v1/me/handoffs/{callId}/done
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
callerName | string | null | Yes | — |
callerNumber | string | null | Yes | — |
endedAt | string (date-time) | null | Yes | — |
fromRingStep | boolean | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
groupName | string | Yes | — |
handoffReason | enum | null | Yes | One of: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". |
isTest | boolean | Yes | — |
lines | array<HandoffLine> | Yes | — |
lines[].id | string | Yes | — |
lines[].name | string | Yes | — |
lines[].questions | array<HandoffQuestion> | Yes | — |
lines[].questions[].key | string | Yes | — |
lines[].questions[].label | string | Yes | — |
lines[].questions[].options | array<object> | Yes | — |
lines[].questions[].options[].label | string | Yes | — |
lines[].questions[].options[].value | string | Yes | — |
lines[].questions[].required | boolean | Yes | — |
lines[].questions[].sensitivity | enum | Yes | One of: "standard", "sensitive". |
lines[].questions[].source | enum | null | Yes | One of: "agent", "heard", "rep". |
lines[].questions[].status | enum | null | Yes | One of: "confirmed", "provisional". |
lines[].questions[].suggested | any | null | Yes | — |
lines[].questions[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
lines[].questions[].value | any | null | Yes | — |
lines[].questions[].version | integer | null | Yes | — |
lines[].questions[].withheld | boolean | Yes | — |
lines[].used | boolean | Yes | — |
live | HandoffLive | Yes | — |
live.canEdit | boolean | Yes | — |
live.crm | object | Yes | — |
live.crm.held | boolean | Yes | — |
live.crm.sent | boolean | Yes | — |
live.crm.updates | integer | Yes | — |
live.mine | boolean | Yes | — |
live.notes | object | null | Yes | — |
live.notes.body | string | Yes | — |
live.notes.version | integer | Yes | — |
live.open | boolean | Yes | — |
live.state | enum | null | Yes | One of: "connected", "ended", "done". |
live.text | object | Yes | — |
live.text.available | boolean | Yes | — |
live.text.sentAt | string (date-time) | null | Yes | — |
live.version | integer | Yes | — |
notetaker | HandoffNotetaker | Yes | — |
notetaker.offReason | string | null | Yes | — |
notetaker.status | enum | null | Yes | One of: "listening", "finished", "unavailable". |
otherAnswers | array<object> | Yes | — |
otherAnswers[].key | string | Yes | — |
otherAnswers[].value | any | null | Yes | — |
startedAt | string (date-time) | Yes | — |
state | enum | Yes | One of: "live", "ended". |
summary | string | null | Yes | — |
transcriptStored | boolean | Yes | — |
transferredAt | string (date-time) | null | Yes | — |
turns | array<HandoffTurn> | Yes | — |
turns[].at | string (date-time) | null | Yes | — |
turns[].seq | integer | Yes | — |
turns[].speaker | enum | Yes | One of: "agent", "caller", "rep". |
turns[].text | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}/done" \
-H "Authorization: Bearer $ACCESS_TOKEN"Set, confirm or clear one answer on a call handed to me. Send the answer's version as read (null when there was none); a stale one is refused with 409#
PATCH /v1/me/handoffs/{callId}/fields/{fieldKey}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
fieldKey | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
value | string | number | boolean | null | Yes | — |
version | integer | null | Yes | Minimum 1. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
callerName | string | null | Yes | — |
callerNumber | string | null | Yes | — |
endedAt | string (date-time) | null | Yes | — |
fromRingStep | boolean | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
groupName | string | Yes | — |
handoffReason | enum | null | Yes | One of: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". |
isTest | boolean | Yes | — |
lines | array<HandoffLine> | Yes | — |
lines[].id | string | Yes | — |
lines[].name | string | Yes | — |
lines[].questions | array<HandoffQuestion> | Yes | — |
lines[].questions[].key | string | Yes | — |
lines[].questions[].label | string | Yes | — |
lines[].questions[].options | array<object> | Yes | — |
lines[].questions[].options[].label | string | Yes | — |
lines[].questions[].options[].value | string | Yes | — |
lines[].questions[].required | boolean | Yes | — |
lines[].questions[].sensitivity | enum | Yes | One of: "standard", "sensitive". |
lines[].questions[].source | enum | null | Yes | One of: "agent", "heard", "rep". |
lines[].questions[].status | enum | null | Yes | One of: "confirmed", "provisional". |
lines[].questions[].suggested | any | null | Yes | — |
lines[].questions[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
lines[].questions[].value | any | null | Yes | — |
lines[].questions[].version | integer | null | Yes | — |
lines[].questions[].withheld | boolean | Yes | — |
lines[].used | boolean | Yes | — |
live | HandoffLive | Yes | — |
live.canEdit | boolean | Yes | — |
live.crm | object | Yes | — |
live.crm.held | boolean | Yes | — |
live.crm.sent | boolean | Yes | — |
live.crm.updates | integer | Yes | — |
live.mine | boolean | Yes | — |
live.notes | object | null | Yes | — |
live.notes.body | string | Yes | — |
live.notes.version | integer | Yes | — |
live.open | boolean | Yes | — |
live.state | enum | null | Yes | One of: "connected", "ended", "done". |
live.text | object | Yes | — |
live.text.available | boolean | Yes | — |
live.text.sentAt | string (date-time) | null | Yes | — |
live.version | integer | Yes | — |
notetaker | HandoffNotetaker | Yes | — |
notetaker.offReason | string | null | Yes | — |
notetaker.status | enum | null | Yes | One of: "listening", "finished", "unavailable". |
otherAnswers | array<object> | Yes | — |
otherAnswers[].key | string | Yes | — |
otherAnswers[].value | any | null | Yes | — |
startedAt | string (date-time) | Yes | — |
state | enum | Yes | One of: "live", "ended". |
summary | string | null | Yes | — |
transcriptStored | boolean | Yes | — |
transferredAt | string (date-time) | null | Yes | — |
turns | array<HandoffTurn> | Yes | — |
turns[].at | string (date-time) | null | Yes | — |
turns[].seq | integer | Yes | — |
turns[].speaker | enum | Yes | One of: "agent", "caller", "rep". |
turns[].text | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}/fields/{fieldKey}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"value": "string",
"version": 1
}'Take the listener's suggestion as the answer, or leave it#
POST /v1/me/handoffs/{callId}/fields/{fieldKey}/suggestion
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
fieldKey | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | One of: "accept", "dismiss". |
version | integer | Yes | Minimum 1. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
callerName | string | null | Yes | — |
callerNumber | string | null | Yes | — |
endedAt | string (date-time) | null | Yes | — |
fromRingStep | boolean | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
groupName | string | Yes | — |
handoffReason | enum | null | Yes | One of: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". |
isTest | boolean | Yes | — |
lines | array<HandoffLine> | Yes | — |
lines[].id | string | Yes | — |
lines[].name | string | Yes | — |
lines[].questions | array<HandoffQuestion> | Yes | — |
lines[].questions[].key | string | Yes | — |
lines[].questions[].label | string | Yes | — |
lines[].questions[].options | array<object> | Yes | — |
lines[].questions[].options[].label | string | Yes | — |
lines[].questions[].options[].value | string | Yes | — |
lines[].questions[].required | boolean | Yes | — |
lines[].questions[].sensitivity | enum | Yes | One of: "standard", "sensitive". |
lines[].questions[].source | enum | null | Yes | One of: "agent", "heard", "rep". |
lines[].questions[].status | enum | null | Yes | One of: "confirmed", "provisional". |
lines[].questions[].suggested | any | null | Yes | — |
lines[].questions[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
lines[].questions[].value | any | null | Yes | — |
lines[].questions[].version | integer | null | Yes | — |
lines[].questions[].withheld | boolean | Yes | — |
lines[].used | boolean | Yes | — |
live | HandoffLive | Yes | — |
live.canEdit | boolean | Yes | — |
live.crm | object | Yes | — |
live.crm.held | boolean | Yes | — |
live.crm.sent | boolean | Yes | — |
live.crm.updates | integer | Yes | — |
live.mine | boolean | Yes | — |
live.notes | object | null | Yes | — |
live.notes.body | string | Yes | — |
live.notes.version | integer | Yes | — |
live.open | boolean | Yes | — |
live.state | enum | null | Yes | One of: "connected", "ended", "done". |
live.text | object | Yes | — |
live.text.available | boolean | Yes | — |
live.text.sentAt | string (date-time) | null | Yes | — |
live.version | integer | Yes | — |
notetaker | HandoffNotetaker | Yes | — |
notetaker.offReason | string | null | Yes | — |
notetaker.status | enum | null | Yes | One of: "listening", "finished", "unavailable". |
otherAnswers | array<object> | Yes | — |
otherAnswers[].key | string | Yes | — |
otherAnswers[].value | any | null | Yes | — |
startedAt | string (date-time) | Yes | — |
state | enum | Yes | One of: "live", "ended". |
summary | string | null | Yes | — |
transcriptStored | boolean | Yes | — |
transferredAt | string (date-time) | null | Yes | — |
turns | array<HandoffTurn> | Yes | — |
turns[].at | string (date-time) | null | Yes | — |
turns[].seq | integer | Yes | — |
turns[].speaker | enum | Yes | One of: "agent", "caller", "rep". |
turns[].text | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}/fields/{fieldKey}/suggestion" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"action": "accept",
"version": 1
}'My notes page is open: the call's CRM log waits for my Done instead of going as soon as the call ends#
POST /v1/me/handoffs/{callId}/heartbeat
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}/heartbeat" \
-H "Authorization: Bearer $ACCESS_TOKEN"Save the notes on a call handed to me (the Markdown subset with checklists). Send the version as read (null for the first save); a stale one is refused with 409#
PUT /v1/me/handoffs/{callId}/notes
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
body | string | Yes | Up to 40000 characters. |
version | integer | null | Yes | Minimum 1. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
body | string | Yes | — |
version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}/notes" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"body": "string",
"version": 1
}'Text the notes link to the rep the call was handed to: the link only, once a minute (logs call.notes.text_link)#
POST /v1/me/handoffs/{callId}/text-link
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
Request body
application/json, required.
Type: object
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
callerName | string | null | Yes | — |
callerNumber | string | null | Yes | — |
endedAt | string (date-time) | null | Yes | — |
fromRingStep | boolean | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
groupName | string | Yes | — |
handoffReason | enum | null | Yes | One of: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". |
isTest | boolean | Yes | — |
lines | array<HandoffLine> | Yes | — |
lines[].id | string | Yes | — |
lines[].name | string | Yes | — |
lines[].questions | array<HandoffQuestion> | Yes | — |
lines[].questions[].key | string | Yes | — |
lines[].questions[].label | string | Yes | — |
lines[].questions[].options | array<object> | Yes | — |
lines[].questions[].options[].label | string | Yes | — |
lines[].questions[].options[].value | string | Yes | — |
lines[].questions[].required | boolean | Yes | — |
lines[].questions[].sensitivity | enum | Yes | One of: "standard", "sensitive". |
lines[].questions[].source | enum | null | Yes | One of: "agent", "heard", "rep". |
lines[].questions[].status | enum | null | Yes | One of: "confirmed", "provisional". |
lines[].questions[].suggested | any | null | Yes | — |
lines[].questions[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
lines[].questions[].value | any | null | Yes | — |
lines[].questions[].version | integer | null | Yes | — |
lines[].questions[].withheld | boolean | Yes | — |
lines[].used | boolean | Yes | — |
live | HandoffLive | Yes | — |
live.canEdit | boolean | Yes | — |
live.crm | object | Yes | — |
live.crm.held | boolean | Yes | — |
live.crm.sent | boolean | Yes | — |
live.crm.updates | integer | Yes | — |
live.mine | boolean | Yes | — |
live.notes | object | null | Yes | — |
live.notes.body | string | Yes | — |
live.notes.version | integer | Yes | — |
live.open | boolean | Yes | — |
live.state | enum | null | Yes | One of: "connected", "ended", "done". |
live.text | object | Yes | — |
live.text.available | boolean | Yes | — |
live.text.sentAt | string (date-time) | null | Yes | — |
live.version | integer | Yes | — |
notetaker | HandoffNotetaker | Yes | — |
notetaker.offReason | string | null | Yes | — |
notetaker.status | enum | null | Yes | One of: "listening", "finished", "unavailable". |
otherAnswers | array<object> | Yes | — |
otherAnswers[].key | string | Yes | — |
otherAnswers[].value | any | null | Yes | — |
startedAt | string (date-time) | Yes | — |
state | enum | Yes | One of: "live", "ended". |
summary | string | null | Yes | — |
transcriptStored | boolean | Yes | — |
transferredAt | string (date-time) | null | Yes | — |
turns | array<HandoffTurn> | Yes | — |
turns[].at | string (date-time) | null | Yes | — |
turns[].seq | integer | Yes | — |
turns[].speaker | enum | Yes | One of: "agent", "caller", "rep". |
turns[].text | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, 502, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}/text-link" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'The lines of a call handed to me after the one the page already has, with the signal version they are at least as fresh as#
GET /v1/me/handoffs/{callId}/turns
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
after | integer | No | Minimum -1. Default: -1. |
limit | integer | No | Between 1 and 500. Default: 200. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
turns | array<HandoffTurn> | Yes | — |
turns[].at | string (date-time) | null | Yes | — |
turns[].seq | integer | Yes | — |
turns[].speaker | enum | Yes | One of: "agent", "caller", "rep". |
turns[].text | string | Yes | — |
version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/handoffs/{callId}/turns" \
-H "Authorization: Bearer $ACCESS_TOKEN"The meetings assigned to me: upcoming, past or cancelled#
GET /v1/me/meetings
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
status | enum | No | One of: "upcoming", "past", "cancelled". Default: "upcoming". |
limit | integer | No | Between 1 and 200. Default: 100. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
meetings | array<Meeting> | Yes | — |
meetings[].cancelNote | string | null | Yes | — |
meetings[].cancelledAt | string (date-time) | null | Yes | — |
meetings[].cancelledBy | enum | null | Yes | One of: "caller", "rep", "admin", "calendar". |
meetings[].end | string (date-time) | null | Yes | — |
meetings[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
meetings[].groupName | string | Yes | — |
meetings[].id | string (bkg_… ID) | Yes | ID (bkg_…) |
meetings[].inviteeName | string | null | Yes | — |
meetings[].meetingType | string | null | Yes | — |
meetings[].outcome | enum | null | Yes | One of: "attended", "no_show". |
meetings[].pageTitle | string | null | Yes | — |
meetings[].source | enum | Yes | One of: "phone", "web_chat", "web_voice", "booking_page", "other". |
meetings[].start | string (date-time) | Yes | — |
meetings[].status | enum | Yes | One of: "upcoming", "past", "cancelled". |
meetings[].timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/meetings" \
-H "Authorization: Bearer $ACCESS_TOKEN"One of my meetings: who is coming, how to reach them, and what they told us#
GET /v1/me/meetings/{bookingId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
meeting | MeetingDetail | Yes | — |
meeting.answers | map | Yes | — |
meeting.answers.{key} | any | No | Any key. |
meeting.cancelNote | string | null | Yes | — |
meeting.cancelledAt | string (date-time) | null | Yes | — |
meeting.cancelledBy | enum | null | Yes | One of: "caller", "rep", "admin", "calendar". |
meeting.email | string | null | Yes | — |
meeting.end | string (date-time) | null | Yes | — |
meeting.groupId | string (grp_… ID) | Yes | ID (grp_…) |
meeting.groupName | string | Yes | — |
meeting.id | string (bkg_… ID) | Yes | ID (bkg_…) |
meeting.inviteeName | string | null | Yes | — |
meeting.maskedFields | array<string> | Yes | — |
meeting.meetingType | string | null | Yes | — |
meeting.outcome | enum | null | Yes | One of: "attended", "no_show". |
meeting.pageTitle | string | null | Yes | — |
meeting.phone | string | null | Yes | — |
meeting.source | enum | Yes | One of: "phone", "web_chat", "web_voice", "booking_page", "other". |
meeting.start | string (date-time) | Yes | — |
meeting.status | enum | Yes | One of: "upcoming", "past", "cancelled". |
meeting.summary | string | null | Yes | — |
meeting.timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"The visit brief for one of my meetings: who is coming, their timeline and interests, objections and answers, open commitments and talking points (logs call.view)#
GET /v1/me/meetings/{bookingId}/brief
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
content | any | null | Yes | — |
crmLogged | boolean | Yes | — |
generatedAt | string (date-time) | null | Yes | — |
notifiedAt | string (date-time) | null | Yes | — |
recipient | object | null | Yes | — |
recipient.name | string | null | Yes | — |
recipient.source | enum | Yes | One of: "rep", "booking_assignee", "human_backup", "editors", "staff". |
recipient.userId | string (usr_… ID) | null | Yes | — |
stage | enum | null | Yes | One of: "booked", "day_before", "two_hours". |
state | enum | Yes | One of: "ready", "pending", "cleared". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/brief" \
-H "Authorization: Bearer $ACCESS_TOKEN"Cancel one of my upcoming meetings, in the calendar and for the caller#
POST /v1/me/meetings/{bookingId}/cancel
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
note | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
meeting | Meeting | Yes | — |
meeting.cancelNote | string | null | Yes | — |
meeting.cancelledAt | string (date-time) | null | Yes | — |
meeting.cancelledBy | enum | null | Yes | One of: "caller", "rep", "admin", "calendar". |
meeting.end | string (date-time) | null | Yes | — |
meeting.groupId | string (grp_… ID) | Yes | ID (grp_…) |
meeting.groupName | string | Yes | — |
meeting.id | string (bkg_… ID) | Yes | ID (bkg_…) |
meeting.inviteeName | string | null | Yes | — |
meeting.meetingType | string | null | Yes | — |
meeting.outcome | enum | null | Yes | One of: "attended", "no_show". |
meeting.pageTitle | string | null | Yes | — |
meeting.source | enum | Yes | One of: "phone", "web_chat", "web_voice", "booking_page", "other". |
meeting.start | string (date-time) | Yes | — |
meeting.status | enum | Yes | One of: "upcoming", "past", "cancelled". |
meeting.timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, 502, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/cancel" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"note": "string"
}'Move one of my meetings to another of my free times; the caller is told#
POST /v1/me/meetings/{bookingId}/reschedule
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
startAt | string (date-time) | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
meeting | Meeting | Yes | — |
meeting.cancelNote | string | null | Yes | — |
meeting.cancelledAt | string (date-time) | null | Yes | — |
meeting.cancelledBy | enum | null | Yes | One of: "caller", "rep", "admin", "calendar". |
meeting.end | string (date-time) | null | Yes | — |
meeting.groupId | string (grp_… ID) | Yes | ID (grp_…) |
meeting.groupName | string | Yes | — |
meeting.id | string (bkg_… ID) | Yes | ID (bkg_…) |
meeting.inviteeName | string | null | Yes | — |
meeting.meetingType | string | null | Yes | — |
meeting.outcome | enum | null | Yes | One of: "attended", "no_show". |
meeting.pageTitle | string | null | Yes | — |
meeting.source | enum | Yes | One of: "phone", "web_chat", "web_voice", "booking_page", "other". |
meeting.start | string (date-time) | Yes | — |
meeting.status | enum | Yes | One of: "upcoming", "past", "cancelled". |
meeting.timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, 502, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/reschedule" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startAt": "2026-01-15T15:30:00Z"
}'Times I could move one of my meetings to, from my own hours and calendar#
GET /v1/me/meetings/{bookingId}/times
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
times | array<object> | Yes | — |
times[].end | string | Yes | — |
times[].start | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/times" \
-H "Authorization: Bearer $ACCESS_TOKEN"A visit I give, or one at a community I can see: its notes, newest first, and what I may do#
GET /v1/me/meetings/{bookingId}/visit
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
actions | array<VisitAction> | Yes | — |
actions[].actionKey | string | null | Yes | — |
actions[].bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
actions[].canTake | boolean | Yes | — |
actions[].canUndo | boolean | Yes | — |
actions[].canWork | boolean | Yes | — |
actions[].closedAt | string (date-time) | null | Yes | — |
actions[].closedInCrm | boolean | Yes | — |
actions[].createdAt | string (date-time) | Yes | — |
actions[].crmTask | boolean | Yes | — |
actions[].dismissReason | string | null | Yes | — |
actions[].dueAt | string (date-time) | Yes | — |
actions[].id | string (vac_… ID) | Yes | ID (vac_…) |
actions[].label | string | Yes | — |
actions[].note | string | null | Yes | — |
actions[].owner | object | null | Yes | — |
actions[].owner.name | string | Yes | — |
actions[].owner.userId | string (usr_… ID) | Yes | ID (usr_…) |
actions[].ownerSource | enum | Yes | One of: "rep", "backup", "member". |
actions[].status | enum | Yes | One of: "open", "done", "dismissed". |
actions[].version | integer | Yes | — |
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
canWrite | boolean | Yes | — |
catalog | VisitActionCatalog | Yes | — |
catalog.allowCustom | boolean | Yes | — |
catalog.items | array<object> | Yes | — |
catalog.items[].dueDays | integer | Yes | — |
catalog.items[].key | string | Yes | — |
catalog.items[].label | string | Yes | — |
catalog.items[].owner | enum | Yes | One of: "rep", "backup". |
closesAt | string (date-time) | Yes | — |
crm | VisitCrm | Yes | — |
crm.blocked | enum | null | Yes | One of: "no_contact", "no_crm". |
crm.changedSince | boolean | Yes | — |
crm.finishedAt | string (date-time) | null | Yes | — |
crm.hasContent | boolean | Yes | — |
crm.sentAt | string (date-time) | null | Yes | — |
crm.started | boolean | Yes | — |
crm.updates | integer | Yes | — |
movedTo | string (bkg_… ID) | null | Yes | — |
notes | array<VisitNote> | Yes | — |
notes[].author | object | Yes | — |
notes[].author.name | string | Yes | — |
notes[].author.userId | string (usr_… ID) | Yes | ID (usr_…) |
notes[].body | string | Yes | — |
notes[].canDelete | boolean | Yes | — |
notes[].canEdit | boolean | Yes | — |
notes[].createdAt | string (date-time) | Yes | — |
notes[].id | string (vnt_… ID) | Yes | ID (vnt_…) |
notes[].mine | boolean | Yes | — |
notes[].updatedAt | string (date-time) | Yes | — |
notes[].version | integer | Yes | — |
open | boolean | Yes | — |
page | VisitPage | Yes | — |
page.origin | enum | null | Yes | One of: "call", "visit". |
page.publishedAt | string (date-time) | null | Yes | — |
page.showsPhotos | boolean | Yes | — |
page.state | enum | Yes | One of: "none", "live", "closed". |
photoState | VisitPhotoState | Yes | — |
photoState.blocked | enum | null | Yes | One of: "not_writer", "moved", "cancelled", "compliance", "too_early", "closed". |
photoState.consentAt | string (date-time) | null | Yes | — |
photoState.opensAt | string (date-time) | Yes | — |
photos | array<VisitPhoto> | Yes | — |
photos[].canDelete | boolean | Yes | — |
photos[].canEdit | boolean | Yes | — |
photos[].caption | string | null | Yes | — |
photos[].createdAt | string (date-time) | Yes | — |
photos[].height | integer | null | Yes | — |
photos[].id | string (vph_… ID) | Yes | ID (vph_…) |
photos[].largeUrl | string | null | Yes | — |
photos[].mine | boolean | Yes | — |
photos[].shared | boolean | Yes | — |
photos[].sort | integer | Yes | — |
photos[].status | enum | Yes | One of: "uploading", "processing", "ready", "failed". |
photos[].thumbUrl | string | null | Yes | — |
photos[].uploadedBy | object | Yes | — |
photos[].uploadedBy.name | string | Yes | — |
photos[].uploadedBy.userId | string (usr_… ID) | Yes | ID (usr_…) |
photos[].width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit" \
-H "Authorization: Bearer $ACCESS_TOKEN"Add a next step to a visit: an item from the community’s list (actionKey), or one typed (label). The same clientKey again returns the first item#
POST /v1/me/meetings/{bookingId}/visit/actions
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
actionKey | string | No | Up to 64 characters. |
clientKey | string | Yes | Pattern: ^[A-Za-z0-9_-]\{16,64\}$. |
dueDay | string | No | Pattern: ^\d\{4\}-\d\{2\}-\d\{2\}$. |
label | string | No | 1–80 characters. |
note | string | No | Up to 500 characters. |
ownerUserId | string (usr_… ID) | No | ID (usr_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
actionKey | string | null | Yes | — |
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
canTake | boolean | Yes | — |
canUndo | boolean | Yes | — |
canWork | boolean | Yes | — |
closedAt | string (date-time) | null | Yes | — |
closedInCrm | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
crmTask | boolean | Yes | — |
dismissReason | string | null | Yes | — |
dueAt | string (date-time) | Yes | — |
id | string (vac_… ID) | Yes | ID (vac_…) |
label | string | Yes | — |
note | string | null | Yes | — |
owner | object | null | Yes | — |
owner.name | string | Yes | — |
owner.userId | string (usr_… ID) | Yes | ID (usr_…) |
ownerSource | enum | Yes | One of: "rep", "backup", "member". |
status | enum | Yes | One of: "open", "done", "dismissed". |
version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/actions" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clientKey": "string"
}'Send the visit’s notes and next steps to the CRM now, as one activity. After it went, sends one update with the visit as it now stands#
POST /v1/me/meetings/{bookingId}/visit/finish
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
blocked | enum | null | Yes | One of: "no_contact", "no_crm". |
changedSince | boolean | Yes | — |
finishedAt | string (date-time) | null | Yes | — |
hasContent | boolean | Yes | — |
sentAt | string (date-time) | null | Yes | — |
started | boolean | Yes | — |
updates | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/finish" \
-H "Authorization: Bearer $ACCESS_TOKEN"Add a note to a visit (the Markdown subset with checklists). The same clientKey again returns the first note#
POST /v1/me/meetings/{bookingId}/visit/notes
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
body | string | Yes | Up to 20000 characters. |
clientKey | string | Yes | Pattern: ^[A-Za-z0-9_-]\{16,64\}$. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
author | object | Yes | — |
author.name | string | Yes | — |
author.userId | string (usr_… ID) | Yes | ID (usr_…) |
body | string | Yes | — |
canDelete | boolean | Yes | — |
canEdit | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
id | string (vnt_… ID) | Yes | ID (vnt_…) |
mine | boolean | Yes | — |
updatedAt | string (date-time) | Yes | — |
version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/notes" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clientKey": "string",
"body": "string"
}'Change one of my notes on a visit. Send the version as read; a stale one is refused with 409#
PATCH /v1/me/meetings/{bookingId}/visit/notes/{noteId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
noteId | string (vnt_… ID) | Yes | ID (vnt_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
body | string | Yes | Up to 20000 characters. |
version | integer | Yes | Minimum 1. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
author | object | Yes | — |
author.name | string | Yes | — |
author.userId | string (usr_… ID) | Yes | ID (usr_…) |
body | string | Yes | — |
canDelete | boolean | Yes | — |
canEdit | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
id | string (vnt_… ID) | Yes | ID (vnt_…) |
mine | boolean | Yes | — |
updatedAt | string (date-time) | Yes | — |
version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/notes/{noteId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"body": "string",
"version": 1
}'Remove a note from a visit: my own while the visit takes notes, or anyone’s at a community I manage#
DELETE /v1/me/meetings/{bookingId}/visit/notes/{noteId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
noteId | string (vnt_… ID) | Yes | ID (vnt_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/notes/{noteId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Confirm the family agreed to have photos taken and shared with them, including on links they forward#
POST /v1/me/meetings/{bookingId}/visit/photo-consent
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
consentAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/photo-consent" \
-H "Authorization: Bearer $ACCESS_TOKEN"Start adding a photo: returns the photo and a one-time link to PUT its bytes to (null when they are already there). The same clientKey again returns the same photo#
POST /v1/me/meetings/{bookingId}/visit/photos
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
bytes | integer | Yes | Between 1 and 15728640. |
clientKey | string | Yes | Pattern: ^[A-Za-z0-9_-]\{16,64\}$. |
contentType | enum | Yes | One of: "image/jpeg", "image/png", "image/webp". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
photo | VisitPhoto | Yes | — |
photo.canDelete | boolean | Yes | — |
photo.canEdit | boolean | Yes | — |
photo.caption | string | null | Yes | — |
photo.createdAt | string (date-time) | Yes | — |
photo.height | integer | null | Yes | — |
photo.id | string (vph_… ID) | Yes | ID (vph_…) |
photo.largeUrl | string | null | Yes | — |
photo.mine | boolean | Yes | — |
photo.shared | boolean | Yes | — |
photo.sort | integer | Yes | — |
photo.status | enum | Yes | One of: "uploading", "processing", "ready", "failed". |
photo.thumbUrl | string | null | Yes | — |
photo.uploadedBy | object | Yes | — |
photo.uploadedBy.name | string | Yes | — |
photo.uploadedBy.userId | string (usr_… ID) | Yes | ID (usr_…) |
photo.width | integer | null | Yes | — |
uploadUrl | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/photos" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clientKey": "string",
"contentType": "image/jpeg",
"bytes": 1
}'Put a visit’s photos in a new order, in one go: every photo the visit shows, each once#
PUT /v1/me/meetings/{bookingId}/visit/photos/order
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
photoIds | array<string (vph_… ID)> | Yes | Up to 2000 items. |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/photos/order" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"photoIds": [
"vph_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
]
}'Change a photo’s caption, whether it is shared with the family, or its place in the order#
PATCH /v1/me/meetings/{bookingId}/visit/photos/{photoId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
photoId | string (vph_… ID) | Yes | ID (vph_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
caption | string | null | No | Up to 200 characters. |
shared | boolean | No | — |
sort | integer | No | Between 0 and 10000. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
canDelete | boolean | Yes | — |
canEdit | boolean | Yes | — |
caption | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
height | integer | null | Yes | — |
id | string (vph_… ID) | Yes | ID (vph_…) |
largeUrl | string | null | Yes | — |
mine | boolean | Yes | — |
shared | boolean | Yes | — |
sort | integer | Yes | — |
status | enum | Yes | One of: "uploading", "processing", "ready", "failed". |
thumbUrl | string | null | Yes | — |
uploadedBy | object | Yes | — |
uploadedBy.name | string | Yes | — |
uploadedBy.userId | string (usr_… ID) | Yes | ID (usr_…) |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/photos/{photoId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"caption": "string",
"shared": true,
"sort": 0
}'Remove a photo: hidden at once, its files deleted by the daily sweep. My own, or anyone’s at a community I manage#
DELETE /v1/me/meetings/{bookingId}/visit/photos/{photoId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
photoId | string (vph_… ID) | Yes | ID (vph_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/photos/{photoId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Finish adding a photo once its bytes are sent: checks them, then its copies are made (status processing, then ready)#
POST /v1/me/meetings/{bookingId}/visit/photos/{photoId}/complete
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
photoId | string (vph_… ID) | Yes | ID (vph_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
canDelete | boolean | Yes | — |
canEdit | boolean | Yes | — |
caption | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
height | integer | null | Yes | — |
id | string (vph_… ID) | Yes | ID (vph_…) |
largeUrl | string | null | Yes | — |
mine | boolean | Yes | — |
shared | boolean | Yes | — |
sort | integer | Yes | — |
status | enum | Yes | One of: "uploading", "processing", "ready", "failed". |
thumbUrl | string | null | Yes | — |
uploadedBy | object | Yes | — |
uploadedBy.name | string | Yes | — |
uploadedBy.userId | string (usr_… ID) | Yes | ID (usr_…) |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/photos/{photoId}/complete" \
-H "Authorization: Bearer $ACCESS_TOKEN"Show the visit’s shared photos on the family’s page, making an on-demand page if it has none. Returns a fresh link and QR code for an on-demand page (each call: Show the link again), or none for a call’s page#
POST /v1/me/meetings/{bookingId}/visit/publish
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
link | any | null | Yes | — |
page | VisitPage | Yes | — |
page.origin | enum | null | Yes | One of: "call", "visit". |
page.publishedAt | string (date-time) | null | Yes | — |
page.showsPhotos | boolean | Yes | — |
page.state | enum | Yes | One of: "none", "live", "closed". |
shown | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/publish" \
-H "Authorization: Bearer $ACCESS_TOKEN"Take every photo of the visit off the family’s page at once, without removing any#
POST /v1/me/meetings/{bookingId}/visit/unpublish
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
origin | enum | null | Yes | One of: "call", "visit". |
publishedAt | string (date-time) | null | Yes | — |
showsPhotos | boolean | Yes | — |
state | enum | Yes | One of: "none", "live", "closed". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/meetings/{bookingId}/visit/unpublish" \
-H "Authorization: Bearer $ACCESS_TOKEN"Which second sign-in steps this login has, and what its account asks for#
GET /v1/me/mfa
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
accountPolicy | any | null | Yes | — |
enrolled | boolean | Yes | — |
factors | array<MfaFactor> | Yes | — |
factors[].backedUp | boolean | null | Yes | — |
factors[].createdAt | string (date-time) | Yes | — |
factors[].hint | string | null | Yes | — |
factors[].id | string (mfa_… ID) | Yes | ID (mfa_…) |
factors[].kind | enum | Yes | One of: "email", "sms", "totp", "passkey". |
factors[].label | string | null | Yes | — |
factors[].lastUsedAt | string (date-time) | null | Yes | — |
factors[].status | enum | Yes | One of: "pending", "active". |
methods | array<enum> | Yes | Items: "email", "sms", "totp", "passkey". |
reason | enum | null | Yes | One of: "platform", "account". |
recoveryCodesLeft | integer | Yes | — |
required | boolean | Yes | — |
satisfied | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/mfa" \
-H "Authorization: Bearer $ACCESS_TOKEN"Send a passcode for one of this login’s methods (an authenticator app sends none)#
POST /v1/me/mfa/challenge
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
factorId | string (mfa_… ID) | Yes | ID (mfa_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
challengeId | string (mfch_… ID) | No | ID (mfch_…) |
devCode | string | No | — |
kind | enum | Yes | One of: "email", "sms", "totp", "passkey". |
publicKeyOptions | map | No | — |
publicKeyOptions.{key} | any | No | Any key. |
sentToHint | string | No | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/mfa/challenge" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"factorId": "mfa_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'Start setting a second sign-in step up. Setting the same kind up again replaces it, but only once the new one is confirmed.#
POST /v1/me/mfa/methods
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
kind | enum | Yes | One of: "email", "sms", "totp", "passkey". |
label | string | No | Up to 60 characters. |
phone | string | No | Up to 20 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
challengeId | string (mfch_… ID) | No | ID (mfch_…) |
devCode | string | No | — |
factorId | string (mfa_… ID) | Yes | ID (mfa_…) |
kind | enum | Yes | One of: "email", "sms", "totp", "passkey". |
publicKeyOptions | map | No | — |
publicKeyOptions.{key} | any | No | Any key. |
qrDataUrl | string | No | — |
secret | string | No | — |
sentToHint | string | No | — |
uri | string | No | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/mfa/methods" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "email"
}'Remove a second sign-in step. Refused when it is the last one and one is required.#
DELETE /v1/me/mfa/methods/{factorId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
factorId | string (mfa_… ID) | Yes | ID (mfa_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/mfa/methods/{factorId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Finish setting a second sign-in step up. The first one also returns recovery codes, shown once.#
POST /v1/me/mfa/methods/{factorId}/confirm
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
factorId | string (mfa_… ID) | Yes | ID (mfa_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
challengeId | string (mfch_… ID) | No | ID (mfch_…) |
code | string | No | 4–32 characters. |
credential | map | No | — |
credential.{key} | any | No | Any key. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
factor | MfaFactor | Yes | — |
factor.backedUp | boolean | null | Yes | — |
factor.createdAt | string (date-time) | Yes | — |
factor.hint | string | null | Yes | — |
factor.id | string (mfa_… ID) | Yes | ID (mfa_…) |
factor.kind | enum | Yes | One of: "email", "sms", "totp", "passkey". |
factor.label | string | null | Yes | — |
factor.lastUsedAt | string (date-time) | null | Yes | — |
factor.status | enum | Yes | One of: "pending", "active". |
recoveryCodes | array<string> | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/mfa/methods/{factorId}/confirm" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"challengeId": "mfch_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"code": "string",
"credential": {}
}'Spend a recovery code to get into this session when no method is to hand. Set a method up again afterwards.#
POST /v1/me/mfa/recovery
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
code | string | Yes | 4–32 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
recoveryCodesLeft | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/mfa/recovery" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "string"
}'Replace every recovery code with ten new ones. The old ones stop working at once.#
POST /v1/me/mfa/recovery-codes
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
codes | array<string> | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/mfa/recovery-codes" \
-H "Authorization: Bearer $ACCESS_TOKEN"Confirm a code for this session. Refresh the Supabase session afterwards to pick up the new claims.#
POST /v1/me/mfa/verify
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
challengeId | string (mfch_… ID) | No | ID (mfch_…) |
code | string | No | 4–32 characters. |
credential | map | No | — |
credential.{key} | any | No | Any key. |
factorId | string (mfa_… ID) | Yes | ID (mfa_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
method | enum | Yes | One of: "email", "sms", "totp", "passkey". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/mfa/verify" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"factorId": "mfa_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'Apps you gave access to your account#
GET /v1/me/oauth-grants
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
grants | array<OAuthGrant> | Yes | — |
grants[].clientId | string | Yes | — |
grants[].clientName | string | null | Yes | — |
grants[].createdAt | string (date-time) | Yes | — |
grants[].expiresAt | string (date-time) | null | Yes | — |
grants[].groupIds | array<string (grp_… ID)> | null | Yes | — |
grants[].id | string (ogr_… ID) | Yes | ID (ogr_…) |
grants[].lastUsedAt | string (date-time) | null | Yes | — |
grants[].redirectHost | string | null | Yes | — |
grants[].scopes | array<string> | Yes | — |
grants[].userEmail | string | null | Yes | — |
grants[].userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/oauth-grants" \
-H "Authorization: Bearer $ACCESS_TOKEN"Take access away from an app you connected#
DELETE /v1/me/oauth-grants/{grantId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
grantId | string (ogr_… ID) | Yes | ID (ogr_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
revoked | enum | Yes | One of: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/oauth-grants/{grantId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Pick the group my defaults come from, among the groups whose staff I am on#
PUT /v1/me/primary-group
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
groups | array<object> | Yes | — |
groups[].id | string (grp_… ID) | Yes | ID (grp_…) |
groups[].name | string | Yes | — |
groups[].timeZone | string | Yes | — |
matchEmail | string | null | Yes | — |
primaryGroupId | string (grp_… ID) | null | Yes | — |
schedules | array<AvailabilitySchedule> | Yes | — |
schedules[].chosen | boolean | Yes | — |
schedules[].hours | object | Yes | — |
schedules[].hours.overrides | array<object> | Yes | Up to 366 items. |
schedules[].hours.overrides[].date | string (date) | Yes | — |
schedules[].hours.overrides[].windows | array<object> | Yes | Up to 12 items. |
schedules[].hours.timeZone | string | Yes | — |
schedules[].hours.weekly | array<object> | Yes | Up to 50 items. |
schedules[].hours.weekly[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
schedules[].hours.weekly[].end | string | constant | Yes | — |
schedules[].hours.weekly[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
schedules[].id | string (avs_… ID) | Yes | ID (avs_…) |
schedules[].isDefault | boolean | Yes | — |
schedules[].name | string | Yes | — |
schedules[].updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/primary-group" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"groupId": "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'Change your own name and the time zone you read times in#
PATCH /v1/me/profile
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Up to 120 characters. |
timeZone | string | null | No | 1–64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
name | string | null | Yes | — |
timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/me/profile" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"timeZone": "string"
}'Whether ring groups ring me (Taking calls) or skip me (Away)#
GET /v1/me/taking-calls
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
takingCalls | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/taking-calls" \
-H "Authorization: Bearer $ACCESS_TOKEN"Switch myself to Taking calls or Away. Away skips me in every ring group; transfers the agent makes to me still ring#
PUT /v1/me/taking-calls
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
takingCalls | boolean | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
takingCalls | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/me/taking-calls" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"takingCalls": true
}'The scopes a token can have, in plain words, and which this role may give. Owners and admins may ask for another role (a service identity’s ceiling)#
GET /v1/me/token-scopes
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
role | enum | No | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
scopes | array<object> | Yes | — |
scopes[].grantable | boolean | Yes | — |
scopes[].label | string | Yes | — |
scopes[].scope | string | Yes | — |
scopes[].write | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/token-scopes" \
-H "Authorization: Bearer $ACCESS_TOKEN"My open next steps from visits, soonest due first, and the ones waiting for a backup contact where I am one#
GET /v1/me/visit-actions
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
items | array<MyVisitAction> | Yes | — |
items[].actionKey | string | null | Yes | — |
items[].bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
items[].canTake | boolean | Yes | — |
items[].canUndo | boolean | Yes | — |
items[].canWork | boolean | Yes | — |
items[].closedAt | string (date-time) | null | Yes | — |
items[].closedInCrm | boolean | Yes | — |
items[].createdAt | string (date-time) | Yes | — |
items[].crmTask | boolean | Yes | — |
items[].dismissReason | string | null | Yes | — |
items[].dueAt | string (date-time) | Yes | — |
items[].id | string (vac_… ID) | Yes | ID (vac_…) |
items[].label | string | Yes | — |
items[].note | string | null | Yes | — |
items[].owner | object | null | Yes | — |
items[].owner.name | string | Yes | — |
items[].owner.userId | string (usr_… ID) | Yes | ID (usr_…) |
items[].ownerSource | enum | Yes | One of: "rep", "backup", "member". |
items[].status | enum | Yes | One of: "open", "done", "dismissed". |
items[].version | integer | Yes | — |
items[].visit | VisitActionVisit | Yes | — |
items[].visit.groupId | string (grp_… ID) | Yes | ID (grp_…) |
items[].visit.groupName | string | Yes | — |
items[].visit.open | object | object | object | Yes | — |
items[].visit.open.bookingId | string (bkg_… ID) | Yes | (variant 1) ID (bkg_…) |
items[].visit.open.kind | constant | Yes | (variant 1) Always "meeting". |
items[].visit.open.callId | string (call_… ID) | Yes | (variant 2) ID (call_…) |
items[].visit.open.kind | constant | Yes | (variant 2) Always "call". |
items[].visit.open.kind | constant | Yes | (variant 3) Always "none". |
items[].visit.start | string (date-time) | Yes | — |
items[].visit.timeZone | string | null | Yes | — |
items[].visit.who | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/me/visit-actions" \
-H "Authorization: Bearer $ACCESS_TOKEN"Mark a next step done, dismiss it, reopen it, move it to another day, change its note or hand it on. Send the version as read; a stale one is refused with 409#
PATCH /v1/me/visit-actions/{actionId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
actionId | string (vac_… ID) | Yes | ID (vac_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
dismissReason | string | No | Up to 200 characters. |
dueDay | string | No | Pattern: ^\d\{4\}-\d\{2\}-\d\{2\}$. |
note | string | null | No | Up to 500 characters. |
owner | string (usr_… ID) | enum | No | — |
status | enum | No | One of: "open", "done", "dismissed". |
version | integer | Yes | Minimum 1. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
actionKey | string | null | Yes | — |
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
canTake | boolean | Yes | — |
canUndo | boolean | Yes | — |
canWork | boolean | Yes | — |
closedAt | string (date-time) | null | Yes | — |
closedInCrm | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
crmTask | boolean | Yes | — |
dismissReason | string | null | Yes | — |
dueAt | string (date-time) | Yes | — |
id | string (vac_… ID) | Yes | ID (vac_…) |
label | string | Yes | — |
note | string | null | Yes | — |
owner | object | null | Yes | — |
owner.name | string | Yes | — |
owner.userId | string (usr_… ID) | Yes | ID (usr_…) |
ownerSource | enum | Yes | One of: "rep", "backup", "member". |
status | enum | Yes | One of: "open", "done", "dismissed". |
version | integer | Yes | — |
visit | VisitActionVisit | Yes | — |
visit.groupId | string (grp_… ID) | Yes | ID (grp_…) |
visit.groupName | string | Yes | — |
visit.open | object | object | object | Yes | — |
visit.open.bookingId | string (bkg_… ID) | Yes | (variant 1) ID (bkg_…) |
visit.open.kind | constant | Yes | (variant 1) Always "meeting". |
visit.open.callId | string (call_… ID) | Yes | (variant 2) ID (call_…) |
visit.open.kind | constant | Yes | (variant 2) Always "call". |
visit.open.kind | constant | Yes | (variant 3) Always "none". |
visit.start | string (date-time) | Yes | — |
visit.timeZone | string | null | Yes | — |
visit.who | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/me/visit-actions/{actionId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"version": 1
}'Take back a next step I added by mistake: within ten minutes, and only while nobody has changed it#
DELETE /v1/me/visit-actions/{actionId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
actionId | string (vac_… ID) | Yes | ID (vac_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/me/visit-actions/{actionId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Take a next step that is waiting for one of the community’s backup contacts#
POST /v1/me/visit-actions/{actionId}/take
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
actionId | string (vac_… ID) | Yes | ID (vac_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
actionKey | string | null | Yes | — |
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
canTake | boolean | Yes | — |
canUndo | boolean | Yes | — |
canWork | boolean | Yes | — |
closedAt | string (date-time) | null | Yes | — |
closedInCrm | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
crmTask | boolean | Yes | — |
dismissReason | string | null | Yes | — |
dueAt | string (date-time) | Yes | — |
id | string (vac_… ID) | Yes | ID (vac_…) |
label | string | Yes | — |
note | string | null | Yes | — |
owner | object | null | Yes | — |
owner.name | string | Yes | — |
owner.userId | string (usr_… ID) | Yes | ID (usr_…) |
ownerSource | enum | Yes | One of: "rep", "backup", "member". |
status | enum | Yes | One of: "open", "done", "dismissed". |
version | integer | Yes | — |
visit | VisitActionVisit | Yes | — |
visit.groupId | string (grp_… ID) | Yes | ID (grp_…) |
visit.groupName | string | Yes | — |
visit.open | object | object | object | Yes | — |
visit.open.bookingId | string (bkg_… ID) | Yes | (variant 1) ID (bkg_…) |
visit.open.kind | constant | Yes | (variant 1) Always "meeting". |
visit.open.callId | string (call_… ID) | Yes | (variant 2) ID (call_…) |
visit.open.kind | constant | Yes | (variant 2) Always "call". |
visit.open.kind | constant | Yes | (variant 3) Always "none". |
visit.start | string (date-time) | Yes | — |
visit.timeZone | string | null | Yes | — |
visit.who | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/me/visit-actions/{actionId}/take" \
-H "Authorization: Bearer $ACCESS_TOKEN"