API Documentation
Read-only access to public DeckCheck deck data and search.
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.
DeckCheck supports decks in multiple formats — Commander plus command-zone variants (Brawl, Pauper Commander) and 60-card constructed formats (Standard, Pioneer, Modern, Legacy, Vintage, Pauper). Every deck payload and search result carries a format field, and deck search can be filtered by format. See Formats for the full list and format-specific behavior.
Formats
Every deck on DeckCheck belongs to exactly one format. API responses identify it with a stable format id and a display-ready formatLabel:
| Format ID | Label | Type |
|---|---|---|
commander | Commander | 100-card singleton, command zone |
brawl | Brawl | 100-card singleton, command zone |
pauper_commander | Pauper Commander | 100-card singleton, command zone |
standard | Standard | 60-card constructed, sideboard |
pioneer | Pioneer | 60-card constructed, sideboard |
modern | Modern | 60-card constructed, sideboard |
legacy | Legacy | 60-card constructed, sideboard |
vintage | Vintage | 60-card constructed, sideboard |
pauper | Pauper | 60-card constructed, sideboard |
Wherever the API accepts a format value, common aliases are also recognized (edh → commander, pedh / pauperedh → pauper_commander, standardbrawl → brawl, and so on).
Format-specific behavior
- Threat Index scores and brackets are Commander-only.
threatIndex,dti,bracket, and the Threat Index filter only apply to Commander decks. For every other format these fields arenull. - Command zone. Only Commander, Brawl, and Pauper Commander decks have a
commandersboard andmainCommander. Constructed decks return an emptycommandersboard, anullmainCommander, and no commander-derived fields. - Sideboards. Constructed formats may include a
sideboardboard (up to 15 cards). Command-zone formats never have one. - Color identity. For command-zone formats,
colorIdentityderives from the commander(s). For constructed decks it is the union of the colors of the cards in the deck.
Authentication
The /deck endpoint is open to everyone and does not require an API key. It is rate limited by IP, so personal projects can call it directly without requesting credentials.
The /deck-search endpoint requires a valid API key on every request. For endpoints that require a key, include it in the X-Api-Key header:
X-Api-Key: your_api_key_here
Providing an optional API key to /deck unlocks higher rate-limit tiers. To request a key for deck search or higher-volume access, 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, and updatedAtUtc. The deck's canonical public page is always its publicUrl (/app/decklist/<id>); legacy /app/deckview/ URLs permanently redirect there.
The response shape adapts to the deck's format: command-zone formats populate the commanders board and mainCommander, while constructed decks instead may carry a sideboard board and return null for threatIndex, dti, bracket, and mainCommander.
Example Request
curl "https://deckcheck.co/api/external/deck?deck_id=sBid_JEUQZ4D"
Response
{
"id": "sBid_JEUQZ4D",
"publicId": "sBid_JEUQZ4D",
"name": "Turbo Green",
"threatIndex": 61,
"dti": {
"score": 61,
"maxScore": 96,
"bracket": 4,
"benchmarks": {
"R1": "S", "R2": "A", "A1": "A", "A2": "S", "P1": "A", "P2": "A",
"P3": "B", "I1": "C", "I2": "B", "S1": "A", "S2": "B", "S3": "A"
}
},
"bracket": 4,
"fullAnalysis": "<h2>Overview:</h2>\n\n<p>This deck is a mono-green Elf and mana-dork combo deck led by Ghalta, Primal Hunger...</p>\n\n...\n\n<h2>Weaknesses:</h2>\n\n<p><strong>Critical</strong></p>\n\n<ul><li>A single sweeper before turn 4 resets the board and stalls the deck.</li></ul>",
"format": "commander",
"formatLabel": "Commander",
"visibility": "public",
"publicUrl": "https://deckcheck.co/app/decklist/sBid_JEUQZ4D",
"colorIdentity": ["G"],
"colors": ["G"],
"createdAtUtc": "2026-04-09T09:21:37.260225-04:00",
"updatedAtUtc": "2026-08-13T17:06:08.213943-04:00",
"creator": {
"username": "ANTHO",
"displayName": "ANTHO"
},
"authors": [
{
"username": "ANTHO",
"displayName": "ANTHO"
}
],
"mainCommander": {
"deckCardId": "com0_GhaltaPrimalHung",
"scryfallId": "6a9c39e4-a8cf-42dd-8d0e-45634b335546",
"name": "Ghalta, Primal Hunger",
"setCode": "fdn",
"collectorNumber": "222",
"manaCost": "{10}{G}{G}",
"cmc": 12.0,
"typeLine": "Legendary Creature — Elder Dinosaur",
"oracleText": "This spell costs {X} less to cast, where X is the total power of creatures you control.\nTrample...",
"power": "12",
"toughness": "12",
"colors": ["G"],
"colorIdentity": ["G"],
"rarity": "rare"
},
"boards": {
"commanders": {
"count": 1,
"cards": {
"com0_GhaltaPrimalHung": {
"quantity": 1,
"board": "commanders",
"finish": "nonFoil",
"isFoil": false,
"card": {
"deckCardId": "com0_GhaltaPrimalHung",
"scryfallId": "6a9c39e4-a8cf-42dd-8d0e-45634b335546",
"name": "Ghalta, Primal Hunger",
"setCode": "fdn",
"collectorNumber": "222",
"manaCost": "{10}{G}{G}",
"cmc": 12.0,
"typeLine": "Legendary Creature — Elder Dinosaur",
"power": "12",
"toughness": "12",
"colors": ["G"],
"colorIdentity": ["G"],
"rarity": "rare"
}
}
}
},
"mainboard": {
"count": 99,
"cards": {
"mai0_Forest": {
"quantity": 24,
"board": "mainboard",
"finish": "nonFoil",
"isFoil": false,
"card": {
"deckCardId": "mai0_Forest",
"scryfallId": "dce15387-4114-4b3e-91aa-5b42b45c44ac",
"name": "Forest",
"setCode": "trk",
"collectorNumber": "325",
"manaCost": "",
"cmc": 0.0,
"typeLine": "Basic Land — Forest",
"oracleText": "({T}: Add {G}.)",
"colors": ["G"],
"colorIdentity": ["G"],
"rarity": "common"
}
},
"...": "remaining mainboard cards"
}
}
}
}
Analysis Fields
Completed deck analyses expose the full rendered prose and a compact DeckCheck Threat Index summary:
| Field | Type | Description |
|---|---|---|
fullAnalysis | string or null | Complete rendered analysis HTML: overview, core strategy, mulligan guide, key tips, weaknesses, and key cards. null when no completed analysis is available. |
dti | object or null | The Threat Index summary: score (0–96), maxScore (96), bracket, and benchmarks (the tier letter S, A, B, C, or F for each of the 12 benchmarks R1, R2, A1, A2, P1, P2, P3, I1, I2, S1, S2, S3). null when the deck has no Threat Index. |
threatIndex | integer or null | Mirror of dti.score. |
bracket | integer or null | Numeric Commander bracket only. The API does not return a bracket justification or bracketDescription. |
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 | Deck name search (e.g. dragon storm). To search by commander, use commander |
commander |
string | none | Commander name. Matches the start of a commander's name (e.g. Atraxa or Atraxa, Praetors' Voice) |
partner |
string | none | Second commander name, for Partner and Background pairs. A deck must match both names, in either order (e.g. commander=Tymna&partner=Thrasios) |
formats |
string | none | Comma-separated format IDs (e.g. commander,brawl or modern). Omit to search every format. Aliases like edh and pedh are accepted; unrecognized values are ignored. |
page |
integer | 1 | Page number (1-indexed) |
per_page |
integer | 24 | Results per page (max 100) |
min_dti |
integer | 0 | Minimum Threat Index (0–96). Commander decks only |
max_dti |
integer | 96 | Maximum Threat Index (0–96). Commander decks only |
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). Commander decks only |
tags |
string | none | Comma-separated theme or typal tags (e.g. aristocrats or landfall,typal-elf). A deck must have every tag. A query that names a theme or a creature type (aristocrats, elves) also matches decks with that tag |
hide_outdated |
boolean | false | Exclude decks flagged as outdated |
sort |
string | power | Sort by: power (Threat Index), recent, or price. When formats only includes non-Commander formats, the Threat Index sort falls back to recent |
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?commander=The%20Ur-Dragon&formats=commander&max_price=600&brackets=3,4"
Response
{
"status": "success",
"data": [
{
"id": "b5ef0ddeab477f1ce2381af410b352d0",
"name": "The Ur-Dragon",
"commanders": ["The Ur-Dragon"],
"threatIndex": 47,
"bracket": 4,
"format": "commander",
"formatLabel": "Commander",
"colorIdentity": ["B", "G", "R", "U", "W"],
"colorIdentityName": "Five-Color",
"deckCost": 555.14,
"tags": ["typal-dragon", "ramp"],
"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/decklist/pR8sWc5nH2Kd",
"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": "",
"commander": "The Ur-Dragon",
"partner": "",
"min_dti": 0,
"max_dti": 96,
"max_price": 600.0,
"min_price": 0,
"brackets": [3, 4],
"formats": ["commander"],
"tags": [],
"colors": [],
"color_match": "at-least",
"sort": "power",
"sort_direction": "desc"
}
}
}
Search Result Object
| Field | Type | Description |
|---|---|---|
id | string | Deck ID |
name | string | Deck name |
commanders | array | List of commander names (empty for constructed formats) |
threatIndex | integer | DeckCheck Threat Index (0–96). null for non-Commander formats |
bracket | integer | Commander bracket level. null for non-Commander formats |
format | string | Format ID (e.g. "commander", "modern") |
formatLabel | string | Display name of the format (e.g. "Pauper Commander") |
colorIdentity | array | Color identity letters |
colorIdentityName | string | Human-readable color name (e.g. "Monogreen") |
deckCost | number | Total deck price in USD |
tags | array | Deck strategy tags |
analysisPreview | string | Short analysis summary |
publicUrl | string | Link to deck on DeckCheck |
commanderImageUrl | string | Cover image URL (commander art, or the deck's key art for constructed formats) |
dateCreated | string | ISO 8601 timestamp |