The three multi-party sequences in the API — who calls what, who signs what, and which webhooks fire. Every step links to the endpoint page where you can run it live.
The end-user pays from their own wallet; rip.fun never touches their funds.
Trying this on the sandbox? Fund your test wallet first — see Get testnet funds (Base Sepolia).
wallet_address + tier_id → unsigned USDC-approve +
purchase calldata (calls[]). Creates no rows.calls[0] (USDC approve — skippable
if the allowance already suffices) then calls[1] (purchase) from their own wallet.request_id decoded from the receipt logs) so
settlement can link the reveal.FULFILLED, or consume the purchase.fulfilled webhook. The revealed
NFTs belong to the user's wallet.The custodial variant collapses steps 1–3 into a single POST /mystery/purchase (credits debited, a
rip.fun relayer signs; Idempotency-Key required).
Ship a revealed card to the end-user. The burn is signed by the user (same prepare → sign → submit pattern as the purchase), and the NFT only finalizes its burn when the item is physically dispatched — "burn on dispatch".
idempotency_key) — validates the address, snapshots the
cheapest rate, runs KYC.kyc.kyc_url (Veriff),
then re-call prepare with the same key once approved to receive the calldata.unsigned.calls (initiateBurn) from the wallet holding the NFT.{ redemption_id, tx_hash } → BURN_SUBMITTED.redemption.updated webhooks: IN_FULFILLMENT → COMPLETED, with the burn finalizing on dispatch.Offer the end-user instant liquidity on a pull; the bought-back NFT is forwarded to your pool wallet and the USDC rip.fun fronted is invoiced to you monthly.
buyback.confirmed webhook.buyback.card_transferred webhook. If no pool wallet is set you get a one-time buyback.transfer_held and the transfer retries every 15 minutes until you PUT /mystery/pool-wallet; after 10 failed attempts
it goes terminal with buyback.transfer_failed.