
cURL
The identifiers
All identifiers are plain UUIDs. The content identifiers —doc_id, capture_id, and passage_id — are derived deterministically, so the same input produces the same ID. search_id and request_id are minted fresh for every response.
Identity vs. response-local
Identity persists across reads; ranking is response-local. Treat them differently:- Safe to store and cite:
doc_id,canonical_url,capture_id,capture_time,passage_id(valid until the content changes),content_digest, andsearch_id(for feedback). - Never store as facts:
rankandscore.value. Theranking.score_scopefield is always"response_local"— scores compare results within one response only, never across responses or ranker versions.scoreis present only when the second-stage reranker scored the result; when reranking is unavailable and results fall back to first-stage order, it is absent.
canonical_url vs. source_url
Both exist because deduplication and citation pull in different directions.canonical_url is the normalized representative URL and the input to doc_id: scheme defaults to https, scheme and host are lowercased, the fragment is stripped, tracking parameters (utm_*, fbclid, gclid, msclkid) are removed, and the trailing slash is trimmed except at the root. Two URLs that differ only in tracking noise are the same document with the same doc_id.
source_url is the URL as actually provided or captured — use it when you need the link that was really fetched.
Timestamps and content_digest
Themetadata block on search results carries the document’s observation history. All values are RFC3339 strings.
content_digest is the drift detector: store it alongside anything you cite, and compare it on the next read. A changed digest means the content changed and any claims built on the old capture need re-verification.
The provenance object
provenance is exactly two fields:
- On
/v1/searchresults,provenanceis returned only atresponse.verbosity: "full"(see response shaping). The defaultstandardverbosity omits it. - On
/v1/document,provenanceis always present when a capture exists — it names the capture the returned content actually came from.
Search, read, cite
The IDs connect search results to full-document reads. This runs withCAESAR_API_KEY:
cURL
If you send feedback later, use the
search_id, doc_id, and passage_id from the response you actually used.Why this matters for agents
- Cite what you actually read. A bare URL cites whatever the page serves at click time. Citing
doc_idpluscapture_idandcapture_timefrom the/v1/documentprovenance block pins the claim to the content the agent really consumed. - Keep continuation reads honest. When reading a long document in ranges, pin the capture with
content.range.capture_id. If a newer capture has replaced it, the response carries astale_rangewarning instead of silently serving misaligned offsets. See documents for the continuation loop. - Detect content drift. Compare
content_digestbetween reads. Same digest, same content — earlier conclusions still hold. Different digest, re-read before repeating a claim. - Tolerate stale passage IDs. Requesting a
passage_idthat no longer exists in the latest capture does not fail:/v1/documentreturns the passages that are still available plus astale_passage_idwarning naming the missing ones.
Next
- Search — ranking and where source IDs are returned
- Documents — the read loop, capture freshness, and range reads
- Quickstart — search and read in two minutes