v1 are additive: a response can gain fields, an enum can gain values, and a new endpoint can appear, so build your parser to ignore what it doesn’t know. A breaking change would ship under a new version prefix. Dates are US Pacific time.
Withdrawal webhook
- New webhook event:
withdrawal.updated, sent when a USDC withdrawal changes status, with the object Get a withdrawal returns. Every webhook on the account whose key haswithdraw:fundsgets it.
Balance history
- New: Balance history (
GET /balance-history, scoperead:account): every change to your balance in a window, newest first, in one list: orders, shipping charges, USDC withdrawals and money in (USDC deposits, wires we credited, card deposits). REST only.
Funding and withdrawals in USDC
- New guide: Funding in USDC.
- New: Get funding details (
GET /funding, scoperead:account): your permanent USDC deposit addresses. A deposit lands in your balance once it settles. - New: Withdraw (
POST /withdrawals), List withdrawals (GET /withdrawals) and Get a withdrawal (GET /withdrawals/{id}), scopewithdraw:funds, granted on request: send your balance as USDC on Base to the escrow address we set on your account, with no fee. REST only.
Sell-back quotes, min_payout, energy cards
- New: Quote a sell-back (
POST /cards/sell-back/quote, scopesell:cards, MCP toolquote_sell_back): what a sell-back pays for up to 100 cards, now and later, as a schedule of phases with the exact UTC time each starts and ends. It moves no money. - Sell back cards takes an optional
min_payoutper item. If the sell-back would pay less, nothing is sold and the item fails withPRICE_CHANGEDand what it pays now. - Get vault and the quote take
category=energy: the energy cards from base packs, which sell back at 100% of their value with no 5-minute window and no lock. - The vault’s
catchbackoffer now includes insurance or a boost bought on the pull, as the sell-back pays it.
Buy packs refusals
- Buy packs now refuses an order before it charges anything when the pack can’t be bought: a
pack_typethat List packs doesn’t offer your key is a404, and a pack withavailable: falseis a409 PACK_UNAVAILABLE, with itsreason. Arisk_leveloutside the pack’srisk_levels, and the categorygoods, are a400. A refused order charges nothing and frees its order id. A retry of a finished order is unaffected. - Card catalog export now lists only what Buy a card can sell, and
category=goodsis a400.
Optional shipping insurance
- Estimate a shipment and Create a shipment take an optional
cover_amount, so you can insure a shipment from $100 up to the cards’ value, at most $10,000. You pay the rate plus the premium, andmax_costapplies to the total. New codes:400 COVER_NOT_ALLOWEDand409 COVER_UNAVAILABLE. - Every estimate now returns
order_valueandmax_cover. A shipment, in responses and inshipment.updated, now hascover_amountandinsurance_cost. - An estimate with
cover_amountcounts as two against the limit of 60 a minute.
Test accounts, public card metadata, shipments, webhooks, orders held for review
- New: Create a test account (
POST /test-accounts, MCP toolcreate_test_account) and List test accounts (GET /test-accounts, MCP toollist_test_accounts), scopecreate:test_accounts, granted on request: test logins with a $10,000 test balance. A test account is a login, not a key, and it can’t use the marketplace, gifts, drops, battles, shipping, chat, DMs or withdrawals. New guide: Testing. - New: Public card metadata (
GET /api/public/v1/cards/{id}): a card’s metadata and image URLs with no key and no prices, cached for 5 minutes at the CDN. - New: Estimate a shipment (
POST /shipments/estimate, MCP toolestimate_shipment), Create a shipment (POST /shipments, MCP toolcreate_shipment), List shipments (GET /shipments, MCP toollist_shipments) and Get a shipment (GET /shipments/{id}, MCP toolget_shipment), scopeship:cards, granted on request: ship cards you hold to your customers at the carrier’s full rate. New guide: Shipping cards. - New: Webhooks, which we set up for you: a signed
POSTwith retries fororder.completed,listing.soldandshipment.updated. - New: Where you can call from. A key doesn’t get around our sanctions list, and a valid key now gets past any other limit on where partner endpoints and the MCP server can be called from.
- Rate limits now says that everything under
/api/has a shared limit of 300 requests a minute per IP address, on top of the per-key limits. - Buy packs and Buy a card: when we can’t confirm whether a purchase was charged, the answer is now
500 PAYMENT_OUTCOME_UNKNOWNwithneeds_review: trueand the order’scheckout_id, not a503. Nothing is delivered and the order is held for us to settle: stop retrying, never place it again under a new order id, and follow it with Get an order. - A resend with the same order id answers
409 IDEMPOTENCY_IN_PROGRESSwithneeds_review: trueuntil we settle the order, and nothing is charged twice. Once we settle it, Get an order answers404and the id is free to send again. See Purchases that need review. - A
503on a purchase means that attempt didn’t charge anything. An earlier attempt with the same order id may have gone through, so retry with the same order id, never a new one.
Pull proofs, one-step price changes, partner accounts
- Buy packs: every pull carries a
proof, its provably fair record, with averify_pathyou canGETwithout a key to replay the draw. New guide: Verify a pull. - Change a listing’s price writes the new price in one step, so it lands whole or not at all. A buy or delist that lands first makes it a
409 LISTING_NOT_ACTIVE, another price change a409 LISTING_CHANGED, and neither writes anything. - A partner account stays off CatchBack’s VIP and Top Gifters leaderboards and recent-pull feeds, its pulls aren’t posted as big-pull cards in chat, and it earns no CatchPoints or quest progress.
Card lookups, your listings, price changes, order history
- New: Get a card (
GET /cards/{id}, MCP toolget_card) and Find a card by cert (GET /cards?cert=, MCP toolfind_card_by_cert), scoperead:catalog: any card by its id or by the cert on its slab. - New: Price history (
GET /cards/{id}/price-history, MCP toolget_price_history): a card’s CardLadder value readings, up to a year back. - New: Card activity (
GET /cards/{id}/activity, MCP toolget_card_activity): a card’s recent sales and listings, with nobody named. - New: Your listings (
GET /listings, scoperead:account, MCP toolget_listings): your own active listings, with your payout on each. - New: Change a listing’s price (
PATCH /listings/{listing_id}, scopewrite:listings, MCP toolupdate_listing_price): reprice a fixed-price listing in place, without delisting it. - New: List orders (
GET /orders, MCP toollist_orders) and Get an order (GET /orders/{checkout_id}, MCP toolget_order), scoperead:account: your order history, paged by cursor, and one order by its id, even while it is still running. - Search cards applies its filters to every listing it reads, up to 5,000 rows from each source, and gains
truncated.has_moreisfalseon the last page and on page 20. - Get vault: a listed card carries its
listing_idandlisting_price. - List a card runs the app’s seller checks, so the account needs a verified phone number.
Sealed pack pools
- Get a pack’s pool covers sealed packs (the Starter and the sealed mystery packs). The response gains
kind(slaborsealed); a sealed pack lists its products inproducts, withtotal_products, and one band per product. - A sold-out pack with no pool to show returns
200withavailable: falseand an empty pool, instead of an error. - The Starter pack opens at the
standardrisk level only, and List packs says so in itsrisk_levels.
Vault acquisitions
- Get vault finds each card’s latest acquisition across every kind of pack pull and buy, so its
pull_idorpurchase_idalways names the acquisition a sell-back pays on.
Who am I, card limits
- New: Who am I (
GET /me, MCP toolwhoami) works with any valid key and shows which account it acts as. - Get account gains
card_limits: your card and spend usage against the daily card caps.
Buying cards
- New: Search cards (
GET /marketplace/listings, MCP toolsearch_cards) finds every card you can buy, from the shop and fixed-price user listings. - New: Buy a card (
POST /cards/purchase, scopebuy:cards, MCP toolbuy_card), with amax_priceguard and daily card and spend caps. - Sell back cards takes a
purchase_idfor a card you bought, and Get vault returnspurchase_idandpurchased_at. - Card orders share your account’s order ids with pack orders, and an interrupted card order is closed the same way as a pack order.
Interrupted orders
- A pack order cut off after it was charged is now closed from our records, usually within about 10 minutes. Resending its order id then returns a shorter body marked
"reconciled": true. See Idempotency. - New error code:
409 IDEMPOTENCY_RETRY, when an earlier attempt with the same order id failed just as the retry arrived. Resend it.
Pack pools and the full card object
- New: Get a pack’s pool (
GET /catalog/packs/pool, MCP toolget_pack_pool): a pack’s value bands, their odds at a risk level, and every card a pull can produce. - Every endpoint that returns a card returns the same card object, with front, back and render images and the slab, set and value fields.
Buying packs and managing cards
- New: Buy packs (
POST /packs/purchase, scoperip:packs), with a requiredIdempotency-Key, one purchase per minute and 100 packs per day per key. - New: Sell back cards (
sell:cards), List a card and Delist a card (write:listings), Get account and Get vault (read:account). - New: the MCP server at
/api/mcp, with the same key. - List packs returns exactly the packs your account can buy, at the price it will be charged.
Purchase report
- New: Purchase report (
GET /pulls, scoperead:pulls, opt-in): completed pack purchases in a time window, for revenue-share reporting.
Partner API v1
- Scoped API keys, and the first read-only endpoints: List packs and the Card catalog export (scope
read:catalog).

