---
title: "Look up by external_id, or list proofs (newest first)"
method: GET
path: "/api/v1/proofs"
tags: ["Proofs"]
---

# Look up by external_id, or list proofs (newest first)

`GET /api/v1/proofs`

## Request

- Base URL: `https://proofledger.io`
- URL: `https://proofledger.io/api/v1/proofs`
- Auth: HTTP bearer

With external_id: exactly one proof or 404. Without it: a page of the account's proofs, newest first. anchored_since limits the page to proofs whose Polygon anchor landed after that time, so an integration can catch up on what finished since its last check. cursor is the last id of the previous page.

## Query parameters

- `external_id` string
- `anchored_since` string, date-time
- `cursor` integer
- `limit` integer

## Response `200`

One proof (external_id lookup) or a page.

- union
  - object
    - `proof` ProofSummary: A proof as returned by the batch and lookup/list endpoints (a shorter view than GET /api/v1/proof/{id}).
      - `id` integer
      - `sha256` string
      - `external_id` string, nullable
      - `filename` string
      - `status` string
      - `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_at` string, date-time
      - `polygon_anchored_at` string, date-time, nullable: When the Polygon transaction was recorded.
      - `chain_tx` string, nullable
      - `chain_name` 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.
      - `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
      - `already_existed` boolean: 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_via` string, nullable: Approved partner name copied onto the proof when it was created ("Recorded through <name> · Anchored by ProofLedger"). Null when not branded.
  - object
    - `proofs` ProofSummary[]
      - `id` integer
      - `sha256` string
      - `external_id` string, nullable
      - `filename` string
      - `status` string
      - `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_at` string, date-time
      - `polygon_anchored_at` string, date-time, nullable: When the Polygon transaction was recorded.
      - `chain_tx` string, nullable
      - `chain_name` 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.
      - `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
      - `already_existed` boolean: 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_via` string, nullable: Approved partner name copied onto the proof when it was created ("Recorded through <name> · Anchored by ProofLedger"). Null when not branded.
    - `next_cursor` integer, nullable

## 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.
- `404`: No proof with that external_id on this account.
- `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.

---

[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)
