/api/v1/azuki/cards/{id} read:catalog 1
creditFetch a single Azuki TCG 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/azuki/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": "AZK01-006",
"name": "Gus",
"number": "006",
"printed_number": "006",
"images": [
{
"type": "front",
"small": "https://static-content.azuki.com/tcg/card_art/S1-AZK01-006_Gus_E_R_die.jpg",
"medium": "https://static-content.azuki.com/tcg/card_art/S1-AZK01-006_Gus_E_R_die.jpg",
"large": "https://static-content.azuki.com/tcg/card_art/S1-AZK01-006_Gus_E_R_die.jpg"
}
],
"expansion": {
"id": "azk-01",
"name": "Gates Awakened",
"total": 154,
"language": "English",
"language_code": "en",
"series": "Azuki TCG",
"code": "AZK-01",
"printed_total": 129,
"release_date": "2026/06/29",
"logo": "https://tcg.azuki.com/azuki_tcg_logo.svg",
"symbol": "https://tcg.azuki.com/azuki_tcg_logo.svg"
},
"language": "English",
"language_code": "en",
"tcgplayer_id": null,
"variants": [
{
"name": "normal",
"images": [
{
"type": "front",
"small": "https://static-content.azuki.com/tcg/card_art/S1-AZK01-006_Gus_E_R_die.jpg",
"medium": "https://static-content.azuki.com/tcg/card_art/S1-AZK01-006_Gus_E_R_die.jpg",
"large": "https://static-content.azuki.com/tcg/card_art/S1-AZK01-006_Gus_E_R_die.jpg"
}
]
}
],
"supertype": "Entity",
"subtypes": [
"Beanz",
"Trickster"
],
"types": [
"Neutral"
],
"hp": "1",
"rarity": "Rare",
"pricing": {
"currency": "USD",
"market": null,
"is_stale": false,
"conditions": [],
"graded": []
}
}
}curl -X GET 'https://service.rip.fun/api/v1/azuki/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`. 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 | The card’s category — what the game calls its Card Type: Entity, Leader, Gate, IKZ, Spell or Weapon. Ingested into the shared `supertype` column, so it arrives under that name rather than a `category` of its own. |
types | A one-element array holding the card’s Element: Fire, Water, Earth, Lightning or Neutral. Same overloading — one Azuki concept riding a Pokémon-shaped column. |
subtypes | Printed traits, verbatim from the official gallery. |
hp | Health, as a string, and emitted only when greater than zero — the 72 cards that print no Health at all (Gates, IKZ, Spells) carry no key rather than a `"0"`. Health is the only one of the four printed numbers you get: Attack, IKZ cost and Gate power have no column to ride and are not returned. |
abilities | `{ type, name, text }` per printed ability, but only `name` carries information: the gallery publishes ability names without their rules text, so `text` is always the empty string and `type` is always `"ability"`. Do not render the empty text as "no effect". |
rarity | The expanded label rather than the printed code: Common, Uncommon, Rare, Super Rare, Leader, Gate, IKZ, each optionally starred — `Super Rare ★` is an alt art and `★★` a portrait rare. The short code (`SR ★`) is stored but not returned. |
number | The number after the group prefix, and the printing letter is part of it: `AZK01-106A` numbers `106A`, where Pokémon and One Piece put the printing in the id suffix and leave the number alone. Range queries (`number:[1 TO 50]`) compare the leading digits. |
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 |
|---|---|
ikz_cost / attack / gate_power | Three of the four numbers printed on the card (Health is the fourth, and is returned as `hp`). All three are ingested and sit on the row, but no field registry exposes them, so no endpoint emits them and no `q` key filters on them. |
card_text | The printed rules paragraph. Ingested, not serialized. `abilities[].name` is the only rules-adjacent string you get, and it is a name, not an effect. |
errata / errata_before / errata_after | The published correction for a card, and its before/after text. Ingested, not serialized — so the API cannot tell you a card has been errata’d. |
printed_in | Every set a printing appears in. A card can ship in the booster and a starter deck; the response carries only its home `expansion`, so a set’s cards endpoint under-reports shared printings. |
rarity_code | The gallery’s short code (`SR ★`). Only the expanded label is returned; map back yourself if you need the code. |
artist | Azuki publishes no illustrator credits, so the column is empty and the key is omitted — absent here means unpublished, not unknown to us. |
Each concept filters under the name it comes back as — that is the Query as column, and the one to write today. Also accepts is an older
spelling from when q resolved only against physical columns; it still
works, and a — there just means the field never had one. A concept whose Query as is — is not searchable at all; filter it client-side
after fetching. Querying an unknown field returns 400 invalid_query with a
suggested name rather than an empty result.
| Concept | Returned as | Query as | Also accepts |
|---|---|---|---|
| Element | types | types:Fire | — |
| Card type | supertype | supertype:Gate | — |
| Trait | subtypes | subtypes:Beanz | — |
| Health | hp | hp:[5 TO *] | — |
| Rarity | rarity | rarity:"Super Rare ★" | — |
| Ability name | abilities[].name | abilities.name:Charge | — |
| Ability text | — | — | — |
| IKZ cost | — | — | — |
| Attack | — | — | — |
| Gate power | — | — | — |
Every game field is optional and is omitted rather than sent as null, so a missing key means unknown — not zero and not empty.
There are no Azuki prices, and there is no date by which there will be. No marketplace has a TCGplayer or Scrydex catalog for AZK-01 and no sold comps exist, so nothing feeds the pricing engine: every card stores a raw price of 0.00, which the API reports as `pricing.market: null` rather than a $0 card, and no card has a `trend_7d`. Do not build a price chart, a portfolio value or a "biggest movers" list on Azuki — it will be a chart of zeros, and it will not fill in on its own.
The six sealed products are the exception, and only just. Each carries the MSRP its distributor published, flagged `price_basis: "msrp"` on the row, and it reaches you as `msrp` — never as `pricing.market`, which stays `null`. That split is deliberate: a list price echoed back under a `market` key would chart as a flat line indistinguishable from a real one, so there is no market figure to plot, no `trend_7d`, and no meaningful "vs MSRP" premium. Show the MSRP as an MSRP, or not at all.
`images[].small` is the same URL as `large` on every Azuki card — the gallery publishes one rendition per card and we store it in both columns. Resize on your side rather than pulling a full-size file into a grid.
Four of the seven sets are starter decks, and their sealed products come back as `product_type: "other"` rather than a `starter_deck` value, which does not exist — the product enum has no member for it and One Piece’s 64 starter decks are filed the same way. Match on the product name if you need to separate them.
Alt arts do not stay in their base card’s set: a starter-deck leader’s alt art is a booster pull, and four `AZK01-*` alt arts exist only in the Alpha run. A variant hunt scoped to one expansion will miss most of them — search the game, not the set.
| 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.