/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.
GET /api/v1/inventory?status=OFFCHAIN&limit=10 These inputs are shared across all docs pages, so an id entered here carries over.
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 -X GET 'https://service.rip.fun/api/v1/inventory?status=OFFCHAIN&limit=10' \ -H 'X-API-Key: rip_…'
| Field | Type | Required | Description |
|---|---|---|---|
type | query string | — | `raw` | `graded` | `all` (default). Unlike List cards, the default here is all of it |
category | query string | — | `tcg` | `sports` |
game | query 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_account | query 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 |
status | query 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_to | query 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 |
q | query 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_id | query 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_to | query 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_cents | query 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_company | query string | — | Comma-separated, case-insensitive: PSA, CGC, BGS, TAG, …. Slabs only (see notes) |
min_grade / max_grade | query 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 |
sort | query 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 |
order | query string | — | `asc` | `desc`. Defaults to `desc` for created_at and declared_value, `asc` for name |
limit | query int | — | 1..100, default 50 |
offset | query int | — | 0..10_000, default 0 |
data)| Field | Description |
|---|---|
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[].status | Where 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 |
| Status | Code | When |
|---|---|---|
| 400 | Invalid <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 |
| 400 | Invalid type | grading_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 |
| 400 | Invalid sub_account | a slug your account does not have (the message lists yours, retired included) |
| 403 | Insufficient permissions | the key lacks read:inventory |
| 403 | Tenant API key required | key is not tenant-scoped |
See Errors for the response envelope and the full code list.