Endpoint
Get draft qa
GET/api/public/v1/campaigns/{campaign_id}/qaread
Machine-readable QA state for drafts. Pass speaker_id alone to inspect one speaker, or campaign_id for the whole campaign. Returns per-message qa_score, qa_evaluated_at, hard-fail codes, actionable fix hints ({code, action, hint}), needs_human / needs_redo, approvable flag, plus per-speaker buckets (ready_to_send | needs_rewrite | needs_human | awaiting_qa | skipped | sent) and a rollup of the most common fail codes. Use this to decide what to rewrite (request_rewrite) before pushing. Filter with only_failing=true. Paginated: pass next_cursor while has_more is true.
Request
curl "https://sayintel.com/api/public/v1/campaigns/<campaign_id>/qa" \ -H "Authorization: Bearer $SAYINTEL_TOKEN"
Try it out
Try it outGET/api/public/v1/campaigns/{campaign_id}/qaread
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| campaign_id | path | string | yes | Required unless speaker_id is given. |
Query parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| speaker_id | query | string | no | — |
| only_failing | query | boolean | no | Only return unsent drafts that are not approvable (hard fail, low score, or unevaluated). |
| limit | query | number | no | — |
| cursor | query | string | no | Opaque cursor from a previous call's next_cursor. Omit for the first page. |
Response
{
"ok": true,
"tool": "get_draft_qa",
"kind": "read",
"data": { ... },
"error": null
}Notes
- Scope required: read. How scopes work.
- Paginated. Pass the returned next_cursor while has_more is true.
- Same capability over MCP as the tool get_draft_qa. MCP setup.