sayintel
Endpoint

Campaign stats

GET/api/public/v1/campaigns/{campaign_id}/statsread

Funnel stats for a single campaign. `qualified` / `disqualified` / `needs_input` are the ICP verdict (qualify_verdict, decided after enrichment; it gates research and drafting). Qualify always decides with a confidence: `check_fit` are qualified at low confidence (drafted, flagged), `maybe` are ruled out at low confidence (recoverable), `needs_input` is only the capped review shortlist of the maybes closest to the ICP (at most 10, optional), and `unjudged` are people the model failed on, retried automatically. `triage_*` is the cheap first pass on the scraped title and company (prequalify_verdict); triage 'unsure' and low-confidence 'disqualified' still flow to qualification, so never read triage as the qualification. `drafted` counts speakers with a complete live 3-message sequence; `drafted_messages` is the raw live row count; `superseded` is rows parked by a repair/redraft pass and awaiting their replacement (never deleted first).

Request

curl "https://sayintel.com/api/public/v1/campaigns/<campaign_id>/stats" \
  -H "Authorization: Bearer $SAYINTEL_TOKEN"

Try it out

Try it outGET/api/public/v1/campaigns/{campaign_id}/statsread

Sent as a bearer token to this site only, and kept in this tab's session storage. It is never written to disk or sent anywhere else.

Paste an API key to run.

Path parameters

NameInTypeRequiredDescription
campaign_idpathstringyes—

Response

{
  "ok": true,
  "tool": "campaign_stats",
  "kind": "read",
  "data": { ... },
  "error": null
}

Notes