Sorcery: Contested Realm

Public API

Before you build

Usage guidance

Expect changes

This API is subject to change as we continue developing the card database. Fields and data may change without notice, and requests are rate limited per user.

Synchronize, don't depend on it live

Poll intermittently, compare each response with your previous import, and host the data your application needs. The API is not intended to be your application's live data backend.

Host images yourself

Card images are not included in the API response, and our private CDN may not be used to serve them. Download released card images from the public image folder.

Version 1

Available endpoints

GET/api/cards

Returns every card in alphabetical order, including its gameplay metadata, set appearances, and individual printings.

Authentication
None
Rate limit
30 requests per minute
Response
JSON
View live response
Quick start

Make a request

curl

curl "https://squirrel-api.sorcerytcg.com/api/cards"

JavaScript

const response = await fetch("https://squirrel-api.sorcerytcg.com/api/cards");
const cards = await response.json();
Schema

Card response schema

/**
 * The JSON shape returned by GET /api/cards.
 *
 * This contract deliberately has no imports from Prisma or another internal
 * package, so it can be copied directly into an API consumer.
 */
export type CardAPIDTO = {
  id: string;
  name: string;
  slug: string;
  engine: {
    type: "Avatar" | "Minion" | "Magic" | "Aura" | "Artifact" | "Site";
    category: "Avatar" | "Spell" | "Site" | "Token";
    rarity: "Unique" | "Elite" | "Exceptional" | "Ordinary" | null;
    slot: "Unique" | "Elite" | "Exceptional" | "Ordinary" | null;
    rules: string | null;
    cost: number | null;
    attack: number | null;
    defense: number | null;
    life: number | null;
    water: number | null;
    earth: number | null;
    fire: number | null;
    air: number | null;
    elements: ("Earth" | "Fire" | "Water" | "Air" | "None")[];
    subtypes: (
      | "Angel"
      | "Beast"
      | "Demon"
      | "Dragon"
      | "Dwarf"
      | "Faerie"
      | "Giant"
      | "Gnome"
      | "Goblin"
      | "Merfolk"
      | "Monster"
      | "Mortal"
      | "Ogre"
      | "Spirit"
      | "Sphinx"
      | "Troll"
      | "Undead"
      | "Armor"
      | "Automaton"
      | "Device"
      | "Document"
      | "Instruments"
      | "Monument"
      | "Potion"
      | "Relic"
      | "Weapon"
      | "Desert"
      | "River"
      | "Tower"
      | "Village"
    )[];
    keywords: (
      | "Airborne"
      | "Burrowing"
      | "Charge"
      | "Deathrite"
      | "Disabled"
      | "Flood"
      | "Genesis"
      | "Immobile"
      | "Lance"
      | "Landbound"
      | "Lethal"
      | "Movement"
      | "Ranged"
      | "Spellcaster"
      | "Stealth"
      | "Submerge"
      | "Voidwalk"
      | "Ward"
      | "Waterbound"
    )[];
    umbrellas: ("Knight" | "Royalty" | "Evil")[];
    back: {
      type: "Avatar" | "Minion" | "Magic" | "Aura" | "Artifact" | "Site";
      category: "Avatar" | "Spell" | "Site" | "Token";
      rarity: "Unique" | "Elite" | "Exceptional" | "Ordinary" | null;
      slot: "Unique" | "Elite" | "Exceptional" | "Ordinary" | null;
      rules: string | null;
      cost: number | null;
      attack: number | null;
      defense: number | null;
      life: number | null;
      water: number | null;
      earth: number | null;
      fire: number | null;
      air: number | null;
      elements: ("Earth" | "Fire" | "Water" | "Air" | "None")[];
      subtypes: (
        | "Angel"
        | "Beast"
        | "Demon"
        | "Dragon"
        | "Dwarf"
        | "Faerie"
        | "Giant"
        | "Gnome"
        | "Goblin"
        | "Merfolk"
        | "Monster"
        | "Mortal"
        | "Ogre"
        | "Spirit"
        | "Sphinx"
        | "Troll"
        | "Undead"
        | "Armor"
        | "Automaton"
        | "Device"
        | "Document"
        | "Instruments"
        | "Monument"
        | "Potion"
        | "Relic"
        | "Weapon"
        | "Desert"
        | "River"
        | "Tower"
        | "Village"
      )[];
      keywords: (
        | "Airborne"
        | "Burrowing"
        | "Charge"
        | "Deathrite"
        | "Disabled"
        | "Flood"
        | "Genesis"
        | "Immobile"
        | "Lance"
        | "Landbound"
        | "Lethal"
        | "Movement"
        | "Ranged"
        | "Spellcaster"
        | "Stealth"
        | "Submerge"
        | "Voidwalk"
        | "Ward"
        | "Waterbound"
      )[];
      umbrellas: ("Knight" | "Royalty" | "Evil")[];
    } | null;
  };
  printings: {
    id: string;
    slug: string;
    /** ISO 8601 date-time string. */
    printedAt: string;
    set: {
      name: string;
      code: string;
      /** ISO 8601 date-time string. */
      releasedAt: string;
    };
    meta: {
      finish: "Standard" | "Foil" | "Rainbow";
      product:
        | "Booster"
        | "BoxTopper"
        | "PreconstructedDeck"
        | "Dust"
        | "DraftKit"
        | "WelcomeKit"
        | "Kickstarter"
        | "TeamCovenant"
        | "AlphaInvestments"
        | "StarCityGames"
        | "OrganizedPlay";
      typeline: string;
      flavor: string | null;
      artist: { name: string; slug: string };
      back: {
        finish: "Standard" | "Foil" | "Rainbow";
        product:
          | "Booster"
          | "BoxTopper"
          | "PreconstructedDeck"
          | "Dust"
          | "DraftKit"
          | "WelcomeKit"
          | "Kickstarter"
          | "TeamCovenant"
          | "AlphaInvestments"
          | "StarCityGames"
          | "OrganizedPlay";
        typeline: string;
        flavor: string | null;
        artist: { name: string; slug: string };
      } | null;
    };
  }[];
};