List tiers

GET /api/v1/mystery/catalog read:catalog

Every tier you can sell, with what it is CALLED and which game it draws from — so you can list only the gachas that belong on your storefront. Price, EV, slot count and active come live from the on-chain pool; name, description, variant and game come from tier metadata; total_purchases and last_active_at are what CardOS has observed. A tier that has never been purchased still appears (it is read from the pool, not from purchase history), so a newly launched tier is sellable immediately. `games` lists every game on offer and is computed BEFORE filtering, so it stays complete as the filter UI you build from it.

Try it GET /api/v1/mystery/catalog
response
403 9ms preloaded server-side with the default context
object · 3 keys
{
  "success": false,
  "message": "Mystery partner API key required",
  "error": "This endpoint requires an API key linked to a mystery partner account"
}
tracks the inputs above
curl -X GET 'https://service.rip.fun/api/v1/mystery/catalog' \
  -H 'X-API-Key: rip_…'

Request fields

FieldTypeRequiredDescription
gamequery stringFilter by game id: pokemon | onepiece | azuki (alias: tcg_type)
variantquery stringFilter by what the tier yields, e.g. card
activequery booltrue = only tiers the pool is currently selling
freshquery bool`true` bypasses the shared response cache and recomputes from source. Meant for a manual refresh, not for polling: it carries its own budget of 10 calls per minute per key, and past that you get a 429 while a plain read still answers from cache

Response fields (data)

FieldDescription
tiers[].name / slug / descriptionDisplay metadata; null when a tier has no metadata row yet
tiers[].game{ id, label } — e.g. onepiece / One Piece. Null when unclassified
tiers[].variantWhat the tier yields (card, box, …)
tiers[].price_usdc / price_display / price_micros / target_ev_usdc / slot_count / activeRead live from the pool, with a short-lived last-known-good fallback when the RPC is down. null = temporarily unavailable (never a real price) — re-fetch shortly rather than treating it as free/unsellable
tiers[].total_purchases / last_active_atObserved volume; 0 / null for a tier nobody has bought yet
gamesEvery game on offer, unaffected by filters — build your filter UI from this

Errors

StatusCodeWhen
403Insufficient permissionskey lacks the read:catalog scope

See Errors for the response envelope and the full code list.