# Verification

Live checks and receipts.

## Download a receipt

`GET /api/v1/etches/{id}/receipt` — public

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.

| Field | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | The etch id (a UUID). |

Responses:

- **200** A self-describing JSON receipt.

```bash
curl https://test.etch.so/api/v1/etches/$ID/receipt
```

Example response:

```json
{
  "_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"
  }
}
```

## Verify against the chain, live

`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`.

| Field | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | The etch id (a UUID). |

Responses:

- **200** The verification.
- **404** No such etch.

```bash
curl https://test.etch.so/api/v1/verify/$ID
```

Example response:

```json
{
  "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"
  }
}
```
