Skip to content
unlob

No generated answer. Bring your own model.

Evidence infrastructure for production AI agents.

Know what supports an answer. Know what doesn’t.

The evidence control plane between your models and the open web: an objective and a budget in; evidence, provenance, independent origins and a status out — including when there isn’t enough.

10,000 free credits a monthno card5 credits per ground call

GET /groundobjective="UK AI regulation position this week"

What the web holds

24 copies · 17 hosts

  1. 6 copies · 4 hostsgov.ukofficial · original
  2. 14 copies · 10 hostsThomson Reuterssecondary · wire
  3. 4 copies · 3 hostsA trade publicationsecondary · original

collapsed by origin and owner, not by host

receipt

status: sufficient

origins
3
hosts
17
copies
24
  • freshnesswithin 7d · newest 37 min
  • missingprimary
  • context1,420 / 3,000 tokens
  • billed5 credits
An illustrative example of one ground call, not a measurement. Every figure is a field in the response; the agent reads it instead of reasoning its way to it.

The ground contract

It tells your agent when it can’t answer.

Most retrieval hands a model whatever it found and leaves the model to decide whether that is enough. ground decides by a fixed rule you set — which roles, how many independent owners, how fresh — and says which of five outcomes you got. The same request over the same corpus gives the same status.

  1. You send

    • objectivethe question or task
    • require_role · min_independent_origins · max_agewhat counts as enough
    • token_budgethow much context it may use
  2. unlob

    retrieval, deduplication, origin clustering, packing

    no model involved

  3. You get back

    • evidence, deduplicated
    • provenance on every item
    • independent origins, by owner
    • contradictions, when you pass a claim
    • missing source classes
    • a deterministic status
  4. Your model

    reasons over it, or abstains

  • sufficient

    Enough independent origins, and at least one source in a required role (primary or official by default).

    Answer from the evidence, citing the origins it lists.

  • insufficient

    Evidence exists but does not meet the bar you set: too few independent owners, or no source in a required role.

    Say so, or follow next_actions: corroborate, search wider, or relax the requirement deliberately.

  • stale

    Nothing inside max_age. Older material is listed separately as stale_evidence, never substituted.

    Report that nothing is current, or widen_max_age if older evidence is acceptable.

  • partial

    Part of the index was unreachable, and the receipt names what was not searched.

    Never treat the answer as complete. retry, or answer with the gap stated.

  • empty

    Nothing found for the objective.

    Abstain. why_not explains whether a specific URL you expected was ever admitted.

statuses, decided by a fixed rule
5
upstream search engines
0
tools in the MCP grounding profile
2
languages
101

The problem

Stop rebuilding search in your context window.

A search API hands your agent links. Deciding which are duplicates, which sources are independent and whether it has enough is left to the model — in context, billed by the token, differently every run.

  1. search
  2. dedupe
  3. corroborate
  4. rank
  5. pack
  6. judge
  7. one ground call

Rebuilding it in context

20 calls

Search, fetch, compare, search again. Every intermediate result lands in the context window whether or not it turns out to matter.

+8 more not drawn

One ground call

1 call

Deduplicated, origin-clustered, ranked and packed on our side. The agent reads the status and the receipt instead of reasoning its way to them.

Illustrative: the same objective, both ways. The difference is how much of the answer the agent has to work out for itself.

One call

An objective and a budget in. Evidence and a receipt out.

Retrieval, story deduplication, origin clustering, ranking and packing run on our side. What comes back is not a list of links and not a generated answer: it is evidence with its provenance, and a receipt that says whether it is enough.

curl -G https://api.unlob.com/ground \
  -H "x-api-key: $UNLOB_API_KEY" \
  --data-urlencode "objective=UK AI regulation position this week" \
  -d max_age=7d \
  -d min_independent_origins=2 \
  -d token_budget=3000
import os, requests

g = requests.get(
    "https://api.unlob.com/ground",
    headers={"x-api-key": os.environ["UNLOB_API_KEY"]},
    params={
        "objective": "UK AI regulation position this week",
        "max_age": "7d",
        "min_independent_origins": 2,
        "token_budget": 3000,
    },
).json()

# Read status first. partial is never complete.
if g["status"] == "sufficient":
    context = [e["hit"]["snippet"] for e in g["evidence"]]
else:
    print(g["coverage"]["known_gaps"], g["next_actions"])
const url = new URL("https://api.unlob.com/ground");
url.search = new URLSearchParams({
  objective: "UK AI regulation position this week",
  max_age: "7d",
  min_independent_origins: "2",
  token_budget: "3000",
}).toString();

const g = await fetch(url, {
  headers: { "x-api-key": process.env.UNLOB_API_KEY! },
}).then((r) => r.json());

// Read status first. partial is never complete.
if (g.status !== "sufficient") {
  console.log(g.coverage.known_gaps, g.next_actions);
}
The response, trimmedjson
{
  "status": "sufficient",
  "evidence": [ /* 3 items, with provenance */ ],
  "coverage": {
    "independent_origins": 3,
    "hosts": 17, "copies": 24,
    "within_max_age": true,
    "source_roles_missing": ["primary"]
  },
  "budget": {
    "context_tokens": 1420, "token_budget": 3000
  },
  "next_actions": []
}
independentmissingbudgetFull annotated response →

Status sufficient; 3 independent origins across 17 hosts and 24 copies; missing primary; 1,420 of 3,000 tokens used.

Or connect over MCP

Two tools in Claude Code, Cursor or any MCP client.

The grounding profile lists only what an agent needs to ground a task, so far less tool schema rides along in every request. The full profile adds the six graph operations.

MCP profiles ↗Per-client setup ↗The Agent Skill ↗

MCP client configjson
{
  "mcpServers": {
    "unlob": {
      "type": "http",
      "url": "https://api.unlob.com/mcp?profile=grounding",
      "headers": { "x-api-key": "ulb_your_key_here" }
    }
  }
}

The contract, machine-readable

Generated from the running server, not written beside it — so a client, a codegen step or an agent reads the same surface the API serves.

In the framework you already use

Copy-paste setups for the agent frameworks, or raw MCP from any client. No SDK to adopt: it is one HTTP call.

The evidence graph

Or walk the graph yourself.

Every other search API makes your agent rebuild the relationships between documents in its context window. We computed them to build the index; six operations let an investigative agent traverse them directly.

How the coverage graph works

For architects

What to check before you depend on it.

The retrieval layer is the part of an agent stack that is hardest to swap later. These are the properties that decide whether it holds up.

Index
Our own, crawled and served by us.No upstream search engine can deprecate, reprice or rate-limit the layer your agents depend on.Why an own index
Status
Decided by a fixed rule, not a model.Five outcomes — sufficient, insufficient, stale, partial or empty. The same request over the same corpus gives the same status.How grounding works
Failure
Explicit, and priced as such.A call that runs and fails costs 1 credit; a refused one (401, 402, 429) costs 0. A partial result says so and is never presented as complete.Errors and retries
Operations
What exists today, and what does not yet.Limits, back-pressure, key handling, where it runs and who processes what — with the enterprise controls that are still coming marked as coming.Security and operations
Model
Yours. None of ours in the loop.No generated answer and no model deciding the status, so the layer beneath your agent stays deterministic whichever model you run above it.Why no generated answer
Cost
Tracks demand, not corpus size.No upstream per-query fee, margin at every tier, and no valuation to grow into. The price is not a subsidy.The cost model

Start from where you are

Where to start, by what you’re doing.

Every route ends in the same place: a test on your own tasks, with the cases where unlob does not fit reported as plainly as the ones where it does.

Price

Priced like infrastructure.

A ground call is retrieval over structure built with the index, so it costs infrastructure money rather than research-agent money — and no part of the bill is a fee to an upstream provider.

Dollars per 1,000 comparable web searches, log scale; each price is the vendor’s cheapest comparable mode, named beside it, and the multiple is against unlob Scale. Each competitor figure is read from the vendor's own pricing page; the oldest read is 7 October 2026.

FAQ

Frequently asked questions

What does "evidence infrastructure" mean?

Search retrieves things. unlob tells an agent what evidence exists, whether the sources are independent, whether the set is sufficient, what is missing, how fresh it is, and what to do next — within a token budget. One call, ground, returns that structure. No generated answer is returned, deliberately: the reasoning stays with whichever model you run, and the layer beneath it is deterministic.

What happens when there is not enough evidence?

The call says so. ground returns insufficient when evidence exists but does not meet the bar you set, stale when nothing is inside your freshness window, partial when part of the index was unreachable, and empty when nothing was found — each with next_actions saying what would change it. A model that reads the status can abstain correctly instead of answering from whatever came back, and that is the behaviour our agent benchmark measures first.

Why not just generate the answer, like a research agent?

Because that puts a retrieval company in a race to run the most expensive reasoning on its own models. Exa, Parallel, Tavily and Linkup are all moving that way. unlob is the infrastructure their agents — and yours — ought to consume: the smallest defensible evidence package, how its pieces relate, and what is not known, beneath arbitrary reasoning models. It is cheaper for the same reason: the structure is precomputed, so a ground call costs infrastructure money rather than research-agent money.

How is source independence computed?

Not by counting hosts. Within a story, passages are grouped into origins: a wire dispatch and its reprints are one origin, a press release and the sites that ran it verbatim are one origin, and two outlets under one media group are two origins with one owner. independent_origins counts distinct owners. Every label carries a confidence, and the rule is documented in full — seventeen URLs and two genuinely independent origins are different findings, and the receipt says which you have.

What is a coverage receipt?

Every ground answer carries one: what was searched, what was not — shard slots down, verticals excluded, stories not expanded — how fresh the evidence is against the window you asked for, which source classes are present and missing, and a plain-language list of known gaps. It is why_not generalised from one URL to a whole request, so an agent knows when an answer is incomplete instead of inferring absence from a short list.

Does unlob have its own web index, or does it resell Google results?

Our own. We crawl the open web ourselves and serve from the index we built, which is what makes the evidence graph possible: story clusters, origins, the link graph and corroboration signals are computed when the index is built. No upstream search engine can deprecate us, reprice us or rate-limit us.

Is there an MCP server?

Yes, over Streamable HTTP at https://api.unlob.com/mcp with your API key. The grounding profile (?profile=grounding) lists ground and get_document — the right surface for most tasks and far less schema in every request. The default profile lists all 13 tools, including the six coverage-graph operations. There is also an installable Agent Skill at api.unlob.com/skill.md, so a coding agent can learn the API without a human reading the docs.

What does the free tier include?

10,000 credits a month, 30 days of history, and 60 credits a minute — no card required, and it is the most generous free tier in the category. A search costs 1 credit and a ground call 5 credits, however many stories it expands. The rate limit, not the allowance, is what makes it a tier for building and evaluating rather than for serving users; it hard-caps at its monthly credits rather than billing you by surprise.

Start on the free tier

10,000 credits a month, no card, no sales call. One magic link creates your account and your first API key.

Your first callbash
# One magic link: account, org and your first key
export UNLOB_API_KEY=ulb_your_key_here

curl -G https://api.unlob.com/ground \
  -H "x-api-key: $UNLOB_API_KEY" \
  --data-urlencode "objective=UK AI regulation position this week"
API and MCP reference ↗