Check whether a photo or video is a genuine On Record capture: when and where it was taken, and whether it has been changed. Free, read-only, no sign-in. For people, AI assistants and platforms.
On Record calls its proof system the Authenticity Chain: every capture made in the app is sealed at the
moment it is taken, anchored into Bitcoin, and publicly verifiable, so nobody has to take On Record's word for it.
Each capture carries a code printed next to the on record mark, for example 81EEC489F55B.
Give the code to any of the three endpoints below.
Open onrecord.live/verify/<CODE>, or scan the code in the app.
Add the server as a connector. It speaks MCP over Streamable HTTP and needs no sign-in.
https://mcp.onrecord.live/mcp
Two tools, both read-only:
verify_capture — status, when and where, seal, Bitcoin anchor, flags, a link to the post, and a say sentence in plain language, ready to show the reader.get_independent_proof — the proof link, the anchor facts and the steps to check the record yourself.In Claude: Settings → Connectors → Add custom connector → paste the URL. Then ask: “Is this a genuine On Record capture? Code 81EEC489F55B.”
GET https://mcp.onrecord.live/v1/verify/81EEC489F55B
Returns the same fields as verify_capture:
| Field | Meaning |
|---|---|
status | verified · private · not_found · invalid_code · unavailable |
captured_at | ISO 8601, UTC |
area | Where it was taken, as an area, e.g. “Harsaru, HR”, so the creator's exact position stays private |
media_type | photo or video |
seal | tier: sealed_at_capture (sealed as it was taken) or sealed_after_capture (sealed later from an existing record, a lighter guarantee), with signature_valid |
anchored | status confirmed or pending, with bitcoin_height and merkle_root |
flags | screen_capture, print_or_scan, ai_generation — what the capture screening saw |
modified | true only when the media was changed after it was sealed |
post_url | Opens the post on On Record, with who posted it and the full context |
say | One plain-language sentence you can show your reader as it is |
HTTP status follows status: 200 for verified and private, 404 not_found, 400 invalid_code, 503 unavailable (retry), 429 when rate limited.
The say sentence is ready to use. If you write your own, this is what each result means:
not_found means the code is not an On Record capture. The picture itself may be perfectly genuine and simply not made in the app; the result describes the code, not the picture.The Authenticity Chain is publicly verifiable: you don't have to take On Record's word for it. The full record is public at api.onrecord.live/verify/<CODE>: the signed envelope, the Ed25519 signature, the public key, the key window, the Merkle inclusion path and the OpenTimestamps proof.
SHA256(0x00 || canonicalJSON(signedEnvelope) + "." + signature) must equal anchor.leaf (canonical JSON = recursively key-sorted, no whitespace).anchor.inclusionPath with SHA256(0x01 || left || right) to reach anchor.merkleRoot.provenance.publicKey, and that provenance.sealedAt falls inside provenance.keyEpoch.anchor.otsProof and run any OpenTimestamps client against the root. It resolves to the Bitcoin block in anchor.bitcoinHeight.Retry-After.Machine-readable summary: onrecord.live/llms.txt · About On Record · Get the app