Receipts docs
v1.0.0
Live demo Get help
● Ship · How the proof works

Proof and method
anyone can check.

How a signal is sealed, chained and timestamped on Bitcoin, how anyone verifies a receipt with or without your website, and the one site-wide method that turns market candles into results.

01Seal and chain

  1. SealEach event (signal, stop move, close, cancel) is a small JSON body: provider, sequence number, previous hash, issue time, a random nonce and the details. Its hash is sha256("receipts/v1\n" + canonical JSON), where canonical JSON has keys sorted and no whitespace.
  2. ChainEach provider has one chain. Event 1 points at 64 zeros; every later event contains the previous event's hash. Removing or reordering an event breaks the chain, and the profile shows "chain gap".
  3. Append-onlyDatabase triggers refuse UPDATE and DELETE on sealed events and batch membership.
  4. BatchAt your anchor interval (default 10 minutes, 5–60) or on Seal a batch now (Anchors), new events form a Merkle tree (inner node = sha256(0x01 ‖ left ‖ right); an odd node is carried up).
  5. TimestampThe root goes to the OpenTimestamps calendars, which commit it into Bitcoin. The .ots file is stored with the batch, "pending" at first. Every 15 minutes the server asks for the finished proof; once a block confirms it (usually within hours) receipts show "Confirmed in Bitcoin block N".

A proof bundle (/proof/<hash>.json, format receipts-proof/1) holds the body (if the viewer may see it), the hash, the previous-hash link, the batch root, the Merkle path, the .ots in base64, and the signer and signature when signed.

A receipt page · public demo
A receipt · public demo

02How anyone verifies

In the browser

Open /verify (or Verify on a receipt), paste a 64-character hash and click Load bundle, or paste a bundle. The page recomputes the SHA-256 and the Merkle path with the browser's own crypto. Change one digit and the seal visibly breaks.

The in-browser verifier · public demo
/verify · public demo

Offline, without the website Tested

node scripts/verify-bundle.mjs receipt.json
node scripts/verify-bundle.mjs receipt.json --ots receipt.ots   # also saves the Bitcoin timestamp

No dependencies, no network. Exit code 0 means every check passed, 1 means a check failed. If the body is still hidden, only the hash is checked.

Against Bitcoin

pip install opentimestamps-client   # the reference client, not shipped with Receipts
ots upgrade receipt.ots
ots verify -d <batch root from the bundle> receipt.ots

The batch's .ots can also be downloaded from /proof/batch/<id>.ots.

03Measurement method

Results model what a follower could actually have got. The rules are deliberately pessimistic and printed on your /method page with your current numbers.

  • Data. Whole 1-minute candles from the signal's price source. The candle still forming is never used.
  • Reaction window. Only candles that start after publish time + reaction seconds (default 30) count; the same delay applies to every stop move, close and cancel.
  • Entry. A market entry fills at the open of the first counted candle. A limit fills at its own price, never better. A limit that never fills before expiry ends "not filled".
  • Filling candle. Only the stop can trigger in it; targets cannot.
  • Stop beats target in one candle. A gapped stop exits at the worse open; a target exits at the target, never better.
  • Targets split the position equally; the last closes the rest.
  • Costs. Fee plus slippage on both sides (default 5 + 5 bps per side).
  • R is measured on the initial risk, after costs. Percentages are shown too.

Statistics and ranking

Per provider over closed signals: median R (the headline), expectancy, win rate with sample size, maximum drawdown, total R, not-filled count, plus profit factor, average hold, worst streak and a monthly heatmap. A provider is ranked after the minimum closed signals and days of history; score = total R ÷ (closed + k).

Price sources

Venue idMarketData
binance-spotBinance spotapi.binance.com/api/v3/klines
binance-usdmBinance USDⓈ-M perpetualfapi.binance.com/fapi/v1/klines
bybit-spotBybit spotapi.bybit.com/v5/market/kline (spot)
bybit-linearBybit USDT perpetualapi.bybit.com/v5/market/kline (linear)

All four are public and keyless. Forex and stocks are not included: a developer can register another source in src/services/prices.ts with a data provider whose licence allows public display.