API reference

Analytics

Metrics

MethodPathSummary
GET/v1/account/analyticsBooking rates, drop-off, latency, transfers, unanswered questions, cost and per-group handoff metrics
GET/v1/account/analytics/booking-pagesBooking pages: views, times picked, booked, completion, cancellations, moves and no-shows per page and rep, and bookings by source
GET/v1/account/analytics/follow-upFollow-up page consent, delivery, open, engagement and show-rate metrics for the filtered calls
GET/v1/account/analytics/pricingServices quoted, services asked about that are not offered, specials mentioned and nearby locations named
GET/v1/account/analytics/visitsVisits held, and how many have notes, next steps and photos; next steps by key and how they ended; photos shared and whether families looked

Booking rates, drop-off, latency, transfers, unanswered questions, cost and per-group handoff metrics#

GET /v1/account/analytics

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

NameTypeRequiredDescription
playbookIdstring (pb_… ID)NoID (pb_…)
playbookVersionIdstring (pbv_… ID)NoID (pbv_…)
groupIdstring (grp_… ID)NoID (grp_…)
fromstringNoUp to 40 characters.
tostringNoUp to 40 characters.
includeTestsenumNoOne of: "true", "false".
channelenumNoOne of: "phone", "site_chat", "page_chat", "web_voice". Default: "phone".
effectivePlaybookIdstring (epb_… ID)NoID (epb_…)
fromDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
toDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
sourceenumNoOne of: "number", "widget", "page".
callerenumNoOne of: "prospect", "other".

Response 200

FieldTypeRequiredDescription
bookingRatenumber | nullYes—
byGrouparray<object>Yes—
byGroup[].bookedintegerYes—
byGroup[].bookingRatenumber | nullYes—
byGroup[].connectedintegerYes—
byGroup[].conversationsintegerYes—
byGroup[].groupIdstring (grp_… ID)YesID (grp_…)
byGroup[].groupNamestringYes—
byRulearray<object>Yes—
byRule[].bookedintegerYes—
byRule[].bookingRatenumber | nullYes—
byRule[].callsintegerYes—
byRule[].connectedintegerYes—
byRule[].ruleIdstringYes—
costobjectYes—
cost.centsPerMinutenumberYes—
cost.connectedMinutesnumberYes—
cost.perBookingCentsinteger | nullYes—
cost.perCallCentsinteger | nullYes—
cost.totalCentsintegerYes—
dropOffarray<object>Yes—
dropOff[].dropOffRatenumber | nullYes—
dropOff[].droppedHereintegerYes—
dropOff[].reachedintegerYes—
dropOff[].stageenumYesOne of: "open", "discover", "consult", "book", "wrap", "transfer".
filtersobjectYes—
filters.channelenumYesOne of: "phone", "site_chat", "page_chat", "web_voice".
filters.fromstring (date-time) | nullYes—
filters.tostring (date-time) | nullYes—
handoffByGrouparray<object>Yes—
handoffByGroup[].callbacksCapturedintegerYes—
handoffByGroup[].connectedintegerYes—
handoffByGroup[].groupIdstring (grp_… ID)YesID (grp_…)
handoffByGroup[].groupNamestringYes—
handoffByGroup[].handoffRatenumber | nullYes—
handoffByGroup[].handoffsintegerYes—
handoffByGroup[].medianMinutesToCallbacknumber | nullYes—
handoffByGroup[].missedCallbacksintegerYes—
handoffByGroup[].notetakerobjectYes—
handoffByGroup[].notetaker.coveragenumber | nullYes—
handoffByGroup[].notetaker.handedToRepsintegerYes—
handoffByGroup[].notetaker.notesDoneintegerYes—
handoffByGroup[].notetaker.repEditsintegerYes—
handoffByGroup[].notetaker.repEditsPerCallnumber | nullYes—
handoffByGroup[].notetaker.withNotesintegerYes—
handoffByGroup[].reasonsarray<object>Yes—
handoffByGroup[].reasons[].countintegerYes—
handoffByGroup[].reasons[].keystringYes—
handoffByGroup[].transferAnswerRatenumber | nullYes—
handoffByGroup[].transferAttemptsintegerYes—
handoffByGroup[].transfersAnsweredintegerYes—
latencyobjectYes—
latency.medianMsnumber | nullYes—
latency.p95Msnumber | nullYes—
latency.turnsintegerYes—
outcomesarray<object>Yes—
outcomes[].countintegerYes—
outcomes[].keystringYes—
qualifiedBookingRatenumber | nullYes—
ringingobjectYes—
ringing.byAnsweredarray<object>Yes—
ringing.byAnswered[].answeredByenumYesOne of: "agent", "rep", "nobody".
ringing.byAnswered[].bookedintegerYes—
ringing.byAnswered[].conversationsintegerYes—
ringing.byReparray<object>Yes—
ringing.byRep[].acceptedintegerYes—
ringing.byRep[].declinedintegerYes—
ringing.byRep[].lostRaceintegerYes—
ringing.byRep[].missedintegerYes—
ringing.byRep[].namestringYes—
ringing.byRep[].offeredintegerYes—
ringing.byRep[].repMinutesnumberYes—
ringing.byRep[].userIdstring (usr_… ID)YesID (usr_…)
ringing.byRingGrouparray<object>Yes—
ringing.byRingGroup[].answeredByAgentintegerYes—
ringing.byRingGroup[].answeredByRepintegerYes—
ringing.byRingGroup[].groupIdstring (grp_… ID)YesID (grp_…)
ringing.byRingGroup[].medianSecondsToAnswernumber | nullYes—
ringing.byRingGroup[].missedintegerYes—
ringing.byRingGroup[].namestringYes—
ringing.byRingGroup[].nobodyAvailableintegerYes—
ringing.byRingGroup[].offeredintegerYes—
ringing.byRingGroup[].repAnswerRatenumber | nullYes—
ringing.byRingGroup[].repMinutesnumberYes—
ringing.byRingGroup[].ringGroupIdstring (rgp_… ID)YesID (rgp_…)
topUnansweredQuestionsarray<object>Yes—
topUnansweredQuestions[].countintegerYes—
topUnansweredQuestions[].keystringYes—
totalsobjectYes—
totals.bookedintegerYes—
totals.callsintegerYes—
totals.connectedintegerYes—
totals.handoffsintegerYes—
totals.qualifiedintegerYes—
totals.transferredintegerYes—
transferRatenumber | nullYes—
transferReasonsarray<object>Yes—
transferReasons[].countintegerYes—
transferReasons[].keystringYes—
unansweredHandoffsintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/analytics" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Booking pages: views, times picked, booked, completion, cancellations, moves and no-shows per page and rep, and bookings by source#

GET /v1/account/analytics/booking-pages

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

NameTypeRequiredDescription
groupIdstring (grp_… ID)NoID (grp_…)
fromstringNoUp to 40 characters.
tostringNoUp to 40 characters.

Response 200

FieldTypeRequiredDescription
bySourcearray<object>Yes—
bySource[].countintegerYes—
bySource[].keystringYes—
byUtmSourcearray<object>Yes—
byUtmSource[].countintegerYes—
byUtmSource[].keystringYes—
filtersobjectYes—
filters.fromstring (date-time) | nullYes—
filters.tostring (date-time) | nullYes—
pagesarray<object>Yes—
pages[].attendedintegerYes—
pages[].bookedintegerYes—
pages[].cancelledintegerYes—
pages[].completionnumber | nullYes—
pages[].groupIdstringYes—
pages[].groupNamestringYes—
pages[].idstringYes—
pages[].kindenumYesOne of: "personal", "group".
pages[].movedintegerYes—
pages[].noShowsintegerYes—
pages[].ownerNamestring | nullYes—
pages[].pickedintegerYes—
pages[].titlestringYes—
pages[].viewsintegerYes—
repsarray<object>Yes—
reps[].attendedintegerYes—
reps[].bookedintegerYes—
reps[].cancelledintegerYes—
reps[].movedintegerYes—
reps[].namestringYes—
reps[].noShowsintegerYes—
reps[].userIdstringYes—
totalsobjectYes—
totals.attendedintegerYes—
totals.bookedintegerYes—
totals.cancelledintegerYes—
totals.completionnumber | nullYes—
totals.movedintegerYes—
totals.noShowsintegerYes—
totals.pickedintegerYes—
totals.viewsintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/analytics/booking-pages" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Follow-up page consent, delivery, open, engagement and show-rate metrics for the filtered calls#

GET /v1/account/analytics/follow-up

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Query parameters

NameTypeRequiredDescription
playbookIdstring (pb_… ID)NoID (pb_…)
playbookVersionIdstring (pbv_… ID)NoID (pbv_…)
groupIdstring (grp_… ID)NoID (grp_…)
fromstringNoUp to 40 characters.
tostringNoUp to 40 characters.
includeTestsenumNoOne of: "true", "false".
channelenumNoOne of: "phone", "site_chat", "page_chat", "web_voice". Default: "phone".
effectivePlaybookIdstring (epb_… ID)NoID (epb_…)
fromDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
toDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
sourceenumNoOne of: "number", "widget", "page".
callerenumNoOne of: "prospect", "other".

Response 200

FieldTypeRequiredDescription
consentobjectYes—
consent.askedintegerYes—
consent.grantedintegerYes—
consent.ratenumber | nullYes—
consent.revokedintegerYes—
deliveryobjectYes—
delivery.deliveredintegerYes—
delivery.failedintegerYes—
delivery.queuedintegerYes—
delivery.ratenumber | nullYes—
delivery.sentintegerYes—
delivery.skippedintegerYes—
engagementobjectYes—
engagement.bookedintegerYes—
engagement.cancelRatenumber | nullYes—
engagement.cancelledintegerYes—
engagement.formRatenumber | nullYes—
engagement.formSubmittedintegerYes—
engagement.rescheduleRatenumber | nullYes—
engagement.rescheduledintegerYes—
engagement.shareRatenumber | nullYes—
engagement.sharedintegerYes—
engagement.videoPlayRatenumber | nullYes—
engagement.videoPlayedintegerYes—
filtersobjectYes—
filters.channelenumYesOne of: "phone", "site_chat", "page_chat", "web_voice".
filters.fromstring (date-time) | nullYes—
filters.tostring (date-time) | nullYes—
pagesobjectYes—
pages.createdintegerYes—
pages.medianMinutesToFirstOpennumber | nullYes—
pages.openRatenumber | nullYes—
pages.openedintegerYes—
pages.openedBySharedintegerYes—
showobjectYes—
show.cohortsarray<object>Yes—
show.cohorts[].attendedintegerYes—
show.cohorts[].bookingsintegerYes—
show.cohorts[].keyenumYesOne of: "opened", "not_opened", "no_page".
show.cohorts[].noShowintegerYes—
show.cohorts[].showRatenumber | nullYes—
show.cohorts[].unknownintegerYes—
show.measuredintegerYes—
show.unknownintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/analytics/follow-up" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Services quoted, services asked about that are not offered, specials mentioned and nearby locations named#

GET /v1/account/analytics/pricing

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

NameTypeRequiredDescription
playbookIdstring (pb_… ID)NoID (pb_…)
playbookVersionIdstring (pbv_… ID)NoID (pbv_…)
groupIdstring (grp_… ID)NoID (grp_…)
fromstringNoUp to 40 characters.
tostringNoUp to 40 characters.
includeTestsenumNoOne of: "true", "false".
channelenumNoOne of: "phone", "site_chat", "page_chat", "web_voice". Default: "phone".
effectivePlaybookIdstring (epb_… ID)NoID (epb_…)
fromDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
toDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
sourceenumNoOne of: "number", "widget", "page".
callerenumNoOne of: "prospect", "other".

Response 200

FieldTypeRequiredDescription
nearbyNamedarray<object>Yes—
nearbyNamed[].bookedintegerYes—
nearbyNamed[].callsintegerYes—
nearbyNamed[].idstringYes—
nearbyNamed[].namestringYes—
notOfferedAskedarray<object>Yes—
notOfferedAsked[].bookedintegerYes—
notOfferedAsked[].callsintegerYes—
notOfferedAsked[].idstringYes—
notOfferedAsked[].namestringYes—
servicesQuotedarray<object>Yes—
servicesQuoted[].bookedintegerYes—
servicesQuoted[].callsintegerYes—
servicesQuoted[].idstringYes—
servicesQuoted[].namestringYes—
specialsMentionedarray<object>Yes—
specialsMentioned[].bookedintegerYes—
specialsMentioned[].callsintegerYes—
specialsMentioned[].idstringYes—
specialsMentioned[].namestringYes—
totalsobjectYes—
totals.bookedOtherwiseintegerYes—
totals.bookedWhenQuotedintegerYes—
totals.callsintegerYes—
totals.connectedintegerYes—
totals.quotedintegerYes—
totals.quotedConnectedintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/analytics/pricing" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Visits held, and how many have notes, next steps and photos; next steps by key and how they ended; photos shared and whether families looked#

GET /v1/account/analytics/visits

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

NameTypeRequiredDescription
groupIdstring (grp_… ID)NoID (grp_…)
fromstringNoUp to 40 characters.
tostringNoUp to 40 characters.
fromDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
toDaystringNoPattern: ^\d\{4\}-\d\{2\}-\d\{2\}$.
playbookIdstring (pb_… ID)NoID (pb_…)
playbookVersionIdstring (pbv_… ID)NoID (pbv_…)
effectivePlaybookIdstring (epb_… ID)NoID (epb_…)

Response 200

FieldTypeRequiredDescription
byGrouparray<object>Yes—
byGroup[].groupIdstringYes—
byGroup[].groupNamestringYes—
byGroup[].heldintegerYes—
byGroup[].notesRatenumber | nullYes—
byGroup[].photosRatenumber | nullYes—
byGroup[].stepsRatenumber | nullYes—
byGroup[].withNotesintegerYes—
byGroup[].withPhotosintegerYes—
byGroup[].withStepsintegerYes—
byReparray<object>Yes—
byRep[].heldintegerYes—
byRep[].namestringYes—
byRep[].notesRatenumber | nullYes—
byRep[].photosRatenumber | nullYes—
byRep[].stepsRatenumber | nullYes—
byRep[].userIdstringYes—
byRep[].withNotesintegerYes—
byRep[].withPhotosintegerYes—
byRep[].withStepsintegerYes—
filtersobjectYes—
filters.fromstring (date-time) | nullYes—
filters.tostring (date-time) | nullYes—
photosobjectYes—
photos.downloadedintegerYes—
photos.downloadedRatenumber | nullYes—
photos.medianSharednumber | nullYes—
photos.publishedintegerYes—
photos.viewedintegerYes—
photos.viewedRatenumber | nullYes—
stepsarray<object>Yes—
steps[].dismissedintegerYes—
steps[].doneLateintegerYes—
steps[].doneOnTimeintegerYes—
steps[].keystring | nullYes—
steps[].labelstringYes—
steps[].openintegerYes—
steps[].pickedintegerYes—
totalsobjectYes—
totals.heldintegerYes—
totals.notesRatenumber | nullYes—
totals.photosRatenumber | nullYes—
totals.stepsRatenumber | nullYes—
totals.withNotesintegerYes—
totals.withPhotosintegerYes—
totals.withStepsintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/analytics/visits" \
  -H "Authorization: Bearer $ACCESS_TOKEN"