Overview
The DeckCheck API provides read-only access to public deck data and search. All endpoints live under:
https://deckcheck.co/api/external
Responses are returned as JSON. All requests use the GET method.
Authentication
Authenticate by including your API key in the X-Api-Key header:
X-Api-Key: your_api_key_here
The /deck endpoint is open to everyone and does not require an API key. The /deck-search endpoint requires a valid API key on every request.
Providing an API key on any endpoint unlocks higher rate-limit tiers. To request an API key, contact me at contact@deckcheck.co.
Permitted Use
The DeckCheck API is provided for read-only integrations that display, reference, or search public DeckCheck deck data in a user-facing product or partner workflow. API access is subject to the DeckCheck Terms of Service, these docs, and any written agreement that applies to your key.
You may not use the API or DeckCheck public pages to scrape, bulk download, mirror, resell, redistribute, sublicense, train models on, create commercial datasets from, or build a competing deck database, search engine, recommendation system, analytics product, or similar service without express written permission from ANTHOS.
Do not share API keys, embed them in public client-side code, bypass rate limits, call undocumented endpoints, or combine API usage with scraping or browser automation. If your use case needs higher volume, caching, redistribution, model training, or commercial dataset rights, contact contact@deckcheck.co first.
Rate Limits
Rate limits are applied per API key (or per IP for unauthenticated requests).
| Tier | Limit | Description |
|---|---|---|
| Tier 1 | 10 requests/s | Default for all API keys and unauthenticated callers |
| Tier 2 | 100 requests/s | Available on request for higher-volume partners |
| Tier 3 | Unlimited | Reserved for trusted integrations |
When the limit is exceeded, the API returns a 429 status code. Back off and retry after the rate window resets.
Error Handling
The API returns standard HTTP status codes with a JSON error body:
{
"error": "Description of the error"
}
| Status | Meaning |
|---|---|
400 | Bad request — missing or invalid parameters |
401 | Unauthorized — invalid API key |
403 | Forbidden — deck is private |
404 | Not found — deck does not exist |
429 | Rate limit exceeded |
500 | Internal server error |
GET /api/external/deck
Pass any shareable DeckCheck deck link or deck ID and this endpoint will parse it and return the matching deck data.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
deck_id |
string | * | A DeckCheck deck identifier. This can be either a deckview ID for a scanned/published deck, or a builder share ID for a shared builder/decklist deck. |
deck_url |
string | * | Any shareable DeckCheck deck URL, including /app/deckview/<id>, /app/decklist/<id>, or /app/builder/<id>. |
* Provide either deck_id or deck_url. At least one is required.
deckview links/IDs represent the published scanned version of a deck and return the simpler published deck list.
builder and decklist links both refer to the same shared builder deck. For non-owners that deck is viewed as a decklist, while owners may land in the builder. Sending either one here returns the shared builder deck data.
Builder/decklist responses are richer than deckview responses. They return the current shared deck state and can include fields like sideboard, considering, updatedAtUtc, and deckviewId/deckviewUrl when that builder deck is also linked to a published scan.
Example Request
curl -H "X-Api-Key: YOUR_KEY" \
"https://deckcheck.co/api/external/deck?deck_id=a7ab43314200e984b056e6467f0ae184"
Response
{
"id": "a7ab43314200e984b056e6467f0ae184",
"publicId": "a7ab43314200e984b056e6467f0ae184",
"name": "Hearthhull, the Worldseed",
"performanceIndex": 6.25,
"bracket": 3,
"format": "commander",
"visibility": "public",
"publicUrl": "https://deckcheck.co/app/deckview/a7ab43314200e984b056e6467f0ae184",
"colorIdentity": ["B", "G", "R"],
"colors": ["B", "G", "R"],
"createdAtUtc": "2025-07-09T20:06:38.022409",
"creator": {
"username": "WotC",
"displayName": "WotC"
},
"authors": [
{
"username": "WotC",
"displayName": "WotC"
}
],
"mainCommander": {
"deckCardId": "com0_HearthhulltheWor",
"scryfallId": "6b913e79-a9f6-44d4-bb37-c4f6f66b8151",
"name": "Hearthhull, the Worldseed",
"manaCost": "{1}{B}{R}{G}",
"typeLine": "Legendary Artifact — Spacecraft",
"colors": ["B", "G", "R"],
"colorIdentity": ["B", "G", "R"],
"cmc": 4.0,
"power": "6",
"toughness": "7",
"rarity": "mythic"
},
"boards": {
"commanders": {
"count": 1,
"cards": {
"com0_HearthhulltheWor": {
"quantity": 1,
"board": "commanders",
"finish": "nonFoil",
"isFoil": false,
"card": {
"deckCardId": "com0_HearthhulltheWor",
"scryfallId": "6b913e79-a9f6-44d4-bb37-c4f6f66b8151",
"name": "Hearthhull, the Worldseed",
"setCode": "eoc",
"setName": "Edge of Eternities Commander",
"collectorNumber": "1",
"manaCost": "{1}{B}{R}{G}",
"cmc": 4.0,
"typeLine": "Legendary Artifact — Spacecraft",
"oracleText": "Station (Tap another creature you control: ...)\n2+ | {1}, {T}, Sacrifice a land: Draw two cards...\n8+ | Flying, vigilance, haste\nWhenever you sacrifice a land, each opponent loses 2 life.",
"power": "6",
"toughness": "7",
"loyalty": null,
"colors": ["B", "G", "R"],
"colorIdentity": ["B", "G", "R"],
"rarity": "mythic",
"reserved": false,
"reprint": false,
"cardFaces": [],
"prices": {
"usd": 2.2,
"usd_foil": 0.57,
"eur": 1.06,
"eur_foil": 0.62,
"tix": 11.15,
"ck": 2.49,
"ck_foil": 0.99,
"mp": 0.37,
"mp_foil": 0.18,
"cm": 0.21,
"cm_foil": 0.44
},
"imageUrl": null
}
}
}
},
"mainboard": {
"count": 99,
"cards": {
"mai11_BalothPrime": {
"quantity": 1,
"board": "mainboard",
"finish": "nonFoil",
"isFoil": false,
"card": {
"deckCardId": "mai11_BalothPrime",
"scryfallId": "2c723fc9-d5c9-4126-a9a6-f80c247a4b6b",
"name": "Baloth Prime",
"setCode": "eoc",
"setName": "Edge of Eternities Commander",
"collectorNumber": "13",
"manaCost": "{3}{G}",
"cmc": 4.0,
"typeLine": "Creature — Beast",
"oracleText": "This creature enters tapped with six stun counters on it...",
"power": "10",
"toughness": "10",
"loyalty": null,
"colors": ["G"],
"colorIdentity": ["G"],
"rarity": "rare",
"reserved": false,
"reprint": false,
"cardFaces": [],
"prices": {
"usd": 0.32,
"eur": 0.45,
"tix": 3.05,
"ck": 0.49,
"mp": 0.15,
"cm": 0.11
},
"imageUrl": null
}
},
"...": "97 more cards"
}
}
}
}
Card Object
Each card entry in a board contains a card object with the following fields:
| Field | Type | Description |
|---|---|---|
deckCardId | string | Unique key for this card entry |
scryfallId | string | Scryfall UUID |
name | string | Card name |
setCode | string | Set code (e.g. "cmm") |
setName | string | Full set name |
collectorNumber | string | Collector number |
manaCost | string | Mana cost string (e.g. "{2}{U}{B}") |
cmc | number | Converted mana cost |
typeLine | string | Full type line |
oracleText | string | Oracle rules text |
power | string | Power (creatures only) |
toughness | string | Toughness (creatures only) |
loyalty | string | Starting loyalty (planeswalkers only) |
colors | array | Card colors (e.g. ["U", "B"]) |
colorIdentity | array | Color identity |
rarity | string | common, uncommon, rare, or mythic |
reserved | boolean | On the Reserved List |
reprint | boolean | Whether this printing is a reprint |
cardFaces | array | Face data for double-faced cards |
prices | object | Price data (USD, CardKingdom, ManaPool, CardMarket) |
imageUrl | string | Card image URL when available |
GET /api/external/deck-search
Search for decks using the same filter criteria available on the DeckCheck search page. Returns paginated results.
X-Api-Key header. To get a key, reach out at contact@deckcheck.co.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
query |
string | none | Commander name or tag search (e.g. ghalta, #combo) |
page |
integer | 1 | Page number (1-indexed) |
per_page |
integer | 24 | Results per page (max 100) |
min_pi |
float | 1.0 | Minimum CRISPI score (0–10) |
max_pi |
float | 10.0 | Maximum CRISPI score (0–10) |
min_price |
float | 0 | Minimum deck price in USD |
max_price |
float | none | Maximum deck price in USD |
colors |
string | none | Comma-separated color letters (e.g. W,U,R or C for colorless) |
color_match |
string | at-least | Color matching: exactly, at-least, at-most, not-these |
brackets |
string | none | Comma-separated bracket levels (e.g. 1,2,3) |
hide_outdated |
boolean | false | Exclude decks flagged as outdated |
sort |
string | power | Sort by: power (CRISPI score), recent, date_created, price, efficiency |
sort_direction |
string | desc | Sort direction: asc or desc |
Example Request
curl -H "X-Api-Key: YOUR_KEY" \
"https://deckcheck.co/api/external/deck-search?query=The%20Ur-Dragon&max_price=600&brackets=3,4"
Response
{
"status": "success",
"data": [
{
"id": "b5ef0ddeab477f1ce2381af410b352d0",
"name": "The Ur-Dragon",
"commanders": ["The Ur-Dragon"],
"performanceIndex": 7.75,
"bracket": 4,
"format": "commander",
"colorIdentity": ["B", "G", "R", "U", "W"],
"colorIdentityName": "Five-Color",
"deckCost": 555.14,
"efficiencyScore": 13.96,
"tags": null,
"analysisPreview": "This is a five-color Dragon tribal deck leveraging The Ur-Dragon's Eminence ability for cost reduction and its attack trigger for card advantage and cheat-into-play effects...",
"publicUrl": "https://deckcheck.co/app/deckview/b5ef0ddeab477f1ce2381af410b352d0",
"commanderImageUrl": "https://cards.scryfall.io/art_crop/front/1/0/10d42b35-844f-4a64-9981-c6118d45e826.jpg?1689999317",
"dateCreated": "2026-03-10T23:56:27.986071"
}
],
"metadata": {
"pagination": {
"page": 1,
"per_page": 24,
"total_items": 1694,
"total_pages": 71,
"has_next": true,
"has_prev": false
},
"filters": {
"query": "The Ur-Dragon",
"min_pi": 1.0,
"max_pi": 10,
"max_price": 600.0,
"min_price": 0,
"brackets": [3, 4],
"colors": [],
"color_match": "at-least",
"sort": "power",
"sort_direction": "desc"
}
}
}
Search Result Object
| Field | Type | Description |
|---|---|---|
id | string | Deck ID |
name | string | Deck name (usually the commander) |
commanders | array | List of commander names |
performanceIndex | number | CRISPI score (0–10) |
bracket | integer | Commander bracket level |
format | string | Always "commander" |
colorIdentity | array | Color identity letters |
colorIdentityName | string | Human-readable color name (e.g. "Monogreen") |
deckCost | number | Total deck price in USD |
efficiencyScore | number | Price-to-performance efficiency |
tags | array | Deck strategy tags |
analysisPreview | string | Short analysis summary |
publicUrl | string | Link to deck on DeckCheck |
commanderImageUrl | string | Commander card image URL |
dateCreated | string | ISO 8601 timestamp |