Get card

GET /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.

Try it GET /api/v1/cards/unique-id/CARD-EXAMPLE-1

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/cards/unique-id/CARD-EXAMPLE-1' \
  -H 'X-API-Key: rip_…'

Response fields (data)

FieldDescription
identityOptional 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
pricingOptional 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_idIdentifiers. card_id is null on sports cards — they are not in the TCG catalog
type / gradedtype 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 / gameThe 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_typesThe 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_accountWhich 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_shipmentThe package the card arrived in: { id, tracking_number, carrier, reference }, or null when no box was recorded — see List cards
name / card_number / set_nameCatalog 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 / rarityThe 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 / yearSet 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_urlCatalog 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_priceEffective 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_valueThe 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
sportsSports-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_atTimestamps

Errors

StatusCodeWhen
400unique_id requiredmissing unique_id
404not foundcard 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.