Erste Schritte

Eine reine Lese-JSON-API auf denselben Daten, die die Website speisen: Karten, Decks, Turniere und Spielerergebnisse.

Kein API-Schlüssel. Jeder Endpunkt ist öffentlich und benötigt weder Authentifizierung noch Token noch Registrierung.

GET oder POST, und die Parameter können im Query-String oder im Body stehen. Siehe Parameter senden, weiter unten.

Basis-URL
https://cardsrealm.com/de-ch/api/

Das Sprachsegment ist Teil des Pfades und bestimmt die Sprache von Kartennamen und anderem übersetzten Text. Jede Locale, die die Seite bedient, funktioniert.

Das Spiel auswählen. Zwei Wege mit demselben Ergebnis: die Subdomain des Spiels aufrufen oder den Parameter game_id übergeben. Ohne beides bekommst du das Spiel der aufgerufenen Domain.

Beispielanfrage
curl "https://cardsrealm.com/en-us/api/getRecentDecks?game_id=1&limit=2"
Preise sind Ganzzahlen in Cent. Ein price von 77 mit currency_prefix $ bedeutet 0,77. Vor der Anzeige durch 100 teilen.
Faire Nutzung. Derzeit wird kein hartes Anfragelimit erzwungen, also bleib vernünftig: cache, was du kannst, und bevorzuge eine paginierte Anfrage gegenüber vielen kleinen. Missbrauch ist es, was aus einer offenen API eine geschlossene macht.

Parameter senden

Jeder Endpunkt antwortet auf GET und POST und liest seine Parameter aus dem Format, das Ihnen am leichtesten fällt. Die Antwort ist dieselbe.

Wie Sie es sendenContent-Type
Query-String (GET oder POST)
Einfaches Formularapplication/x-www-form-urlencoded
Multipart-Formularmultipart/form-data
JSONapplication/json
Derselbe Aufruf, drei Wege
curl "https://cardsrealm.com/de-ch/api/getRecentDecks?game_id=1&limit=2"

curl -X POST "https://cardsrealm.com/de-ch/api/getRecentDecks" \
     -d "game_id=1" -d "limit=2"

curl -X POST "https://cardsrealm.com/de-ch/api/getRecentDecks" \
     -H "Content-Type: application/json" \
     -d '{"game_id": 1, "limit": 2}'
Zahlen dürfen Zahlen sein. In einem Formular kommt jeder Wert als Text an; in JSON dürfen Sie 1 statt "1" senden. Beides wird überall akzeptiert.
Setzen Sie den Content-Type-Header nicht von Hand in Postman, Insomnia oder einer HTTP-Bibliothek. Lassen Sie das Werkzeug ihn schreiben: bei multipart muss es die boundary enthalten, und ein Content-Type, der nicht zum Body passt, lässt jedes Feld leer ankommen. Dann ist die Antwort ein 400 über den Umschlag, nicht über Ihre Felder:
Antwort
{
  "error": "Die Felder im Body der Anfrage konnten nicht gelesen werden. Senden Sie sie als form-data, x-www-form-urlencoded oder JSON.",
  "hint": "Wenn Sie Postman oder Insomnia verwenden, löschen Sie den Content-Type-Header und lassen Sie ihn vom Werkzeug erzeugen."
}
Der Aufruf aus dem Browser ist erlaubt. Eine Seite auf Ihrer eigenen Domain kann sie direkt aus dem Browser aufrufen. Es werden keine Cookies oder Anmeldedaten gelesen.

cardinfo

GET/de-ch/api/cardinfo

Alles, was die Seite über eine Karte weiß, per Name gesucht: Text, Manakosten, Seltenheit, Editionen und aktuelle Preise.

ParameterArtMusterNotizen
cardnamestringPath to exileHöchstens 50 Zeichen.
currencystringWährung der LocaleDrei Buchstaben.
game_idintSpiel der Domain1 = Magic, 2 = Yu-Gi-Oh, 3 = Pokémon, 4 = Runeterra.
language_codestringSprache des PfadesSprache des zurückgegebenen Kartennamens und -textes.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/cardinfo?cardname=Lightning%20Bolt&currency=USD"
Beispielantwort
{
  "name_of_card": "Lightning Bolt",
  "name_ing": "Lightning Bolt",
  "type_of_card": "Instant",
  "text_of_card": "Lightning Bolt deals 3 damage to any target.",
  "price": 77,
  "currency_prefix": "$",
  "path_of_card": "oj7-lightning-bolt",
  "card_url": "https://mtg.cardsrealm.com/en-us/card/lightning-bolt"
}

getRecentDecks

GET/de-ch/api/getRecentDecks

Die zuletzt veröffentlichten Decks, neueste zuerst.

ParameterArtMusterNotizen
pageint1Seitenzahl.
limitint50Decks pro Seite. Die Obergrenze ist 500; darüber liefert der Aufruf einen Fehler.
game_idint1Wie bei cardinfo.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/getRecentDecks?page=1&limit=2"
Beispielantwort
[
  {
    "deck_id": 374859,
    "deck_title": "Attack of the myrs",
    "deck_owner": "jarrod long",
    "deck_format_name": "Commander",
    "deck_colours": "B G R U W",
    "total_cards": 100,
    "deck_url": "https://cardsrealm.com/decks/en-us/l8dh-attack-of-the-myrs"
  }
]

getDeckByID

GET/de-ch/api/getDeckByID

Eine vollständige Deckliste. Die Kartenliste steht unter dem Schlüssel cards, mit Anzahl, Board (main oder side) und Preis pro Karte.

ParameterArtMusterNotizen
deck_idint0Die numerische id des Decks.
currencystringBRLDrei Buchstaben.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/getDeckByID?deck_id=374859&currency=USD"
Beispielantwort
{
  "deck_title": "Attack of the myrs",
  "user_name": "jarrod long",
  "tour_type_name": "Commander",
  "deck_quantity_main": 99,
  "deck_quantity_side": 1,
  "cards": [
    {
      "name_ing": "Command Tower",
      "deck_quantity": 1,
      "deck_sideboard": 0,
      "card_price_total": 18
    }
  ]
}
Eine nicht existierende deck_id antwortet mit 200 und einem fast leeren Objekt, nicht mit einem Fehler. Prüfe, ob deck_title vorhanden ist, bevor du den Rest verwendest.

getDeckResults

GET/de-ch/api/getDeckResults

Wie sich ein Archetyp schlägt: Gesamtbilanz plus eine by_meta-Aufschlüsselung der Ergebnisse gegen jeden anderen Archetyp.

ParameterArtMusterNotizen
deck_namestringleerName des Archetyps, höchstens 40 Zeichen.
weekint4Wie viele Wochen zurück. Die Obergrenze ist 52.
formatstringStandardHöchstens 20 Zeichen.
game_idint1Wie bei cardinfo.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/getDeckResults?deck_name=Grixis%20Affinity&format=Pauper&week=8"

getPlayerResults

GET/de-ch/api/getPlayerResults

Die Bilanz eines Spielers, mit einer by_meta-Aufschlüsselung nach Archetyp.

ParameterArtMusterNotizen
player_namestringleerHöchstens 40 Zeichen.
weekint52Wie viele Wochen zurück.
player_platformstringcardsrealm_nicknameNach welchem Namen du suchst. Einer von cardsrealm_nickname, mtgo, arena, riot oder display. Alles andere liefert einen Fehler.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/getPlayerResults?player_name=Carrubs&player_platform=mtgo"

getPastTournaments

GET/de-ch/api/getPastTournaments

Bereits ausgetragene Turniere, neueste zuerst.

ParameterArtMusterNotizen
pageint1Seitenzahl.
formatstringleerHöchstens 20 Zeichen. Leer bedeutet alle Formate.
game_idint1Wie bei cardinfo.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/getPastTournaments?format=Pauper&page=1"
Beispielantwort
[
  {
    "tournament_id": 810845,
    "tournament_name": "Domingooouuu Pauper 86",
    "tournament_path": "https://cardsrealm.com/tournament/en-us/1k3c9-domingooouuu-pauper-86",
    "format_name": "Pauper",
    "game_name": "Magic: the Gathering",
    "datetime_utc": "Sun, 16 Aug 2026 16:30:00 GMT"
  }
]

getTournamentInfo

GET/de-ch/api/getTournamentInfo

Ein vollständiges Turnier: das Event, seine Runden unter round_info und die Endtabelle unter standings. Eine nicht existierende id liefert eine leere Liste, keinen Fehler.

ParameterArtMusterNotizen
tournament_idint1Die numerische id des Turniers.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/getTournamentInfo?tournament_id=810845"

getUserTournaments

GET/de-ch/api/getUserTournaments

Die von einem Konto veranstalteten Turniere.

ParameterArtMusterNotizen
nicknamestringCards RealmHöchstens 30 Zeichen.
Beispielanfrage
curl "https://cardsrealm.com/de-ch/api/getUserTournaments?nickname=leon-diniz"

Fehler und Support

CodeBedeutung
200Erfolg. Der Body ist immer JSON.
400Der Aufruf wurde abgelehnt: ein zu langer Name, eine Zahl, die keine ist, ein Wert außerhalb der erlaubten Liste, oder ein Body, der nicht gelesen werden konnte.
500Auf unserer Seite ist etwas kaputtgegangen. Sagen Sie uns Bescheid.

Ein abgelehnter Aufruf antwortet mit 400 und einem Objekt. invalid_fields nennt die Parameter, die es zu prüfen lohnt, und fehlt, wenn das Problem kein bestimmtes Feld ist.

Antwort
{
  "error": "Die Woche muss eine Zahl sein",
  "invalid_fields": ["week"]
}
Das hat sich am 8. September 2026 geändert. Ein abgelehnter Aufruf antwortete früher mit 404 und einem nackten String. Die Meldung ist dieselbe; Status und Umschlag sind es nicht. Änderungsprotokoll

Fragen, oder ein Feld, das du brauchst und das hier fehlt? Sprich uns auf Discord an. Discord