An independent archive of Counterparty (XCP) events on Bitcoin L1, and a read-only JSON API over it — live XCP-69 launches, AMM pools, the DEX order book and the BTC/XCP rate. We publish our own coverage gaps so you can check us rather than trust us: /api/coverage says what we hold per event type, /api/gaps says which blocks are missing from a scanned window. Versions — site 266 is baked into this page; api — is the build the API says it is running.

Activity waiting for the first answer
asking our archive…
nothing here yet is a statement about the chain
Dan Anderson
xcp.funXCP-69 launchpad — minting happens here XCP WalletCounterparty Web3 browser extension xcpdexpeer-to-peer DEX front end xcp.ioCounterparty block explorer
Protocol
counterparty.ioprotocol home counterparty-corereference implementation public APIthe node this terminal reads
This terminal
our APIevery route this archive serves — check us, don't trust us
Minting happens on xcp.fun, Dan Anderson's launchpad — this is his page, framed. opreturn.art never touches your keys and cannot see or sign anything here.
Saved layouts
Reset to defaults stored on this computer only

Method

✕

What this is

An independent view of Counterparty market data. Every figure is derived from the chain through the public Counterparty API and is either read live or stamped with the block it came from.

Two venues, never merged

A pair can trade on the DEX order book and in an AMM pool at the same time, at two different prices. They are shown separately everywhere. No figure on this page averages or sums across venues.

Prices

Quoted as quote-per-base. Quantities come from the node already adjusted for divisibility; indivisible assets are shown in whole units because fractions of them cannot exist. Order-book side is taker-side: the aggressing order decides whether a fill reads as a buy or a sell.

Pool depth

A pool has no order book. Its depth is the constant product x·y=k on live reserves: the size shown at a price is what can be taken before the pool reaches that price. Execution figures include the swap fee — the rate each pool's OWN swaps showed, falling back to the expected 50 bps with an XCP leg / 100 bps without one, labelled expected until a swap on that pool confirms it. TVL is the quote reserve doubled, which holds because a constant-product pool carries equal value on both sides.

Change

Measured against the previous fill, not a 24-hour window. Most pairs here trade rarely, so a fixed 24h change would read 0.00% or nothing for almost all of them. Each popup states how old the compared fill is.

Volume

Ranked on volume inside a fixed recent window, converted to XCP only through XCP and BTC. A pair quoted in anything else keeps its native units, because valuing an asset from its own thin market lets a single print reprice everything quoted in it.

Time estimates

Block intervals are exponentially distributed, so an N-block wait is N x the mean interval, not N x the median. Using the median understates every countdown by about 29%.

What this page will not do

It makes no predictions about price or financial performance. It publishes what is and what was. Figures such as "pace" describe what has already happened; they are not forecasts.

Freshness

The selected market's book, fills and pool are re-fetched when a new block reaches our archive — not on a clock, because nothing on Counterparty changes between blocks. Launch and ecosystem totals come from a snapshot; the status bar shows how many blocks behind it is.

What opreturn.art is

✕

An independent archive of Counterparty (XCP) events on Bitcoin L1, and a read-only JSON API over it. The routes named below are answered from this archive's own database, not relayed from another front end. The machine-readable map of every route is at /api/openapi.json.

Questions this archive answers

  • Is an XCP-69 fair-mint launch on pace to fill? Every open launch with its funded percentage, its elapsed percentage, the blocks left to its deadline and its mint pace — funded divided by elapsed, measured against the chain tip read in the same request. It is a description of what has already happened, never a forecast. /api/launches
  • What is XCP worth in BTC? A volume-weighted average of the most recent XCP dispenses: a dispense is atomic, so the event itself proves BTC moved. Published with its sample count, its sample floor, the spread across those samples and how many blocks old the newest one is — and it refuses to answer below the floor rather than guessing. /api/rates
  • What AMM pools exist on Counterparty, and what are their reserves and fees? Reserves labelled with the event they were read from, the fee range each pool was actually observed to charge rather than an assumed default, and a 24-hour change that names the basis it was computed on. /api/pools
  • What is resting on the Counterparty DEX order book right now? The open book rebuilt from archived events, stamped with the block it was true at — and an empty result that tells you it is empty rather than that we failed to look. /api/book
  • Every DEX fill, every AMM swap, and every liquidity deposit and withdrawal. A matched order carries both transaction hashes and both addresses, and names which side was the taker instead of assuming you know the convention. /api/trades · /api/pool/swaps · /api/pool/deposits · /api/pool/withdrawals
  • Did the Bitcoin chain reorganise, and what Counterparty events were on the losing fork? Forks observed are published as a lower bound, and the answer is null rather than an empty list when there is no log to read. /api/reorgs
  • What does this archive not have? Per event type: how many rows are held, what an independent node reported, whether historical completeness is claimed, and whether that claim has a witness — three separate fields, so the claim is falsifiable instead of merely believed. /api/coverage
  • Which blocks are missing, and did you actually look? The answer returns the window it scanned, so an empty list of gaps can never be mistaken for a clean bill of health. /api/gaps

Where this archive is complete, and why that is a narrow claim

Counterparty's AMM opens at block 952,800, and this archive's unbroken coverage begins at the same block. For pools, swaps and liquidity there is therefore no history behind us — not "more history than the alternatives", none missing at all. That is a claim about one surface and it is not transferable to the others.

XCP-69 is a recent convention layered on Counterparty's older fairminter primitive. Fairminters that predate the standard are a different population and are counted separately here; they are never folded into an XCP-69 total.

What this archive does not hold

Stated here rather than left to be discovered. Counterparty SEND events are not collected at all — for transfer history, ask a Counterparty node. Several known event types are held at zero and no completeness is claimed for any of them; the coverage route names which. Dispenser history is a live window only: the BTC/XCP rate above is a rolling window of recent dispenses and is not a dispenser record. Below the archive's dense floor complete blocks exist but are not continuous, and the block-to-time map covers well under half the span, so deep history on a time axis is partial by construction. There are no balances here, and no route answers "tell me everything about this address". No wallet, no keys, no transaction construction, no broadcasting, no price oracle, no investment advice.

How to check us instead of trusting us

Ask /api/coverage what is held and what is not claimed, ask /api/gaps which blocks are missing, and cross-check any answer against a public Counterparty node. Every route is listed and described at /api/docs. We would rather be checked than believed.

One caveat that belongs with the rest: the counts drawn on the terminal above come from a build-time snapshot, stamped with the block it was taken at. The routes named on this page are live. Where a number on the page and a number from a route disagree, the route is right.

from goat with love