---
title: "Retrieve a proof by ID"
method: GET
path: "/api/v1/proof/{id}"
tags: ["Proofs"]
---

# Retrieve a proof by ID

`GET /api/v1/proof/{id}`

## Request

- Base URL: `https://proofledger.io`
- URL: `https://proofledger.io/api/v1/proof/{id}`
- Auth: HTTP bearer

Returns full status of a proof, including chain transaction hash, anchoring status, and public explorer URLs. Callers can only retrieve proofs they own.

## Path parameters

- `id` integer, required

## Response `200`

Proof retrieved.

- Proof
  - `id` integer
  - `sha256` string
  - `filename` string
  - `size` integer
  - `mime` string
  - `status` 'approved' | 'pending' | 'pending_review' | 'denied' | 'contested'
  - `review_status` 'APPROVED' | 'PENDING' | 'PENDING_REVIEW' | 'DENIED' | 'CONTESTED' | 'UNKNOWN'
  - `polygon_status` 'ANCHORED' | 'PENDING'
  - `bitcoin_status` 'NOT_REQUESTED' | 'AWAITING_PAYMENT' | 'PENDING' | 'ANCHORED' | 'FAILED': Legacy field: carries a value only on proofs anchored on Bitcoin before 2026-10-15, when Bitcoin anchoring was discontinued. Null or NOT_REQUESTED on every newer proof.
  - `evidence_readiness` 'READY_BITCOIN' | 'READY_POLYGON' | 'PENDING_BITCOIN' | 'PENDING_BITCOIN_PAYMENT' | 'PENDING_POLYGON' | 'NEEDS_REVIEW' | 'DENIED' | 'UNKNOWN'
  - `created_at` string, date-time
  - `chain_tx` string, nullable: Polygon transaction hash once anchored.
  - `chain_name` 'polygon-mainnet' | 'polygon-amoy' | 'null', nullable
  - `bitcoin_txid` string, nullable: Legacy field: carries a value only on proofs anchored on Bitcoin before 2026-10-15, when Bitcoin anchoring was discontinued. Null on every newer proof.
  - `bitcoin_anchor_status` 'NOT_REQUESTED' | 'AWAITING_PAYMENT' | 'PENDING' | 'ANCHORED' | 'FAILED' | 'null', nullable: Legacy field: carries a value only on proofs anchored on Bitcoin before 2026-10-15, when Bitcoin anchoring was discontinued. Null or NOT_REQUESTED on every newer proof.
  - `btc_merkle_root` string, nullable: Legacy field: carries a value only on proofs anchored on Bitcoin before 2026-10-15, when Bitcoin anchoring was discontinued. Null on every newer proof.
  - `btc_payment_status` 'NONE' | 'INCLUDED' | 'REQUIRED' | 'PAID': Legacy field: NONE on every proof created since 2026-10-15.
  - `public_cert_id` string, nullable
  - `certificate_url` string, uri: Absolute link to the public certificate page.
  - `verification_url` string, uri: Absolute link to the public verification page for this hash.
  - `explorer_url` string, nullable: Polygonscan URL once anchored.
  - `bitcoin_explorer_url` string, nullable: Legacy field: carries a value only on proofs anchored on Bitcoin before 2026-10-15, when Bitcoin anchoring was discontinued. Null on every newer proof.
  - `external_id` string, nullable: Your own record id, if one was sent.
  - `polygon_anchored_at` string, date-time, nullable: When the Polygon transaction was recorded.
  - `issued_via` string, nullable: Approved partner name copied onto the proof when it was created ("Recorded through <name> · Anchored by ProofLedger"). Null when not branded.

## Other responses

- `400`: The request body or parameters were invalid (e.g. hash is not 64-character hex).
- `401`: API key was missing, malformed, or does not match a known key.
- `403`: API key belongs to a disabled account.
- `404`: The requested resource was not found, or the authenticated account does not own it.
- `429`: Rate limit exceeded: 120 requests per minute per API key (fixed window). Retry-After says how many seconds to wait; X-RateLimit-Limit / -Remaining / -Reset are on every keyed response.
- `500`: Something went wrong on our side. Retry with exponential backoff.

---

[API](https://skmtc.dev/proofledger/apis/proofledger-api.md) · [All operations](https://skmtc.dev/proofledger/apis/proofledger-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proofledger/apis/proofledger-api/revisions/6b9565b296a2?raw)
