---
title: "Proof bundle: verify this proof without ProofLedger"
method: GET
path: "/api/v1/proof/{id}/bundle"
tags: ["Proofs"]
---

# Proof bundle: verify this proof without ProofLedger

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

## Request

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

One JSON document with the hash, chain, transaction id and anchor time, in the verify-proof file format. Store it next to the file. Also delivered in every proof.*.anchored webhook payload as data.bundle. Owner only.

## Path parameters

- `id` integer, required

## Query parameters

- `chain` 'polygon' | 'bitcoin'
- `download` '1'

## Response `200`

The bundle

- Bundle: Everything needed to verify one proof without ProofLedger. Top-level fields are the verify-proof file format. `anchors` holds the Polygon anchor and a legacy `bitcoin` block, which carries data only on proofs anchored on Bitcoin before 2026-10-15.
  - `format` string
  - `service` string
  - `generated_at` string, date-time
  - `hash` string: SHA-256 of the file, lowercase hex.
  - `algorithm` string
  - `blockchain` 'polygon' | 'bitcoin': The chain in the top-level fields (?chain=).
  - `tx_id` string, nullable
  - `anchored_at` string, date-time, nullable
  - `merkle_path` object[]: Empty: Polygon anchors are one transaction per hash. (Non-empty only on the legacy Bitcoin anchor of proofs anchored before 2026-10-15.)
    - `hash` string
    - `position` 'left' | 'right'
  - `anchored` boolean
  - `proof_id` integer
  - `external_id` string, nullable
  - `public_cert_id` string, nullable
  - `filename` string, nullable
  - `created_at` string, date-time
  - `issued_via` 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.
  - `anchors` object
    - `polygon` object
      - `blockchain` string
      - `network` string, nullable
      - `anchored` boolean
      - `tx_id` string, nullable
      - `anchored_at` string, nullable
      - `explorer_url` string, nullable
    - `bitcoin` object: Legacy block: carries Bitcoin data only on proofs anchored on Bitcoin before 2026-10-15. On every newer proof it reads anchored: false, status NOT_REQUESTED.
      - `blockchain` string
      - `anchored` boolean
      - `status` string
      - `tx_id` string, nullable
      - `anchored_at` string, nullable
      - `merkle_root` string, nullable
      - `merkle_root_verified` boolean
      - `batch_size` integer
      - `merkle_path` unknown
      - `explorer_url` string, nullable
  - `how_to_verify` string[]

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

---

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