Capture what Microsoft Copilot actually shows a user for a prompt — from the live app in a real browser — and receive it as the canonical Envelope.
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

Read the dotted child id with 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
object
answer.markdown is always populated; answer.blocks[] carry the answer as typed blocks.
provenance
object
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.