Skip to main content
GET
Get Field Request

Poll first — your session will be dead when this completes

A new-field build takes hours, not seconds. The agent (or session) that filed the request is almost certainly gone by the time the field is live, so the contract is built around resumption:
  1. On accepted_new, store the request_id and the resume call in durable task state — not in conversation context.
  2. Poll this endpoint whenever a successor picks the task up. The poll state is the source of truth: it is always right, and it works even if every callback failed.
  3. When status is live, execute the stored resume call (or re-read it from this response) — the exact /v1/fetch request that answers the original ask.
Webhook and email callbacks (below) are a convenience over polling, never a second contract.
Requests are visible only to the credential that filed them. An id that doesn’t exist — or belongs to someone else — is a 404 field_request_not_found either way, never a 403: a 403 would confirm the id exists, which is a cross-tenant existence oracle over an enumerable id space.

Response fields

Status vocabulary

The full set, in lifecycle order. Intake outcomes first: Build lifecycle, once queued (each transition appears here as it happens): Terminal set: live, blocked, expired, rejected (and matched, which is answered rather than terminal-by-refusal). Everything else is in motion — poll at whatever cadence your task runs on (builds move on a scale of hours; your plan’s normal request-per-minute limit is the only constraint).

The three build outcomes

A finished build lands in one of three terminal outcomes. On the poll surface they appear as live or blocked; the callbacks (below) carry the finer status distinction:
  • DONElive, callback event_type: "request_live". The field passed its eval cleanly.
  • SHIP_LOW_CONFIDENCElive, callback event_type: "request_live_low_confidence". The field is live with an honest, stated limit — the caveat field in the callback. This is not a lesser approval: the caveat travels with the value, worded so an agent can propagate it into its own citations. If you consume the field, repeat the caveat wherever you cite the number.
  • BLOCKEDblocked, callback event_type: "request_blocked", with a typed blocked_reason.code, an explanation, and — where one exists — a counter_offer naming the nearest thing that is possible. The typed codes: no_indexable_source, licensing, coverage_gap, quality_below_bar (we built it and the eval says it would mislead), realtime_only, cost_prohibitive, upstream_dead, pr_closed (built, but declined in review), other.
The poll response does not currently carry the blocked reason or the caveat — they arrive on the callback channels. If you poll only and see blocked, the reason was also emailed/webhooked to the callback you registered (a callback can be added after filing: re-POST the identical body with the same idempotency_key and a callback — a present callback replaces the stored one).

Webhook callbacks

If you registered callback.webhook_url, each event is POSTed to it as JSON. Headers: screening_completed fires when screening settles (useful mainly on the 202 path) and carries {request_id, status, disposition} — the same disposition array the poll shows. Completion events carry the machine-readable document:
  • value/unit/citation are the resolved value at your original example location — a value you can check beats a field id you have to go fetch to believe.
  • caveat is present even when null: an explicit null says “we checked, there isn’t one,” so a consumer branching on key-presence never mistakes a clean DONE for an un-inspected one.
  • request_blocked adds a blocked_reason object: {"code": "coverage_gap", "explanation": "...", "counter_offer": "..."}.
  • Webhook URLs must resolve to a public address (private, loopback, and link-local targets are refused). Deliveries are retried on failure with backoff; the poll state stays correct regardless of delivery outcome.
  • Webhooks are unsigned in V1 — the body contains only what you already know plus the result. Treat the payload as untrusted input to your own pipeline and verify via the poll endpoint if it matters.

Email callbacks

If you registered callback.email, completion mail is written for a human and ends with the same machine-readable document in a fenced JSON block, so the recipient can be an agent without asking it to parse prose:
The fenced block is byte-equivalent to the webhook body — one document, two channels, so an agent reading the email and an agent receiving the webhook act on the same keys.

Errors

What we keep

Same policy as the POST page: address strings from example_locations are scrubbed 30 days after the request reaches a terminal state; resolved coordinates and geocode metadata are kept. Poll responses remain available after the scrub — only the address text is removed.

Path Parameters

request_id
string
required

Response

Successful Response

The response is of type Response Get Field Request V1 Field Requests Request Id Get · object.