API reference
Calls
Calls, transcripts, recordings and callbacks
| Method | Path | Summary |
|---|---|---|
GET | /v1/account/bookings | Meetings the agent booked: upcoming soonest first, or past most recent first. No caller details |
GET | /v1/account/callbacks | Callbacks captured by the agent, oldest due first |
POST | /v1/account/callbacks/{callbackId}/done | Mark a callback as done, with an optional note |
GET | /v1/account/calls | Calls and chats, newest first, filtered by group, playbook, version, outcome, channel and date. Test calls are left out unless includeTests=true (both kinds) or isTest=true (test calls only) |
GET | /v1/account/calls/{callId} | One call: record, transcript, tool calls, guardrail hits, rule fired, booking and callback (audited; sensitive answers withheld) |
GET | /v1/account/calls/{callId}/debug-trace | What code decided on a call, in order: path moves, rules checked and why, tools run with their arguments and results (audited; sensitive answers withheld) |
POST | /v1/account/calls/{callId}/debug-trace/reveal | The call debugger trace with its sensitive answers, recorded separately in the audit log (rate limited) |
GET | /v1/account/calls/{callId}/follow-up | The follow-up page for a call: its state, the texts sent and where they got to, what the caller did on the page, and why there is no page when there is none. The page's link is never returned |
GET | /v1/account/calls/{callId}/follow-up/page | The call's follow-up page as the caller sees it now, for staff to look at. Read-only: no link, no booking actions, and viewing it is not recorded as the caller opening it |
POST | /v1/account/calls/{callId}/follow-up/resend | Text the follow-up link again. A fresh link is minted, so the earlier one stops working, and the send goes through the normal consent and quiet-hours checks |
POST | /v1/account/calls/{callId}/follow-up/revoke | Turn off a caller's follow-up link. The page then shows only the group's name and number, and nothing personal |
GET | /v1/account/calls/{callId}/prompts | What the model was sent on each step of a call, whole and unmasked (kept on test calls and when prompt capture is on; recorded in the audit log as a reveal; rate limited) |
GET | /v1/account/calls/{callId}/question-map | The lines of questioning of the playbook a call ran, to draw its path on: pinned, so lines a group added and rules since deleted are there |
GET | /v1/account/calls/{callId}/recording-link | A signed link to the recording, valid for 5 minutes (only when consent was given) |
POST | /v1/account/calls/{callId}/reveal | Show the sensitive answers a call collected: the full values, recorded separately in the audit log (rate limited) |
Meetings the agent booked: upcoming soonest first, or past most recent first. No caller details#
GET /v1/account/bookings
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.).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
when | enum | No | One of: "upcoming", "past". Default: "upcoming". |
limit | integer | No | Between 1 and 200. Default: 50. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
bookings | array<Booking> | Yes | — |
bookings[].assignee | string | null | Yes | — |
bookings[].callId | string (call_… ID) | null | Yes | — |
bookings[].confirmationId | string | Yes | — |
bookings[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
bookings[].id | string (bkg_… ID) | Yes | ID (bkg_…) |
bookings[].meetingType | string | null | Yes | — |
bookings[].outcome | string | null | Yes | — |
bookings[].provider | string | Yes | — |
bookings[].slotEnd | string (date-time) | null | Yes | — |
bookings[].slotStart | string (date-time) | Yes | — |
bookings[].status | enum | Yes | One of: "confirmed", "cancelled". |
bookings[].timeZone | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/bookings" \
-H "Authorization: Bearer $ACCESS_TOKEN"Callbacks captured by the agent, oldest due first#
GET /v1/account/callbacks
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.).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
status | enum | No | One of: "open", "done", "escalated", "dismissed". |
groupId | string (grp_… ID) | No | ID (grp_…) |
limit | integer | No | Between 1 and 200. Default: 100. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callbacks | array<Callback> | Yes | — |
callbacks[].callId | string (call_… ID) | null | Yes | — |
callbacks[].callerName | string | null | Yes | — |
callbacks[].createdAt | string (date-time) | Yes | — |
callbacks[].doneAt | string (date-time) | null | Yes | — |
callbacks[].doneBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
callbacks[].doneNote | string | null | Yes | — |
callbacks[].dueAt | string (date-time) | null | Yes | — |
callbacks[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
callbacks[].id | string (cbk_… ID) | Yes | ID (cbk_…) |
callbacks[].phone | string | null | Yes | — |
callbacks[].preferredWindow | string | null | Yes | — |
callbacks[].reason | string | null | Yes | — |
callbacks[].status | enum | Yes | One of: "open", "done", "escalated", "dismissed". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/callbacks" \
-H "Authorization: Bearer $ACCESS_TOKEN"Mark a callback as done, with an optional note#
POST /v1/account/callbacks/{callbackId}/done
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 |
|---|---|---|---|
callbackId | string (cbk_… ID) | Yes | ID (cbk_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
note | string | No | 1–1000 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | null | Yes | — |
callerName | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
doneAt | string (date-time) | null | Yes | — |
doneBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
doneNote | string | null | Yes | — |
dueAt | string (date-time) | null | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
id | string (cbk_… ID) | Yes | ID (cbk_…) |
phone | string | null | Yes | — |
preferredWindow | string | null | Yes | — |
reason | string | null | Yes | — |
status | enum | Yes | One of: "open", "done", "escalated", "dismissed". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/callbacks/{callbackId}/done" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"note": "string"
}'Calls and chats, newest first, filtered by group, playbook, version, outcome, channel and date. Test calls are left out unless includeTests=true (both kinds) or isTest=true (test calls only)#
GET /v1/account/calls
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.).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
playbookId | string (pb_… ID) | No | ID (pb_…) |
playbookVersionId | string (pbv_… ID) | No | ID (pbv_…) |
version | integer | No | Minimum 1. |
outcome | enum | No | One of: "booked", "callback", "transferred", "not_fit", "declined", "abandoned", "booking_failed", "redirected", "error". |
ruleFired | string | No | 1–200 characters. |
recorded | enum | No | One of: "true", "false". |
from | string | No | Up to 40 characters. |
to | string | No | Up to 40 characters. |
isTest | enum | No | One of: "true", "false". |
includeTests | enum | No | One of: "true", "false". |
channel | enum | No | One of: "phone", "site_chat", "page_chat", "web_voice". |
limit | integer | No | Between 1 and 200. Default: 50. |
cursor | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
calls | array<CallSummary> | Yes | — |
calls[].answeredBy | enum | null | Yes | One of: "agent", "rep", "nobody". |
calls[].callerNumberMasked | string | null | Yes | — |
calls[].channel | enum | Yes | One of: "phone", "web_chat", "web_voice". |
calls[].channelKind | enum | Yes | One of: "phone", "site_chat", "page_chat", "web_voice". |
calls[].continuesCallId | string (call_… ID) | null | Yes | — |
calls[].durationSeconds | integer | null | Yes | — |
calls[].endedAt | string (date-time) | null | Yes | — |
calls[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
calls[].groupName | string | Yes | — |
calls[].guardrailHitCount | integer | Yes | — |
calls[].handoffReason | string | null | Yes | — |
calls[].id | string (call_… ID) | Yes | ID (call_…) |
calls[].isTest | boolean | Yes | — |
calls[].outcome | enum | null | Yes | One of: "booked", "callback", "transferred", "not_fit", "declined", "abandoned", "booking_failed", "redirected", "error". |
calls[].phoneNumberId | string (pn_… ID) | null | Yes | — |
calls[].playbookId | string (pb_… ID) | null | Yes | — |
calls[].playbookName | string | null | Yes | — |
calls[].playbookVersion | integer | null | Yes | — |
calls[].playbookVersionId | string (pbv_… ID) | null | Yes | — |
calls[].recorded | boolean | Yes | — |
calls[].recordingStatus | enum | null | Yes | One of: "disabled", "unavailable", "recording", "stored", "declined", "failed". |
calls[].ruleFired | string | null | Yes | — |
calls[].sourcePageId | string (fup_… ID) | null | Yes | — |
calls[].startedAt | string (date-time) | Yes | — |
calls[].status | enum | Yes | One of: "ringing", "in_progress", "completed", "failed". |
calls[].widgetKeyId | string (wk_… ID) | null | Yes | — |
calls[].widgetVisitorId | string (wvis_… ID) | null | Yes | — |
nextCursor | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/calls" \
-H "Authorization: Bearer $ACCESS_TOKEN"One call: record, transcript, tool calls, guardrail hits, rule fired, booking and callback (audited; sensitive answers withheld)#
GET /v1/account/calls/{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_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
answeredAt | string (date-time) | null | Yes | — |
answeredBy | enum | null | Yes | One of: "agent", "rep", "nobody". |
bookingFacts | map | Yes | — |
bookingFacts.{key} | any | No | Any key. |
bookings | array<object> | Yes | — |
bookings[].assignee | string | null | Yes | — |
bookings[].confirmationId | string | Yes | — |
bookings[].id | string (bkg_… ID) | Yes | ID (bkg_…) |
bookings[].meetingType | string | null | Yes | — |
bookings[].provider | string | Yes | — |
bookings[].slotEnd | string (date-time) | null | Yes | — |
bookings[].slotStart | string (date-time) | Yes | — |
bookings[].status | enum | Yes | One of: "confirmed", "cancelled". |
bookings[].timeZone | string | null | Yes | — |
callbacks | array<Callback> | Yes | — |
callbacks[].callId | string (call_… ID) | null | Yes | — |
callbacks[].callerName | string | null | Yes | — |
callbacks[].createdAt | string (date-time) | Yes | — |
callbacks[].doneAt | string (date-time) | null | Yes | — |
callbacks[].doneBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
callbacks[].doneNote | string | null | Yes | — |
callbacks[].dueAt | string (date-time) | null | Yes | — |
callbacks[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
callbacks[].id | string (cbk_… ID) | Yes | ID (cbk_…) |
callbacks[].phone | string | null | Yes | — |
callbacks[].preferredWindow | string | null | Yes | — |
callbacks[].reason | string | null | Yes | — |
callbacks[].status | enum | Yes | One of: "open", "done", "escalated", "dismissed". |
callerNumber | string | null | Yes | — |
callerNumberMasked | string | null | Yes | — |
channel | enum | Yes | One of: "phone", "web_chat", "web_voice". |
channelKind | enum | Yes | One of: "phone", "site_chat", "page_chat", "web_voice". |
collectedFields | map | Yes | — |
collectedFields.{key} | any | No | Any key. |
connectedSeconds | integer | null | Yes | — |
continuesCallId | string (call_… ID) | null | Yes | — |
dialedNumber | string | null | Yes | — |
durationSeconds | integer | null | Yes | — |
effectiveHash | string | null | Yes | — |
endedAt | string (date-time) | null | Yes | — |
errorCode | string | null | Yes | — |
fieldSensitivity | map | Yes | — |
fieldSensitivity.{key} | enum | No | Any key. One of: "standard", "sensitive". |
flowPath | array<object | object | object | object | object | object | object | object | object> | Yes | — |
flowPath[].flowId | string | Yes | (variant 1) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 1) Always "enter". |
flowPath[].t | number | Yes | (variant 1) Minimum 0. |
flowPath[].via | enum | Yes | (variant 1) One of: "default", "reason". |
flowPath[].afterField | string | No | (variant 2) 1–64 characters. |
flowPath[].from | string | Yes | (variant 2) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 2) Always "skip". |
flowPath[].ruleId | string | Yes | (variant 2) 1–64 characters. |
flowPath[].t | number | Yes | (variant 2) Minimum 0. |
flowPath[].to | string | Yes | (variant 2) 1–64 characters. |
flowPath[].action | enum | Yes | (variant 3) One of: "offer_nurture", "offer_referral", "end_politely". |
flowPath[].afterField | string | No | (variant 3) 1–64 characters. |
flowPath[].flowId | string | Yes | (variant 3) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 3) Always "not_a_fit". |
flowPath[].ruleId | string | Yes | (variant 3) 1–64 characters. |
flowPath[].t | number | Yes | (variant 3) Minimum 0. |
flowPath[].afterField | string | No | (variant 4) 1–64 characters. |
flowPath[].flowId | string | Yes | (variant 4) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 4) Always "fit_again". |
flowPath[].ruleId | string | Yes | (variant 4) 1–64 characters. |
flowPath[].t | number | Yes | (variant 4) Minimum 0. |
flowPath[].fieldId | string | Yes | (variant 5) 1–64 characters. |
flowPath[].flowId | string | Yes | (variant 5) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 5) Always "gated". |
flowPath[].t | number | Yes | (variant 5) Minimum 0. |
flowPath[].flowId | string | Yes | (variant 6) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 6) Always "complete". |
flowPath[].t | number | Yes | (variant 6) Minimum 0. |
flowPath[].asWritten | boolean | No | (variant 7) |
flowPath[].flowId | string | Yes | (variant 7) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 7) Always "talking_point". |
flowPath[].missing | array<string> | No | (variant 7) Up to 20 items. |
flowPath[].pointId | string | Yes | (variant 7) 1–64 characters. |
flowPath[].said | boolean | Yes | (variant 7) |
flowPath[].t | number | Yes | (variant 7) Minimum 0. |
flowPath[].kind | constant | Yes | (variant 8) Always "booking". |
flowPath[].ruleId | string | null | Yes | (variant 8) 1–64 characters. |
flowPath[].t | number | Yes | (variant 8) Minimum 0. |
flowPath[].flowId | string | null | Yes | (variant 9) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 9) Always "transfer". |
flowPath[].t | number | Yes | (variant 9) Minimum 0. |
flowPathWithheld | boolean | Yes | — |
flowsUsed | array<string> | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
groupName | string | Yes | — |
guardrailHitCount | integer | Yes | — |
guardrailHits | array<object> | Yes | — |
guardrailHits[].actionTaken | string | null | Yes | — |
guardrailHits[].createdAt | string (date-time) | Yes | — |
guardrailHits[].detail | string | null | Yes | — |
guardrailHits[].id | string (grd_… ID) | Yes | ID (grd_…) |
guardrailHits[].layer | string | Yes | — |
guardrailHits[].rule | string | Yes | — |
handoffReason | string | null | Yes | — |
handoffRing | array<CallRingAttempt> | null | Yes | — |
handoffRing[].answeredAt | string (date-time) | null | Yes | — |
handoffRing[].attempt | integer | Yes | — |
handoffRing[].dialedAt | string (date-time) | Yes | — |
handoffRing[].endedAt | string (date-time) | Yes | — |
handoffRing[].name | string | Yes | — |
handoffRing[].number | string | null | Yes | — |
handoffRing[].outcome | enum | Yes | One of: "accepted", "declined", "no_accept", "no_answer", "busy", "failed", "cancelled", "lost_race". |
handoffRing[].sipStatus | integer | null | Yes | — |
handoffRing[].userId | string (usr_… ID) | null | Yes | — |
hasRecording | boolean | Yes | — |
id | string (call_… ID) | Yes | ID (call_…) |
isTest | boolean | Yes | — |
maskedFields | array<string> | Yes | — |
models | CallModels | Yes | — |
models.llm | string | null | Yes | — |
models.llmFallbackUsed | boolean | Yes | — |
models.stt | string | null | Yes | — |
models.tts | string | null | Yes | — |
objectionTags | array<string> | Yes | — |
outcome | enum | null | Yes | One of: "booked", "callback", "transferred", "not_fit", "declined", "abandoned", "booking_failed", "redirected", "error". |
phoneNumberId | string (pn_… ID) | null | Yes | — |
playbookId | string (pb_… ID) | null | Yes | — |
playbookName | string | null | Yes | — |
playbookVersion | integer | null | Yes | — |
playbookVersionId | string (pbv_… ID) | null | Yes | — |
provisionalFields | map | Yes | — |
provisionalFields.{key} | any | No | Any key. |
recorded | boolean | Yes | — |
recording | object | null | Yes | — |
recording.durationMs | integer | null | Yes | — |
recording.expired | boolean | Yes | — |
recording.handoverAt | string (date-time) | null | Yes | — |
recording.startedAt | string (date-time) | null | Yes | — |
recording.status | enum | Yes | One of: "disabled", "unavailable", "recording", "stored", "declined", "failed". |
recordingConsent | boolean | null | Yes | — |
recordingStatus | enum | null | Yes | One of: "disabled", "unavailable", "recording", "stored", "declined", "failed". |
ring | any | null | Yes | — |
ruleAction | map | null | Yes | — |
ruleAction.{key} | any | No | Any key. |
ruleFired | string | null | Yes | — |
source | object | null | Yes | — |
source.pageCallId | string (call_… ID) | null | Yes | — |
source.site | string | null | Yes | — |
source.widgetKeyName | string | null | Yes | — |
sourcePageId | string (fup_… ID) | null | Yes | — |
startedAt | string (date-time) | Yes | — |
status | enum | Yes | One of: "ringing", "in_progress", "completed", "failed". |
summary | string | null | Yes | — |
timings | map | Yes | — |
timings.{key} | any | No | Any key. |
toolCalls | array<object> | Yes | — |
toolCalls[].endedAt | string (date-time) | null | Yes | — |
toolCalls[].latency | map | null | Yes | — |
toolCalls[].latency.{key} | number | No | Any key. |
toolCalls[].redacted | boolean | Yes | — |
toolCalls[].role | enum | Yes | One of: "agent", "caller", "tool", "system", "rep". |
toolCalls[].seq | integer | Yes | — |
toolCalls[].startedAt | string (date-time) | null | Yes | — |
toolCalls[].text | string | null | Yes | — |
toolCalls[].toolArgs | map | null | Yes | — |
toolCalls[].toolArgs.{key} | any | No | Any key. |
toolCalls[].toolName | string | null | Yes | — |
toolCalls[].toolResult | any | Yes | — |
transcriptStored | boolean | Yes | — |
transferResult | string | null | Yes | — |
turns | array<object> | Yes | — |
turns[].endedAt | string (date-time) | null | Yes | — |
turns[].latency | map | null | Yes | — |
turns[].latency.{key} | number | No | Any key. |
turns[].redacted | boolean | Yes | — |
turns[].role | enum | Yes | One of: "agent", "caller", "tool", "system", "rep". |
turns[].seq | integer | Yes | — |
turns[].startedAt | string (date-time) | null | Yes | — |
turns[].text | string | null | Yes | — |
turns[].toolArgs | map | null | Yes | — |
turns[].toolArgs.{key} | any | No | Any key. |
turns[].toolName | string | null | Yes | — |
turns[].toolResult | any | Yes | — |
widgetKeyId | string (wk_… ID) | null | Yes | — |
widgetVisitorId | string (wvis_… ID) | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/calls/{callId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"What code decided on a call, in order: path moves, rules checked and why, tools run with their arguments and results (audited; sensitive answers withheld)#
GET /v1/account/calls/{callId}/debug-trace
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_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
callId | string (call_… ID) | Yes | ID (call_…) |
isTest | boolean | Yes | — |
pathWithheld | boolean | Yes | — |
startedAt | string (date-time) | Yes | — |
trace | any | null | Yes | — |
transcriptStored | boolean | Yes | — |
withheld | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/debug-trace" \
-H "Authorization: Bearer $ACCESS_TOKEN"The call debugger trace with its sensitive answers, recorded separately in the audit log (rate limited)#
POST /v1/account/calls/{callId}/debug-trace/reveal
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_…) |
isTest | boolean | Yes | — |
pathWithheld | boolean | Yes | — |
startedAt | string (date-time) | Yes | — |
trace | any | null | Yes | — |
transcriptStored | boolean | Yes | — |
withheld | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/debug-trace/reveal" \
-H "Authorization: Bearer $ACCESS_TOKEN"The follow-up page for a call: its state, the texts sent and where they got to, what the caller did on the page, and why there is no page when there is none. The page's link is never returned#
GET /v1/account/calls/{callId}/follow-up
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 |
|---|---|---|---|
consent | object | null | Yes | — |
consent.askedAt | string (date-time) | Yes | — |
consent.granted | boolean | Yes | — |
consent.resubscribeSource | enum | null | Yes | One of: "caller_start". |
consent.resubscribedAt | string (date-time) | null | Yes | — |
consent.revokeSource | enum | null | Yes | One of: "caller_stop", "staff", "crm", "system", "unsubscribe". |
consent.revokedAt | string (date-time) | null | Yes | — |
events | array<FollowUpEvent> | Yes | — |
events[].moduleId | string | null | Yes | — |
events[].occurredAt | string (date-time) | Yes | — |
events[].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". |
messages | array<FollowUpMessage> | Yes | — |
messages[].body | string | Yes | — |
messages[].channel | enum | Yes | One of: "sms", "email". |
messages[].createdAt | string (date-time) | Yes | — |
messages[].id | string (msg_… ID) | Yes | ID (msg_…) |
messages[].reason | string | null | Yes | — |
messages[].recipientMasked | string | null | Yes | — |
messages[].scheduledFor | string (date-time) | null | Yes | — |
messages[].sentAt | string (date-time) | null | Yes | — |
messages[].status | enum | Yes | One of: "queued", "sent", "delivered", "failed", "skipped". |
messages[].templateKey | string | Yes | — |
page | object | null | Yes | — |
page.createdAt | string (date-time) | Yes | — |
page.expiresAt | string (date-time) | Yes | — |
page.firstOpenedAt | string (date-time) | null | Yes | — |
page.formAnswers | array<object> | Yes | — |
page.formAnswers[].label | string | Yes | — |
page.formAnswers[].value | string | Yes | — |
page.formSubmittedAt | string (date-time) | null | Yes | — |
page.hasBooking | boolean | Yes | — |
page.id | string (fup_… ID) | Yes | ID (fup_…) |
page.openCount | integer | Yes | — |
page.readiness | Readiness | Yes | — |
page.readiness.basePoints | number | Yes | — |
page.readiness.points | number | Yes | — |
page.readiness.reasons | array<object> | Yes | — |
page.readiness.reasons[].key | string | Yes | — |
page.readiness.reasons[].points | number | Yes | — |
page.readiness.reasons[].words | string | Yes | — |
page.readiness.sentence | string | Yes | — |
page.readiness.silentDays | integer | null | Yes | — |
page.readiness.source | enum | Yes | One of: "lead", "call". |
page.readiness.tier | enum | Yes | One of: "cold", "warm", "hot", "not_a_fit". |
page.readiness.version | string | Yes | — |
page.revokedAt | string (date-time) | null | Yes | — |
page.revokedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
page.state | enum | Yes | One of: "upcoming", "day_of", "after_visit", "no_booking", "cancelled", "expired", "revoked". |
reason | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/follow-up" \
-H "Authorization: Bearer $ACCESS_TOKEN"The call's follow-up page as the caller sees it now, for staff to look at. Read-only: no link, no booking actions, and viewing it is not recorded as the caller opening it#
GET /v1/account/calls/{callId}/follow-up/page
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 |
|---|---|---|---|
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/account/calls/{callId}/follow-up/page" \
-H "Authorization: Bearer $ACCESS_TOKEN"Text the follow-up link again. A fresh link is minted, so the earlier one stops working, and the send goes through the normal consent and quiet-hours checks#
POST /v1/account/calls/{callId}/follow-up/resend
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 |
|---|---|---|---|
queued | constant | Yes | Always true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/follow-up/resend" \
-H "Authorization: Bearer $ACCESS_TOKEN"Turn off a caller's follow-up link. The page then shows only the group's name and number, and nothing personal#
POST /v1/account/calls/{callId}/follow-up/revoke
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 |
|---|---|---|---|
revokedAt | string (date-time) | Yes | — |
revokedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/follow-up/revoke" \
-H "Authorization: Bearer $ACCESS_TOKEN"What the model was sent on each step of a call, whole and unmasked (kept on test calls and when prompt capture is on; recorded in the audit log as a reveal; rate limited)#
GET /v1/account/calls/{callId}/prompts
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_…) |
isTest | boolean | Yes | — |
prompts | array<object> | Yes | — |
prompts[].at | string (date-time) | Yes | — |
prompts[].prompt | PromptRecord | Yes | — |
prompts[].prompt.clipped | boolean | Yes | — |
prompts[].prompt.forMessage | string | null | Yes | — |
prompts[].prompt.items | array<object | object | object> | Yes | — |
prompts[].prompt.items[].role | enum | Yes | (variant 1) One of: "system", "developer", "user", "assistant". |
prompts[].prompt.items[].text | string | Yes | (variant 1) |
prompts[].prompt.items[].type | constant | Yes | (variant 1) Always "message". |
prompts[].prompt.items[].args | string | Yes | (variant 2) |
prompts[].prompt.items[].name | string | Yes | (variant 2) |
prompts[].prompt.items[].type | constant | Yes | (variant 2) Always "function_call". |
prompts[].prompt.items[].isError | boolean | Yes | (variant 3) |
prompts[].prompt.items[].name | string | Yes | (variant 3) |
prompts[].prompt.items[].output | string | Yes | (variant 3) |
prompts[].prompt.items[].type | constant | Yes | (variant 3) Always "function_call_output". |
prompts[].prompt.model | string | null | No | — |
prompts[].prompt.step | integer | Yes | Minimum 0. |
prompts[].prompt.tools | array<string> | Yes | — |
prompts[].prompt.v | constant | Yes | Always 1. |
prompts[].seq | integer | Yes | — |
prompts[].t | number | Yes | — |
startedAt | string (date-time) | Yes | — |
transcriptStored | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/prompts" \
-H "Authorization: Bearer $ACCESS_TOKEN"The lines of questioning of the playbook a call ran, to draw its path on: pinned, so lines a group added and rules since deleted are there#
GET /v1/account/calls/{callId}/question-map
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 |
|---|---|---|---|
questionMap | object | null | Yes | — |
questionMap.allowUnqualified | boolean | Yes | — |
questionMap.defaultFlowId | string | Yes | — |
questionMap.flows | array<map> | Yes | — |
questionMap.flows[].{key} | any | No | Any key. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/question-map" \
-H "Authorization: Bearer $ACCESS_TOKEN"A signed link to the recording, valid for 5 minutes (only when consent was given)#
GET /v1/account/calls/{callId}/recording-link
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 |
|---|---|---|---|
download | enum | No | One of: "true", "false". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
expiresInSeconds | integer | Yes | — |
url | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/recording-link" \
-H "Authorization: Bearer $ACCESS_TOKEN"Show the sensitive answers a call collected: the full values, recorded separately in the audit log (rate limited)#
POST /v1/account/calls/{callId}/reveal
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 |
|---|---|---|---|
bookingFacts | map | Yes | — |
bookingFacts.{key} | any | No | Any key. |
collectedFields | map | Yes | — |
collectedFields.{key} | any | No | Any key. |
fieldSensitivity | map | Yes | — |
fieldSensitivity.{key} | enum | No | Any key. One of: "standard", "sensitive". |
flowPath | array<object | object | object | object | object | object | object | object | object> | Yes | — |
flowPath[].flowId | string | Yes | (variant 1) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 1) Always "enter". |
flowPath[].t | number | Yes | (variant 1) Minimum 0. |
flowPath[].via | enum | Yes | (variant 1) One of: "default", "reason". |
flowPath[].afterField | string | No | (variant 2) 1–64 characters. |
flowPath[].from | string | Yes | (variant 2) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 2) Always "skip". |
flowPath[].ruleId | string | Yes | (variant 2) 1–64 characters. |
flowPath[].t | number | Yes | (variant 2) Minimum 0. |
flowPath[].to | string | Yes | (variant 2) 1–64 characters. |
flowPath[].action | enum | Yes | (variant 3) One of: "offer_nurture", "offer_referral", "end_politely". |
flowPath[].afterField | string | No | (variant 3) 1–64 characters. |
flowPath[].flowId | string | Yes | (variant 3) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 3) Always "not_a_fit". |
flowPath[].ruleId | string | Yes | (variant 3) 1–64 characters. |
flowPath[].t | number | Yes | (variant 3) Minimum 0. |
flowPath[].afterField | string | No | (variant 4) 1–64 characters. |
flowPath[].flowId | string | Yes | (variant 4) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 4) Always "fit_again". |
flowPath[].ruleId | string | Yes | (variant 4) 1–64 characters. |
flowPath[].t | number | Yes | (variant 4) Minimum 0. |
flowPath[].fieldId | string | Yes | (variant 5) 1–64 characters. |
flowPath[].flowId | string | Yes | (variant 5) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 5) Always "gated". |
flowPath[].t | number | Yes | (variant 5) Minimum 0. |
flowPath[].flowId | string | Yes | (variant 6) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 6) Always "complete". |
flowPath[].t | number | Yes | (variant 6) Minimum 0. |
flowPath[].asWritten | boolean | No | (variant 7) |
flowPath[].flowId | string | Yes | (variant 7) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 7) Always "talking_point". |
flowPath[].missing | array<string> | No | (variant 7) Up to 20 items. |
flowPath[].pointId | string | Yes | (variant 7) 1–64 characters. |
flowPath[].said | boolean | Yes | (variant 7) |
flowPath[].t | number | Yes | (variant 7) Minimum 0. |
flowPath[].kind | constant | Yes | (variant 8) Always "booking". |
flowPath[].ruleId | string | null | Yes | (variant 8) 1–64 characters. |
flowPath[].t | number | Yes | (variant 8) Minimum 0. |
flowPath[].flowId | string | null | Yes | (variant 9) 1–64 characters. |
flowPath[].kind | constant | Yes | (variant 9) Always "transfer". |
flowPath[].t | number | Yes | (variant 9) Minimum 0. |
provisionalFields | map | Yes | — |
provisionalFields.{key} | any | No | Any key. |
turns | array<object> | Yes | — |
turns[].seq | integer | Yes | — |
turns[].toolArgs | map | null | Yes | — |
turns[].toolArgs.{key} | any | No | Any key. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/calls/{callId}/reveal" \
-H "Authorization: Bearer $ACCESS_TOKEN"