# Pricing API research spike — 2026-09-15 Status: MTG OK (Scryfall `prices.usd` → `current_price`/`market_price`). Lorcana / Pokémon were showing $0.00 because import jobs didn't map price fields. ## Sources verified | Game | Source | Endpoint | Free? | Auth | Price fields | Status | |---|---|---|---|---|---|---| | MTG | Scryfall | `api.scryfall.com/cards/{id}` | ✅ | None | `prices.usd`, `usd_foil` | Working (`lib/card-import/mtg.js`) | | Lorcana | **Lorcast** | `api.lorcast.com/v0/cards/search?q=NAME+set:CODE` | ✅ | None | `prices.usd`, `prices.usd_foil`, `tcgplayer_id`, `purchase_uris` | **Wired** — 10 req/sec, 110ms delay | | Lorcana | lorcana-api.com | `api.lorcana-api.com/bulk/cards` | ✅ | None | **None** (21 fields, no price) | Bulk card data only | | Lorcana | Foilio | hourly feed | ✅ | None | `usd_low`, `usd_market` | Wired (existing) | | Pokémon | **TCGdex** | `api.tcgdex.net/v2/en/cards/{localId}` | ✅ | None | `pricing.tcgplayer.*` (low/mid/market USD) + Cardmarket EUR | **Wired** — `lib/pricing/tcgdex-client.js` | ## Sources checked and rejected / paid | Source | Game | Verdict | |---|---|---| | TCGplayer API | All | Paid / locked down (no new dev keys) | | `lorcana-prices.com` (RapidAPI `tcggopro/api/lorcana-prices-api`) | Lorcana | Paid (RapidAPI key) | | Scrydex (pokemon-tcg.io → acquired) | Pokémon | Paid API | | TCG API (`tcgapi.dev`) | 54 games | Free tier 100 req/day; needs account | | poketrace.com | Pokémon | No working API endpoint found | | tcgdex.dev (docs site) | Pokémon | SPA docs; actual API is `api.tcgdex.net` | ## Wiring summary - **Lorcana** (`lib/card-import/lorcana-bulk.js`): - Bulk card data from `lorcana-api.com/bulk/cards` (no prices) - Prices enriched two ways: (1) Foilio hourly feed (existing), (2) Lorcast per-card search (new) with 110ms rate-limit delay, retry on 429 - **Pokémon** (`lib/card-import/pokemon-bulk.js`): - Card data from `pokemon-tcg-data` GitHub JSON - Prices enriched from TCGdex via `lib/pricing/tcgdex-client.js` (TCGPlayer USD primary, Cardmarket EUR fallback)