📄 Notary — proof of existence
Timestamp any file on-chain without revealing it — a track, a video master, a photo, a contract, a dataset. Hash it locally (in your browser, or yourself) and send only the 64-char fingerprint; later, re-hash to prove the document existed at or before the block's timestamp.
OP_RETURN bsv.cx not1 <sha256>Endpoints
{ "hash": "<sha256hex>" } or { "content": "text" }printf '%s' "my document" | sha256sum
curl -X POST https://bsv.cx/n -H 'content-type: application/json' -d '{"hash":"<that hash>"}'
Verify it yourself
What this proves — and the one catch for media
Re-hash your file with SHA-256 and confirm it matches. The anchor's OP_RETURN
carries bsv.cx / not1 / <hash>, and the block timestamp bounds when it existed.
🧾 Batch — thousands for one anchor
Timestamp thousands of fingerprints for the price of one transaction: they're committed to a single Merkle root (RFC 6962 — domain-separated, single SHA-256, promote-odd), and only the root is anchored. Every item still gets an inclusion proof you can verify independently.
OP_RETURN bsv.cx not2 <merkleRoot>{ "hashes": ["<sha256hex>", …] } or { "contents": ["…"] }Free vs paid
Notarizing one file at a time (POST /n above) is free.
Bulk batching is paid, because every batch spends a real on-chain anchor — see
pay-per-call. Verification is free and always will be: proofs, batch
summaries and records need no token, because a proof nobody can check is not a proof.
Unpaid requests get an HTTP 402 with an invoice. The
pay-per-call docs walk through the three-step loop, and
scripts/batch-demo.ts is a working client.
# 1. quote (no token) -> 402 with an invoice
curl -X POST https://bsv.cx/n/batch -H 'content-type: application/json' -d '{"hashes":["<sha256hex>"]}'
# 2. pay it, then batch with the token
curl -X POST https://bsv.cx/n/batch -H "authorization: Bearer <token>" -H 'content-type: application/json' -d '{"hashes":["<sha256hex>","…"]}'
Fold a proof's audit path into a root and confirm the anchor's OP_RETURN carries
bsv.cx / not2 / <root>. A standalone, dependency-free verifier ships in
scripts/verify-proof.ts.