/api/v1/mystery/redemption/prepare cards:redeemStarts a physical redemption: validates + stores the address, snapshots the cheapest shipping rate, pre-creates the fulfillment order/queue rows, and — once KYC (Veriff) is clear — returns unsigned initiateBurn calldata in the same {chain_id, calls} shape as purchase/prepare. The END USER signs the burn from the wallet holding the NFT. Idempotent per idempotency_key / per (purchase, token) while pre-burn.
POST /api/v1/mystery/redemption/prepare money These inputs are shared across all docs pages — an id entered here carries over.
{
"purchase_id": 0,
"shipping_address": {
"name": "Demo Buyer",
"street1": "1 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94105",
"country": "US"
},
"idempotency_key": "demo-redeem-0-single"
}Not run yet — press Run to make a live call against https://staging-service.rip.fun (through this demo's server-side proxy; the API key never reaches the browser).
curl -X POST 'https://staging-service.rip.fun/api/v1/mystery/redemption/prepare' \
-H 'X-API-Key: rip_v1_…' \
-H 'Content-Type: application/json' \
-d '{"purchase_id":0,"shipping_address":{"name":"Demo Buyer","street1":"1 Market St","city":"San Francisco","state":"CA","zip":"94105","country":"US"},"idempotency_key":"demo-redeem-0-single"}' | Field | Type | Required | Description |
|---|---|---|---|
purchase_id | number | yes | The fulfilled purchase holding the item |
token_id | string | — | Required when the purchase revealed multiple items |
idempotency_key | string | — | Replay-safe; an Idempotency-Key header is also accepted |
shipping_address.name | string | yes | Recipient full name |
shipping_address.street1 | string | yes | Street line 1 (`street2` optional) |
shipping_address.city | string | yes | City |
shipping_address.state | string | — | State / region |
shipping_address.zip | string | yes | Postal code |
shipping_address.country | string | yes | ISO country code, e.g. `US` (`phone`, `email` optional) |
data)| Field | Description |
|---|---|
redemption_id / status | AWAITING_KYC (no calldata yet) or PREPARED |
kyc.status / kyc.kyc_url | NOT_REQUIRED | PENDING | APPROVED | DECLINED; send the user to kyc_url while PENDING |
shipping_quote | Snapshotted cheapest rate (same shape as /quote) |
expires_at | PREPARED calldata validity (default 24 h); EXPIRED is retryable with a NEW idempotency_key |
unsigned.chain_id / unsigned.calls[] | initiateBurn calldata for the user to sign — null until KYC clears |
| Status | Code | When |
|---|---|---|
| 409 | not_fulfilled | purchase not revealed yet |
| 409 | not_burnable | token unindexed / burned / not in a redeemable state, or already queued |
| 409 | not_owner | token left the purchase wallet — the holder must be the burn signer |
| 409 | redemption_exists | re-preparing after the burn already started |
| 400 | invalid_address | Shippo cannot validate the address |
| 409 | kyc_required | (on submit) burn submitted while still AWAITING_KYC |
See Errors for the response envelope and the full code list.