/api/v1/pokemon/cards/{id} read:catalog 1
creditFetch a single Pokémon Trading Card Game card by its id. This is the cheapest way to hydrate a card you already know. Add `include=prices` for the embedded pricing object. Ids are matched case-insensitively, so `OPPR-681242` finds the card stored as `oppr-681242`; the response always carries the stored spelling.
GET /api/v1/pokemon/cards/swshp_ja-104vh?include=prices These inputs are shared across all docs pages, so an id entered here carries over.
{
"success": true,
"data": {
"id": "swshp_ja-104vh",
"name": "Charizard VMAX",
"number": "104",
"printed_number": "104",
"images": [
{
"type": "front",
"small": "https://api.rip.fun/storage/v1/object/public/tcg/cards/swshp_ja/104vh.small.webp",
"medium": "https://api.rip.fun/storage/v1/object/public/tcg/cards/swshp_ja/104vh.large.webp",
"large": "https://api.rip.fun/storage/v1/object/public/tcg/cards/swshp_ja/104vh.large.webp"
}
],
"expansion": {
"id": "swshp_ja",
"name": "Sword & Shield Promos",
"total": 340,
"language": "Japanese",
"language_code": "ja",
"series": "Sword & Shield",
"code": "PROMO",
"printed_total": 340,
"release_date": "2019/11/01",
"logo": "https://api.rip.fun/storage/v1/object/public/tcg/sets/swshp_ja.logo.png",
"symbol": "https://api.rip.fun/storage/v1/object/public/tcg/sets/swshp_ja.symbol.png",
"translation": {
"en": {
"name": "Sword & Shield Promos"
}
}
},
"language": "Japanese",
"language_code": "ja",
"tcgplayer_id": null,
"variants": [
{
"name": "holofoil",
"images": [
{
"type": "front",
"small": "https://api.rip.fun/storage/v1/object/public/tcg/cards/swshp_ja/104vh.small.webp",
"medium": "https://api.rip.fun/storage/v1/object/public/tcg/cards/swshp_ja/104vh.large.webp",
"large": "https://api.rip.fun/storage/v1/object/public/tcg/cards/swshp_ja/104vh.large.webp"
}
]
}
],
"supertype": "Pokémon",
"subtypes": [
"VMAX"
],
"types": [
"Fire"
],
"hp": "330",
"attacks": [
{
"cost": [
"Colorless",
"Colorless",
"Colorless"
],
"converted_energy_cost": 3,
"name": "Claw Slash",
"damage": "100"
},
{
"cost": [
"Fire",
"Fire",
"Fire",
"Colorless",
"Colorless"
],
"converted_energy_cost": 5,
"name": "G-Max Wildfire",
"text": "Discard 2 Energy from this Pokémon.",
"damage": "300"
}
],
"weaknesses": [
{
"type": "Water",
"value": "×2"
}
],
"rarity": "Promo",
"artist": "aky CG Works",
"pricing": {
"currency": "USD",
"market": 4586.4,
"is_stale": false,
"conditions": [
{
"condition": "NM",
"price": 4586.4
}
],
"graded": [
{
"company": "BGS",
"grade": "10",
"value": 11100,
"low": 11100,
"high": 11100,
"confidence": "med",
"value_kind": "blended",
"sold_count": 1
},
{
"company": "BGS",
"grade": "9",
"value": 3120,
"low": 2652,
"high": 3588,
"confidence": "low",
"value_kind": "feed",
"sold_count": 0
},
{
"company": "PSA",
"grade": "10",
"value": 9900,
"low": 7660,
"high": 9940,
"confidence": "med",
"value_kind": "sold",
"sold_count": 3
}
],
"market_updated_at": "2026-09-21T02:28:31.895Z",
"trend_7d": {
"direction": "down",
"percent": -2
}
}
}
}curl -X GET 'https://service.rip.fun/api/v1/pokemon/cards/swshp_ja-104vh?include=prices' \ -H 'X-API-Key: rip_…'
| Field | Type | Required | Description |
|---|---|---|---|
include | string | — | Set to `prices` to embed the pricing object on every returned object. **No surcharge** — metering is a flat 1 credit per request whatever the response carries, so hydrating a page of 100 with prices costs the same as without, and strictly less than a second call per row. |
data)| Field | Description |
|---|---|
data.id | Card id (variant printings carry a suffix, e.g. `…vh` for holofoil, `…vrh` for reverse holofoil) |
data.name / supertype / subtypes | Card identity + classification |
data.rarity / number / printed_number / artist | Print metadata |
data.images[] | `{ type, small, medium, large }`, `type` always `front`. Use `small` for grids and `large` for detail views. Two caveats: `medium` is always an alias of `large` (only two sizes are stored), and on cards whose source supplied a single rendition `small` is an alias too — it points at the same file as `large`. Compare the two URLs before assuming `small` is cheap; where they differ it is roughly 6× smaller. |
data.language / language_code | Card language: `English`/`en`, `Japanese`/`ja`, `Chinese`/`zh`. Chinese splits into Simplified (`zh-Hans`) and Traditional (`zh-Hant`). Each printing is its own object. |
data.tcgplayer_id | TCGplayer product id for cross-referencing, or null when we don’t have one |
data.expansion | Nested expansion object (id, name, series, total, release_date, logo, symbol, …) |
data.variants[] | `{ name, images[] }`, one self-describing element per card printing |
data.pricing | Present only with `include=prices` — and then always present, even where we hold nothing: `market` comes back `null` and the two arrays empty rather than the key being dropped. `{ currency, market, market_updated_at, is_stale, trend_7d, conditions[], graded[] }`, with every amount a **number** rather than a decimal string. `trend_7d` is `{ direction, percent }`, and it is the only trend window there is. See the Pricing data guide. |
data.pricing.conditions[] | `{ condition, price }` raw ladder (NM/LP/MP/HP/DMG) for the card’s variant — those two fields only |
data.pricing.graded[] | Reconciled graded value per company+grade: `{ company, grade, value, low, high, confidence, value_kind, sold_count, trend? }` |
Game fields on the Card object, on top of the shared ones above. All are optional and are omitted when we have no value, so a missing key means unknown.
| Field | What it holds |
|---|---|
supertype | Pokémon, Trainer or Energy. |
subtypes | Classification, e.g. Basic, Stage 1, VMAX, Mega, Supporter. |
types | Energy types, e.g. Fire, Water. |
hp | Hit points, as a string. Emitted only when greater than zero. |
abilities | `{ type, name, text }` per printed ability. |
attacks | `{ cost, converted_energy_cost, name, text, damage }` per attack. |
weaknesses / resistances | `{ type, value }` pairs. |
These values are printed on the physical card but no endpoint returns them today, and nothing in the response lets you derive them. Don't infer them — see the notes below.
| Field | Why it's missing |
|---|---|
retreat_cost | The retreat cost printed at the foot of the card. Not ingested, so never emitted — not even as null. |
evolves_from | The Pokémon this one evolves from. Same gap; build evolution chains from `subtypes` and name matching instead. |
level / flavor_text / regulation_mark / national_pokedex_numbers | Also printed, also not ingested. Omitted rather than returned empty. |
Every game field is optional and is omitted rather than sent as null, so a missing key means unknown — not zero and not empty.
| Status | Code | When |
|---|---|---|
| 404 | not_found | no such object for this game (a Pokémon id on `/onepiece` is "not found") |
See Errors for the response envelope and the full code list.