Help
DevelopersReference

Insights

The numbers the Insights pages show, over the day rollups, for your own tools.

Base URL https://api.showpilot.com/v1. Every call needs Authorization: Bearer <api key>; see Authentication.

What happened, and what moved

GET /insights/digest

Scope: insights:read. Operation id: getDigest.

The window's totals against the equally long window before it, with every metric ranked by how much it actually changed. Defaults to the last seven days. Reads the day rollups, so the cost is one row per day whatever the traffic. missingDays names any day not folded yet, so partial figures are visible rather than quietly low.

Parameters

NameInTypeMeaning
fromquerystring
toquerystring

Example request

curl "https://api.showpilot.com/v1/insights/digest" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The digest.

Digest

FieldTypeAlwaysMeaning
rangeobjectyes
comparedWithobjectyes
daysintegeryes
totalsDigestTotalsyes
previousTotalsDigestTotalsyes
metricsarray of objectyesEvery metric, largest absolute change first.
missingDaysarray of stringyesDays in the range with no folded row yet.

DigestTotals

FieldTypeAlwaysMeaning
visitorsintegeryes
conversationsintegeryes
meetingsintegeryes
formsSubmittedintegeryes
escalatedintegeryesConversations the agent handed to a person.
tourPlaysintegeryes
tourCompletionsintegeryes

Errors

StatusWhen
400A parameter is malformed, such as a cursor this API did not issue, a limit under 1, or an unknown status. Code invalid-request.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

What visitors asked that the agent could not answer

GET /insights/knowledge-gaps

Scope: insights:read. Operation id: listKnowledgeGaps.

Each question in the visitor's own words, why the agent stalled, and whether a human has since answered it. Deliberately NOT clustered — your own model groups them better than a pattern would, and normalized collapses exact repeats without one. Questions are transcript content: masked unless the key holds conversations:transcripts.

Parameters

NameInTypeMeaning
fromquerystring
toquerystring
statusqueryopen · answered · dismissed · anyDefault open — the ones still unanswered.
limitqueryinteger

Example request

curl "https://api.showpilot.com/v1/insights/knowledge-gaps" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The questions.

FieldTypeAlwaysMeaning
itemsarray of KnowledgeGapyes
redactionobjectyes

KnowledgeGap

FieldTypeAlwaysMeaning
idstring (uuid)yes
questionstringyesThe visitor's own words. Masked unless the key holds conversations:transcripts.
normalizedstringyesLowercased and stripped
reasonstring or nullyesWhy the agent could not answer — a guardrail
statusopen · answered · dismissedyes
answeredbooleanyes
redactedbooleannoTrue when something in the question was masked. Absent on a verbatim read.
visitorIdstring or null (uuid)yes
conversationIdstring or null (uuid)yes
askedAtstring (date-time)yes
answeredAtstring or null (date-time)yes

Errors

StatusWhen
400A parameter is malformed, such as a cursor this API did not issue, a limit under 1, or an unknown status. Code invalid-request.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Companies worth a call right now

GET /insights/sales-ready-accounts

Scope: insights:read. Operation id: listSalesReadyAccounts.

Recently engaged visitors grouped by company, strongest intent first, with whether your CRM already shows an open deal and who owns it. There is no fit or ICP score — engagement and intent are measured, fit is not, and a number we invented would be worse than none.

Parameters

NameInTypeMeaning
withinDaysqueryintegerHow recently someone from the company was seen. Default 30.
minIntentqueryintegerLowest intent score to include. Default 40.
limitqueryinteger

Example request

curl "https://api.showpilot.com/v1/insights/sales-ready-accounts" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The companies.

FieldTypeAlwaysMeaning
itemsarray of SalesReadyAccountyes

SalesReadyAccount

FieldTypeAlwaysMeaning
domainstringyes
namestring or nullyes
industrystring or nullyes
visitorCountintegeryesPeople from this company seen in the window.
identifiedCountintegeryesHow many of them you have an email for.
topIntentintegeryesThe strongest intent score in the group.
lastSeenAtstring (date-time)yes
lifecycleStagestring or nullyesFrom your CRM.
ownerEmailstring or nullyes
hasOpenDealbooleanyesFalse when no CRM is connected.
visitorIdsarray of string (uuid)yesThe strongest-intent visitors

Errors

StatusWhen
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Tour plays, completions and time watched, by tour and by day

GET /insights/tours

Scope: insights:read. Operation id: listTourInsights.

Per-tour totals over the range plus one row per tour per day. identified sums per-day distinct viewer emails, so a repeat viewer across days counts each day. Reads rollups only; cost is a few hundred rows whatever the traffic.

Parameters

NameInTypeMeaning
fromquerystring (date)First day of the range (UTC), YYYY-MM-DD. Default is 29 days before to.
toquerystring (date)Last day of the range (UTC), YYYY-MM-DD, inclusive. Default is today. The range is at most 366 days.

Example request

curl "https://api.showpilot.com/v1/insights/tours?from=2026-08-25&to=2026-09-23" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

Totals and daily rows for the range.

TourInsights

FieldTypeAlwaysMeaning
rangeRangeyes
toursarray of TourTotalyesSorted by plays, most first.
dailyarray of TourDayyesSorted by day.

Range

FieldTypeAlwaysMeaning
fromstring (date)yes
tostring (date)yes

TourTotal

One tour over the whole range.

FieldTypeAlwaysMeaning
tourIdstring (uuid)yes
namestring or nullyes
publicIdstring or nullyesThe id in share links and embeds.
playsintegeryes
engagedintegeryes
completionsintegeryes
ctaClicksintegeryes
identifiedintegeryesSum of per-day distinct emails.
totalSecsintegeryes
daysintegeryesDays in the range with at least one play.

TourDay

One tour on one day.

FieldTypeAlwaysMeaning
tourIdstring (uuid)yes
daystring (date)yes
playsintegeryesSittings that started that day.
engagedintegeryesSittings that reached step 2 or later.
completionsintegeryes
ctaClicksintegeryes
identifiedintegeryesDistinct viewer emails that day.
totalSecsintegeryesSeconds watched

Example response

{
  "range": {
    "from": "2026-08-25",
    "to": "2026-09-23"
  },
  "tours": [
    {
      "tourId": "c5879294-795a-5430-88b1-7fdbdfa910ce",
      "name": "A First Walk Through the App",
      "publicId": "t_9f3k2q",
      "plays": 184,
      "engaged": 151,
      "completions": 35,
      "ctaClicks": 4,
      "identified": 12,
      "totalSecs": 48551,
      "days": 27
    }
  ],
  "daily": [
    {
      "tourId": "c5879294-795a-5430-88b1-7fdbdfa910ce",
      "day": "2026-09-23",
      "plays": 9,
      "engaged": 7,
      "completions": 2,
      "ctaClicks": 0,
      "identified": 1,
      "totalSecs": 2210
    }
  ]
}

Errors

StatusWhen
400from or to is not a day, to is before from, or the range is over 366 days. Code invalid-range.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Visitors, conversations, meetings and outcomes for the workspace, by day and by source

GET /insights/pulse

Scope: insights:read. Operation id: getPulseInsights.

The Pulse page's totals over the range, one row per day, and the top 25 traffic sources with their sessions, conversations, meetings and outcomes.

Parameters

NameInTypeMeaning
fromquerystring (date)First day of the range (UTC), YYYY-MM-DD. Default is 29 days before to.
toquerystring (date)Last day of the range (UTC), YYYY-MM-DD, inclusive. Default is today. The range is at most 366 days.

Example request

curl "https://api.showpilot.com/v1/insights/pulse?from=2026-08-25&to=2026-09-23" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

Totals, daily rows and sources for the range.

PulseInsights

FieldTypeAlwaysMeaning
rangeRangeyes
totalsOrgTotalsyes
dailyarray of OrgDayyes
sourcesarray of SourceTotalyesTop 25 by sessions.

Range

FieldTypeAlwaysMeaning
fromstring (date)yes
tostring (date)yes

OrgTotals

The same fields as a day row, summed over the range.

FieldTypeAlwaysMeaning
visitorsintegeryes
conversedVisitorsintegeryes
meetingVisitorsintegeryes
sessionsintegeryes
conversationsintegeryes
meetingsintegeryes
formSubmittedintegeryes
outcomesintegeryes
tourPlaysintegeryes
tourCompletionsintegeryes

OrgDay

The workspace on one day.

FieldTypeAlwaysMeaning
daystring (date)yes
visitorsintegeryesDistinct visitors seen.
conversedVisitorsintegeryesVisitors who exchanged messages with the agent.
meetingVisitorsintegeryesVisitors who booked a meeting.
sessionsintegeryes
conversationsintegeryesSessions with at least one message.
meetingsintegeryes
formSubmittedintegeryes
outcomesintegeryesOffers accepted
tourPlaysintegeryes
tourCompletionsintegeryes

SourceTotal

One traffic source over the range.

FieldTypeAlwaysMeaning
sourcestringyesutm_source, else the referrer host, else direct.
sessionsintegeryes
conversationsintegeryes
meetingsintegeryes
outcomesintegeryes

Example response

{
  "range": {
    "from": "2026-08-25",
    "to": "2026-09-23"
  },
  "totals": {
    "visitors": 1240,
    "conversedVisitors": 96,
    "meetingVisitors": 11,
    "sessions": 1502,
    "conversations": 104,
    "meetings": 12,
    "formSubmitted": 31,
    "outcomes": 19,
    "tourPlays": 388,
    "tourCompletions": 71
  },
  "daily": [
    {
      "day": "2026-09-23",
      "visitors": 52,
      "conversedVisitors": 4,
      "meetingVisitors": 1,
      "sessions": 60,
      "conversations": 4,
      "meetings": 1,
      "formSubmitted": 2,
      "outcomes": 1,
      "tourPlays": 15,
      "tourCompletions": 3
    }
  ],
  "sources": [
    {
      "source": "google",
      "sessions": 640,
      "conversations": 41,
      "meetings": 5,
      "outcomes": 8
    }
  ]
}

Errors

StatusWhen
400from or to is not a day, to is before from, or the range is over 366 days. Code invalid-range.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

On this page