# 401 Games connector (`401-games`) - Source: https://store.401games.ca · dealer · CA · CAD · Shopify storefront - Acquisition: public `/collections//products.json?limit=250&page=N` (shared `ShopifyStoreConnector` adapter wrapped by `MarketPinnedShopifyConnector`, which adds a `localization=CA` cookie so Shopify Markets never geo-converts prices; no store-specific code) - Records: `listing` (asking prices, one per variant; out-of-stock variants → `ended`) - Refresh: every 12 h (ACTIVE→NORMAL boundary, large catalogue) · history: none (listings only) Canada's largest TCG/board-game retailer (Toronto). Public Shopify storefront with one umbrella collection per game plus sports and non-sport cards. ## Collections → taxonomy | collection handle | category | brand / franchise / series | |---|---|---| | `all-magic-the-gathering` | `magic_the_gathering` | Magic: The Gathering | | `all-pokemon` | `pokemon` | Pokémon | | `all-yugioh` | `yugioh` | Yu-Gi-Oh! | | `all-one-piece-card-game` | `one_piece_card_game` | One Piece | | `all-disney-lorcana` | `disney_lorcana` | Disney Lorcana | | `all-weiss-schwarz` | `weiss_schwarz` | Weiß Schwarz | | `all-digimon-card-game` | `digimon_tcg` | Digimon | | `all-dragon-ball-super` | `dragon_ball_tcg` | Dragon Ball Super | | `all-star-wars-unlimited` | `star_wars_tcg` | Star Wars Unlimited | | `all-cardfight-vanguard` | `other_tcg` | Cardfight!! Vanguard | | `all-riftbound-league-of-legends-tcg` | `other_tcg` | Riftbound | | `all-gundam-card-game` | `other_tcg` | Gundam Card Game | | `all-sports-cards` | `sports_cards` | — | | `all-non-sports-trading-cards` | `non_sport_cards` | — | | `all-board-games` | `board_games` | — | Rules (first match wins, applied to "title | product_type | tags | collection"): - `^(?=[\s\S]*\bhockey\b)[\s\S]*\| all-sports-cards$` → `hockey_cards` - `^(?=[\s\S]*\bbaseball\b)[\s\S]*\| all-sports-cards$` → `baseball_cards` - `^(?=[\s\S]*\bbasketball\b)[\s\S]*\| all-sports-cards$` → `basketball_cards` - `^(?=[\s\S]*\bfootball\b)[\s\S]*\| all-sports-cards$` → `football_cards` - `^(?=[\s\S]*\b(soccer|premier league|uefa|fifa)\b)[\s\S]*\| all-sports-cards$` → `soccer_cards` - `^(?=[\s\S]*\b(formula 1|formula one|\bf1\b)\b)[\s\S]*\| all-sports-cards$` → `f1_cards` Excluded (regex): `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` ## Access & compliance See `accessNotes` in meta.json: robots.txt verified 2026-09-08 (standard Shopify rules, products.json paths allowed), honest UA, 1 req / 1.5 s, listings only, no personal data. Not fetched: supplies/dice/modelling collections, event tickets, staff-loyalty and "acorn" migration collections, the 0.00-priced Easy-Buy buylist placeholders (dropped: no price). ## Fixtures & tests `data/fixtures/401-games/` — live captures (`pnpm tsx connectors/api/_g3-shops-na-lib/capture.ts 401-games`), trimmed single-product payloads incl. a sold-out variant and a graded item. `pnpm vitest run connectors/api/401-games` · live probe: `pnpm tsx connectors/api/_g3-shops-na-lib/probe.ts 401-games`.