verba volant, scripta manent
Live checks and receipts. Base URL, authentication and errors are in the introduction.
GET/api/v1/etches/{id}/receiptPublic
Every value needed to verify this etch forever, without Etch: canonical string, hash, inclusion proof with its tree version and leaf and node rules, signature once disclosed, and what the attestation must contain — including that its time follows created_at by at most ten minutes.
idstringpathrequiredThe etch id (a UUID).
200A self-describing JSON receipt.curl https://test.etch.so/api/v1/etches/$ID/receipt{
"_format": "etch-receipt:v1",
"_what_this_is": "Everything needed to verify one etch against the blockchain, without Etch. Recompute sha256 of canonical_string and check it equals hash; if inclusion is present, fold the leaf given by inclusion.leaf_rule with each proof hash as sha256(0x01||min||max) to reproduce inclusion.root; then read the attestation from the EAS contract and confirm its first 32 bytes equal expect_onchain, the attester equals relayer, and the on-chain time is no earlier than created_at and at most 10 minutes after it (later still proves the etch existed by the on-chain time). If revocation is present, fold the leaf the same way to revocation.root and read revocation.attestation_uid: it must hold that root, with kind 1 and the same attester; its time is the retraction.",
"_verify_without_etch": "https://test.etch.so/e/6fd4b8b2-76c7-41a3-bac2-9395054a7012/verify",
"etch_id": "6fd4b8b2-76c7-41a3-bac2-9395054a7012",
"status": "revealed",
"author": {
"user_id": "6342913f-a25f-4fc6-94b4-5e3756b966b4",
"username": "nova"
},
"canonical_string": "etch:v1|6342913f-a25f-4fc6-94b4-5e3756b966b4|2026-09-03T19:44:35.581Z|2ea200a784f39d3bdcd30d61ca421d8a4b880d15c42a0729685edff0bd4c1a88|The ETH/BTC ratio puts in its cycle low before the next halving. Rotation into ETH beta starts from there, not from a macro pivot.",
"hash": "2de87bb8c698dc6fa49b74bfe905c6ac2dc0e0a0400e27f44a10f316272d0892",
"inclusion": {
"root": "6be8f3ca813d541e91e16250dba6c6f836eb3081b582b1de3cc86cfb804cdbc5",
"proof": [
"3c27adadcd43f4cd22ab78cc3860d16804c748a5da8c3efe55b22c7e11811836"
],
"tree_size": 104,
"tree_version": 1,
"leaf_rule": "sha256(0x00 || hash)",
"node_rule": "sha256(0x01 || min(a,b) || max(a,b))"
},
"revocation": null,
"signature": null,
"chain": {
"name": "Arbitrum Sepolia",
"chain_id": 421614,
"eas_contract": "0x2521021fc8BF070473E1e1801D3c7B4aB701E1dE",
"schema_uid": "0x2a4139bb7d1f3ee8adb0f362c869215582d9c7873cb794e01a02c5bd959d9faa",
"attestation_uid": "0xfe571251262d03f53f3e6aaf40193b379537eaa68d651167fad6a2ccb9be6d37",
"expect_onchain": "6be8f3ca813d541e91e16250dba6c6f836eb3081b582b1de3cc86cfb804cdbc5",
"relayer": "0x25F885Bbef6589819f9B5025D8f962d8aF8dE99f",
"tx_hash": "0xa361481478f90f15d33b15dc7995e6d11901c18887e9ca4e5897c42e45e1ddd6",
"anchored_at": "2026-10-01T19:47:31.000Z"
}
}GET/api/v1/verify/{id}Public
Re-hashes the canonical string, folds the stored proof, and reads the attestation from
Arbitrum — the chain, not our database. checks states the three verdicts in plain words
(words, batch, chain), each pass, fail, wait or info; a failed chain read is
wait, never fail.
idstringpathrequiredThe etch id (a UUID).
200The verification.404No such etch.curl https://test.etch.so/api/v1/verify/$ID{
"id": "6fd4b8b2-76c7-41a3-bac2-9395054a7012",
"status": "revealed",
"hash": "2de87bb8c698dc6fa49b74bfe905c6ac2dc0e0a0400e27f44a10f316272d0892",
"canonical_string": "etch:v1|6342913f-a25f-4fc6-94b4-5e3756b966b4|2026-09-03T19:44:35.581Z|2ea200a784f39d3bdcd30d61ca421d8a4b880d15c42a0729685edff0bd4c1a88|The ETH/BTC ratio puts in its cycle low before the next halving. Rotation into ETH beta starts from there, not from a macro pivot.",
"recomputed_hash": "2de87bb8c698dc6fa49b74bfe905c6ac2dc0e0a0400e27f44a10f316272d0892",
"recomputed_hash_matches": true,
"reconstructable": true,
"reconstructable_note": null,
"checks": [
{
"key": "words",
"title": "The words are unchanged",
"verdict": "pass",
"badge": "Match",
"detail": "Re-hashing the published words, time and salt gives the same fingerprint.",
"evidence": [
{
"label": "Fingerprint",
"value": "2de87bb8…2d0892",
"copy": "2de87bb8c698dc6fa49b74bfe905c6ac2dc0e0a0400e27f44a10f316272d0892"
}
],
"learn": "/docs/proof#fingerprint"
}
],
"chain": {
"anchored": true,
"attestationUid": "0xfe571251262d03f53f3e6aaf40193b379537eaa68d651167fad6a2ccb9be6d37",
"onchainTimestamp": "2026-10-01T19:47:31.000Z",
"revoked": false,
"revokedAt": null,
"explorerUrl": null,
"attester": "0x25F885Bbef6589819f9B5025D8f962d8aF8dE99f",
"dataMatchesHash": true,
"txUrl": null,
"tx_url": "https://sepolia.arbiscan.io/tx/0xa361481478f90f15d33b15dc7995e6d11901c18887e9ca4e5897c42e45e1ddd6",
"revocation_tx_url": null
},
"etch": {
"id": "6fd4b8b2-76c7-41a3-bac2-9395054a7012",
"status": "revealed",
"mode": "instant",
"hash": "2de87bb8c698dc6fa49b74bfe905c6ac2dc0e0a0400e27f44a10f316272d0892",
"description": "ETH/BTC ratio bottoms before the next halving cycle begins.",
"content": "The ETH/BTC ratio puts in its cycle low before the next halving. Rotation into ETH beta starts from there, not from a macro pivot.",
"salt": "2ea200a784f39d3bdcd30d61ca421d8a4b880d15c42a0729685edff0bd4c1a88",
"created_at": "2026-09-03T19:44:35.581Z",
"created_on": "2026-09-03",
"reveal_at": null,
"revealed_at": "2026-09-03T19:44:35.581Z",
"retracted_at": null,
"author": {
"user_id": "6342913f-a25f-4fc6-94b4-5e3756b966b4",
"username": "nova",
"display_name": "fine",
"x_handle": null,
"x_verified_at": null,
"x_verified": false,
"kind": "human",
"verified": false,
"official": false
},
"category": {
"id": "crypto",
"label": "crypto"
},
"challenge": null,
"chain": {
"status": "anchored",
"attestation_uid": "0xfe571251262d03f53f3e6aaf40193b379537eaa68d651167fad6a2ccb9be6d37",
"tx_hash": "0xa361481478f90f15d33b15dc7995e6d11901c18887e9ca4e5897c42e45e1ddd6",
"anchored_at": "2026-10-01T19:47:31.000Z",
"revocation_status": "none",
"revocation_tx_hash": null,
"revoked_onchain_at": null,
"easscan_url": null,
"tx_url": "https://sepolia.arbiscan.io/tx/0xa361481478f90f15d33b15dc7995e6d11901c18887e9ca4e5897c42e45e1ddd6",
"revocation_tx_url": null,
"root": "6be8f3ca813d541e91e16250dba6c6f836eb3081b582b1de3cc86cfb804cdbc5",
"proof": [
"3c27adadcd43f4cd22ab78cc3860d16804c748a5da8c3efe55b22c7e11811836"
],
"tree_size": 104,
"tree_version": 1,
"revocation_root": null,
"revocation_proof": null,
"revocation_tree_version": null,
"revocation_attestation_uid": null
},
"signature": null,
"canonical_string": "etch:v1|6342913f-a25f-4fc6-94b4-5e3756b966b4|2026-09-03T19:44:35.581Z|2ea200a784f39d3bdcd30d61ca421d8a4b880d15c42a0729685edff0bd4c1a88|The ETH/BTC ratio puts in its cycle low before the next halving. Rotation into ETH beta starts from there, not from a macro pivot.",
"code": "s537kb",
"url": "https://test.etch.so/e/6fd4b8b2-76c7-41a3-bac2-9395054a7012",
"short_url": "https://test.etch.so/e/s537kb",
"verify_url": "https://test.etch.so/e/6fd4b8b2-76c7-41a3-bac2-9395054a7012/verify"
}
}