CrawlCheck
Proof

Proof an agent can check without trusting us.

In one sentence

Every CrawlCheck report is reduced to its measurements — host, timestamp, section scores, every path and status fetched, every crawler identity and what it received, the citation state — canonicalised and hashed with SHA-256, and each day’s digests are anchored to the Bitcoin blockchain with OpenTimestamps. That proves a report existed in exactly that form at that time and has not been altered since; it does not prove the measurement was correct, and this page says which claim is which.

An agent that acts on what CrawlCheck measured should not have to take our word for it. Every report is fingerprinted and each day anchored to Bitcoin; every answer an agent acts on is signed; every signed answer is entered in a log that a witness we run on GitHub, outside our servers, re-checks. Each of the three is checked on the reader’s own machine.

Proves

A report with this digest existed in exactly this form by that day, and has not been edited since.

Does not prove

That the measurement was correct. Only the first claim can be settled by mathematics.

93

sealed days

205,919

reports in the last 7 roots

7/7

roots in a Bitcoin block

The chain, the last 7 sealed days
11-0716,086reports#975,02011-0843,119reports#975,12111-0946,180reports#975,23511-1044,351reports#975,36811-1124,163reports#975,50711-1215,804reports#975,62011-1316,216reports#975,734Each day is one Merkle root. Gold: in a Bitcoin block (height shown). Dashed: submitted to the calendars, not yet confirmed.

205,919 report fingerprints in these 7 roots, 7 of them already in Bitcoin. Click a day for its root and its .ots file.

Three proofs

What each record proves, and how to check it

Each check runs on the reader’s own machine, from files that are published and can be kept.

1 · Reports

Sealed and anchored to Bitcoin

Each report’s measurements are hashed; each day’s hashes become one root, committed to a Bitcoin block through OpenTimestamps.

Proves the report existed in exactly this form by that day.

The latest sealHow it is built

2 · Answers

Signed with Ed25519

Every Resolve answer an agent receives before it reads, cites, connects or transacts carries a signature over its canonical content.

Proves the answer came from CrawlCheck and was not altered in transit or afterwards.

The signing keysThe offline verifierWhat an answer holds

3 · History

Logged, chained and witnessed

Every signed answer names its leaf in an append-only Merkle log. Each signed tree head chains to the one before, and a witness we run on GitHub, outside our servers, re-checks and co-signs it. It is our own workflow: it proves the log was not rewritten on our servers, not that an independent party checked it.

Proves an answer was not rewritten or removed after it was logged.

The log headThe latest witness

Method

How a report becomes a proof

No wallet, no fee, no key held by us. The proof is a file, not a coin.

1Reportmeasurements only2SHA-256one digest3Merkle rootone per day4OpenTimestampstwo calendars5Bitcoin blockpermanent
  1. 1

    Measurements only

    Host, timestamp, section scores, every path and status fetched, every crawler identity and what it received, the citation state. Wording and layout are excluded, so an editorial change never breaks a proof.

  2. 2

    One digest

    Canonicalised with sorted keys and hashed with SHA-256.

  3. 3

    One root a day

    Digests sorted and folded into a Merkle tree: parent = SHA256(left || right), an odd node paired with itself. Arrival order cannot change the root.

  4. 4

    Anchored

    The root goes to the OpenTimestamps calendars, which commit it into a Bitcoin transaction.

The seal

2026-11-13

Confirmed in Bitcoin block #975,734.

Merkle root
f538ea3298ca91fb424a5814b0284d58266660cd2abf90e6865aef677fe34675
Reports covered
16216
Sealed
2026-11-14T01:17:19.695Z
Calendars
https://a.pool.opentimestamps.org
https://b.pool.opentimestamps.org
Bitcoin
block #975,734

Download the .ots proofOne report’s receipt as a single file →

Verify it yourself

ots verify -d f538ea3298ca91fb424a5814b0284d58266660cd2abf90e6865aef677fe34675 crawlcheck-2026-11-13.ots

The reference client checks the file against a Bitcoin node or a public calendar. No CrawlCheck server is needed, or trusted. A fresh seal reads pending confirmation until the next Bitcoin transaction confirms; ots upgrade then stores the block attestation in the file for good.

Ledger

Every sealed day

93 days anchored. Each links to its own root and proof file. Days are sealed once and never recomputed.

The 16216 digests sealed under this root

All 16,216 digests as plain text, one per line; the first 20:

0000780110e67c8fd25cb77b9572143e4528f8abaf2906a7508d530c82c0c078
00025b558b316c0b7daa8611b48e87184bfbd223327662e3e55b79a33284f6fa
0006a7b5d5751a5d9f25a996d163ac31e43a6f9f4364fa561f772c13906b779e
00085367783def60121faffb7bbd9456f17a1ff1e04a08307b4b6b1d4334cfe9
0010f5a092d9d96d0e0be482dc72007bb6fbb4e8692a3bb0ac27f60c992ae584
0010fe48c0d972791054f0dc2cd4d0acf32127519ce5d389fec492a3dc4d4a3a
001194d68198f690b04859021a13196dfdace80cabe59842bbdab501c977563d
001a9e73db95ff45a101a3d19671f048c7a1037886fb7e299bd95111af01428f
001b938d1e0a4b45c725a3a24fad1b6e27d1f63ed6fb2680807388c016434dec
001dde4853e879201f1f52073ad4e2e23b27f3620e2a772094b7ce631fd03f2c
001ec60d5edeb7a0e61b429565960eb9bb57f7ec2b390acc4852a30e02017040
001ecfc523bc6d66d40e9c6ce8424f2b96046027a408bd8776c0112970e88a7c
002111a876ed0ee979c34293cbb8c55a5bc7d52724da650ba3d5178955951702
0024343b01ca7256e9e6c137d54bb7ac9c6999fad06c4f0c3345bb01b6c4283f
0029b685715eab13f4d2dc6814f549c9d23a3efe011c148a6fc934a0e65a14ce
002e4a0f643c8446858222f8ad6ba03d5ad79f3dd6571606083425b9fc6d6efd
0036ed2546886dc3ccf5d0562fecfeea1cbc0cb35b440861817ff30f2ea904a0
003849ed11bad24f620bcb14632ab76a879d20f19f29588dd94410841c7860b5
0038a6286d221ed9d02d613a7eb89e1765b2d8f99728d947e5860d8ca6e8cebb
003a7b0771e5bc9dbc6a716490fb13923a13d52529ddb1b3f4fc3c32e3adf238

Questions about this page

QWhat does the Bitcoin anchor prove?
That a report with exactly this digest existed no later than the anchored block, and that it has not been edited since. It is a proof about time and integrity, not about correctness.
QHow do I verify a report myself?
Download the day’s .ots proof from this page, recompute the report digest from its JSON record, and verify the proof with the OpenTimestamps client against a Bitcoin node or public calendar. No CrawlCheck server is needed for the check.
QWhy exclude wording and layout from the hash?
So an editorial change never invalidates a measurement. Only the measured fields are hashed; the words around them can be improved without the proof breaking.
QWhich days are anchored?
Every sealed day is listed on this page with its digest and proof file. Days are sealed once, after they end, and never recomputed. A day sealed within the last day or so reads as pending in the reference client: the calendar holds the commitment, and the Bitcoin block confirming it is usually mined within 24 hours. The proof file here is upgraded to carry that block header once it exists, so a pending file is a proof waiting on a block, not a missing seal.

Keep reading

Check it yourself

Every number here comes from the signed JSON at /api/v1/instruments/proof/now.json; each copy carries its own sha256 and an Ed25519 signature by key 1hHmE3fo1rg5…. Verify it with no call to us:

node crawlcheck-verify.mjs --online proof.json

The verifier: /crawlcheck-verify.mjs, zero dependencies.

Editions

One sealed edition per ISO week, never edited. Feed: Atom · all instruments: /api/v1/instruments.