OPERATIONAL serving on mainnet · payments accepted no issues in 18h 43m report a problem

📦 Proofpack

Give us any confirmed BSV transaction id. We acquire its Merkle proof, fold it against block headers we sync ourselves, and return a portable BEEF + BUMP + tip attestation in one machine-payable call.

you sendone 64-hex txid
you getBRC-62 BEEF, BRC-74 BUMP, proven block height, and our current self-synced headers tip
price6000 sat per successful call · $0.0025 in MNEE
accountnone — HTTP 402, one payment for one result

What you are buying

The bytes are not the scarce part. Proofpack does the awkward live work: locate the transaction and its TSC proof, reconstruct the Merkle root, compare it with the header our node holds, fetch the raw transaction, and package the result into two ecosystem-standard forms. It will never label a bundle verified merely because an explorer supplied it.

BEEF · BRC-62the raw transaction and its Merkle path together — hand it to Transaction.fromHexBEEF()
BUMP · BRC-74the portable Merkle path alone — hand it to MerklePath.fromHex()
tipour self-synced header height and Merkle root at serving time, so the response records the chain view used

The trust boundary

We do use public data providers to retrieve transaction bytes and candidate proof nodes. We do not trust them to decide inclusion. The candidate path must fold to the Merkle root in the block header bsv.cx independently synced over the BSV peer-to-peer network. If it does not, there is no Proofpack.

candidate transaction + Merkle path
                 ↓ fold locally
          computed Merkle root
                 ↓ must equal
root in our self-synced block header → package BEEF + BUMP

For maximum independence, verify the returned BEEF/BUMP against your own headers. Our free SPV verifier is useful as a second view, not a demand that you trust ours.

Call it

curl -i https://bsv.cx/pay/proofpack/<txid>

# → HTTP 402 Payment Required
# PAYMENT-REQUIRED: <base64 x402 v2 challenge>

# repeat the same GET with a signed payment transaction
curl https://bsv.cx/pay/proofpack/<txid> \
  -H 'PAYMENT-SIGNATURE: <base64 x402 payment>'

The challenge contains the exact amount, fresh locking script, network, scheme, endpoint, and expected output shape. Generic discovery: curl https://bsv.cx/.well-known/x402. A complete reference client lives in scripts/x402-demo.ts in the public source tree.

Successful response

{
  "txid": "<64-hex>",
  "height": 961695,
  "beef": "<BRC-62 hex>",
  "bump": "<BRC-74 hex>",
  "verified": true,
  "tip": { "height": 964658, "merkleRoot": "<64-hex>", "source": "self-headers" },
  "servedAt": "<ISO-8601>"
}

The tip numbers above illustrate the schema; live values naturally move. The proven block height comes from the BUMP and is not the current tip.

Failure and charging semantics

400malformed txid — not charged
409unconfirmed, proof not yet available, or proof does not match our header — not charged; retry later
502 / 503proof source, bundle assembly, or headers service unavailable — not charged
200proof verified, artifacts assembled, payment accepted and broadcast; settlement txid is returned in PAYMENT-RESPONSE

Proof assembly happens before payment settlement. If we cannot produce the verified bundle, we do not broadcast your payment transaction.

Proven on mainnet

We ran the complete native-BSV loop against the live service: 402 challenge, signed 6000-sat payment, proof acquisition, fold against our headers, BEEF/BUMP assembly, 200 OK, and broadcast. The settlement transaction is public: 9f773972c5cbfbceb12d3686521745d92e9f94c06d1ced5047779805ea88e0a9. This is our own end-to-end test, not customer-usage theatre.

What Proofpack is not

It does not create a confirmation, notarize new data, or make a zero-confirmation transaction final. It packages evidence for an inclusion that already exists. Verification remains free at POST /spv/verify; the paid product is acquisition, independent checking, and portable assembly.

← all paid APIs · free SPV verification · machine docs: curl https://bsv.cx/proofpack