📦 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.
txidWhat 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.
Transaction.fromHexBEEF()MerklePath.fromHex()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
PAYMENT-RESPONSEProof 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