API reference
Public
Public marketing site endpoints
| Method | Path | Summary |
|---|---|---|
GET | /v1/public/book/manage/{token} | A booking by its manage link, to see, reschedule or cancel it |
POST | /v1/public/book/manage/{token}/cancel | Cancel a booking by its manage link |
POST | /v1/public/book/manage/{token}/reschedule | Move a booking to another open time on its page, by its manage link |
GET | /v1/public/book/manage/{token}/times | Times a booking can move to on its page, by its manage link |
GET | /v1/public/book/{account}/{owner} | A rep's or a community's booking pages, for their landing page |
GET | /v1/public/book/{account}/{owner}/{page} | A booking page for rendering, or why it takes no bookings, or where it moved |
POST | /v1/public/book/{account}/{owner}/{page}/bookings | Book a time on a booking page. A repeat with the same request key returns the first booking |
POST | /v1/public/book/{account}/{owner}/{page}/events | Count a view of a booking page, or a time picked on it, once per visitor a day |
GET | /v1/public/book/{account}/{owner}/{page}/times | Open start times on a booking page in a range (a month at most), for one length, and on a group page one service or member |
POST | /v1/public/coupons/check | Whether a promo code can be used at sign-up, and what it gives |
POST | /v1/public/demo-requests | Request a demo or early access from the marketing site |
GET | /v1/public/email/unsubscribe/{token} | The page an unsubscribe link opens: one button, so a link scanner changes nothing |
POST | /v1/public/email/unsubscribe/{token} | Unsubscribe from caller email (RFC 8058 one-click) |
GET | /v1/public/mobile-config | The mobile app's lock timings and minimum version |
GET | /v1/public/pages/{token} | A caller's follow-up page, by link token: state, theme and the resolved modules. Expired and revoked links return the neutral page; an unknown link is a 404 |
POST | /v1/public/pages/{token}/booking | Book, move or cancel this caller's meeting from their page. Booking and moving go through the playbook's own booking rules; cancelling needs no rule's permission |
POST | /v1/public/pages/{token}/events | Record what a visitor did on their follow-up page: one of the contract's event types and an optional module, never free text |
POST | /v1/public/pages/{token}/form | Answer the pre-visit questions on a follow-up page. Every question is optional, and sending again replaces the previous answers |
POST | /v1/public/pages/{token}/share | Mint a link the caller can send to family. It opens a limited view with no personal detail, and expires sooner than the page itself |
GET | /v1/public/pages/{token}/slots | Times this caller may book from their page, decided by the same booking rules the agent used |
POST | /v1/public/signups | Start a self-serve trial: the confirmation link is emailed. The answer is the same for an address that already has a login |
A booking by its manage link, to see, reschedule or cancel it#
GET /v1/public/book/manage/{token}
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
brand | any | null | Yes | — |
canChange | boolean | Yes | — |
cancelledBy | enum | null | Yes | One of: "caller", "rep", "admin", "calendar". |
duration | integer | Yes | — |
end | string | null | Yes | — |
groupName | string | Yes | — |
groupPhone | string | null | Yes | — |
pagePath | string | null | Yes | — |
repName | string | Yes | — |
start | string | Yes | — |
status | enum | Yes | One of: "upcoming", "past", "cancelled". |
timeZone | string | Yes | — |
title | string | Yes | — |
where | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}"Cancel a booking by its manage link#
POST /v1/public/book/manage/{token}/cancel
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
brand | any | null | Yes | — |
canChange | boolean | Yes | — |
cancelledBy | enum | null | Yes | One of: "caller", "rep", "admin", "calendar". |
duration | integer | Yes | — |
end | string | null | Yes | — |
groupName | string | Yes | — |
groupPhone | string | null | Yes | — |
pagePath | string | null | Yes | — |
repName | string | Yes | — |
start | string | Yes | — |
status | enum | Yes | One of: "upcoming", "past", "cancelled". |
timeZone | string | Yes | — |
title | string | Yes | — |
where | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, 502, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}/cancel"Move a booking to another open time on its page, by its manage link#
POST /v1/public/book/manage/{token}/reschedule
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
startAt | string (date-time) | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
brand | any | null | Yes | — |
canChange | boolean | Yes | — |
cancelledBy | enum | null | Yes | One of: "caller", "rep", "admin", "calendar". |
duration | integer | Yes | — |
end | string | null | Yes | — |
groupName | string | Yes | — |
groupPhone | string | null | Yes | — |
pagePath | string | null | Yes | — |
repName | string | Yes | — |
start | string | Yes | — |
status | enum | Yes | One of: "upcoming", "past", "cancelled". |
timeZone | string | Yes | — |
title | string | Yes | — |
where | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, 502, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}/reschedule" \
-H "Content-Type: application/json" \
-d '{
"startAt": "2026-01-15T15:30:00Z"
}'Times a booking can move to on its page, by its manage link#
GET /v1/public/book/manage/{token}/times
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | string (date-time) | Yes | — |
to | string (date-time) | Yes | — |
duration | integer | Yes | Between 5 and 240. |
service | string | No | Up to 40 characters. |
member | string | No | Up to 40 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
times | array<object> | Yes | — |
times[].end | string | Yes | — |
times[].start | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}/times?from=2026-01-15T15:30:00Z&to=2026-01-15T15:30:00Z&duration=5"A rep's or a community's booking pages, for their landing page#
GET /v1/public/book/{account}/{owner}
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
account | string | Yes | 1–64 characters. |
owner | string | Yes | 1–64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
brand | any | null | Yes | (variant 1) |
group | object | Yes | (variant 1) |
group.name | string | Yes | (variant 1) |
group.phone | string | null | Yes | (variant 1) |
kind | enum | Yes | (variant 1) One of: "personal", "group". |
pages | array<object> | Yes | (variant 1) |
pages[].color | string | null | Yes | (variant 1) |
pages[].description | string | Yes | (variant 1) |
pages[].durations | array<integer> | Yes | (variant 1) |
pages[].slug | string | Yes | (variant 1) |
pages[].title | string | Yes | (variant 1) |
rep | object | null | Yes | (variant 1) |
rep.bio | string | null | Yes | (variant 1) |
rep.name | string | Yes | (variant 1) |
rep.photoUrl | string | null | Yes | (variant 1) |
rep.title | string | null | Yes | (variant 1) |
status | constant | Yes | (variant 1) Always "open". |
brand | any | null | Yes | (variant 2) |
group | object | null | Yes | (variant 2) |
group.name | string | Yes | (variant 2) |
group.phone | string | null | Yes | (variant 2) |
rep | object | null | Yes | (variant 2) |
rep.name | string | Yes | (variant 2) |
status | constant | Yes | (variant 2) Always "unavailable". |
path | string | Yes | (variant 3) |
status | constant | Yes | (variant 3) Always "moved". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}"A booking page for rendering, or why it takes no bookings, or where it moved#
GET /v1/public/book/{account}/{owner}/{page}
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
account | string | Yes | 1–64 characters. |
owner | string | Yes | 1–64 characters. |
page | string | Yes | 1–64 characters. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | string | No | Up to 64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
brand | any | null | Yes | (variant 1) |
group | object | Yes | (variant 1) |
group.name | string | Yes | (variant 1) |
group.phone | string | null | Yes | (variant 1) |
kind | enum | Yes | (variant 1) One of: "personal", "group". |
members | array<object> | null | Yes | (variant 1) |
members[].bio | string | null | Yes | (variant 1) |
members[].id | string | Yes | (variant 1) |
members[].name | string | Yes | (variant 1) |
members[].photoUrl | string | null | Yes | (variant 1) |
members[].title | string | null | Yes | (variant 1) |
page | object | Yes | (variant 1) |
page.color | string | null | Yes | (variant 1) |
page.description | string | Yes | (variant 1) |
page.durations | array<integer> | Yes | (variant 1) |
page.location | object | Yes | (variant 1) |
page.location.kind | enum | Yes | (variant 1) One of: "in_person", "phone_invitee", "phone_rep", "video", "custom". |
page.location.label | string | Yes | (variant 1) |
page.questions | array<object> | Yes | (variant 1) |
page.questions[].fieldKey | string | No | (variant 1) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
page.questions[].id | string | Yes | (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
page.questions[].kind | enum | Yes | (variant 1) One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
page.questions[].label | string | Yes | (variant 1) 1–200 characters. |
page.questions[].options | array<string> | No | (variant 1) Up to 20 items. |
page.questions[].required | boolean | Yes | (variant 1) Default: false. |
page.requireEmail | boolean | Yes | (variant 1) |
page.requirePhone | boolean | Yes | (variant 1) |
page.textConsent | string | null | Yes | (variant 1) |
page.title | string | Yes | (variant 1) |
prefill | object | null | Yes | (variant 1) |
prefill.email | string | No | (variant 1) |
prefill.firstName | string | No | (variant 1) |
prefill.lastName | string | No | (variant 1) |
prefill.phone | string | No | (variant 1) |
rep | object | null | Yes | (variant 1) |
rep.bio | string | null | Yes | (variant 1) |
rep.name | string | Yes | (variant 1) |
rep.photoUrl | string | null | Yes | (variant 1) |
rep.title | string | null | Yes | (variant 1) |
service | object | null | Yes | (variant 1) |
service.description | string | Yes | (variant 1) |
service.id | string | Yes | (variant 1) |
service.name | string | Yes | (variant 1) |
services | array<object> | null | Yes | (variant 1) |
services[].description | string | Yes | (variant 1) |
services[].id | string | Yes | (variant 1) |
services[].name | string | Yes | (variant 1) |
status | constant | Yes | (variant 1) Always "open". |
timeZone | string | Yes | (variant 1) |
window | object | Yes | (variant 1) |
window.end | string | Yes | (variant 1) |
window.start | string | Yes | (variant 1) |
yourRep | object | null | Yes | (variant 1) |
yourRep.bio | string | null | Yes | (variant 1) |
yourRep.id | string | Yes | (variant 1) |
yourRep.name | string | Yes | (variant 1) |
yourRep.photoUrl | string | null | Yes | (variant 1) |
yourRep.title | string | null | Yes | (variant 1) |
brand | any | null | Yes | (variant 2) |
group | object | null | Yes | (variant 2) |
group.name | string | Yes | (variant 2) |
group.phone | string | null | Yes | (variant 2) |
rep | object | null | Yes | (variant 2) |
rep.name | string | Yes | (variant 2) |
status | constant | Yes | (variant 2) Always "unavailable". |
path | string | Yes | (variant 3) |
status | constant | Yes | (variant 3) Always "moved". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}"Book a time on a booking page. A repeat with the same request key returns the first booking#
POST /v1/public/book/{account}/{owner}/{page}/bookings
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
account | string | Yes | 1–64 characters. |
owner | string | Yes | 1–64 characters. |
page | string | Yes | 1–64 characters. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
answers | map | No | Default: \{\}. |
answers.{key} | string | array<string> | boolean | No | Any key. |
botToken | string | No | Up to 2048 characters. |
duration | integer | Yes | Between 5 and 240. |
email | string (email) | No | Up to 200 characters. |
firstName | string | Yes | 1–80 characters. |
followUp | string | No | Up to 64 characters. |
formMs | integer | Yes | Minimum 0. |
from | string | No | Up to 64 characters. |
lastName | string | No | 1–80 characters. |
member | string | No | Up to 40 characters. |
phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
requestKey | string | Yes | 16–64 characters. |
service | string | No | Up to 40 characters. |
startAt | string (date-time) | Yes | — |
textConsent | boolean | No | — |
timeZone | string | Yes | 1–64 characters. |
utm | object | No | — |
utm.campaign | string | No | 1–200 characters. |
utm.content | string | No | 1–200 characters. |
utm.medium | string | No | 1–200 characters. |
utm.source | string | No | 1–200 characters. |
utm.term | string | No | 1–200 characters. |
via | enum | No | One of: "link", "inline", "popup". |
website | string | No | Up to 200 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
booking | object | Yes | — |
booking.end | string | Yes | — |
booking.groupName | string | Yes | — |
booking.id | string | Yes | — |
booking.repName | string | Yes | — |
booking.start | string | Yes | — |
booking.title | string | Yes | — |
booking.where | string | Yes | — |
manageToken | string | Yes | — |
redirectUrl | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, 502, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}/bookings" \
-H "Content-Type: application/json" \
-d '{
"startAt": "2026-01-15T15:30:00Z",
"duration": 5,
"firstName": "string",
"timeZone": "string",
"requestKey": "string",
"formMs": 0
}'Count a view of a booking page, or a time picked on it, once per visitor a day#
POST /v1/public/book/{account}/{owner}/{page}/events
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
account | string | Yes | 1–64 characters. |
owner | string | Yes | 1–64 characters. |
page | string | Yes | 1–64 characters. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
kind | enum | Yes | One of: "view", "picked". |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}/events" \
-H "Content-Type: application/json" \
-d '{
"kind": "view"
}'Open start times on a booking page in a range (a month at most), for one length, and on a group page one service or member#
GET /v1/public/book/{account}/{owner}/{page}/times
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
account | string | Yes | 1–64 characters. |
owner | string | Yes | 1–64 characters. |
page | string | Yes | 1–64 characters. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | string (date-time) | Yes | — |
to | string (date-time) | Yes | — |
duration | integer | Yes | Between 5 and 240. |
service | string | No | Up to 40 characters. |
member | string | No | Up to 40 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
times | array<object> | Yes | — |
times[].end | string | Yes | — |
times[].start | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}/times?from=2026-01-15T15:30:00Z&to=2026-01-15T15:30:00Z&duration=5"Whether a promo code can be used at sign-up, and what it gives#
POST /v1/public/coupons/check
Authentication: None. This endpoint does not take an access token.
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
code | string | Yes | — |
planId | string (plan_… ID) | No | ID (plan_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
summary | string | Yes | (variant 1) |
valid | enum | Yes | (variant 1) One of: true. |
message | string | Yes | (variant 2) |
valid | enum | Yes | (variant 2) One of: false. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/coupons/check" \
-H "Content-Type: application/json" \
-d '{
"code": "string"
}'Request a demo or early access from the marketing site#
POST /v1/public/demo-requests
Authentication: None. This endpoint does not take an access token.
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
communities | string | No | Up to 40 characters. |
crm | string | No | Up to 80 characters. |
email | string (email) | Yes | Up to 254 characters. |
interests | array<enum> | No | Items: "voice", "chat", "booking", "follow_up", "insights", "sales_team", "api". Up to 7 items. |
kind | enum | No | One of: "demo", "early_access". Default: "demo". |
name | string | Yes | 1–120 characters. |
note | string | No | Up to 1000 characters. |
organization | string | Yes | 1–160 characters. |
role | string | No | Up to 80 characters. |
website | string | No | Up to 500 characters. |
Response 202
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | One of: "received". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/demo-requests" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"email": "[email protected]",
"organization": "string"
}'The page an unsubscribe link opens: one button, so a link scanner changes nothing#
GET /v1/public/email/unsubscribe/{token}
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 10–200 characters. |
Response 200
No content.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/email/unsubscribe/{token}"Unsubscribe from caller email (RFC 8058 one-click)#
POST /v1/public/email/unsubscribe/{token}
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 10–200 characters. |
Response 200
No content.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/email/unsubscribe/{token}"The mobile app's lock timings and minimum version#
GET /v1/public/mobile-config
Authentication: None. This endpoint does not take an access token.
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
lock | object | Yes | — |
lock.backgroundSeconds | integer | Yes | Between 0 and 900. |
lock.fullSignInDays | integer | Yes | Between 1 and 90. |
lock.idleSeconds | integer | Yes | Between 60 and 1800. |
lock.maxFailedUnlocks | integer | Yes | Between 3 and 10. |
minVersion | string | Yes | Pattern: ^\d\{1,4\}\.\d\{1,4\}\.\d\{1,6\}$. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/mobile-config"A caller's follow-up page, by link token: state, theme and the resolved modules. Expired and revoked links return the neutral page; an unknown link is a 404#
GET /v1/public/pages/{token}
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
bookingPageUrl | string | No | (variant 1) |
can | object | Yes | (variant 1) |
can.book | boolean | Yes | (variant 1) |
can.cancel | boolean | Yes | (variant 1) |
can.reschedule | boolean | Yes | (variant 1) |
chat | boolean | Yes | (variant 1) |
firstName | string | null | Yes | (variant 1) |
groupName | string | Yes | (variant 1) |
lead | string | null | Yes | (variant 1) |
modules | array<object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object> | Yes | (variant 1) |
modules[].dayLabel | string | Yes | (variant 1) (variant 1) |
modules[].durationLabel | string | null | Yes | (variant 1) (variant 1) |
modules[].endAt | string | Yes | (variant 1) (variant 1) |
modules[].heading | string | Yes | (variant 1) (variant 1) |
modules[].id | constant | Yes | (variant 1) (variant 1) Always "meeting_card". |
modules[].location | string | null | Yes | (variant 1) (variant 1) |
modules[].staffName | string | null | Yes | (variant 1) (variant 1) |
modules[].startAt | string | Yes | (variant 1) (variant 1) |
modules[].status | enum | Yes | (variant 1) (variant 1) One of: "confirmed", "cancelled". |
modules[].timeLabel | string | Yes | (variant 1) (variant 1) |
modules[].when | string | Yes | (variant 1) (variant 1) |
modules[].bio | string | null | Yes | (variant 1) (variant 2) |
modules[].heading | string | Yes | (variant 1) (variant 2) |
modules[].id | constant | Yes | (variant 1) (variant 2) Always "staff_intro". |
modules[].name | string | Yes | (variant 1) (variant 2) |
modules[].photoUrl | string (uri) | null | Yes | (variant 1) (variant 2) |
modules[].title | string | null | Yes | (variant 1) (variant 2) |
modules[].video | object | null | Yes | (variant 1) (variant 2) |
modules[].video.captionsUrl | string (uri) | null | Yes | (variant 1) (variant 2) |
modules[].video.kind | enum | Yes | (variant 1) (variant 2) One of: "upload", "youtube", "vimeo", "loom". |
modules[].video.url | string (uri) | Yes | (variant 1) (variant 2) |
modules[].heading | string | Yes | (variant 1) (variant 3) |
modules[].id | constant | Yes | (variant 1) (variant 3) Always "recap". |
modules[].noted | array<object> | Yes | (variant 1) (variant 3) |
modules[].noted[].label | string | Yes | (variant 1) (variant 3) |
modules[].noted[].value | string | Yes | (variant 1) (variant 3) |
modules[].summary | string | Yes | (variant 1) (variant 3) |
modules[].heading | string | Yes | (variant 1) (variant 4) |
modules[].id | constant | Yes | (variant 1) (variant 4) Always "open_questions". |
modules[].questions | array<string> | Yes | (variant 1) (variant 4) |
modules[].heading | string | Yes | (variant 1) (variant 5) |
modules[].id | constant | Yes | (variant 1) (variant 5) Always "pricing". |
modules[].services | array<object> | Yes | (variant 1) (variant 5) |
modules[].services[].asked | boolean | Yes | (variant 1) (variant 5) |
modules[].services[].line | string | Yes | (variant 1) (variant 5) |
modules[].services[].name | string | Yes | (variant 1) (variant 5) |
modules[].specials | array<object> | Yes | (variant 1) (variant 5) |
modules[].specials[].endsOn | string | null | Yes | (variant 1) (variant 5) |
modules[].specials[].items | array<object> | No | (variant 1) (variant 5) |
modules[].specials[].items[].altText | string | Yes | (variant 1) (variant 5) |
modules[].specials[].items[].caption | string | null | Yes | (variant 1) (variant 5) |
modules[].specials[].items[].details | string | null | Yes | (variant 1) (variant 5) |
modules[].specials[].items[].kind | enum | Yes | (variant 1) (variant 5) One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo". |
modules[].specials[].items[].previewUrl | string (uri) | null | Yes | (variant 1) (variant 5) |
modules[].specials[].items[].title | string | Yes | (variant 1) (variant 5) |
modules[].specials[].items[].url | string (uri) | Yes | (variant 1) (variant 5) |
modules[].specials[].line | string | Yes | (variant 1) (variant 5) |
modules[].specials[].title | string | Yes | (variant 1) (variant 5) |
modules[].heading | string | Yes | (variant 1) (variant 6) |
modules[].id | constant | Yes | (variant 1) (variant 6) Always "service_media". |
modules[].services | array<object> | Yes | (variant 1) (variant 6) |
modules[].services[].items | array<object> | Yes | (variant 1) (variant 6) |
modules[].services[].items[].altText | string | Yes | (variant 1) (variant 6) |
modules[].services[].items[].caption | string | null | Yes | (variant 1) (variant 6) |
modules[].services[].items[].details | string | null | Yes | (variant 1) (variant 6) |
modules[].services[].items[].kind | enum | Yes | (variant 1) (variant 6) One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo". |
modules[].services[].items[].previewUrl | string (uri) | null | Yes | (variant 1) (variant 6) |
modules[].services[].items[].title | string | Yes | (variant 1) (variant 6) |
modules[].services[].items[].url | string (uri) | Yes | (variant 1) (variant 6) |
modules[].services[].name | string | Yes | (variant 1) (variant 6) |
modules[].cards | array<object> | Yes | (variant 1) (variant 7) |
modules[].cards[].body | string | Yes | (variant 1) (variant 7) |
modules[].cards[].button | object | null | Yes | (variant 1) (variant 7) |
modules[].cards[].button.label | string | Yes | (variant 1) (variant 7) |
modules[].cards[].button.url | string (uri) | Yes | (variant 1) (variant 7) |
modules[].cards[].id | string | Yes | (variant 1) (variant 7) |
modules[].cards[].imageUrl | string (uri) | null | Yes | (variant 1) (variant 7) |
modules[].cards[].title | string | Yes | (variant 1) (variant 7) |
modules[].heading | string | Yes | (variant 1) (variant 7) |
modules[].id | constant | Yes | (variant 1) (variant 7) Always "content_cards". |
modules[].accessibility | string | null | Yes | (variant 1) (variant 8) |
modules[].address | string | null | Yes | (variant 1) (variant 8) |
modules[].entrance | string | null | Yes | (variant 1) (variant 8) |
modules[].heading | string | Yes | (variant 1) (variant 8) |
modules[].id | constant | Yes | (variant 1) (variant 8) Always "getting_here". |
modules[].mapUrl | string (uri) | null | Yes | (variant 1) (variant 8) |
modules[].nearby | string | null | Yes | (variant 1) (variant 8) |
modules[].parking | string | null | Yes | (variant 1) (variant 8) |
modules[].body | string | null | Yes | (variant 1) (variant 9) |
modules[].checklist | array<string> | Yes | (variant 1) (variant 9) |
modules[].heading | string | Yes | (variant 1) (variant 9) |
modules[].id | constant | Yes | (variant 1) (variant 9) Always "prep". |
modules[].answers | map | Yes | (variant 1) (variant 10) |
modules[].answers.{key} | string | boolean | No | (variant 1) (variant 10) Any key. |
modules[].fields | array<object> | Yes | (variant 1) (variant 10) |
modules[].fields[].id | string | Yes | (variant 1) (variant 10) |
modules[].fields[].label | string | Yes | (variant 1) (variant 10) |
modules[].fields[].options | array<string> | Yes | (variant 1) (variant 10) |
modules[].fields[].type | enum | Yes | (variant 1) (variant 10) One of: "text", "choice", "boolean". |
modules[].heading | string | Yes | (variant 1) (variant 10) |
modules[].id | constant | Yes | (variant 1) (variant 10) Always "pre_visit_form". |
modules[].intro | string | null | Yes | (variant 1) (variant 10) |
modules[].heading | string | Yes | (variant 1) (variant 11) |
modules[].id | constant | Yes | (variant 1) (variant 11) Always "gallery". |
modules[].photos | array<object> | Yes | (variant 1) (variant 11) |
modules[].photos[].altText | string | No | (variant 1) (variant 11) |
modules[].photos[].caption | string | null | Yes | (variant 1) (variant 11) |
modules[].photos[].url | string (uri) | Yes | (variant 1) (variant 11) |
modules[].tourUrl | string (uri) | null | Yes | (variant 1) (variant 11) |
modules[].heading | string | Yes | (variant 1) (variant 12) |
modules[].id | constant | Yes | (variant 1) (variant 12) Always "reviews". |
modules[].reviews | array<object> | Yes | (variant 1) (variant 12) |
modules[].reviews[].attribution | string | null | Yes | (variant 1) (variant 12) |
modules[].reviews[].id | string | Yes | (variant 1) (variant 12) |
modules[].reviews[].quote | string | Yes | (variant 1) (variant 12) |
modules[].heading | string | Yes | (variant 1) (variant 13) |
modules[].id | constant | Yes | (variant 1) (variant 13) Always "resources". |
modules[].resources | array<object> | Yes | (variant 1) (variant 13) |
modules[].resources[].description | string | null | Yes | (variant 1) (variant 13) |
modules[].resources[].id | string | Yes | (variant 1) (variant 13) |
modules[].resources[].label | string | Yes | (variant 1) (variant 13) |
modules[].resources[].url | string (uri) | Yes | (variant 1) (variant 13) |
modules[].blockId | string | Yes | (variant 1) (variant 14) |
modules[].body | string | null | Yes | (variant 1) (variant 14) |
modules[].button | object | null | Yes | (variant 1) (variant 14) |
modules[].button.label | string | Yes | (variant 1) (variant 14) |
modules[].button.url | string (uri) | Yes | (variant 1) (variant 14) |
modules[].heading | string | Yes | (variant 1) (variant 14) |
modules[].id | constant | Yes | (variant 1) (variant 14) Always "custom_block". |
modules[].imageUrl | string (uri) | null | Yes | (variant 1) (variant 14) |
modules[].video | object | null | Yes | (variant 1) (variant 14) |
modules[].video.captionsUrl | string (uri) | null | Yes | (variant 1) (variant 14) |
modules[].video.kind | enum | Yes | (variant 1) (variant 14) One of: "upload", "youtube", "vimeo", "loom". |
modules[].video.url | string (uri) | Yes | (variant 1) (variant 14) |
modules[].heading | string | Yes | (variant 1) (variant 15) |
modules[].id | constant | Yes | (variant 1) (variant 15) Always "share". |
modules[].note | string | Yes | (variant 1) (variant 15) |
modules[].groupName | string | Yes | (variant 1) (variant 16) |
modules[].heading | string | Yes | (variant 1) (variant 16) |
modules[].hours | string | null | Yes | (variant 1) (variant 16) |
modules[].id | constant | Yes | (variant 1) (variant 16) Always "contact". |
modules[].phone | string | null | Yes | (variant 1) (variant 16) |
modules[].heading | string | Yes | (variant 1) (variant 17) |
modules[].id | constant | Yes | (variant 1) (variant 17) Always "visit_photos". |
modules[].photos | array<object> | Yes | (variant 1) (variant 17) |
modules[].photos[].altText | string | Yes | (variant 1) (variant 17) |
modules[].photos[].caption | string | null | Yes | (variant 1) (variant 17) |
modules[].photos[].downloadUrl | string (uri) | Yes | (variant 1) (variant 17) |
modules[].photos[].height | integer | null | Yes | (variant 1) (variant 17) |
modules[].photos[].largeUrl | string (uri) | Yes | (variant 1) (variant 17) |
modules[].photos[].thumbUrl | string (uri) | Yes | (variant 1) (variant 17) |
modules[].photos[].width | integer | null | Yes | (variant 1) (variant 17) |
state | enum | Yes | (variant 1) One of: "upcoming", "day_of", "after_visit", "no_booking", "cancelled". |
theme | object | Yes | (variant 1) |
theme.accent | string | Yes | (variant 1) |
theme.background | string | Yes | (variant 1) |
theme.font | enum | Yes | (variant 1) One of: "system", "serif_warm", "sans_modern". |
theme.logoUrl | string (uri) | null | Yes | (variant 1) |
theme.primary | string | Yes | (variant 1) |
timeZone | string | Yes | (variant 1) |
groupName | string | Yes | (variant 2) |
modules | array<object | object | object | object | object | object | object | object | object | object> | Yes | (variant 2) |
modules[].dayLabel | string | Yes | (variant 2) (variant 1) |
modules[].durationLabel | string | null | Yes | (variant 2) (variant 1) |
modules[].heading | string | Yes | (variant 2) (variant 1) |
modules[].id | constant | Yes | (variant 2) (variant 1) Always "meeting_card". |
modules[].status | enum | Yes | (variant 2) (variant 1) One of: "confirmed", "cancelled". |
modules[].timeLabel | string | Yes | (variant 2) (variant 1) |
modules[].when | string | Yes | (variant 2) (variant 1) |
modules[].bio | string | null | Yes | (variant 2) (variant 2) |
modules[].heading | string | Yes | (variant 2) (variant 2) |
modules[].id | constant | Yes | (variant 2) (variant 2) Always "staff_intro". |
modules[].name | string | Yes | (variant 2) (variant 2) |
modules[].photoUrl | string (uri) | null | Yes | (variant 2) (variant 2) |
modules[].title | string | null | Yes | (variant 2) (variant 2) |
modules[].video | object | null | Yes | (variant 2) (variant 2) |
modules[].video.captionsUrl | string (uri) | null | Yes | (variant 2) (variant 2) |
modules[].video.kind | enum | Yes | (variant 2) (variant 2) One of: "upload", "youtube", "vimeo", "loom". |
modules[].video.url | string (uri) | Yes | (variant 2) (variant 2) |
modules[].cards | array<object> | Yes | (variant 2) (variant 3) |
modules[].cards[].body | string | Yes | (variant 2) (variant 3) |
modules[].cards[].button | object | null | Yes | (variant 2) (variant 3) |
modules[].cards[].button.label | string | Yes | (variant 2) (variant 3) |
modules[].cards[].button.url | string (uri) | Yes | (variant 2) (variant 3) |
modules[].cards[].id | string | Yes | (variant 2) (variant 3) |
modules[].cards[].imageUrl | string (uri) | null | Yes | (variant 2) (variant 3) |
modules[].cards[].title | string | Yes | (variant 2) (variant 3) |
modules[].heading | string | Yes | (variant 2) (variant 3) |
modules[].id | constant | Yes | (variant 2) (variant 3) Always "content_cards". |
modules[].accessibility | string | null | Yes | (variant 2) (variant 4) |
modules[].address | string | null | Yes | (variant 2) (variant 4) |
modules[].entrance | string | null | Yes | (variant 2) (variant 4) |
modules[].heading | string | Yes | (variant 2) (variant 4) |
modules[].id | constant | Yes | (variant 2) (variant 4) Always "getting_here". |
modules[].mapUrl | string (uri) | null | Yes | (variant 2) (variant 4) |
modules[].nearby | string | null | Yes | (variant 2) (variant 4) |
modules[].parking | string | null | Yes | (variant 2) (variant 4) |
modules[].heading | string | Yes | (variant 2) (variant 5) |
modules[].id | constant | Yes | (variant 2) (variant 5) Always "gallery". |
modules[].photos | array<object> | Yes | (variant 2) (variant 5) |
modules[].photos[].altText | string | No | (variant 2) (variant 5) |
modules[].photos[].caption | string | null | Yes | (variant 2) (variant 5) |
modules[].photos[].url | string (uri) | Yes | (variant 2) (variant 5) |
modules[].tourUrl | string (uri) | null | Yes | (variant 2) (variant 5) |
modules[].heading | string | Yes | (variant 2) (variant 6) |
modules[].id | constant | Yes | (variant 2) (variant 6) Always "reviews". |
modules[].reviews | array<object> | Yes | (variant 2) (variant 6) |
modules[].reviews[].attribution | string | null | Yes | (variant 2) (variant 6) |
modules[].reviews[].id | string | Yes | (variant 2) (variant 6) |
modules[].reviews[].quote | string | Yes | (variant 2) (variant 6) |
modules[].heading | string | Yes | (variant 2) (variant 7) |
modules[].id | constant | Yes | (variant 2) (variant 7) Always "resources". |
modules[].resources | array<object> | Yes | (variant 2) (variant 7) |
modules[].resources[].description | string | null | Yes | (variant 2) (variant 7) |
modules[].resources[].id | string | Yes | (variant 2) (variant 7) |
modules[].resources[].label | string | Yes | (variant 2) (variant 7) |
modules[].resources[].url | string (uri) | Yes | (variant 2) (variant 7) |
modules[].blockId | string | Yes | (variant 2) (variant 8) |
modules[].body | string | null | Yes | (variant 2) (variant 8) |
modules[].button | object | null | Yes | (variant 2) (variant 8) |
modules[].button.label | string | Yes | (variant 2) (variant 8) |
modules[].button.url | string (uri) | Yes | (variant 2) (variant 8) |
modules[].heading | string | Yes | (variant 2) (variant 8) |
modules[].id | constant | Yes | (variant 2) (variant 8) Always "custom_block". |
modules[].imageUrl | string (uri) | null | Yes | (variant 2) (variant 8) |
modules[].video | object | null | Yes | (variant 2) (variant 8) |
modules[].video.captionsUrl | string (uri) | null | Yes | (variant 2) (variant 8) |
modules[].video.kind | enum | Yes | (variant 2) (variant 8) One of: "upload", "youtube", "vimeo", "loom". |
modules[].video.url | string (uri) | Yes | (variant 2) (variant 8) |
modules[].groupName | string | Yes | (variant 2) (variant 9) |
modules[].heading | string | Yes | (variant 2) (variant 9) |
modules[].hours | string | null | Yes | (variant 2) (variant 9) |
modules[].id | constant | Yes | (variant 2) (variant 9) Always "contact". |
modules[].phone | string | null | Yes | (variant 2) (variant 9) |
modules[].heading | string | Yes | (variant 2) (variant 10) |
modules[].id | constant | Yes | (variant 2) (variant 10) Always "visit_photos". |
modules[].photos | array<object> | Yes | (variant 2) (variant 10) |
modules[].photos[].altText | string | Yes | (variant 2) (variant 10) |
modules[].photos[].caption | string | null | Yes | (variant 2) (variant 10) |
modules[].photos[].downloadUrl | string (uri) | Yes | (variant 2) (variant 10) |
modules[].photos[].height | integer | null | Yes | (variant 2) (variant 10) |
modules[].photos[].largeUrl | string (uri) | Yes | (variant 2) (variant 10) |
modules[].photos[].thumbUrl | string (uri) | Yes | (variant 2) (variant 10) |
modules[].photos[].width | integer | null | Yes | (variant 2) (variant 10) |
state | constant | Yes | (variant 2) Always "shared". |
theme | object | Yes | (variant 2) |
theme.accent | string | Yes | (variant 2) |
theme.background | string | Yes | (variant 2) |
theme.font | enum | Yes | (variant 2) One of: "system", "serif_warm", "sans_modern". |
theme.logoUrl | string (uri) | null | Yes | (variant 2) |
theme.primary | string | Yes | (variant 2) |
groupName | string | Yes | (variant 3) |
phone | string | null | Yes | (variant 3) |
state | enum | Yes | (variant 3) One of: "expired", "revoked". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/pages/{token}"Book, move or cancel this caller's meeting from their page. Booking and moving go through the playbook's own booking rules; cancelling needs no rule's permission#
POST /v1/public/pages/{token}/booking
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | One of: "book", "reschedule", "cancel". |
startAt | string (date-time) | No | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
done | boolean | Yes | — |
message | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/booking" \
-H "Content-Type: application/json" \
-d '{
"action": "book"
}'Record what a visitor did on their follow-up page: one of the contract's event types and an optional module, never free text#
POST /v1/public/pages/{token}/events
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
moduleId | string | No | Up to 80 characters. |
position | integer | No | Between 1 and 10000. |
type | enum | Yes | One of: "opened", "module_viewed", "link_clicked", "calendar_added", "video_played", "form_submitted", "shared", "booked", "rescheduled", "cancelled", "visit_photos_viewed", "visit_photo_downloaded". |
Response 202
| Field | Type | Required | Description |
|---|---|---|---|
recorded | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/events" \
-H "Content-Type: application/json" \
-d '{
"type": "opened"
}'Answer the pre-visit questions on a follow-up page. Every question is optional, and sending again replaces the previous answers#
POST /v1/public/pages/{token}/form
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
answers | map | Yes | — |
answers.{key} | string | boolean | No | Any key. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
saved | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/form" \
-H "Content-Type: application/json" \
-d '{
"answers": {}
}'Mint a link the caller can send to family. It opens a limited view with no personal detail, and expires sooner than the page itself#
POST /v1/public/pages/{token}/share
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
expiresAt | string (date-time) | Yes | — |
url | string (uri) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/share"Times this caller may book from their page, decided by the same booking rules the agent used#
GET /v1/public/pages/{token}/slots
Authentication: None. This endpoint does not take an access token.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | 1–64 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
reason | string | null | Yes | — |
slots | array<object> | Yes | — |
slots[].end | string (date-time) | Yes | — |
slots[].staffName | string | null | Yes | — |
slots[].start | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/public/pages/{token}/slots"Start a self-serve trial: the confirmation link is emailed. The answer is the same for an address that already has a login#
POST /v1/public/signups
Authentication: None. This endpoint does not take an access token.
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
acceptTerms | enum | Yes | One of: true. |
botToken | string | Yes | Up to 2048 characters. |
code | string | No | Up to 40 characters. |
company | string | Yes | 2–120 characters. |
email | string (email) | Yes | Up to 254 characters. |
groupWord | enum | No | One of: "community", "location", "office", "practice", "branch". Default: "community". |
name | string | Yes | 1–120 characters. |
phone | string | null | No | Pattern: ^\+[1-9]\d\{7,14\}$. |
planId | string (plan_… ID) | No | ID (plan_…) |
utm | object | No | — |
utm.campaign | string | No | Up to 120 characters. |
utm.content | string | No | Up to 120 characters. |
utm.medium | string | No | Up to 120 characters. |
utm.source | string | No | Up to 120 characters. |
utm.term | string | No | Up to 120 characters. |
website | string | No | Up to 500 characters. |
Response 202
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | One of: "check_email". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/public/signups" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"email": "[email protected]",
"company": "string",
"botToken": "string",
"acceptTerms": true
}'