TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1{2 "id": "401-games",3 "displayName": "401 Games (Canadian TCG & sports-card & board-game store, CAD)",4 "sourceId": "401-games",5 "sourceName": "401 Games",6 "sourceType": "dealer",7 "sourceUrl": "https://store.401games.ca",8 "module": "api/401-games",9 "enginePriority": [10 "api"11 ],12 "categories": [13 "magic_the_gathering",14 "pokemon",15 "yugioh",16 "one_piece_card_game",17 "disney_lorcana",18 "weiss_schwarz",19 "digimon_tcg",20 "dragon_ball_tcg",21 "star_wars_tcg",22 "other_tcg",23 "sports_cards",24 "non_sport_cards",25 "board_games",26 "hockey_cards",27 "baseball_cards",28 "basketball_cards",29 "football_cards",30 "soccer_cards",31 "f1_cards"32 ],33 "regions": [34 "CA"35 ],36 "languages": [37 "en"38 ],39 "currency": [40 "CAD"41 ],42 "supportsListings": true,43 "supportsSold": false,44 "supportsAuctions": false,45 "supportsImages": true,46 "supportsCatalog": false,47 "supportsPopulation": false,48 "supportsLookup": true,49 "refreshFrequencyMinutes": 720,50 "priority": "medium",51 "trustScore": 0.75,52 "attributionRequired": true,53 "termsUrl": "https://store.401games.ca/policies/terms-of-service",54 "accessNotes": "401 Games (store.401games.ca) 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 (all-magic-the-gathering, all-pokemon, all-yugioh, all-one-piece-card-game, all-disney-lorcana, all-weiss-schwarz, all-digimon-card-game, all-dragon-ball-super … (+7 more, see config.collections)) and /products/<handle>.json for URL lookups (~430k products; MTG 158k, Yu-Gi-Oh! 60k, Pokémon 54k). 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 — supplies/dice/modelling collections, event tickets, staff-loyalty and \"acorn\" migration collections, the 0.00-priced Easy-Buy buylist placeholders (dropped: no price). No personal data is collected; seller = the store itself.",55 "enabled": true,56 "schemaVersion": "1.0",57 "acquisitionMethod": "Shopify storefront products.json",58 "historicalDepth": "none",59 "requires": [],60 "config": {61 "currency": "CAD",62 "market": "CA",63 "seller": "401 Games",64 "location": "Toronto, ON, Canada",65 "collections": [66 {67 "handle": "all-magic-the-gathering",68 "categorySlug": "magic_the_gathering",69 "franchise": "Magic: The Gathering"70 },71 {72 "handle": "all-pokemon",73 "categorySlug": "pokemon",74 "franchise": "Pokémon"75 },76 {77 "handle": "all-yugioh",78 "categorySlug": "yugioh",79 "franchise": "Yu-Gi-Oh!"80 },81 {82 "handle": "all-one-piece-card-game",83 "categorySlug": "one_piece_card_game",84 "franchise": "One Piece"85 },86 {87 "handle": "all-disney-lorcana",88 "categorySlug": "disney_lorcana",89 "franchise": "Disney Lorcana"90 },91 {92 "handle": "all-weiss-schwarz",93 "categorySlug": "weiss_schwarz",94 "franchise": "Weiß Schwarz"95 },96 {97 "handle": "all-digimon-card-game",98 "categorySlug": "digimon_tcg",99 "franchise": "Digimon"100 },101 {102 "handle": "all-dragon-ball-super",103 "categorySlug": "dragon_ball_tcg",104 "franchise": "Dragon Ball Super"105 },106 {107 "handle": "all-star-wars-unlimited",108 "categorySlug": "star_wars_tcg",109 "franchise": "Star Wars Unlimited"110 },111 {112 "handle": "all-cardfight-vanguard",113 "categorySlug": "other_tcg",114 "franchise": "Cardfight!! Vanguard"115 },116 {117 "handle": "all-riftbound-league-of-legends-tcg",118 "categorySlug": "other_tcg",119 "franchise": "Riftbound"120 },121 {122 "handle": "all-gundam-card-game",123 "categorySlug": "other_tcg",124 "franchise": "Gundam Card Game"125 },126 {127 "handle": "all-sports-cards",128 "categorySlug": "sports_cards"129 },130 {131 "handle": "all-non-sports-trading-cards",132 "categorySlug": "non_sport_cards"133 },134 {135 "handle": "all-board-games",136 "categorySlug": "board_games"137 }138 ],139 "rules": [140 {141 "match": "^(?=[\\s\\S]*\\bhockey\\b)[\\s\\S]*\\| all-sports-cards$",142 "categorySlug": "hockey_cards"143 },144 {145 "match": "^(?=[\\s\\S]*\\bbaseball\\b)[\\s\\S]*\\| all-sports-cards$",146 "categorySlug": "baseball_cards"147 },148 {149 "match": "^(?=[\\s\\S]*\\bbasketball\\b)[\\s\\S]*\\| all-sports-cards$",150 "categorySlug": "basketball_cards"151 },152 {153 "match": "^(?=[\\s\\S]*\\bfootball\\b)[\\s\\S]*\\| all-sports-cards$",154 "categorySlug": "football_cards"155 },156 {157 "match": "^(?=[\\s\\S]*\\b(soccer|premier league|uefa|fifa)\\b)[\\s\\S]*\\| all-sports-cards$",158 "categorySlug": "soccer_cards"159 },160 {161 "match": "^(?=[\\s\\S]*\\b(formula 1|formula one|\\bf1\\b)\\b)[\\s\\S]*\\| all-sports-cards$",162 "categorySlug": "f1_cards"163 }164 ],165 "defaultCategory": null,166 "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",167 "keepOutOfStock": true,168 "fetchBarcodes": false,169 "wholeShop": false,170 "pageSize": 250171 }172}173