---
name: factstamp-verification
description: "Use when a document, draft or agent output states a date-bearing figure, a company registration, a citation or a package version before acting on it, or when an answer has to stay true after it is delivered."
version: 1.1.0
author: Steve
---

# FactStamp — verification that comes with a receipt

A gate for any work that commits a checkable claim: pricing pages, research notes, decks, agent
output, compliance copy, a bibliography, a lockfile. Before the claim ships, check it — and keep
something you can show somebody afterwards.

## What the price buys (read this before comparing on price)

Cheaper services will run the same lookup. What they return is a string, and a string is worth
exactly what the reader's trust in it is worth. Every paid answer here comes back with:

- an **Ed25519 signed receipt** over the question, the verdict, the sources and the time. It verifies
  offline, needs no account with us, and the public key is published at
  `/.well-known/factstamp-issuer.json`. Every receipt also has a page at `/r/<receipt_id>` you can
  hand to a person, and a badge at `/badge/<id>.svg`.
- **the sources named, with their licences wherever the source carries one** — so you can check us, and so you know what you may reuse.
- a **mismatch verdict** where a lookalike is refused the word "verified", and per-field checks when
  you supply the claim you want tested.
- **silence when nothing changed**, on the standing work, instead of a daily notification you learn
  to ignore.

The assurance is the product: after the fact, somebody who was not in the room can check what you
were told, when, and on whose authority. It is the difference between a lookup and a record.

## What FactStamp actually is

A Cloudflare Worker exposing eight paid MCP tools and two free ones (a coverage registry and a claim router). It is NOT an LLM and
NOT financial, legal or investment advice. It is deterministic: for a pinned registry version, judge
version and snapshot, the same claim always returns the same verdict.

## The doors and what they cost

- `check_figure` — **US$0.05**. A dated figure claim. Sources: the Australian Bureau of Statistics
  (the CPI, the unemployment rate, the wage price index) and the Reserve Bank of Australia (F11.1
  exchange rates, the cash rate target).
- `check_entity` — **US$0.05**. Whether a legal entity exists and is currently registered. Sources:
  the GLEIF LEI index, US SEC EDGAR and the Australian Business Register (ABN Lookup).
- `verify_citation` — **US$0.02**. Does this DOI, arXiv id or title exist, what is it, and has it been
  retracted? Sources: Crossref, arXiv.
- `verify_package` — **US$0.02**. Does this exact version exist, is it yanked or deprecated, and what
  advisories are listed against it? Sources: the npm registry, PyPI, crates.io, OSV.
- `watch_add` — **US$0.50 for 30 days of daily re-checks: 1.7 cents a check**, cheaper than our own
  per-call lookup. Buy it when an answer has to STAY true. The first check is answered immediately;
  each real change (retraction, new advisory, yanked version) is recorded with its own receipt, and
  nothing is sent when nothing changed. Read it at `GET /watch/<id>` with the token you are given, or
  give an https webhook and each change is POSTed to it.
- `watch_portfolio` — **US$0.20 a reference for 30 days (about 0.67 of a cent a check)**, up to 25 references in one purchase with one token: a whole bibliography watched instead of one entry at a time, cheaper a reference than watching each one separately. Every reference is an ordinary watch row, so a portfolio verdict can never disagree with a single-call verdict, a duplicate reference is charged once, and stopping the list stops every member.
- `check_document` — **US$0.25 for up to 5 claims (5 cents a claim)** on the per-call rail; the
  pack-funded door (POST /document) takes up to 25 claims at 5 cents a claim on an answer pack, or 2
  cents for a citation or package claim on a lookup pack. Extraction is mechanical, so the claim list and the count are
  reproducible from the document alone. There is a paste box for a human at GET /document. **The preview is free** (`"preview": true`) and lists the
  claims and the exact price before anything is charged; a claim that produces no answer is not charged
  for.
- `verify_bulk` — **US$0.12 for up to 12 items: 1 cent an item**, against 2 cents per call for the
  same lookups. A whole reference list or dependency manifest in one call, one receipt for the list.
  With a pack code, `POST /bulk` takes up to 25 items (one answer-pack credit per three items, or one
  credit an item on a lookup pack).
- Free: `list_series`, `route_claim`, the coverage table at `/series.json` (readable at `/series`),
  and `/samples` for frozen example verdicts with no wallet.

Settle per call in USDC on Base over x402 at `/mcp`, or prepay by card in packs (answer packs at the
5c doors, lookup packs at the 2c doors, same $10 / $50 / $200 rungs).

## Verdicts, honestly

- `verified` — the claim matches the publisher's series as at the publisher's own as-of date.
  It means "matches the cited primary source", not "true in every sense".
- `stale` — the value WAS correct at the stated date and has since been superseded. The verdict names
  both: when it was last true, and what the current value is.
- `contradicted` — the value appears nowhere in the primary series, or an entity-status claim is the
  opposite of the registry record.
- `retracted` — the record exists and carries a retraction (or is itself one).
- `not_found` — no such record in the registers we read.
- `mismatch` — the record exists but the claim you supplied about it does not match it.
- `unknown` — not routable, not a number, ambiguous between two series, or the engine's snapshot is
  past its freshness contract. NEVER a guess, and NOT a failure of the claim.

## How to use it well

1. Free first: call `route_claim` (or `list_series`) to see whether the number is even in scope.
   Out-of-scope claims cost nothing to discover.
2. If routing is `ambiguous`, retry with an explicit `series_id`. That is the cheapest fix and it
   makes the verdict deterministic by construction.
3. Send the claim you want tested (`claims: { title, authors, year }` on a citation), not just the
   identifier: the per-field comparison is what turns a lookup into an audit.
4. Pay for `check_figure` when you need the machine verdict. Pin the returned `registry_version`,
   `judge_version` and the citation's `upstream_sha256` if you log it.
5. Keep the receipt with the claim. That is what makes the correction auditable later.
6. Treat `stale` as action: update the number, and keep the "was true on X, now Y" note so the
   correction is auditable.

## Limits (say these, don't hide them)

- Coverage is what the doors read, and nothing else: AUD/USD daily, the RBA cash rate target monthly,
  the ABS Consumer Price Index (all groups, quarterly), the ABS unemployment rate (monthly,
  seasonally adjusted), the ABS Wage Price Index (quarterly), ABN registration status, GLEIF LEI
  records, SEC EDGAR, Crossref and arXiv metadata, npm/PyPI/crates versions and OSV advisories.
  Everything else is `unknown`.
- The ABS series are read from the ABS data API at `data.api.abs.gov.au` — NOT the `api.data.abs.gov.au`
  printed in ABS's own documentation, which does not resolve. A quarter is dated at the first day of
  its ending month, and a month at its own first day, because that is how the ABS labels them.
- We hold the CPI INDEX, not a year-ended inflation RATE. An "inflation was 3.4%" claim is out of
  scope and returns `unknown` rather than being answered with an index number.
- A receipt proves **what we answered and on what evidence**, at a stated time. It does not make the
  underlying claim true, and it does not warrant the publisher's data.
- A retraction is only reported when the register we read actually carries it.
- `verifiable_reward` is 1 ONLY for `verified`. It is not a truth signal: `stale`, `contradicted` and
  `unknown` all return 0 for different reasons, and 0 does not mean the claim is false.
- A verdict is only as fresh as its snapshot. The payload carries `retrieved_at` and the series'
  `max_age_days`; past contract the engine refuses rather than serves.
- The ABN series currently reads the public ABN Lookup record page, not the ABR web service.

## Pitfalls

- Do not treat `unknown` as a pass or a fail — it is the most common honest answer.
- Do not compare us to a cheaper lookup on price alone. Compare on what you can prove afterwards.
- Do not pay for a claim you have not routed when the free route tool will tell you it is out of scope.
- Do not quote a figure from a verdict without also quoting its `as_of` date. That date is the whole
  product.
