# Good Games API — goodgames.com.au, the Australian trading-card and board-game retailer: AUD prices per card and condition, live stock, card number, set, rarity and finish for Pokémon, Magic: The Gathering, Lorcana, One Piece, Flesh and Blood and Riftbound singles, plus sealed product across 113,000 products. No login, no key.

> Search Good Games by name or card number across the store, one game's singles or sealed product, or any collection; filter by set, rarity, finish, tag, condition, stock and AUD price, sort by price, newest or best selling. One row per product, with a variant per condition carrying its own AUD price and stock.
> ReefAPI engine `goodgames` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/goodgames/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Clients that add connectors by URL, such as ChatGPT and the Claude app, connect with OAuth 2.1 (the user pastes their key once on a ReefAPI page; discovery at `/.well-known/oauth-protected-resource/mcp`). Config files send the key as `Authorization: Bearer <key>`. `?key=<key>` in the URL also works as a last-resort fallback.

## Endpoints

### POST https://api.reefapi.com/goodgames/v1/search — 1 credit
Search Good Games by name or card number across the store, one game's singles or sealed product, or any collection; filter by set, rarity, finish, tag, condition, stock and AUD price, sort by price, newest or best selling. One row per product, with a variant per condition carrying its own AUD price and stock.

**Parameters:**
- `game` (enum, optional) — Limit to one game. Singles exist for pokemon, mtg, lorcana, one-piece, flesh-and-blood and riftbound; yu-gi-oh, digimon and star-wars-unlimited are sealed product only. Omit it to search the whole store. [one of: pokemon, mtg, lorcana, one-piece, flesh-and-blood, riftbound, yu-gi-oh, digimon, star-wars-unlimited]
- `scope` (enum, optional, default "singles") — With game: individual cards (default) or the game's sealed product. [one of: singles, sealed]
- `collection` (string, optional) — A collection handle or numeric id, instead of game (the `collections` action lists all 760+).
- `keyword` (string, optional) — Card or product name, or a printed card number such as 018/159 or OP08-047.
- `exact_match` (boolean, optional, default false) — Keep only rows whose title contains keyword as written. The shop's search also matches card text, so a price sort on a card name can start with unrelated cards. Applied per page; meta.removed_not_exact says how many were dropped.
- `set` (string, optional) — Exact set name as rows' `set` shows it, singles only. The `sets` action lists them.
- `rarity` (string, optional) — Exact rarity name as rows' `rarity` shows it; the `filters` action lists this game's values.
- `finish` (string, optional) — Exact finish as rows' `finish` shows it (Holofoil, Reverse Holofoil, Foil, Cold Foil, 1st Edition Normal ...).
- `product_type` (string, optional) — Exact product type as rows' `product_type` shows it.
- `tags` (string, optional) — Any exact tag, several separated by ';'. `filters` lists them per game, e.g. 'H P: 70', 'Retreat Cost: 2'.
- `condition` (enum, optional) — Only this condition: each row then describes that condition alone, and rows without it are removed from the page (meta.removed_by_condition). Singles only. [one of: NM, LP, MP, HP, DMG]
- `in_stock` (boolean, optional, default false) — Only products with stock. With condition, only rows with stock in that condition.
- `min_price` (number, optional) — Lowest price in AUD.
- `max_price` (number, optional) — Highest price in AUD.
- `sort` (enum, optional, default "featured") — Order of the rows. [one of: featured, relevance, best_selling, price_asc, price_desc, title_asc, title_desc, newest, oldest]
- `page` (integer, optional, default 1) — Page number.
- `limit` (integer, optional, default 24) — Rows per page, 1-70.

**Returns:** rows[]: id, handle, title, name (the card name without number, set and finish), game, card_number, set, rarity, finish (the shop's Variant: Holofoil, Reverse Holofoil, Cold Foil ...), condition (only with the condition filter), language, is_single, product_type, product_kind, brand, is_preorder, price_aud (lowest of the row's variants), price_max_aud, lowest_in_stock_price_aud, compare_at_price_aud (the reduced-from price, when one is above the price), on_sale, in_stock, stock (units across variants), stock_by_store (always null, see meta), currency, url, image, attributes{card_type, hp, stage, weakness, retreat_cost, artist, colour, mana_value ...}, created_at, updated_at, variants[]{variant_id, condition (NM/LP/MP/HP/DMG), variant_title, price_aud, compare_at_price_aud, on_sale, in_stock, stock, stock_by_location{location: units}, sku, barcode}. meta: total, page, per_page, last_page, deepest_page, has_more, sort, filters_applied, removed_by_condition, removed_not_exact, stock_by_store_note, warnings.

**Example request body:**
```json
{
  "game": "pokemon",
  "keyword": "charizard"
}
```

### POST https://api.reefapi.com/goodgames/v1/product — 1 credit
One Good Games product in full, by id, handle or URL: every condition with its AUD price and stock, stock per fulfilment location, description, images, tags and the collections it sits in.

**Parameters:**
- `product` (string, required) — A row's id or handle, or a goodgames.com.au product URL.

**Returns:** product{id, handle, title, name (the card name without number, set and finish), game, card_number, set, rarity, finish (the shop's Variant: Holofoil, Reverse Holofoil, Cold Foil ...), condition (only with the condition filter), language, is_single, product_type, product_kind, brand, is_preorder, price_aud (lowest of the row's variants), price_max_aud, lowest_in_stock_price_aud, compare_at_price_aud (the reduced-from price, when one is above the price), on_sale, in_stock, stock (units across variants), stock_by_store (always null, see meta), currency, url, image, attributes{card_type, hp, stage, weakness, retreat_cost, artist, colour, mana_value ...}, created_at, updated_at, variants[]{variant_id, condition (NM/LP/MP/HP/DMG), variant_title, price_aud, compare_at_price_aud, on_sale, in_stock, stock, stock_by_location{location: units}, sku, barcode}, description, images[], tags[], collections[]{id, handle, title}, options[]{name, values[]}}. meta.stock_source: 'catalogue' (stock counts) or 'product_page' (the product is outside the search index: availability only, stock null).

**Example request body:**
```json
{
  "product": "charizard-v-018-159-swsh-crown-zenith-holofoil"
}
```

### POST https://api.reefapi.com/goodgames/v1/sets — 5 credits
The card sets Good Games carries singles from for one game, newest stock first, with how many products of each were read. Set names are what `search` takes as `set`.

**Parameters:**
- `game` (enum, required) — Which game. [one of: pokemon, mtg, lorcana, one-piece, flesh-and-blood, riftbound, yu-gi-oh, digimon, star-wars-unlimited]
- `max_pages` (integer, optional, default 60) — How many pages of 70 products to read. A game whose list needs more returns `complete: false` with the sets found on the newest products.

**Returns:** sets[]{set, products_seen, game}. meta: complete (false when the game has more pages than were read: only MTG at the default max_pages of 60), pages_read, pages_total, products_seen, total_products.

**Example request body:**
```json
{
  "game": "pokemon"
}
```

### POST https://api.reefapi.com/goodgames/v1/filters — 1 credit
The filter values Good Games offers for one game's singles or sealed product or for a collection, with product counts: rarity, finish, card type, stage, HP, weakness, ink, colour and more.

**Parameters:**
- `game` (enum, optional) — Limit to one game. Singles exist for pokemon, mtg, lorcana, one-piece, flesh-and-blood and riftbound; yu-gi-oh, digimon and star-wars-unlimited are sealed product only. Omit it to search the whole store. [one of: pokemon, mtg, lorcana, one-piece, flesh-and-blood, riftbound, yu-gi-oh, digimon, star-wars-unlimited]
- `scope` (enum, optional, default "singles") — With game: individual cards (default) or the game's sealed product. [one of: singles, sealed]
- `collection` (string, optional) — A collection handle or numeric id, instead of game (the `collections` action lists all 760+).

**Returns:** filters[]{filter, filter_id, kind, values[]{value (give it to `tags`), label, products}}.

**Example request body:**
```json
{
  "game": "pokemon"
}
```

### POST https://api.reefapi.com/goodgames/v1/collections — 1 credit
Good Games' collections with their product counts: games, singles, sets, brands, categories.

**Parameters:**
- `keyword` (string, optional) — Only collections whose title or handle contains this.

**Returns:** rows[]{id, handle (give it to `collection`), title, products_count, updated_at}.

**Example request body:**
```json
{
  "keyword": "pokemon"
}
```

### POST https://api.reefapi.com/goodgames/v1/suggest — 1 credit
As-you-type suggestions from the shop's search box: search terms, products and collections.

**Parameters:**
- `keyword` (string, required) — Part of a name.

**Returns:** query, suggestions[], did_you_mean[], total, products[]{id, handle, title, price_aud, price_max_aud, in_stock, image, url}, collections[]{id, handle, title}.

**Example request body:**
```json
{
  "keyword": "charizard"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=goodgames
- Human docs page: https://reefapi.com/docs/goodgames
- Overview page: https://reefapi.com/goodgames-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
