PkmnPrices6 Min. Lesezeit

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.ioPkmnPrices
Basis-URLhttps://api.pokemontcg.io/v2https://api.pkmnprices.com/v1
Schlüssel-HeaderX-Api-Keyx-api-key
Ohne SchlüsselFunktioniert, mit deutlich niedrigeren LimitsNicht möglich; ein kostenloser Schlüssel gibt 500 Credits pro Tag
Karten-IDEin String wie base1-4Eine Ganzzahl
Sucheq=name:charizard subtypes:megaEin Parameter pro Feld: name, set_id, number, rarity und weitere
SeitengrößepageSize, bis 250per_page, bis 100
Seiteninfocount, totalCountEin pagination-Objekt mit total und total_pages
Felder wählenselect=id,nameNicht verfügbar; jede Antwort hat eine feste Form
PreiseIn jeder KarteNicht 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.

bash
# pokemontcg.io
curl -H "X-Api-Key: $PTCG_KEY" \
"https://api.pokemontcg.io/v2/cards?q=name:charizard&pageSize=3"
# PkmnPrices
curl -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 qPkmnPrices
name:charizardname=charizard, eine Teilstring-Suche
set.id:base1set_id=1, die numerische ID aus GET /v1/sets?name=Base Set
number:4number=4; führende Nullen werden ignoriert
rarity:"Rare Holo"rarity=Rare Holo, genau so geschrieben wie in den Antworten
types:fireenergy_type=Fire
supertype:pokemoncard_type=Pokemon
subtypes:stage1stage=Stage 1; für andere Untertypen gibt es keinen Filter
artist:"Mitsuhiro Arita"artist=arita, ein Teilstring ohne Beachtung der Groß- und Kleinschreibung
hp:120hp=120; nur exakte Werte, keine Bereiche
orderBy=-set.releaseDatesort=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.

js
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:

json
{
"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:

js
// 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, high und directLow werden nicht zurückgegeben. Jede Zeile hat einen market_price.
  • Die Cardmarket-Durchschnitte und -Trends (trendPrice, avg1, avg7, avg30 und die übrigen) werden nicht zurückgegeben. Der market_price einer 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:

  • legalities und regulationMark
  • supertype und subtypes (es gibt nur card_type und stage)
  • rules, evolvesFrom, evolvesTo und nationalPokedexNumbers
  • ancientTrait sowie 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 ptcgoCode eines Sets: ein Set hat id, name, language und card_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.
PkmnPrices

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.