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
commanderCommander100-card singleton, command zone
brawlBrawl100-card singleton, command zone
pauper_commanderPauper Commander100-card singleton, command zone
standardStandard60-card constructed, sideboard
pioneerPioneer60-card constructed, sideboard
modernModern60-card constructed, sideboard
legacyLegacy60-card constructed, sideboard
vintageVintage60-card constructed, sideboard
pauperPauper60-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 are null.
  • Command zone. Only Commander, Brawl, and Pauper Commander decks have a commanders board and mainCommander. Constructed decks return an empty commanders board, a null mainCommander, and no commander-derived fields.
  • Sideboards. Constructed formats may include a sideboard board (up to 15 cards). Command-zone formats never have one.
  • Color identity. For command-zone formats, colorIdentity derives 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:

Request 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 Response
{
  "error": "Description of the error"
}
Status Meaning
400Bad request — missing or invalid parameters
401Unauthorized — invalid API key
403Forbidden — deck is private
404Not found — deck does not exist
429Rate limit exceeded
500Internal 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.

No API key required. Requests are rate limited by IP. An optional API key only raises the available rate limit.

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
curl "https://deckcheck.co/api/external/deck?deck_id=sBid_JEUQZ4D"

Response

200 OK
{
  "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:

FieldTypeDescription
fullAnalysisstring or nullComplete rendered analysis HTML: overview, core strategy, mulligan guide, key tips, weaknesses, and key cards. null when no completed analysis is available.
dtiobject or nullThe 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.
threatIndexinteger or nullMirror of dti.score.
bracketinteger or nullNumeric 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:

FieldTypeDescription
deckCardIdstringUnique key for this card entry
scryfallIdstringScryfall UUID
namestringCard name
setCodestringSet code (e.g. "cmm")
setNamestringFull set name
collectorNumberstringCollector number
manaCoststringMana cost string (e.g. "{2}{U}{B}")
cmcnumberConverted mana cost
typeLinestringFull type line
oracleTextstringOracle rules text
powerstringPower (creatures only)
toughnessstringToughness (creatures only)
loyaltystringStarting loyalty (planeswalkers only)
colorsarrayCard colors (e.g. ["U", "B"])
colorIdentityarrayColor identity
raritystringcommon, uncommon, rare, or mythic
reservedbooleanOn the Reserved List
reprintbooleanWhether this printing is a reprint
cardFacesarrayFace data for double-faced cards
pricesobjectPrice data (USD, CardKingdom, ManaPool, CardMarket)
imageUrlstringCard image URL when available