Get a card

GET /api/v1/pokemon/cards/{id} read:catalog 1 credit

Fetch 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.

Try it 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.

response
200 19ms preloaded server-side with the default context
object · 2 keys
{
  "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
      }
    }
  }
}
tracks the inputs above
curl -X GET 'https://service.rip.fun/api/v1/pokemon/cards/swshp_ja-104vh?include=prices' \
  -H 'X-API-Key: rip_…'

Request fields

FieldTypeRequiredDescription
includestringSet 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.

Response fields (data)

FieldDescription
data.idCard id (variant printings carry a suffix, e.g. `…vh` for holofoil, `…vrh` for reverse holofoil)
data.name / supertype / subtypesCard identity + classification
data.rarity / number / printed_number / artistPrint 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_codeCard 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_idTCGplayer product id for cross-referencing, or null when we don’t have one
data.expansionNested expansion object (id, name, series, total, release_date, logo, symbol, …)
data.variants[]`{ name, images[] }`, one self-describing element per card printing
data.pricingPresent 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? }`

Pokémon card fields

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.

FieldWhat it holds
supertypePokémon, Trainer or Energy.
subtypesClassification, e.g. Basic, Stage 1, VMAX, Mega, Supporter.
typesEnergy types, e.g. Fire, Water.
hpHit 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.

Printed on the card, not in the API

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.

FieldWhy it's missing
retreat_costThe retreat cost printed at the foot of the card. Not ingested, so never emitted — not even as null.
evolves_fromThe Pokémon this one evolves from. Same gap; build evolution chains from `subtypes` and name matching instead.
level / flavor_text / regulation_mark / national_pokedex_numbersAlso 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.

Errors

StatusCodeWhen
404not_foundno 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.