---
title: "OpenTimestamps proof for one event record"
method: GET
path: "/receipts/proof"
tags: ["Receipts"]
---

# OpenTimestamps proof for one event record

`GET /receipts/proof`

## Request

- Base URL: `https://tickerz.com/api/v1`
- URL: `https://tickerz.com/api/v1/receipts/proof`
- Auth: none declared

JSON metadata for the stamp, or the .ots file with format=ots. Verify at opentimestamps.org or with the ots CLI. Until a Bitcoin height is known the stamp is calendar-pending. horizon=open is the event as called. New events are stamped within about an hour of open. Events already on the record when open stamping shipped on September 22 2026 were stamped later, some after their outcome, so compare stamped_at with opened_at. 24h, 7d and 30d are the resolved receipts.

## Query parameters

- `event_id` string, uuid, required
- `horizon` 'open' | '24h' | '7d' | '30d', required
- `format` 'ots'

## Response `200`

Proof metadata, or the .ots file when format=ots

- ReceiptProof
  - `event_id` string, uuid
  - `horizon` 'open' | '24h' | '7d' | '30d': open is the event as called at open; 24h, 7d and 30d are the resolved receipts
  - `digest_sha256` string: SHA-256 of canonical_json
  - `canonical` object: The stamped record. Receipts: event_id, symbol, opened_at, open_price, horizon, resolved_at, ret_pct. Open: event_id, symbol, opened_at, open_price, horizon, score_at_open, trigger_z_vol, trigger_z_move. Stored as jsonb, so key order here is not the hashed order; use canonical_json
  - `canonical_json` string, nullable: The exact bytes that were hashed: compact JSON with keys in the documented order. sha256(canonical_json) equals digest_sha256
  - `bitcoin_height` integer, nullable: Bitcoin block height once the stamp upgrades, else null
  - `bitcoin_block_time` string, date-time, nullable
  - `stamped_at` string, date-time
  - `upgraded_at` string, date-time, nullable
  - `ots_url` string: Same endpoint with format=ots
  - `verify` string, uri

## Other responses

- `400`: event_id and horizon required
- `404`: not_found
- `429`: rate_limited: the address passed the limit named in RateLimit-Policy
- `500`: internal_error: the server failed to answer

---

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