TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1# 401 Games connector (`401-games`)23- Source: https://store.401games.ca · dealer · CA · CAD · Shopify storefront4- Acquisition: public `/collections/<handle>/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)5- Records: `listing` (asking prices, one per variant; out-of-stock variants → `ended`)6- Refresh: every 12 h (ACTIVE→NORMAL boundary, large catalogue) · history: none (listings only)78Canada's largest TCG/board-game retailer (Toronto). Public Shopify storefront with one umbrella collection per game plus sports and non-sport cards.910## Collections → taxonomy11| collection handle | category | brand / franchise / series |12|---|---|---|13| `all-magic-the-gathering` | `magic_the_gathering` | Magic: The Gathering |14| `all-pokemon` | `pokemon` | Pokémon |15| `all-yugioh` | `yugioh` | Yu-Gi-Oh! |16| `all-one-piece-card-game` | `one_piece_card_game` | One Piece |17| `all-disney-lorcana` | `disney_lorcana` | Disney Lorcana |18| `all-weiss-schwarz` | `weiss_schwarz` | Weiß Schwarz |19| `all-digimon-card-game` | `digimon_tcg` | Digimon |20| `all-dragon-ball-super` | `dragon_ball_tcg` | Dragon Ball Super |21| `all-star-wars-unlimited` | `star_wars_tcg` | Star Wars Unlimited |22| `all-cardfight-vanguard` | `other_tcg` | Cardfight!! Vanguard |23| `all-riftbound-league-of-legends-tcg` | `other_tcg` | Riftbound |24| `all-gundam-card-game` | `other_tcg` | Gundam Card Game |25| `all-sports-cards` | `sports_cards` | — |26| `all-non-sports-trading-cards` | `non_sport_cards` | — |27| `all-board-games` | `board_games` | — |2829Rules (first match wins, applied to "title | product_type | tags | collection"):30- `^(?=[\s\S]*\bhockey\b)[\s\S]*\| all-sports-cards$` → `hockey_cards`31- `^(?=[\s\S]*\bbaseball\b)[\s\S]*\| all-sports-cards$` → `baseball_cards`32- `^(?=[\s\S]*\bbasketball\b)[\s\S]*\| all-sports-cards$` → `basketball_cards`33- `^(?=[\s\S]*\bfootball\b)[\s\S]*\| all-sports-cards$` → `football_cards`34- `^(?=[\s\S]*\b(soccer|premier league|uefa|fifa)\b)[\s\S]*\| all-sports-cards$` → `soccer_cards`35- `^(?=[\s\S]*\b(formula 1|formula one|\bf1\b)\b)[\s\S]*\| all-sports-cards$` → `f1_cards`3637Excluded (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`3839## Access & compliance40See `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).4142## Fixtures & tests43`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.44`pnpm vitest run connectors/api/401-games` · live probe: `pnpm tsx connectors/api/_g3-shops-na-lib/probe.ts 401-games`.45