---
title: "Verify a proof by SHA-256 hash (public)"
method: GET
path: "/api/v1/verify"
tags: ["Verification"]
---

# Verify a proof by SHA-256 hash (public)

`GET /api/v1/verify`

## Request

- Base URL: `https://proofledger.io`
- URL: `https://proofledger.io/api/v1/verify`
- Auth: none required

Public, no-auth endpoint. Returns whether ProofLedger holds a proof for the given hash, along with blockchain transaction details and links to public explorers. It is a convenience: to check a proof without us, use its bundle with the open-source verify-proof tool and look the transaction up on any public block explorer. Rate-limited to 120 requests per hour per IP. With an API key, the key's 120 requests a minute apply instead.

## Query parameters

- `hash` string, required

## Response `200`

Verification result (whether or not a matching proof was found).

- VerifyResult
  - `found` boolean, required
  - `sha256` string: Echoed only when found = false.
  - `proof` object: Present only when found = true.
    - `id` integer
    - `sha256` string
    - `filename` string
    - `size` integer
    - `created_at` string, date-time
    - `polygon_anchored_at` string, date-time, nullable: When the Polygon transaction was recorded (added 2026-10-18). Null while polygon_status is PENDING.
    - `status` string
    - `review_status` string
    - `polygon_status` string
    - `bitcoin_status` string: 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` string
    - `chain_tx` string, 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` string, 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.
    - `public_cert_id` string, nullable
    - `user_email` string, nullable: Always null. This public lookup does not return the account email, not even masked (since 2026-10-17). The field stays so existing clients keep working.
  - `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
  - `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.

## Other responses

- `400`: The request body or parameters were invalid (e.g. hash is not 64-character hex).
- `429`: Too many verify requests from this IP. Try again later.
- `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)
