Get an API key
Grab a key from the dashboard, then export it so the examples below just work.Verify connectivity with the unauthenticated health check:
- Open the dashboard and go to Settings → API Keys.
- Create a key and copy it (you only see the full value once).
- Export it in your shell:
Response
New accounts start with 500 free credits, no card required. A capture is charged only on success — an empty or failed capture costs nothing. See pricing.
Make your first search
Submit a The response carries a
query and at least one surface. By default the API is async: it returns 202 immediately with a parent job and one child per surface × region.202 Accepted
Location header pointing at the parent job. Each entry in children is a child id — a dotted id (job_8t2q.chatgpt.us) that resolves to the Envelope for one surface in one region.Poll for the result
Fetch a job with
GET /v1/jobs/:id. A child id (dotted) returns the canonical Envelope. Poll until the job reaches any terminal state — completed, partial, failed, canceled, or expired — and never past it.Read the Envelope
A completed child returns four sections:
job, provenance, answer, and evidence.GET /v1/jobs/job_8t2q.chatgpt.us
Key fields to read first
| Field | What it gives you |
|---|---|
answer.text | The plain-text answer the user sees. |
answer.markdown | The same answer with formatting; always populated. |
answer.blocks[].referenceIds | Which evidence.sources each block cites. |
evidence.sources[] | Every source, each with a role (cited / retrieved / related), a cited flag, and charRanges mapping it back into the answer. |
evidence.fanOut.queries | The follow-up queries the surface ran under the hood. |
evidence.mentions | Brands and entities named in the answer. |
provenance.model | Which model produced it, whether it was inferred, and a confidence score. |
provenance.surfacePresent | false means the surface returned nothing (see below). |
When a surface returns nothing, the job still reaches
completed with provenance.surfacePresent: false, an empty answer, and a surface_absent entry in job.warnings. Absence is a valid, billable-free result — the capture costs no credits.Sync mode
Skip polling for a single surface. Add?mode=sync (or send the header Prefer: wait) to get the Envelope inline with a 200 instead of a 202.
POST /v1/search/:surface is sync-by-default for one surface and accepts prompt (an alias of query) plus a flat country:
Fan out across surfaces & regions
Add more surfaces and regions to a single search. The API creates one child per surface × region, and the parent tracks them all.202 Accepted
completed when all children complete, failed when all fail, and partial on a mix.
Next steps
Webhooks
Get a signed POST on each child’s terminal state instead of polling.
Batch
Submit up to 500 searches in one request.
Errors
Codes, statuses, and the rate-limit headers to respect.
SDKs
Typed clients for Node and Python.