# MTG Mate API scraper - Australian Magic: The Gathering singles: AUD prices, per-SKU stock, foil and non-foil listed separately, every printing of a card, full set lists, the store's buylist in cash and credit, deck pricing, newest stock and format staples.

> Find cards by name across the store: every matching SKU with set, card number, rarity, finish, AUD price, units in stock and image. Foil and non-foil are separate rows. Needs at least 3 characters. The store caps one search at 1000 SKUs; truncated says when that was reached. Filter, sort and page the answer with the parameters below.
> ReefAPI engine `mtgmate` · 10 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/mtgmate/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/mtgmate/v1/search — 2 credits
Find cards by name across the store: every matching SKU with set, card number, rarity, finish, AUD price, units in stock and image. Foil and non-foil are separate rows. Needs at least 3 characters. The store caps one search at 1000 SKUs; truncated says when that was reached. Filter, sort and page the answer with the parameters below.

**Parameters:**
- `query` (string, required) — Part of a card name, 3 characters or more.
- `set_code` (string, optional) — Keep these sets only (comma list of codes from the sets action).
- `finish` (string, optional) — Comma list of nonfoil, foil, etched, glossy. Each finish is its own row, so foil and non-foil never share a price.
- `rarity` (string, optional) — Comma list: common, uncommon, rare, mythic, special, timeshifted.
- `color` (string, optional) — Comma list of W, U, B, R, G, C (colorless). A card matches if it has any of them.
- `type` (string, optional) — Part of the type line (Creature, Instant, Legendary, Dragon...).
- `language` (string, optional) — ja (Japanese) or ph (Phyrexian) printings, en for the ordinary ones. Rows return language null for ordinary printings: the store marks only the others.
- `min_price` (number, optional) — Minimum price in AUD.
- `max_price` (number, optional) — Maximum price in AUD.
- `in_stock_only` (boolean, optional) — Only SKUs with units for sale. Off by default, so sold-out printings and their prices are included.
- `sort` (enum, optional, default "relevance") — Result order. relevance is the store's own order. [one of: relevance, price_asc, price_desc, name_asc, name_desc, stock_desc, stock_asc]
- `page` (integer, optional, default 1) — Result page.
- `limit` (integer, optional, default 100) — Rows per page, up to 2000.

**Returns:** results[]{sku, name, set, set_code, card_number, rarity, finish, foil, language, condition, price_aud, stock, in_stock, colors[], type_line, preorder, is_unique_item, unique_item_note, image_url, url}, count, total, site_total, truncated, page, pages, limit, has_more, sort

**Example request body:**
```json
{
  "query": "lightning bolt"
}
```

### POST https://api.reefapi.com/mtgmate/v1/printings — 2 credits
Every printing of one exact card name, including sold-out ones with their last price: set, number, rarity, finish, AUD price and stock per SKU. Use it to find the cheapest copy of a card in Australia or to watch every version of one card.

**Parameters:**
- `name` (string, required) — Exact card name.
- `set_code` (string, optional) — Keep these sets only (comma list of codes from the sets action).
- `finish` (string, optional) — Comma list of nonfoil, foil, etched, glossy. Each finish is its own row, so foil and non-foil never share a price.
- `rarity` (string, optional) — Comma list: common, uncommon, rare, mythic, special, timeshifted.
- `color` (string, optional) — Comma list of W, U, B, R, G, C (colorless). A card matches if it has any of them.
- `type` (string, optional) — Part of the type line (Creature, Instant, Legendary, Dragon...).
- `language` (string, optional) — ja (Japanese) or ph (Phyrexian) printings, en for the ordinary ones. Rows return language null for ordinary printings: the store marks only the others.
- `min_price` (number, optional) — Minimum price in AUD.
- `max_price` (number, optional) — Maximum price in AUD.
- `in_stock_only` (boolean, optional) — Only SKUs with units for sale. Off by default, so sold-out printings and their prices are included.
- `sort` (enum, optional, default "relevance") — Result order. relevance is the store's own order. [one of: relevance, price_asc, price_desc, name_asc, name_desc, stock_desc, stock_asc]
- `page` (integer, optional, default 1) — Result page.
- `limit` (integer, optional, default 100) — Rows per page, up to 2000.

**Returns:** name, results[]{sku, name, set, set_code, card_number, rarity, finish, foil, language, condition, price_aud, stock, in_stock, colors[], type_line, preorder, is_unique_item, unique_item_note, image_url, url}, count, total, site_total, page, pages, limit, has_more, sort

**Example request body:**
```json
{
  "name": "Lightning Bolt"
}
```

### POST https://api.reefapi.com/mtgmate/v1/set — 3 credits
One whole Magic set as the store lists it: every card in every finish with AUD price and stock. Filter, sort and page the answer, or ask up to 2000 rows at once.

**Parameters:**
- `set_code` (string, required) — Set code from the sets action.
- `finish` (string, optional) — Comma list of nonfoil, foil, etched, glossy. Each finish is its own row, so foil and non-foil never share a price.
- `rarity` (string, optional) — Comma list: common, uncommon, rare, mythic, special, timeshifted.
- `color` (string, optional) — Comma list of W, U, B, R, G, C (colorless). A card matches if it has any of them.
- `type` (string, optional) — Part of the type line (Creature, Instant, Legendary, Dragon...).
- `language` (string, optional) — ja (Japanese) or ph (Phyrexian) printings, en for the ordinary ones. Rows return language null for ordinary printings: the store marks only the others.
- `min_price` (number, optional) — Minimum price in AUD.
- `max_price` (number, optional) — Maximum price in AUD.
- `in_stock_only` (boolean, optional) — Only SKUs with units for sale. Off by default, so sold-out printings and their prices are included.
- `sort` (enum, optional, default "relevance") — Result order. relevance is the store's own order. [one of: relevance, price_asc, price_desc, name_asc, name_desc, stock_desc, stock_asc]
- `page` (integer, optional, default 1) — Result page.
- `limit` (integer, optional, default 100) — Rows per page, up to 2000.

**Returns:** set_code, set, results[]{sku, name, set, set_code, card_number, rarity, finish, foil, language, condition, price_aud, stock, in_stock, colors[], type_line, preorder, is_unique_item, unique_item_note, image_url, url}, count, total, site_total, page, pages, limit, has_more, sort

**Example request body:**
```json
{
  "set_code": "sos",
  "limit": 20
}
```

### POST https://api.reefapi.com/mtgmate/v1/sets — 3 credits
The store's set directory, newest first: name, code, number of SKUs listed, release date and parent set for commander decks, tokens and bonus sheets.

**Parameters:**
- `query` (string, optional) — Keep sets whose name or code contains this.

**Returns:** sets[]{name, set_code, card_count, release_date, parent_set_code, url}, count

**Example request body:**
```json
{
  "query": "commander"
}
```

### POST https://api.reefapi.com/mtgmate/v1/card — 2 credits
One printing in full: AUD price, units in stock, finish, rarity, mana cost, rules text, set and number, plus the other printings in stock with their prices and what buyers of this card also bought. Give url, or name + set_code + card_number.

**Parameters:**
- `url` (string, optional) — The card's page, from any row's url.
- `name` (string, optional) — Card name, with set_code and card_number.
- `set_code` (string, optional) — Set code.
- `card_number` (string, optional) — Collector number from search.
- `finish` (string, optional) — nonfoil (default), foil, etched or glossy.
- `language` (string, optional) — ja or ph for that printing; leave out otherwise.

**Returns:** card{sku, name, printing_name, set, set_code, card_number, rarity, finish, foil, language, condition, price_aud, price_source, availability, in_stock, stock, oracle_text, mana_cost, image_url, url}, other_printings[]{set, set_code, card_number, rarity, finish, foil, language, price_aud, stock, in_stock, url}, also_bought[]{name, set_code, card_number, finish, language, image_url, url}

**Example request body:**
```json
{
  "url": "https://www.mtgmate.com.au/cards/Sword_of_Feast_and_Famine/2XM/296"
}
```

### POST https://api.reefapi.com/mtgmate/v1/stock — 1 credit
Live AUD price and units in stock for one SKU (the sku on any row). The cheapest way to watch a card you already know.

**Parameters:**
- `sku` (string, required) — The sku from search, printings or set.

**Returns:** sku, price_aud, stock, in_stock

**Example request body:**
```json
{
  "sku": "5acb7f4a-5e71-51e7-89f5-1aae02f79c32"
}
```

### POST https://api.reefapi.com/mtgmate/v1/buylist — 2 credits
What MTG Mate pays for cards: cash and store-credit price in AUD and how many it wants, for Near Mint copies. Without set_code it returns the store's hot list; with set_code, the cards it is buying from that set.

**Parameters:**
- `set_code` (string, optional) — Set code; leave out for the hot list.
- `min_cash` (number, optional) — Keep offers paying at least this cash price (AUD).
- `limit` (integer, optional, default 500) — Maximum rows.

**Returns:** results[]{name, set, finish, foil, cash_aud, credit_aud, wanted, condition, image_url}, count, total, source

**Example request body:**
```json
{
  "set_code": "sos"
}
```

### POST https://api.reefapi.com/mtgmate/v1/decklist — 3 credits
Price a whole deck at MTG Mate. Paste one card per line (4 Lightning Bolt); the answer lists up to 10 in-stock printings per card with price and stock, the store's suggested pick, the deck total at that pick, and the cards it cannot fill.

**Parameters:**
- `decklist` (string, required) — One card per line, exact names, up to 5000 characters.

**Returns:** cards[]{name, quantity_filled, cheapest_aud, printings[]{sku, printing_name, set, set_code, card_number, rarity, finish, foil, language, price_aud, stock, in_stock, suggested_quantity, url}}, not_available[], short_supply[], suggested_total_aud

**Example request body:**
```json
{
  "decklist": "4 Lightning Bolt\n2 Sol Ring"
}
```

### POST https://api.reefapi.com/mtgmate/v1/recently_added — 2 credits
The newest stock added to the store, with the day it was added: name, set, number, finish and link. The store's feed carries no price; use card or stock for one. Last 100 or last 1000.

**Parameters:**
- `count` (enum, optional, default "100") — How many of the latest additions. [one of: 100, 1000]

**Returns:** results[]{name, set_code, card_number, finish, foil, language, added_on, image_url, url}, count

**Example request body:**
```json
{
  "count": "100"
}
```

### POST https://api.reefapi.com/mtgmate/v1/staples — 2 credits
The cards MTG Mate lists as staples for a format, grouped by card type, with the store's last update date. Use printings for prices.

**Parameters:**
- `format` (enum, required) — The format. [one of: standard, premodern, pioneer, modern, legacy, game_changers, cedh]

**Returns:** format, title, last_updated, sections[]{category, cards[]{name, image_url, url}}, count

**Example request body:**
```json
{
  "format": "modern"
}
```

## 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=mtgmate
- Human docs page: https://reefapi.com/docs/mtgmate
- Overview page: https://reefapi.com/mtgmate-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
