SPB Git forge

spb/rareindex

Public
54commits 1branches 0releases
7.1 MBsize
maindefault branch
10 days agolast push
TypeScript 61.9% HTML 37.2% SQL 0.7%
7.4 KB · 178 lines json
Raw Blame History
1{2  "id": "kanzen-games",3  "displayName": "KanZen Games (Canadian TCG & sports-card store, CAD)",4  "sourceId": "kanzen-games",5  "sourceName": "KanZen Games",6  "sourceType": "dealer",7  "sourceUrl": "https://www.kanzengames.com",8  "module": "api/kanzen-games",9  "enginePriority": [10    "api"11  ],12  "categories": [13    "pokemon",14    "magic_the_gathering",15    "disney_lorcana",16    "other_tcg",17    "digimon_tcg",18    "one_piece_card_game",19    "dragon_ball_tcg",20    "football_cards",21    "basketball_cards",22    "yugioh",23    "weiss_schwarz"24  ],25  "regions": [26    "CA"27  ],28  "languages": [29    "en"30  ],31  "currency": [32    "CAD"33  ],34  "supportsListings": true,35  "supportsSold": false,36  "supportsAuctions": false,37  "supportsImages": true,38  "supportsCatalog": false,39  "supportsPopulation": false,40  "supportsLookup": true,41  "refreshFrequencyMinutes": 720,42  "priority": "medium",43  "trustScore": 0.75,44  "attributionRequired": true,45  "termsUrl": "https://www.kanzengames.com/policies/terms-of-service",46  "accessNotes": "KanZen Games (kanzengames.com) runs on Shopify. The connector reads ONLY the public, unauthenticated storefront JSON that every Shopify shop serves to any visitor: /collections/<handle>/products.json?limit=250&page=N for the 15 configured collections (slabs, graded-card-in-stock, ebay-pokemon-singles, pokemon-tcg-mega-evolution, japanese-sealed, magic-the-gathering, disney-lorcana-singles-1, gundam-singles-all … (+7 more, see config.collections)) and /products/<handle>.json for URL lookups (~63k products; 53k TCG singles, 750 PSA slabs). robots.txt (verified 2026-09-08, User-agent *): standard Shopify rules — Disallow /admin, /cart, /checkout(s), /orders, /account, /services, /sf_*, /cart.js, /recommendations/products, /cdn/wpm/*.js and the filter/sort crawl traps (/collections/*sort_by*, /collections/*+*, /collections/*filter*&*filter*); no Crawl-delay for *. The /collections/<handle>/products.json and /products/<handle>.json paths we read carry none of those patterns and are allowed. Sitemap declared at /sitemap.xml (not needed). Access behaviour: plain HTTP 200 JSON with the honest RareIndexBot UA, no anti-bot challenge, no login, no key. Market pinning: Shopify Markets localises products.json prices by the requester IP as soon as an Accept-Language header is present (observed on Markets-enabled shops: a Canadian crawler receives CAD-converted prices with content-language en-CA while the JSON carries no currency field). Every request therefore sends the public localization=CA cookie — the shop's own home market, exactly what a CA visitor gets — so prices are always the declared CAD (verified 2026-09-08: 30.00 vs 43.00 on a Markets shop). Politeness: 1 request per 1.5 s, concurrency 1 per host (connectors/domains.d/g3-shops-na.json), crawlDepth pages per collection per incremental run, backfill bounded by backfillMaxPages. Data: asking prices in CAD (the shop's declared currency) — these are LISTINGS, never sales (§111); one listing per variant (condition/size/edition), variant SKU kept as identifier, out-of-stock variants kept as 'ended' listings, 0.00-priced placeholders dropped. Dates: published_at only; no fetch time is ever used as a sale date. Third-party grades in titles (PSA/BGS/CGC/ICCS/PMG…) are parsed by parseGradeFromTitle; cert numbers are not extracted. Deliberately NOT fetched: cart/checkout/account/customer endpoints, per-product .js barcode enrichment (fetchBarcodes=false: one extra request per product is not worth it for listings), the whole-shop /products.json, and unmapped collections — deck-box/sleeve/binder collections, \"all products\" umbrella collections, tournament entries. No personal data is collected; seller = the store itself.",47  "enabled": true,48  "schemaVersion": "1.0",49  "acquisitionMethod": "Shopify storefront products.json",50  "historicalDepth": "none",51  "requires": [],52  "config": {53    "currency": "CAD",54    "market": "CA",55    "seller": "KanZen Games",56    "location": "Toronto, ON, Canada",57    "collections": [58      {59        "handle": "slabs",60        "categorySlug": "pokemon",61        "franchise": "Pokémon"62      },63      {64        "handle": "graded-card-in-stock",65        "categorySlug": "pokemon",66        "franchise": "Pokémon"67      },68      {69        "handle": "ebay-pokemon-singles",70        "categorySlug": "pokemon",71        "franchise": "Pokémon"72      },73      {74        "handle": "pokemon-tcg-mega-evolution",75        "categorySlug": "pokemon",76        "franchise": "Pokémon"77      },78      {79        "handle": "japanese-sealed",80        "categorySlug": "pokemon",81        "franchise": "Pokémon"82      },83      {84        "handle": "magic-the-gathering",85        "categorySlug": "magic_the_gathering",86        "franchise": "Magic: The Gathering"87      },88      {89        "handle": "disney-lorcana-singles-1",90        "categorySlug": "disney_lorcana",91        "franchise": "Disney Lorcana"92      },93      {94        "handle": "gundam-singles-all",95        "categorySlug": "other_tcg",96        "franchise": "Gundam Card Game"97      },98      {99        "handle": "digimon-single",100        "categorySlug": "digimon_tcg",101        "franchise": "Digimon"102      },103      {104        "handle": "digimon-sealed",105        "categorySlug": "digimon_tcg",106        "franchise": "Digimon"107      },108      {109        "handle": "one-piece-tcg-singles-all",110        "categorySlug": "one_piece_card_game",111        "franchise": "One Piece"112      },113      {114        "handle": "dragon-ball-tcg",115        "categorySlug": "dragon_ball_tcg",116        "franchise": "Dragon Ball Super"117      },118      {119        "handle": "hololive-tcg-sealed",120        "categorySlug": "other_tcg",121        "franchise": "hololive"122      },123      {124        "handle": "football-sealed",125        "categorySlug": "football_cards"126      },127      {128        "handle": "basketball-sealed-all",129        "categorySlug": "basketball_cards"130      }131    ],132    "rules": [133      {134        "match": "\\bone piece\\b|\\bOP\\d{2}\\b",135        "categorySlug": "one_piece_card_game",136        "franchise": "One Piece"137      },138      {139        "match": "\\bmagic\\b|\\bmtg\\b",140        "categorySlug": "magic_the_gathering",141        "franchise": "Magic: The Gathering"142      },143      {144        "match": "yu-?gi-?oh",145        "categorySlug": "yugioh",146        "franchise": "Yu-Gi-Oh!"147      },148      {149        "match": "\\blorcana\\b",150        "categorySlug": "disney_lorcana",151        "franchise": "Disney Lorcana"152      },153      {154        "match": "\\bdigimon\\b",155        "categorySlug": "digimon_tcg",156        "franchise": "Digimon"157      },158      {159        "match": "\\bdragon ball\\b",160        "categorySlug": "dragon_ball_tcg",161        "franchise": "Dragon Ball Super"162      },163      {164        "match": "\\bweiss\\b",165        "categorySlug": "weiss_schwarz",166        "franchise": "Weiß Schwarz"167      }168    ],169    "defaultCategory": null,170    "exclude": "gift card|sleeves?|deck box|binder|playmat|toploader|top loader|storage box|dice|tokens? only|bundle of|mystery|buylist|submission|event ticket|\\bentry\\b|tournament|store credit|pre-?release event|supplies|card savers?|\\brepack|bulk lot|\\blot of\\b|\\bpaints?\\b|primer|brushes|online (pack|code)|digital code|code card|unused digital|ptcgo|ptcg live",171    "keepOutOfStock": true,172    "fetchBarcodes": false,173    "wholeShop": false,174    "pageSize": 250,175    "titlePattern": "^(?:PSA|BGS|CGC|TAG|ACE|SGC)\\s*[\\d.]+\\s*-\\s*(?<name>.+?)\\s*-\\s*(?<set>.+?)\\s*-\\s*#(?<number>\\S+)"176  }177}178