Good Games API & Scraper
The Good Games API returns goodgames.com.au, the Australian trading-card and board-game retailer, as clean JSON in Australian dollars.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Its singles list covers Magic: The Gathering (26,722 products on 2026-11-08), Flesh and Blood (3,899), Pokémon (2,658), Disney Lorcana (1,781), One Piece (1,178) and Riftbound (896), and each single is sold in five conditions, NM, LP, MP, HP and DMG, each with its own price and its own live stock count. Search by card name or printed number across one game or the whole 113,000-product store, filter by set, rarity, finish, condition, stock and AUD price, and sort by price, newest or best selling. product returns every condition of one card with its stock per fulfilment location, sets lists a game's sets and filters its rarities, finishes and card types with product counts. The same endpoint reads sealed boxes, booster packs, board games and accessories. No account, no browser: one ReefAPI key and the standard { ok, data, meta, error } envelope.
One Charizard V, five conditions: the AUD price and the stock of each
Good Games sells every single in five conditions, each priced and stocked separately. Measured on Charizard V 018/159 (Crown Zenith, Holofoil), 2026-11-08:
| what the shop lists | field | value |
|---|---|---|
| Near Mint: $12.80, 3 in stock | variants[0].price_aud / stock | 12.8 / 3 |
| Lightly Played: $10.30, sold out | variants[1].price_aud / in_stock | 10.3 / false |
| Moderately Played: $7.70, sold out | variants[2].price_aud / in_stock | 7.7 / false |
| Damaged: $2.60, sold out | variants[4].price_aud / stock | 2.6 / 0 |
| Cheapest condition you can actually buy | lowest_in_stock_price_aud | 12.8 |
The product-level price_aud is the lowest of the five conditions, here the $2.60 Damaged price, which is sold out; lowest_in_stock_price_aud is what you could buy today. Good Games publishes stock for its online range only: there is no count per walk-in shop, so stock_by_store is always null, and stock_by_location names the store's fulfilment locations.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/goodgames/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"game": "pokemon",
"keyword": "charizard",
"in_stock": true
}
}{
"ok": true,
"meta": {
"api": "goodgames",
"endpoint": "search",
"mode": "live",
"latency_ms": 1441.4,
"record_count": 15,
"bytes": 116810,
"cache_hit": false,
"game": "pokemon",
"collection": null,
"total": 15,
"page": 1,
"per_page": 24,
"last_page": 1,
"deepest_page": 2291,
"has_more": false,
"sort": "relevance",
"filters_applied": {
"keyword": "charizard",
"in_stock": true
},
"upstream_requests": 1,
"stock_by_store_note": "stock_by_store is null: Good Games publishes no stock per walk-in shop. stock_by_location holds the store's fulfilment and supplier locations as its catalogue reports them, which are not shops you can visit.",
"charged_credits": 1,
"version": "1.0.0",
"request_id": "74396d726dd640b1",
"queue_ms": 1.3,
"fetched_at": "2026-11-08T13:04:23.191Z"
},
"data": {
"rows": [
{
"id": 15462488932716,
"handle": "charizard-v-018-159-swsh-crown-zenith-holofoil",
"title": "Charizard V 018/159 (SWSH: Crown Zenith) - Holofoil",
"name": "Charizard V",
"game": "pokemon",
"card_number": "018/159",
"set": "SWSH: Crown Zenith",
"rarity": "Ultra Rare",
"finish": "Holofoil",
"condition": null,
"language": null,
"is_single": true,
"product_type": "Pokemon TCG",
"product_kind": null,
"brand": null,
"is_preorder": false,
"price_aud": 2.6,
"price_max_aud": 12.8,
"lowest_in_stock_price_aud": 12.8,
"compare_at_price_aud": null,
"on_sale": false,
"in_stock": true,
"stock": 3,
"stock_by_store": null,
"currency": "AUD",
"url": "https://www.goodgames.com.au/products/charizard-v-018-159-swsh-crown-zenith-holofoil",
"image": "https://cdn.shopify.com/s/files/1/0440/6493/1998/files/20260216_large_bc76b286-334c-4899-993c-2ed3dbd64d7d.jpg?v=1794035098",
"attributes": {
"card_type": "Fire",
"hp": "220",
"resistance": "None",
"retreat_cost": "2",
"stage": "Basic",
"weakness": "Wx2"
},
"created_at": "2026-11-02T01:23:45Z",
"updated_at": "2026-11-07T19:05:02Z",
"variants": [
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
]
},
{
"id": 15466199843180,
"handle": "charizard-ex-[redacted-phone]-091-sv-paldean-fates-holofoil",
"title": "Charizard ex [redacted-phone]/091 (SV: Paldean Fates) - Holofoil",
"name": "Charizard ex 054 091",
"game": "pokemon",
"card_number": "054/091",
"set": "SV: Paldean Fates",
"rarity": "Double Rare",
"finish": "Holofoil",
"condition": null,
"language": null,
"is_single": true,
"product_type": "Pokemon TCG",
"product_kind": null,
"brand": null,
"is_preorder": false,
"price_aud": 2,
"price_max_aud": 9.8,
"lowest_in_stock_price_aud": 9.8,
"compare_at_price_aud": null,
"on_sale": false,
"in_stock": true,
"stock": 1,
"stock_by_store": null,
"currency": "AUD",
"url": "https://www.goodgames.com.au/products/charizard-ex-054-091-054-091-sv-paldean-fates-holofoil",
"image": "https://cdn.shopify.com/s/files/1/0440/6493/1998/files/20260305_large_4db80aad-b6bd-4e39-8e06-9d6d80362beb.jpg?v=1794035636",
"attributes": {
"card_type": "Darkness",
"hp": "330",
"resistance": "None",
"retreat_cost": "2",
"stage": "Stage 2",
"weakness": "Gx2"
},
"created_at": "2026-11-04T00:01:37Z",
"updated_at": "2026-11-07T22:15:18Z",
"variants": [
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
]
},
{
"id": 15461240045932,
"handle": "charizard-vmax-secret-74-73-champions-path-holofoil",
"title": "Charizard VMAX Secret 74/73 (Champion's Path) - Holofoil",
"name": "Charizard VMAX Secret",
"game": "pokemon",
"card_number": "74/73",
"set": "Champion's Path",
"rarity": "Secret Rare",
"finish": "Holofoil",
"condition": null,
"language": null,
"is_single": true,
"product_type": "Pokemon TCG",
"product_kind": null,
"brand": null,
"is_preorder": false,
"price_aud": 71.6,
"price_max_aud": 357.9,
"lowest_in_stock_price_aud": 357.9,
"compare_at_price_aud": null,
"on_sale": false,
"in_stock": true,
"stock": 2,
"stock_by_store": null,
"currency": "AUD",
"url": "https://www.goodgames.com.au/products/charizard-vmax-secret-74-73-champions-path-holofoil",
"image": "https://cdn.shopify.com/s/files/1/0440/6493/1998/files/20260206_large_6714e16e-af6b-43b3-b773-0e802b1d2f5f.jpg?v=1794034697",
"attributes": {
"card_type": "Fire",
"hp": "330",
"resistance": "None",
"retreat_cost": "3",
"stage": "VMAX",
"weakness": "Wx2"
},
"created_at": "2026-11-01T01:27:14Z",
"updated_at": "2026-11-07T18:58:22Z",
"variants": [
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"variant_id": "[trimmed-depth]",
"condition": "[trimmed-depth]",
"variant_title": "[trimmed-depth]",
"price_aud": "[trimmed-depth]",
"compare_at_price_aud": "[trimmed-depth]",
"on_sale": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"stock": "[trimmed-depth]",
"stock_by_location": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
]
}
]
}
}What the Good Games API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | 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. | Pricing teams call search to search Good Games by name or card number across the store, one game's singles or sealed produ…. | game, scope, collection, keyword, exact_match, ... |
| product | 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. | Marketplace operators call product to get one Good Games product in full, by id, handle or URL. | product |
| sets | 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`. | Catalog enrichment teams call sets to get the card sets Good Games carries singles from for one game, newest stock first, with how many…. | game, max_pages |
| filters | 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. | Retail analysts call filters to get the filter values Good Games offers for one game's singles or sealed product or for a collect…. | game, scope, collection |
| collections | Good Games' collections with their product counts: games, singles, sets, brands, categories. | Pricing teams call collections to get good Games' collections with their product counts. | keyword |
| suggest | As-you-type suggestions from the shop's search box: search terms, products and collections. | Marketplace operators call suggest to get as-you-type suggestions from the shop's search box. | keyword |
Call search from your stack
curl -X POST https://api.reefapi.com/goodgames/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"game":"pokemon","keyword":"charizard","in_stock":true}'import os
import requests
REEF_KEY = os.environ["REEF_KEY"]
r = requests.post(
"https://api.reefapi.com/goodgames/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"game": "pokemon",
"keyword": "charizard",
"in_stock": True
},
timeout=90,
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/goodgames/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"game": "pokemon",
"keyword": "charizard",
"in_stock": true
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.goodgames.search with {"game":"pokemon","keyword":"charizard","in_stock":true}.Who uses this API and why
- Australian price tracking per condition across 37,000 singles
- Arbitrage: Good Games' AUD NM price against TCGplayer, Cardmarket or eBay for the same card number
- Restock and low-stock watches on specific conditions
- Sealed booster-box and pack prices in AUD
- Set completion lists: every card of one set with its price and stock in each condition
Questions developers ask before integrating
Which games have singles at Good Games?
Magic: The Gathering, Flesh and Blood, Pokémon, Disney Lorcana, One Piece and Riftbound, 37,134 products in all on 2026-11-08. Yu-Gi-Oh!, Digimon and Star Wars: Unlimited are sealed product only at Good Games; use scope sealed for those.
Does it give the price per condition?
Yes. Each single carries five variants, NM, LP, MP, HP and DMG, each with price_aud, in_stock and a live stock count. The condition parameter returns one condition only, for example every in-stock NM Pokémon single on a page.
Are these real stock numbers, or just in stock and sold out?
Real counts per condition, the same numbers the product page prints as 'Only 3 in stock'. On 2026-11-08 we re-read 69 products on the shop's own pages and 1 of 1,328 values differed: a stock of 13 against 14.
Can I see stock at a particular Good Games shop?
No. Good Games does not publish stock for individual walk-in shops, so stock_by_store is null. stock_by_location names the store's fulfilment locations as its catalogue reports them, which are not shops you can visit.
Can I look up a card by its number?
Yes, keyword takes a printed number such as 018/159 or OP08-047, and every row carries card_number. Magic and Flesh and Blood singles print the number in the title, not as a separate value at the shop; the API reads it from there.
How do I get every set?
sets returns the sets a game has singles from, newest stock first. Pokémon, Lorcana, One Piece, Flesh and Blood and Riftbound come back complete; Magic is too large to read in one call, so it returns the sets on the newest 4,200 products and says complete false. search with a set name reaches every set.
Is it Australian pricing?
Yes. Every price is in AUD as Good Games lists it for Australian customers.
What is the Good Games API?
Good Games API is a ReefAPI endpoint group for good games australia as json: aud prices and live stock per card and condition for pokémon, magic, lorcana, one piece, flesh and blood and riftbound. It returns live JSON through POST requests under /goodgames/v1.
Is the Good Games API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Good Games calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Good Games login or account?
No login to Good Games is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Good Games data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Good Games API use?
Good Games actions currently cost 1-5 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Good Games from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call goodgames actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Good Games API a Good Games scraper?
It is the managed alternative to a DIY Good Games scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same good games australia as json: aud prices and live stock per card and condition for pokémon, magic, lorcana, one piece, flesh and blood and riftbound back as clean JSON.