Search inventory

GET /api/v1/inventory read:inventory

Searches your whole inventory: raw cards and graded slabs together in one list, one ordering and one total. Use it to build an inventory screen or a report — "my basketball cards filed under PrizePicks that arrived last week, most valuable first". Every row is the same card object List cards returns, plus the card’s status, so one parser reads both endpoints. List cards stays the tool for reconciliation: it sweeps one stream in the order cards became visible, with a drift-free cursor. This endpoint pages by offset and sorts however you ask, so rows can shift between pages while cards are arriving; for a complete, drift-free copy of your inventory, sweep List cards instead. Every filter is validated: a value we do not recognise returns 400 naming the valid ones, never an empty list that looks like missing inventory. Filters combine with AND; the values inside one comma-separated filter combine with OR.

The same cards List cards shows, and no others: nothing still in its check-in hour, nothing we are still identifying (count those with pending_identity on List cards), no duplicate we removed, and no slab until we have photographed it.

Grade filters narrow to slabs. With the default type=all, setting grading_company, min_grade or max_grade returns graded cards only, because a raw card has neither.

Sorting and filtering happen across both kinds at once, so one page can hold raw cards and slabs side by side. Branch on each row’s type, not on the page.

Offset paging reflects the inventory as it is when each page is read. If cards arrive or ship while you page, a card can move between pages. Re-run from offset 0 to refresh a view, and use List cards with ?since when you need every card exactly once.

Try it GET /api/v1/inventory?status=OFFCHAIN&limit=10

These inputs are shared across all docs pages, so an id entered here carries over.

response

Not run yet. Press Run to make a live call against https://service.rip.fun (through this demo's server-side proxy; the API key never reaches the browser).

curl (tracks the inputs above)
curl -X GET 'https://service.rip.fun/api/v1/inventory?status=OFFCHAIN&limit=10' \
  -H 'X-API-Key: rip_…'

Request fields

FieldTypeRequiredDescription
typequery string—`raw` | `graded` | `all` (default). Unlike List cards, the default here is all of it
categoryquery string—`tcg` | `sports`
gamequery string—Comma-separated: pokemon, onepiece, basketball, baseball, football, soccer, hockey, other. Case, spaces, hyphens and underscores are ignored, so `One Piece` and `one-piece` both mean onepiece. Matches exactly the rows whose `game` field has that value. A game from the other category than ?category= is a 400
sub_accountquery string—Comma-separated sub-account slugs, plus `main` for cards in your own inventory and `all` for no filter. `sub_account=prizepicks,main` is PrizePicks cards and your own, without your other sub-accounts. Matched case-insensitively; an unknown slug is a 400 listing yours. Read the slugs from GET /sub-accounts
statusquery string—Comma-separated, case-insensitive: `OFFCHAIN` (in the vault — the only status you can order, transfer or withdraw), `PENDING_REDEEM` (on a committed order, being packed), `REDEEMED` (shipped on an order), `PENDING_WITHDRAWAL` (on an open withdrawal), `SHIPPED_OUT` (withdrawn, shipped back to you). Omitted returns every status. `status=OFFCHAIN` is what you hold right now
created_from / created_toquery string—Intake date range on created_at, both ends inclusive. A date (`2026-09-01`) is the whole UTC day, so created_from=2026-09-01&created_to=2026-09-30 is all of September. A date-time must carry its zone (`2026-09-01T14:00:00Z` or `…-05:00`); one without a zone is a 400 rather than a guess. created_to earlier than created_from is a 400
qquery string—Case-insensitive text search, 2–100 characters, matched anywhere in the card name or player name, team, set name, card number, unique_id and, on slabs, the cert number. `%` and `_` are matched literally
set_idquery string—Exact TCG catalog set id, e.g. `sv3pt5`. Sports cards have no catalog set id — search their set name with q
year_from / year_toquery int—Inclusive range on the `year` field: set release year for TCG, season start year for sports (a 2023-24 card is 2023)
min_value_cents / max_value_centsquery int—Inclusive range on declared_value.amount_cents. A card with no declared value is excluded when either bound is set, not treated as $0
grading_companyquery string—Comma-separated, case-insensitive: PSA, CGC, BGS, TAG, …. Slabs only (see notes)
min_grade / max_gradequery string—Inclusive grade range as written: `9`, `9.5`, `10`, up to `10.5`. Slabs only (see notes). A slab whose grade we could not resolve never matches a grade range
sortquery string—`created_at` (default), `declared_value` or `name` (card name, or player name for sports). Cards with no value or no name sort last in either direction; ties fall back to newest first
orderquery string—`asc` | `desc`. Defaults to `desc` for created_at and declared_value, `asc` for name
limitquery int—1..100, default 50
offsetquery int—0..10_000, default 0

Response fields (data)

FieldDescription
cards[]The same card object List cards returns — unique_id, card_id, category, game, name, card_number, set_name, release_date, year, image_url, scan_image_url, insured_price, declared_value, created_at, updated_at, sub_account, sports (sports rows only), type and graded (slabs only), in the same key order. See List cards for every field
cards[].statusWhere the card is right now: OFFCHAIN, PENDING_REDEEM, REDEEMED, PENDING_WITHDRAWAL or SHIPPED_OUT — see ?status= above. Appended as the last key, after everything List cards returns
pagination{ limit, offset, total, has_more }. total counts every card matching your filters across all pages. has_more is true while another page exists

Errors

StatusCodeWhen
400Invalid <filter>a filter value is not recognised or out of range — message names the filter (Invalid game, Invalid status, Invalid created_from, …) and error lists the valid values or the accepted format. Also when a filter is repeated (?game=a&game=b): send one value, comma-separated
400Invalid typegrading_company, min_grade or max_grade was combined with type=raw — a raw card has no grade, so that query could only ever be empty
400Invalid sub_accounta slug your account does not have (the message lists yours, retired included)
403Insufficient permissionsthe key lacks read:inventory
403Tenant API key requiredkey is not tenant-scoped

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