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 · 173 lines json
Raw Blame History
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