[
  {
    "id": "cardmarket-priceguide",
    "name": "Cardmarket price guide & product catalog (bulk files)",
    "domain": "downloads.s3.cardmarket.com",
    "country": "DE",
    "supportedCountries": ["DE", "FR", "IT", "ES", "NL", "AT", "BE", "PL", "PT", "CH", "GB", "EU"],
    "languages": ["en"],
    "sourceType": "pricing_guide",
    "categories": ["magic_the_gathering", "yugioh", "pokemon", "final_fantasy_tcg", "weiss_schwarz", "dragon_ball_tcg", "flesh_and_blood", "digimon_tcg", "one_piece_card_game", "disney_lorcana", "star_wars_tcg", "other_tcg"],
    "subcategories": ["singles", "sealed"],
    "api": { "available": true, "docsUrl": "https://www.cardmarket.com/en/Magic/Data/Price-Guide", "auth": "none", "notes": "Public S3 bulk JSON: productCatalog/priceGuide/price_guide_<idGame>.json (avg/low/trend/avg1/avg7/avg30 + -foil, EUR, createdAt) and productCatalog/productList/products_singles_<idGame>.json / products_nonsingles_<idGame>.json. Game ids probed live 1–30: 1,2,3,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22 exist (403 otherwise). No expansion-name file exists (probed several paths → 403)." },
    "urls": { "search": null, "product": "https://downloads.s3.cardmarket.com/productCatalog/productList/products_singles_1.json", "sold": null, "sitemap": null, "robots": "https://downloads.s3.cardmarket.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": false, "auctionResults": false, "historical": "none", "images": false, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": true },
    "access": { "pagination": "bulk_file", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "Bucket returns S3 AccessDenied for /robots.txt (no robots file); files are world-readable. Storefront cardmarket.com is Cloudflare-protected and not touched.", "rateLimit": "≤ 3 files per game per day, 2 s apart", "preferredEngine": "api" },
    "currency": ["EUR"],
    "freshness": "daily",
    "priority": "wave1",
    "difficulty": "easy",
    "reliability": 0.85,
    "legal": "Files are published by Cardmarket for public download without authentication; guide values are aggregate statistics (not personal data). Attribution kept via sourceUrl. Storefront ToS not implicated because no site page is fetched.",
    "status": "implemented",
    "connectors": ["cardmarket-priceguide"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Wave-1. idProduct = identifiers.cardmarket_id (same key MTGJSON emits for mcmId → entity resolution links). Foil rows → variant Foil (Reverse Holo for Pokémon)."
  },
  {
    "id": "cardmarket",
    "name": "Cardmarket storefront (cardmarket.com)",
    "domain": "cardmarket.com",
    "country": "DE",
    "supportedCountries": ["EU"],
    "languages": ["en", "de", "fr", "es", "it"],
    "sourceType": "marketplace",
    "categories": ["magic_the_gathering", "pokemon", "yugioh", "one_piece_card_game", "disney_lorcana", "other_tcg"],
    "api": { "available": false, "docsUrl": null, "auth": "partner", "notes": "The former MKM API (OAuth 1.0a) was closed to new applications; product/price data is instead published as the public bulk files (see cardmarket-priceguide)." },
    "urls": { "search": "https://www.cardmarket.com/en/Magic/Products/Search", "product": null, "sold": null, "sitemap": null, "robots": "https://www.cardmarket.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "images": true, "seller": true, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": true },
    "access": { "pagination": "page_number", "jsRendering": true, "antiBot": "blocking", "cloudflare": true, "robots": "Not evaluated further: the site answers 403 (Cloudflare) to the honest bot UA even on help pages.", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["EUR"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "very_hard",
    "reliability": 0.5,
    "legal": "Cloudflare-protected storefront; per SPEC §36 we do not attempt to defeat it. Individual seller offers are personal data of private sellers.",
    "status": "blocked",
    "connectors": [],
    "statusReason": "Cloudflare challenge on every page (403 to bots); deliberately not crawled. Price/catalog needs are covered by the public bulk files (cardmarket-priceguide).",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "limitless-tcg",
    "name": "Limitless TCG card database",
    "domain": "limitlesstcg.com",
    "country": "DE",
    "supportedCountries": ["US", "EU", "JP"],
    "languages": ["en", "ja"],
    "sourceType": "collector_database",
    "categories": ["pokemon"],
    "subcategories": ["english sets", "japanese sets"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "No documented API (/api/cards → 404). The card page loads /api/cards/<cardId>/prices (daily [epoch ms, cents] history for TCGplayer USD and Cardmarket EUR); set pages accept ?display=list for a full table." },
    "urls": { "search": "https://limitlesstcg.com/cards", "product": "https://limitlesstcg.com/cards/MEG/1", "sold": null, "sitemap": null, "robots": "https://limitlesstcg.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": false, "auctionResults": false, "historical": "years", "images": true, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": true },
    "access": { "pagination": "none", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "User-agent: * / Disallow: (empty) — everything allowed.", "rateLimit": "self-imposed 1 req / 1.5 s", "preferredEngine": "api" },
    "currency": ["USD", "EUR"],
    "freshness": "daily",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.7,
    "legal": "Public card database; prices are third-party (TCGplayer/Cardmarket) values relayed by Limitless and stored with provider metadata at reduced confidence. No decklists/tournament/player data fetched.",
    "status": "implemented",
    "connectors": ["limitless-tcg"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Sister databases onepiece.limitlesstcg.com (HTTP 500), lorcana./riftbound.limitlesstcg.com (DNS failure) were unreachable at research time."
  },
  {
    "id": "pokellector",
    "name": "Pokellector",
    "domain": "pokellector.com",
    "country": "US",
    "supportedCountries": ["US", "JP"],
    "languages": ["en"],
    "sourceType": "collector_database",
    "categories": ["pokemon"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Terms: 'Pokellector does not offer an API to interact with the data we store.'" },
    "urls": { "search": "https://www.pokellector.com/sets", "product": "https://www.pokellector.com/Base-Set-Expansion/Charizard-Card-4", "sold": null, "sitemap": null, "robots": "https://www.pokellector.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": false, "auctionResults": false, "historical": "none", "images": true, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": true },
    "access": { "pagination": "none", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "No robots.txt (404); pages are plain HTML and technically reachable.", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "daily",
    "priority": "later",
    "difficulty": "easy",
    "reliability": 0.7,
    "legal": "https://www.pokellector.com/terms — 'You agree not to use automated means to interact with the data we store without written permission. This includes, but isn't limited to, retrieving prices, images and managing collections.'",
    "status": "blocked",
    "connectors": [],
    "statusReason": "Terms of Use explicitly prohibit automated retrieval of their data (prices, images) without written permission → not crawled (SPEC §36). Their prices are TCGplayer relays anyway (covered by tcgcsv/limitless-tcg).",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Would need written permission from Pokellector to proceed."
  },
  {
    "id": "yuyu-tei",
    "name": "Yuyu-tei (遊々亭)",
    "domain": "yuyu-tei.jp",
    "country": "JP",
    "supportedCountries": ["JP"],
    "languages": ["ja"],
    "sourceType": "dealer",
    "categories": ["pokemon", "one_piece_card_game", "yugioh", "weiss_schwarz", "digimon_tcg", "other_tcg"],
    "subcategories": ["singles"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Server-rendered HTML; /top/<game> lists expansion codes (vers[] checkboxes), /sell/<game>/s/<ver> lists every single of an expansion with JPY price and stock." },
    "urls": { "search": "https://yuyu-tei.jp/top/poc", "product": "https://yuyu-tei.jp/sell/poc/s/m06", "sold": null, "sitemap": "https://yuyu-tei.jp/ext/sitemap/yuyutei/index.xml", "robots": "https://yuyu-tei.jp/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "images": true, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": true },
    "access": { "pagination": "none", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "Only Crawl-delay entries for Slurp (1), serpstatbot (20), bingbot (10), AhrefsBot (10); nothing disallowed. Listed sitemap returns 404.", "rateLimit": "self-imposed 1 req / 4 s", "preferredEngine": "api" },
    "currency": ["JPY"],
    "freshness": "daily",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.8,
    "legal": "Shop asking prices of a retailer (no personal data). Buy-list prices and damaged-card pages deliberately not fetched.",
    "status": "implemented",
    "connectors": ["yuyu-tei"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Games: poc opc ygo ws digi dm ua vg bs gcg (also yrd, wsr, chaos, pm, re, hocg, zx, wx, lo, fe, sev, xs, gab, ei available)."
  },
  {
    "id": "hareruya",
    "name": "Hareruya (晴れる屋)",
    "domain": "hareruyamtg.com",
    "country": "JP",
    "supportedCountries": ["JP"],
    "languages": ["en", "ja"],
    "sourceType": "dealer",
    "categories": ["magic_the_gathering"],
    "subcategories": ["singles"],
    "api": { "available": true, "docsUrl": null, "auth": "none", "notes": "Undocumented but public JSON endpoint used by the storefront: GET /en/products/search/unisearch_api?fq.category_id=1&fq.cardset=<id>&fq.price=1~*&rows=60&page=n → response.numFound/docs (product, product_name_en, card_name, language code, price JPY, foil_flg, stock, weekly_sales, product_class, card_condition). Verified live (Black Lotus query: 73 docs)." },
    "urls": { "search": "https://www.hareruyamtg.com/en/products/search", "product": "https://www.hareruyamtg.com/en/products/detail/1282?lang=EN", "sold": null, "sitemap": "https://www.hareruyamtg.com/sitemap.xml", "robots": "https://www.hareruyamtg.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "images": true, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": false },
    "access": { "pagination": "page_number", "jsRendering": true, "antiBot": "none", "cloudflare": false, "robots": "Allow: / ; Disallow: /en/products/search?*page=* , *sort=* , *order=* (HTML result pages), /*.csv$, /news/, deck downloads, purchase forwards. The JSON endpoint path /en/products/search/unisearch_api is not covered by any rule and is what the page itself calls.", "rateLimit": "site caps a query at 4 000 results; self-imposed 1 req / 4 s", "preferredEngine": "api" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "medium",
    "reliability": 0.8,
    "legal": "Retailer asking prices, no personal data. HTML search result pages with page/sort/order (robots-disallowed) are never requested.",
    "status": "implemented",
    "connectors": ["hareruya"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Condition is exposed only as a numeric code (card_condition 1/2/…) → kept in metadata, never mapped. weekly_sales per offer is a useful velocity signal (metadata)."
  },
  {
    "id": "magi",
    "name": "magi (magi.camp)",
    "domain": "magi.camp",
    "country": "JP",
    "supportedCountries": ["JP"],
    "languages": ["ja"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "yugioh", "magic_the_gathering", "one_piece_card_game", "other_tcg"],
    "subcategories": ["graded singles", "sealed"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Server-rendered Rails pages. /series/<id>/items?page=n browse lists (96/page, SOLD marker), /items/<id> with schema.org Product JSON-LD (offers.availability InStock/OutOfStock). /products/<id> pages show current offers per card model." },
    "urls": { "search": "https://magi.camp/series/31/items", "product": "https://magi.camp/items/449165794", "sold": null, "sitemap": null, "robots": "https://magi.camp/robots.txt" },
    "data": { "liveListings": true, "soldResults": true, "auctionResults": false, "historical": "none", "images": true, "seller": true, "saleDate": false, "realizedPrice": false, "fees": false, "grading": true, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": false },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "User-Agent: * Disallow: (all allowed). /items/search and /products/search disallowed for ClaudeBot/GPTBot/CCBot/PerplexityBot/Amazonbot/Bytespider/meta-externalagent etc. (site comment: 59 % of search load came from AI crawlers) — we never call the search endpoints.", "rateLimit": "self-imposed 1 req / 4 s", "preferredEngine": "api" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "medium",
    "reliability": 0.65,
    "legal": "C2C marketplace: seller usernames/profiles are personal data → never stored (only 'certified seller' boolean). Sold items carry no sale date → emitted as listings with availability sold, never as sales (§192).",
    "status": "implemented",
    "connectors": ["magi"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Series ids: 31 Pokémon, 34 Yu-Gi-Oh!, 32 Magic, 20 Duel Masters, 100148 One Piece (+ sealed sub-series 1005xx)."
  },
  {
    "id": "cardrush",
    "name": "Cardrush (カードラッシュ) stores",
    "domain": "cardrush-mtg.jp",
    "country": "JP",
    "supportedCountries": ["JP"],
    "languages": ["ja"],
    "sourceType": "dealer",
    "categories": ["magic_the_gathering", "one_piece_card_game", "yugioh", "digimon_tcg", "pokemon", "other_tcg"],
    "subcategories": ["singles", "graded singles", "sealed"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Same shop platform on six domains: cardrush-mtg.jp, cardrush-op.jp, cardrush.jp (YGO), cardrush-dm.jp, cardrush-digimon.jp (plain HTTP 200) and cardrush-pokemon.jp (Cloudflare managed challenge → 403 to non-browsers; Scrapfly ASP country=jp passes at ~25 credits/page). product-list/<id>?page=n, 100 items/page, .item_data blocks." },
    "urls": { "search": "https://www.cardrush-mtg.jp/category", "product": "https://www.cardrush-mtg.jp/product-list/100", "sold": null, "sitemap": null, "robots": "https://www.cardrush-mtg.jp/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "images": true, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": true, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": false },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "medium", "cloudflare": true, "robots": "All stores: Disallow / only for GPTBot, Bytespider, TikTokSpider, meta-externalagent. Pokémon store adds Cloudflare 'Content-Signal: search=yes, ai-train=no, use=reference' with Allow: / for *, plus Disallow for Amazonbot/Applebot-Extended/CCBot/ClaudeBot/GPTBot/Google-Extended/meta-externalagent.", "rateLimit": "self-imposed 1 req / 4 s (8 s + Scrapfly on the Pokémon store)", "preferredEngine": "api" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "medium",
    "reliability": 0.8,
    "legal": "Retailer asking prices, no personal data. Pokémon store is public but Cloudflare-fronted: fetched via Scrapfly ASP within its robots allowance (search=yes), capped to 1 page/category/run for cost.",
    "status": "implemented",
    "connectors": ["cardrush"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "cardrush-onepiece.jp / cardrush-yugioh.jp / cardrush-ws.jp do not resolve (DNS)."
  },
  {
    "id": "tcdb",
    "name": "TCDB – Trading Card Database",
    "domain": "tcdb.com",
    "country": "US",
    "supportedCountries": ["US"],
    "languages": ["en"],
    "sourceType": "collector_database",
    "categories": ["sports_cards", "non_sport_cards", "trading_cards"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": "https://www.tcdb.com", "product": null, "sold": null, "sitemap": null, "robots": "https://www.tcdb.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": false, "auctionResults": false, "historical": "none", "images": true, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": true },
    "access": { "pagination": "page_number", "jsRendering": true, "antiBot": "blocking", "cloudflare": true, "robots": "Cannot be read: /robots.txt itself returns a Cloudflare managed challenge (HTTP 403, 'Just a moment…', noindex).", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "unknown",
    "priority": "later",
    "difficulty": "very_hard",
    "reliability": 0.5,
    "legal": "Community checklist database protected by a Cloudflare challenge on every path; terms could not be retrieved by a bot. Not circumvented (SPEC §36).",
    "status": "blocked",
    "connectors": [],
    "statusReason": "Cloudflare managed challenge on all paths including robots.txt (HTTP 403); no lawful automated access path — not crawled.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "cardtrader",
    "name": "CardTrader",
    "domain": "cardtrader.com",
    "country": "IT",
    "supportedCountries": ["IT", "EU", "US"],
    "languages": ["en", "it", "es"],
    "sourceType": "marketplace",
    "categories": ["magic_the_gathering", "pokemon", "yugioh", "one_piece_card_game", "disney_lorcana", "flesh_and_blood", "digimon_tcg", "dragon_ball_tcg", "star_wars_tcg", "other_tcg"],
    "subcategories": ["singles", "sealed"],
    "api": { "available": true, "docsUrl": "https://www.cardtrader.com/docs/api/full", "auth": "api_key", "notes": "REST API v2 at https://api.cardtrader.com/api/v2 with `Authorization: Bearer <token>`; token issued to any registered account from its settings. Unauthenticated /games → 401 (verified). Endpoints: /games, /categories, /expansions, /blueprints/export?expansion_id, /marketplace/products?expansion_id|blueprint_id (25 cheapest offers per blueprint; 10 req/s), global 200 req/10 s." },
    "urls": { "search": "https://api.cardtrader.com/api/v2/marketplace/products?expansion_id=", "product": "https://api.cardtrader.com/api/v2/blueprints/export?expansion_id=", "sold": null, "sitemap": "https://www.cardtrader.com/sitemaps/en/blueprint_products.xml.gz", "robots": "https://www.cardtrader.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "images": true, "seller": true, "saleDate": false, "realizedPrice": false, "fees": false, "grading": true, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": true },
    "access": { "pagination": "none", "jsRendering": false, "antiBot": "none", "cloudflare": true, "robots": "www: Disallow /uploads/ except /uploads/blueprints/; sitemaps published. API host has no robots relevance (authenticated JSON).", "rateLimit": "200 req / 10 s; 10 req/s on marketplace/products", "preferredEngine": "api" },
    "currency": ["EUR", "USD"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.8,
    "legal": "Official API under CardTrader's API terms; read-only endpoints. Private ('normal') sellers' usernames are personal data → not stored.",
    "status": "gated",
    "connectors": ["cardtrader"],
    "statusReason": "Needs CARDTRADER_API_TOKEN (free with a CardTrader account); connector implemented against the documented shapes with fixtures from the docs' example responses.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Blueprints carry scryfall_id, card_market_ids and tcg_player_id → strong entity-resolution bridge between Scryfall/MTGJSON/Cardmarket/TCGplayer ids."
  },
  {
    "id": "mtgstocks",
    "name": "MTGStocks",
    "domain": "mtgstocks.com",
    "country": "US",
    "supportedCountries": ["US"],
    "languages": ["en"],
    "sourceType": "pricing_guide",
    "categories": ["magic_the_gathering"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "api.mtgstocks.com/prints/<id> answers 403 (CloudFront) to the honest bot UA; site robots.txt request returned 202 with no body." },
    "urls": { "search": "https://www.mtgstocks.com", "product": null, "sold": null, "sitemap": null, "robots": "https://www.mtgstocks.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": false, "auctionResults": false, "historical": "years", "images": false, "seller": false, "saleDate": false, "realizedPrice": false, "fees": false, "grading": false, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": false },
    "access": { "pagination": "none", "jsRendering": true, "antiBot": "high", "cloudflare": false, "robots": "Could not be retrieved (HTTP 202 empty body).", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "daily",
    "priority": "later",
    "difficulty": "hard",
    "reliability": 0.6,
    "legal": "Angular SPA fed by a private API that rejects non-browser clients; its prices are TCGplayer/Cardmarket relays already covered by tcgcsv, mtgjson and cardmarket-priceguide.",
    "status": "rejected",
    "connectors": [],
    "statusReason": "Private API blocks bots (403 CloudFront) and the data (TCGplayer/Cardmarket price relays) is redundant with mtgjson, tcgcsv and cardmarket-priceguide.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  }
]
