Proofs

Submit a SHA-256 hash for anchoring

Submits a 64-character SHA-256 hex digest to be anchored on Polygon (usually within a minute). The file content never leaves the caller; only the hash is sent, with an optional file name and your own optional external_id. Returns immediately with a proof ID; anchoring happens asynchronously. Send your own record id as external_id and a repeat of the same request returns the existing proof (HTTP 200, already_existed: true) instead of creating another.

post/api/v1/proof

Request

  • Base URL: https://proofledger.io
  • URL: https://proofledger.io/api/v1/proof
  • Auth: HTTP bearer

Headers

Idempotency-Keystring

Optional. Any unique string, 1 to 200 printable ASCII characters, no spaces. A resend with the same key and the same body within 24 hours returns the stored 2xx response (same status, same JSON) with Idempotent-Replayed: true and runs nothing twice. The same key with a different body is refused with 422; a duplicate that arrives while the first request is still running gets 409. Only 2xx responses are stored, so after a 4xx the same key accepts a corrected body. Scoped to your account and to the route.

Request body

sha256string required

64-character SHA-256 hex digest of the file. Compute locally; file content is never sent.

filenamestring

Optional label (up to 500 characters). Shown on the public certificate and returned by the public verify endpoint, so keep personal details out of it. Defaults to 'api-submission'.

bitcoin_requestedboolean

Ignored. Bitcoin anchoring was discontinued on 2026-10-15; every proof is anchored on Polygon. Accepted so older clients keep working.

external_idstring

Your own record id for this file (private, never shown publicly). Unique per account: resending it returns the same proof.

Response

A proof with this external_id already exists on the account; it is returned unchanged with already_existed: true.

idinteger
sha256string
external_idstring nullable
filenamestring
statusstring
polygon_status'PENDING' | 'ANCHORED'
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.

created_atstring date-time
polygon_anchored_atstring date-time nullable

When the Polygon transaction was recorded.

chain_txstring nullable
chain_namestring nullable
bitcoin_txidstring 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.

certificate_urlstring uri

Absolute link to the public certificate page.

verification_urlstring uri

Absolute link to the public verification page for this hash.

explorer_urlstring nullable
already_existedboolean

Create responses only: false on a new proof (201); true when the external_id was already recorded and the existing proof is returned (200).

issued_viastring nullable

Approved partner name copied onto the proof when it was created ("Recorded through <name> · Anchored by ProofLedger"). Null when not branded.

Example response

{
  "status": "approved",
  "certificate_url": "https://proofledger.io/cert/42",
  "verification_url": "https://proofledger.io/verify.html?hash=a1b2c3..."
}

Changes

No recorded changes to this operation across all 1 revision of this API.