An API, not a portal with a download button.
Scope is a property of the key: a request may narrow it and can never widen it. Every
response carries a bounding block saying whether the answer is complete, what
it was scoped to, what was left out and what it cost.
Reading the evidence
-
GET /scope
What this key may read. The first call any integration should make.
-
GET /search
Full-text search across acquired documents, within scope.
-
GET /claims
Every fact held about a subject, with quotes, disagreements and an as-of date.
-
GET /coverage
How much of a jurisdiction’s evidence ecosystem we actually see.
-
GET /accuracy
Published per-geography scorecards — the same artifact this website renders.
Relationships
-
GET /related
What an entity is connected to, bounded by hops and metered on edges expanded.
-
GET /path
How two entities are connected, with the documents that establish each link.
-
GET /network
A bounded neighbourhood around one entity.
-
GET /exposures
What two or more companies are both exposed to.
Analysis and bulk
-
GET /sql
Bounded SQL over the claim and document lakes. Reads only; scope comes from the key, never from the SQL.
-
GET /export
Presigned URLs to the same immutable Parquet segments the query engine reads, pinned to the same epoch.
Working with it
-
POST /searches
Save a search, with its scope narrowed to the key’s grant at the moment it is saved.
-
POST /alerts
Fire on matches committed since the alert last ran — never twice on the same match.
-
POST /corrections
Dispute a fact. Name the document, quote the words; it enters the same review queue as everything else.
-
POST /mcp
The same tools an agent reaches over stdio, over HTTP. Read-only.
Every answer says how it was bounded
"bounding": {
"complete": false,
"scope": ["GB"],
"returned": 2,
"available": 3,
"note": "2 of 3 matches; 1 shard has no current index,
so there may be documents not yet searchable",
"charged": [
{ "unit": "requests", "quantity": 1 },
{ "unit": "bytes_scanned", "quantity": 57303 }
]
} Metered in the unit that makes each surface expensive
A graph traversal through a hub and one through a leaf are not the same work, so relationships are charged on edges expanded. SQL and export are charged on bytes scanned. Charging everything as “one request” prices the cheap query out and the expensive one free.
Agents, over the same surface
The MCP endpoint exposes the same read-only tools an agent reaches over stdio. There is deliberately no tool that writes: a proposal is reviewable because it names the agent run behind it, and a call made on a customer key names nothing.
Bulk export is the real segments
Not a second copy in a different format — the same immutable Parquet objects the query engine reads, pinned to the same manifest epoch. So an export is reconcilable against a query: both name the epoch, and “why does my file disagree with your API” has an answer.