Every surface normalizes to the same Envelope, so the parser you write
here handles ChatGPT, Perplexity, and the rest unchanged.
Request
Add"copilot" to surfaces on POST /v1/search. A single-surface request with no webhook runs synchronously by default (a 200 with the Envelope inline). Add ?mode=async for the durable path:
Response 202 Accepted
GET /v1/jobs/job_8t2q.copilot.us to fetch its Envelope, or receive it via webhook on its terminal state.
Per-surface alias
POST /v1/search/copilot targets Copilot only — sync by default like any single-surface call — and accepts prompt (an alias of query) plus a flat country:
cURL
Envelope (trimmed)
A completed Copilot child returns the canonical four-section Envelope:answer.markdown is always populated; answer.blocks[] carry the answer as
typed blocks.Records how the capture ran: the observed model label, requested vs effective
region, and other capture context.
If Copilot returns nothing for a prompt, the child still completes:
provenance.surfacePresent is false, job.warnings carries a
surface_absent warning, and answer is empty. An empty capture costs no
credits.Search reference
Full request and response schema for
POST /v1/search.The Envelope
Every field in the canonical per-surface result.
Read a job
Poll a parent or fetch a child Envelope.
Webhooks
Get each child’s Envelope pushed on its terminal state.