200 with the parsed result. No jobId, no polling, no webhook.
Use sync when a human is waiting on a single surface × region. For anything wider — multiple surfaces, multiple regions, or work you don’t want to block on — use asynchronous requests.
Two ways to go synchronous
Add ?mode=sync
Send a normal
POST /v1/search body with exactly one surface and one region, plus ?mode=sync (or the header Prefer: wait).Use the surface alias
POST /v1/search/:surface (e.g. /v1/search/chatgpt) is synchronous by default. It accepts prompt (an alias of query) and a flat country.Both paths return the same Envelope. The alias is just a shorter, sync-first shape for one surface.
Request
prompt and flat country:
cURL
Response
You get200 with the full Envelope for that one capture — the same structure a child returns from GET /v1/jobs/:id.
Identity for this capture:
id (a dotted child id like job_8t2q.chatgpt.us), status, surface, and credits charged.Detected
model, region (requested vs effective), and surfacePresent. When surfacePresent is false and a surface_absent warning is present, the surface returned nothing — the call still completes with an empty answer.answer.markdown is always populated. answer.blocks[] carry referenceIds that point into evidence.sources.Normalized
sources, mentions, shopping, and ads. Every surface fills this same shape, so one parser handles all of them.Errors specific to sync
Because the call blocks on a live capture, two error paths matter more here than in async.429 CONCURRENCY_LIMIT_EXCEEDED
429 CONCURRENCY_LIMIT_EXCEEDED
Your key has a sync concurrency budget — the number of blocking captures allowed at once. When too many sync calls are already inflight, new ones get
429 CONCURRENCY_LIMIT_EXCEEDED. Wait for the Retry-After window, then retry. The response also carries X-Concurrency-Limit, X-Concurrency-Running, and X-Concurrency-Queued so you can back off precisely. See concurrency & rate limits.504 SURFACE_TIMEOUT
504 SURFACE_TIMEOUT
If the surface doesn’t respond within the capture window, you get
504 SURFACE_TIMEOUT. This is a transient upstream timeout — retry the request. No credits are charged, since credits apply only on success.All
429s also carry Retry-After plus X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Honor Retry-After before retrying.When not to use sync
Next steps
Asynchronous requests
Fan out across surfaces and regions without blocking.
Concurrency & limits
Understand the sync budget, rate limits, and the headers to back off on.