Capture the answer ChatGPT gives for a query and receive it in the same canonical Envelope every surface returns.
Captures come from the real ChatGPT app in a live browser, not a sanitized model API. You get what a person would actually see.

Capture ChatGPT

With POST /v1/search

Pass surfaces: ["chatgpt"]. A single-surface request with no webhook runs synchronously by default — a 200 with the finished Envelope inline. Add ?mode=async for the durable 202 + poll path:
Fetch the child Envelope once it’s done with GET /v1/jobs/job_8t2q.chatgpt.us. See Synchronous and Asynchronous.

With the alias POST /v1/search/chatgpt

The per-surface alias targets ChatGPT only — sync by default like any single-surface call — and accepts prompt (an alias of query) and a flat country.

Request fields

query
string
required
The prompt to run — a non-empty string. On the alias endpoint you may send prompt instead.
surfaces
string[]
required
For this page, ["chatgpt"]. Only used with POST /v1/search — the alias infers the surface from the path.
regions
object[]
{ country, state?, city?, language? }[], country as an ISO-3166 alpha-2 code, at most 10 per request. Omitted: one untargeted (GLOBAL) capture. See Regions.

The Envelope

ChatGPT returns the same canonical Envelope as every other surface, so one parser handles them all. Below it’s trimmed; the real result always has four sections (job, provenance, answer, evidence). For the full schema, see Output formats.
Envelope (trimmed)
answer.text
string
Plain-text answer.
answer.markdown
string
Markdown rendering of the answer. Always populated.
answer.blocks
object[]
Structured blocks, each typed (paragraph, heading, list, code, quote) with text and referenceIds.
evidence.sources
object[]
Cited and retrieved sources, each { id, url, title, role, cited, charRanges }. id is an integer that answer.blocks[].referenceIds point to.
evidence.fanOut
object
The follow-up web searches behind the answer. ChatGPT surfaces these, so provenance is "observed" and queries is populated. mentions, shopping, and ads are reserved and currently null.
provenance.model
object
Which model produced the answer: { providerId, observedLabel, inferred, confidence }.
provenance.surfacePresent
boolean
true when ChatGPT returned an answer; false when it returned nothing.
If ChatGPT returns nothing for a query, provenance.surfacePresent is false and a surface_absent warning is attached. The job still completes with an empty answer — absence is a valid result, and it costs no credits.
Because the Envelope is identical across surfaces, code written for ChatGPT works unchanged for Claude, Perplexity, Copilot, and the rest. See Output formats.

Search reference

Full request and response schema for POST /v1/search.

Output formats

The canonical Envelope every surface returns.