Von pokemontcg.io zu PkmnPrices wechseln
Die Schlüssel von pokemontcg.io funktionieren bis zum 1. März 2027. Wie seine Anfragen und Antworten auf PkmnPrices abgebildet werden, der Code für Kartenabfrage und Preise, und welche Felder du verlierst.
Die Pokémon TCG API unter pokemontcg.io ist veraltet. Laut ihrer
Dokumentation sind neue Registrierungen
geschlossen, und „existing API keys will continue to function through
March 1, 2027“. Wenn deine App api.pokemontcg.io aufruft, ist das deine Frist.
Dieser Beitrag ist der Code-Teil des Umzugs: wie eine Anfrage an pokemontcg.io
auf unsere abgebildet wird, ein paar Zeilen, die das tcgplayer.prices-Objekt
nachbauen, das dein Code vermutlich liest, und die Kartenfelder ohne
Entsprechung. Wir betreiben PkmnPrices, bewerte den Rat also entsprechend.
Wenn du den vollständigen Kartentext und Legalitätsdaten brauchst, behandelt
der Vergleichsbeitrag Scrydex, worauf
pokemontcg.io verweist. Alle Angaben zu pokemontcg.io wurden am 26. Oktober
2026 anhand der Dokumentation geprüft.
Was sich ändert
| pokemontcg.io | PkmnPrices | |
|---|---|---|
| Basis-URL | https://api.pokemontcg.io/v2 | https://api.pkmnprices.com/v1 |
| Schlüssel-Header | X-Api-Key | x-api-key |
| Ohne Schlüssel | Funktioniert, mit deutlich niedrigeren Limits | Nicht möglich; ein kostenloser Schlüssel gibt 500 Credits pro Tag |
| Karten-ID | Ein String wie base1-4 | Eine Ganzzahl |
| Suche | q=name:charizard subtypes:mega | Ein Parameter pro Feld: name, set_id, number, rarity und weitere |
| Seitengröße | pageSize, bis 250 | per_page, bis 100 |
| Seiteninfo | count, totalCount | Ein pagination-Objekt mit total und total_pages |
| Felder wählen | select=id,name | Nicht verfügbar; jede Antwort hat eine feste Form |
| Preise | In jeder Karte | Nicht in Listen; GET /v1/cards/:id liefert ein prices-Array |
Authentifizierung
Erstelle einen Schlüssel im Dashboard. Der kostenlose Tarif braucht
keine Karte. Header-Namen unterscheiden nicht zwischen Groß- und Kleinschreibung,
Code, der schon X-Api-Key sendet, funktioniert also weiter, sobald er einen
PkmnPrices-Schlüssel enthält.
# pokemontcg.iocurl -H "X-Api-Key: $PTCG_KEY" \"https://api.pokemontcg.io/v2/cards?q=name:charizard&pageSize=3"# PkmnPricescurl -H "x-api-key: $PKMNPRICES_KEY" \"https://api.pkmnprices.com/v1/cards?name=charizard&per_page=3"
Suchen
pokemontcg.io hat eine Abfragesprache in q. Wir haben getrennte Parameter,
jede Bedingung eines q wird also zu einem eigenen Parameter.
pokemontcg.io q | PkmnPrices |
|---|---|
name:charizard | name=charizard, eine Teilstring-Suche |
set.id:base1 | set_id=1, die numerische ID aus GET /v1/sets?name=Base Set |
number:4 | number=4; führende Nullen werden ignoriert |
rarity:"Rare Holo" | rarity=Rare Holo, genau so geschrieben wie in den Antworten |
types:fire | energy_type=Fire |
supertype:pokemon | card_type=Pokemon |
subtypes:stage1 | stage=Stage 1; für andere Untertypen gibt es keinen Filter |
artist:"Mitsuhiro Arita" | artist=arita, ein Teilstring ohne Beachtung der Groß- und Kleinschreibung |
hp:120 | hp=120; nur exakte Werte, keine Bereiche |
orderBy=-set.releaseDate | sort=price_asc oder price_desc, und nur mit einem Preisfilter |
Dieselbe Karte finden
Eine ID bei pokemontcg.io ist ein Set-Code und eine Nummer, base1-4. Unsere ist
eine Ganzzahl ohne Bezug dazu. Suche das Set also einmal über den Namen und
behalte das Ergebnis.
const API = "https://api.pkmnprices.com/v1";const get = async (path, params = {}) => {const url = new URL(API + path);for (const [key, value] of Object.entries(params)) {if (value !== undefined) url.searchParams.set(key, value);}const res = await fetch(url, { headers: { "x-api-key": process.env.PKMNPRICES_KEY } });if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);return res.json();};// pokemontcg.io id "base1-4" becomes a set name plus a number here.export const findCard = async (setName, number) => {const sets = await get("/sets", { name: setName });const set = sets.data.find((s) => s.name === setName);if (!set) throw new Error(`no set called ${setName}`);const cards = await get("/cards", { set_id: set.id, number });if (cards.data.length === 0) throw new Error(`no card ${number} in ${setName}`);// The list has no prices; the single-card call does.return get(`/cards/${cards.data[0].id}`);};
Die zurückgegebene Karte enthält ihre Preise. Der Listenaufruf in der Mitte tut das nicht, deshalb ist die letzte Zeile eine zweite Anfrage.
Preise
pokemontcg.io schachtelt Preise unter Marktplatz und Druckvariante:
card.tcgplayer.prices.holofoil.market. Bei uns sind es Zeilen in einem
prices-Array, eine pro Quelle, Zustand und Druckvariante:
{"source": "tcgplayer","currency": "USD","condition": "Near Mint","variant": "Holofoil","market_price": 412.5}
Das baut das Objekt nach, das dein Code schon liest, für die drei Varianten, die die meisten Apps nutzen:
// card.tcgplayer.prices.holofoil.market, rebuilt from the prices array.const VARIANT_KEY = {Normal: "normal",Holofoil: "holofoil","Reverse Holofoil": "reverseHolofoil",};export const tcgplayerPrices = (card) => {const prices = {};for (const row of card.prices) {if (row.source !== "tcgplayer" || row.condition !== "Near Mint") continue;const key = VARIANT_KEY[row.variant];if (key) prices[key] = { market: row.market_price };}return prices;};
Manche Felder gibt es nicht mehr:
low,mid,highunddirectLowwerden nicht zurückgegeben. Jede Zeile hat einenmarket_price.- Die Cardmarket-Durchschnitte und -Trends (
trendPrice,avg1,avg7,avg30und die übrigen) werden nicht zurückgegeben. Dermarket_priceeiner Cardmarket-Zeile ist das niedrigste vertrauenswürdige aktuelle Angebot für diesen Zustand und diese Variante, in EUR, ab Pro. - Erstauflagen erscheinen als eigene Varianten. Lies die Variantenbezeichnungen in einer echten Antwort, bevor du sie zuordnest.
Dafür bekommst du einen Preis für jeden Zustand statt nur für Near Mint, einen täglichen Preisverlauf von bis zu einem Jahr, die aktuellen Angebote von TCGplayer und Cardmarket sowie eBay-Verkäufe. Die Dokumentation beschreibt jeden Teil.
Was du nicht findest
Unsere Karten enthalten die Felder, die eine Preis-App braucht, und lassen den vollständigen Regeltext weg. Dafür gibt es keine Entsprechung:
legalitiesundregulationMarksupertypeundsubtypes(es gibt nurcard_typeundstage)rules,evolvesFrom,evolvesToundnationalPokedexNumbersancientTraitsowie Fähigkeiten und Angriffe als strukturierte Objekte: bei uns sind es Texte- Kleine und große Bilder: es gibt ein
image_url - Serie, Erscheinungsdatum und
ptcgoCodeeines Sets: ein Set hatid,name,languageundcard_count
Wenn deine App das braucht, behalte dafür eine lokale Kopie und nutze die API für Preise. Die historischen JSON-Daten im pokemon-tcg-data-Repository lassen sich weiterhin klonen, auch wenn seine README es als Legacy bezeichnet und sagt, das Projekt werde eingestellt. Scrydex hat die vollständige Kartendatenbank übernommen.
Credits und Seitenabruf
Ein Credit ist ein zurückgegebener Eintrag. Eine Seite mit 100 Karten kostet 100 Credits, und die Liste hat keine Preise, jede Preisabfrage kostet also einen weiteren Credit. Pro erlaubt 20.000 Credits pro Tag.
Eine App, die alle Karten spiegelt, passt nicht in einen Tag. Es gibt mehr als 80.000 Karten, alle einmal aufzulisten kostet also etwa so viele Credits: verteile es auf ein paar Tage und behalte die IDs. Für Preise des gesamten Katalogs liefert der Katalog-Export des Scale-Tarifs jeden aktuellen Preis als eine Datei, und ein Download kostet keine Credits.
Umziehen ohne Stichtag
Lass pokemontcg.io bis März weiterlaufen. Hole dir einen kostenlosen Schlüssel und führe ein paar Abfragen mit dem Code oben neben deinen bisherigen Aufrufen aus, damit du die Zahlen vergleichen kannst. Speichere unsere Karten-ID neben deiner. Stelle dann das Lesen um und lass den alten Schlüssel stehen, bis du sicher bist. Die Seite Tarife zeigt, was jeder Tarif enthält.
- Wann hören die Schlüssel von pokemontcg.io auf zu funktionieren?
- Laut Dokumentation funktionieren bestehende Schlüssel bis zum 1. März 2027. Neue Registrierungen sind schon geschlossen.
- Kann ich meinen pokemontcg.io-Schlüssel mit PkmnPrices verwenden?
- Nein. Erstelle einen PkmnPrices-Schlüssel im Dashboard. Der kostenlose Tarif gibt 500 Credits pro Tag und braucht keine Karte.
- Liefert PkmnPrices Legalitäts- oder Rotationsdaten?
- Nein. Karten enthalten Preise, Attribute wie Stufe, Typ, KP, Schwäche und Angriffstext sowie ein Bild, aber keine Legalitäten oder Regelmarken. Behalte dafür eine lokale Kopie.
- Gibt es ein SDK?
- Ja, offizielle SDKs für JavaScript und Python. Die SDK-Seite in der Dokumentation zeigt beide.

Geschrieben von
PkmnPrices
PkmnPrices ist eine Entwickler-API für Daten zum Pokémon TCG: tägliche TCGPlayer-Preise für über 80.000 Karten, über 800 Sets und Sealed-Produkte.