Cards Realm API
Getting started
A read-only JSON API over the same data that powers the site: cards, decks, tournaments and player results.
No API key. Every endpoint is public and needs no authentication, no token and no sign-up.
GET or POST, and the parameters can travel in the query string or in the body. See Sending parameters below.
https://cardsrealm.com/en-za/api/
The language segment is part of the path and decides the language of card names and other translated text. Any locale the site serves works.
Choosing the game. Two ways, and they do the same thing: call the game's own subdomain, or pass the game_id parameter. Without either, you get the game of the domain you called.
curl "https://cardsrealm.com/en-us/api/getRecentDecks?game_id=1&limit=2"
Sending parameters
Every endpoint answers both GET and POST, and reads its parameters from whichever of these you find easiest. There is no difference in the answer.
| How you send it | Content-Type |
|---|---|
| Query string (GET or POST) | — |
| Simple form | application/x-www-form-urlencoded |
| Multipart form | multipart/form-data |
| JSON | application/json |
curl "https://cardsrealm.com/en-za/api/getRecentDecks?game_id=1&limit=2"
curl -X POST "https://cardsrealm.com/en-za/api/getRecentDecks" \
-d "game_id=1" -d "limit=2"
curl -X POST "https://cardsrealm.com/en-za/api/getRecentDecks" \
-H "Content-Type: application/json" \
-d '{"game_id": 1, "limit": 2}'{
"error": "Could not read the fields in the request body. Send them as form-data, x-www-form-urlencoded or JSON.",
"hint": "If you use Postman or Insomnia, delete the Content-Type header and let the tool generate it."
}cardinfo
Everything the site knows about one card, found by name: text, mana cost, rarity, printings and current prices.
| Parameter | Type | Default | Notes |
|---|---|---|---|
cardname | string | Path to exile | Up to 50 characters. |
currency | string | currency of the locale | Three letters. |
game_id | int | game of the domain | 1 = Magic, 2 = Yu-Gi-Oh, 3 = Pokémon, 4 = Runeterra. |
language_code | string | language of the path | Language of the returned card name and text. |
curl "https://cardsrealm.com/en-za/api/cardinfo?cardname=Lightning%20Bolt¤cy=USD"
{
"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
The most recently published decks, newest first.
| Parameter | Type | Default | Notes |
|---|---|---|---|
page | int | 1 | Page number. |
limit | int | 50 | Decks per page. 500 is the ceiling; above it the call returns an error. |
game_id | int | 1 | Same as in cardinfo. |
curl "https://cardsrealm.com/en-za/api/getRecentDecks?page=1&limit=2"
[
{
"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
One decklist in full. The card list comes under the cards key, with quantity, board (main or side) and price per card.
| Parameter | Type | Default | Notes |
|---|---|---|---|
deck_id | int | 0 | The numeric id of the deck. |
currency | string | BRL | Three letters. |
curl "https://cardsrealm.com/en-za/api/getDeckByID?deck_id=374859¤cy=USD"
{
"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
}
]
}getDeckResults
How an archetype has been performing: overall record, plus a by_meta breakdown of its results against each other archetype.
| Parameter | Type | Default | Notes |
|---|---|---|---|
deck_name | string | empty | Archetype name, up to 40 characters. |
week | int | 4 | How many weeks back. 52 is the ceiling. |
format | string | Standard | Up to 20 characters. |
game_id | int | 1 | Same as in cardinfo. |
curl "https://cardsrealm.com/en-za/api/getDeckResults?deck_name=Grixis%20Affinity&format=Pauper&week=8"
getPlayerResults
A player's record, with a by_meta breakdown of how they did with each archetype.
| Parameter | Type | Default | Notes |
|---|---|---|---|
player_name | string | empty | Up to 40 characters. |
week | int | 52 | How many weeks back. |
player_platform | string | cardsrealm_nickname | Which name you are searching by. One of cardsrealm_nickname, mtgo, arena, riot or display. Anything else returns an error. |
curl "https://cardsrealm.com/en-za/api/getPlayerResults?player_name=Carrubs&player_platform=mtgo"
getPastTournaments
Tournaments that already happened, most recent first.
| Parameter | Type | Default | Notes |
|---|---|---|---|
page | int | 1 | Page number. |
format | string | empty | Up to 20 characters. Empty means every format. |
game_id | int | 1 | Same as in cardinfo. |
curl "https://cardsrealm.com/en-za/api/getPastTournaments?format=Pauper&page=1"
[
{
"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
One tournament in full: the event, its rounds under round_info, and the final table under standings. An id that does not exist returns an empty list, not an error.
| Parameter | Type | Default | Notes |
|---|---|---|---|
tournament_id | int | 1 | The numeric id of the tournament. |
curl "https://cardsrealm.com/en-za/api/getTournamentInfo?tournament_id=810845"
getUserTournaments
The tournaments organised by one account.
| Parameter | Type | Default | Notes |
|---|---|---|---|
nickname | string | Cards Realm | Up to 30 characters. |
curl "https://cardsrealm.com/en-za/api/getUserTournaments?nickname=leon-diniz"
Errors and support
| Code | Meaning |
|---|---|
200 | Success. The body is always JSON. |
400 | The call was rejected: a name that is too long, a number that is not a number, a value outside the accepted list, or a body that could not be read. |
500 | Something broke on our side. Worth telling us about. |
A rejected call answers 400 with an object. invalid_fields names the parameters worth looking at, and is absent when the problem is not a specific field.
{
"error": "Week needs to be a number",
"invalid_fields": ["week"]
}Questions, or a field you need that is not here? Talk to us on the Discord. Discord