/api/v1/cards/unique-id/:unique_id tenant key Fetches a single card by unique_id with the card and set context attached — the same fields as a List cards row. Scoped to your account: a unique_id that exists but belongs to someone else is a 404, not a 403. Raw cards and graded slabs share one unique_id namespace and both resolve here — you know a card by its CARD-RIP… id and never have to know which kind it is before you ask.
When a raw-card response includes identity and pricing, use their status fields to interpret it. An unconfirmed identity has null market and insured prices; declared_value remains separate. A returned card is not automatically verified or eligible for a quote or order. Intake-held, REMOVED and other-account cards remain excluded; existing graded publication controls still apply.
Start a full sweep with GET /cards?type=raw&since=0 (or type=all for both streams), then pass each returned cursor unchanged. Upsert by unique_id and repeat full sweeps to refresh existing identity and pricing. since is a visible-sequence cursor, not an updated_at change feed. Historical rows newly included by a visibility-policy change can be behind a saved cursor; a real identity publication can return the same unique_id again. Reading inventory generates no receipt or confirmation events and changes no publication timestamp. GET /inventory/events alone does not guarantee historical-card or catalog-price updates.
A card that came out of a box you announced with declared_value_min_cents / declared_value_max_cents (POST /inbound-shipments) has every value WE set clamped into those bounds: a value below the minimum is raised to the minimum, a value above the maximum is lowered to the maximum. That covers a declared_value with source "RIP", the catalog fallback behind insured_price and, where returned, pricing.market_price. A declared value you set yourself (source "tenant") is never changed, and a card we cannot price stays null rather than taking the minimum. The bounds in force when a card is priced are the ones applied.
Read sports.record_status before you trust a sports row: "provisional" means it was machine-extracted from the warehouse scan and never catalog-verified, so its player name, parallel and print run can change. See List cards for the full lifecycle.
GET /api/v1/cards/unique-id/CARD-EXAMPLE-1 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/cards/unique-id/CARD-EXAMPLE-1' \ -H 'X-API-Key: rip_…'
data)| Field | Description |
|---|---|
identity | Optional metadata on RAW-card responses: { status, published_at, blockers }. status is "unconfirmed" while identity_published_at is null, "confirmed" when published, or "unknown" if the deployment cannot track publication. published_at is the actual ISO 8601 timestamp or null; it is never fabricated. The pending blocker is "identity_not_published". A sports.record_status of "canonical" alone does not establish publication |
pricing | Optional metadata on RAW-card responses: { status, market_price, currency, blockers }. status is "unverified" for pending identity, "unpriced" for published identity without a catalog price, or "priced" when a catalog price is available. market_price is a USD decimal string or null, never declared_value. Pending identity always returns null with blocker "identity_not_published"; missing catalog price returns null with "missing_market_price". priced reports an available catalog price, not a new live appraisal. On a card from a box announced with declared-value bounds, market_price is clamped into those bounds — see the declared-value bounds note |
unique_id / card_id | Identifiers. card_id is null on sports cards — they are not in the TCG catalog |
type / graded | type is "RAW" | "GRADED". graded carries company, grade, grade_numeric (tenths — 100 is a 10), cert_number, cert_url and verification_status, and is present only on a GRADED row — see List cards for the full shape. On a slab, scan_image_url is a photograph of the holder and declared_value, not insured_price, is the figure that reflects the grade |
category / game | The discriminator. category is "tcg" | "sports"; game is pokemon | onepiece | basketball | baseball | football | soccer | hockey | other. Both are null when the row resolves to neither catalog — treat that as unknown, not as TCG |
energy_types | The card’s Pokémon energy types, e.g. ["Fire", "Water"] — see List cards. [] on a Pokémon card whose catalog row carries no types, null on every non-Pokémon or unresolved row |
sub_account | Which of your sub-accounts the card is filed under: { slug, name }, or null when it is in your own inventory — see List cards. There is no ?sub_account= filter here: a single card is already scoped to you, and its label is on the row |
inbound_shipment | The package the card arrived in: { id, tracking_number, carrier, reference }, or null when no box was recorded — see List cards |
name / card_number / set_name | Catalog identity, filled from whichever catalog owns the row. On a sports card, name is the player name and card_number / set_name come from the sports catalog row |
language / language_code / tcgplayer_id / series / supertype / subtypes / rarity | The catalog identity behind card_id — see List cards. All seven are null on a sports row and on an unresolved catalog card; subtypes is [] on a catalog card that has none. Appended last |
release_date / year | Set release date (ISO 8601, always null for sports cards — a sports row carries a season, not a release date) + release year (sports cards use the season start year) |
image_url / scan_image_url | Catalog image + your scanned image. image_url is null on sports cards: we hold no licensed product art for them, so scan_image_url is the only image you get |
insured_price | Effective insured/carried value (USD decimal string) — declared value first, catalog fallback; see List cards. Null for an unconfirmed raw identity. The catalog fallback is clamped into the declared-value bounds of the box the card arrived in, when it has them |
declared_value | The value this copy is carried and insured at — see List cards for the shape. A value we set (source "RIP") on a card from a box announced with declared-value bounds is clamped into them; a value you set is never changed |
sports | Sports-catalog identity, present only when category is "sports" (the key is absent otherwise): id, sport, player_name, team, manufacturer, set_name, year, card_number, parallel_name, print_run, is_autograph, is_relic, is_rookie, record_status, position, jersey_number, league — see List cards |
(not yet identified) | Visibility follows the account policy. A returned pending raw card has identity.status=unconfirmed and null market/insured prices. Otherwise an unpublished identity returns 404. Pending graded cards retain the existing publication gate |
(still being checked in) | A card received within about the last hour returns 404 here, the same as a card we do not hold, until its delivery has been checked in — see List cards |
(removed duplicate) | A card we added by mistake and took back out (the same physical card scanned in twice) returns 404 here from then on. For published cards, a card.removed event in GET /inventory/events names the unique_id to delete and the copy we kept. An unpublished pending card can return 404 without a removal event |
created_at / updated_at | Timestamps |
| Status | Code | When |
|---|---|---|
| 400 | unique_id required | missing unique_id |
| 404 | not found | card not part of your account, intake-held, removed, or blocked by its publication policy (see the visibility policy described above) |
See Errors for the response envelope and the full code list.