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%
6.9 KB · 145 lines json
Raw Blame History
1{2  "id": "wizards-tower",3  "displayName": "Wizard's Tower (Canadian TCG & board-game store, CAD)",4  "sourceId": "wizards-tower",5  "sourceName": "Wizard's Tower",6  "sourceType": "dealer",7  "sourceUrl": "https://www.kanatacg.com",8  "module": "api/wizards-tower",9  "enginePriority": [10    "api"11  ],12  "categories": [13    "magic_the_gathering",14    "disney_lorcana",15    "board_games"16  ],17  "regions": [18    "CA"19  ],20  "languages": [21    "en"22  ],23  "currency": [24    "CAD"25  ],26  "supportsListings": true,27  "supportsSold": false,28  "supportsAuctions": false,29  "supportsImages": true,30  "supportsCatalog": false,31  "supportsPopulation": false,32  "supportsLookup": true,33  "refreshFrequencyMinutes": 720,34  "priority": "medium",35  "trustScore": 0.75,36  "attributionRequired": true,37  "termsUrl": "https://www.kanatacg.com/policies/terms-of-service",38  "accessNotes": "Wizard's Tower (kanatacg.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 17 configured collections (commander-legends-singles, commander-masters-singles, double-masters-singles, commander-legends-battle-for-baldurs-gate-singles, avatar-the-last-airbender-singles, edge-of-eternities-singles, adventures-in-the-forgotten-realms-singles, dominaria-united-singles … (+9 more, see config.collections)) and /products/<handle>.json for URL lookups (~30k MTG singles across per-set collections, 5.9k Lorcana). 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. 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 — card-game supplies, dice, modelling supplies, sale umbrella collections, events. No personal data is collected; seller = the store itself.",39  "enabled": true,40  "schemaVersion": "1.0",41  "acquisitionMethod": "Shopify storefront products.json",42  "historicalDepth": "none",43  "requires": [],44  "config": {45    "currency": "CAD",46    "market": "CA",47    "seller": "Wizard's Tower",48    "location": "Ottawa (Kanata), ON, Canada",49    "collections": [50      {51        "handle": "commander-legends-singles",52        "categorySlug": "magic_the_gathering",53        "franchise": "Magic: The Gathering"54      },55      {56        "handle": "commander-masters-singles",57        "categorySlug": "magic_the_gathering",58        "franchise": "Magic: The Gathering"59      },60      {61        "handle": "double-masters-singles",62        "categorySlug": "magic_the_gathering",63        "franchise": "Magic: The Gathering"64      },65      {66        "handle": "commander-legends-battle-for-baldurs-gate-singles",67        "categorySlug": "magic_the_gathering",68        "franchise": "Magic: The Gathering"69      },70      {71        "handle": "avatar-the-last-airbender-singles",72        "categorySlug": "magic_the_gathering",73        "franchise": "Magic: The Gathering"74      },75      {76        "handle": "edge-of-eternities-singles",77        "categorySlug": "magic_the_gathering",78        "franchise": "Magic: The Gathering"79      },80      {81        "handle": "adventures-in-the-forgotten-realms-singles",82        "categorySlug": "magic_the_gathering",83        "franchise": "Magic: The Gathering"84      },85      {86        "handle": "dominaria-united-singles",87        "categorySlug": "magic_the_gathering",88        "franchise": "Magic: The Gathering"89      },90      {91        "handle": "bloomburrow-singles",92        "categorySlug": "magic_the_gathering",93        "franchise": "Magic: The Gathering"94      },95      {96        "handle": "duskmourn-house-of-horror-singles",97        "categorySlug": "magic_the_gathering",98        "franchise": "Magic: The Gathering"99      },100      {101        "handle": "aetherdrift-singles",102        "categorySlug": "magic_the_gathering",103        "franchise": "Magic: The Gathering"104      },105      {106        "handle": "double-masters-2022-singles",107        "categorySlug": "magic_the_gathering",108        "franchise": "Magic: The Gathering"109      },110      {111        "handle": "dominaria-remastered-singles",112        "categorySlug": "magic_the_gathering",113        "franchise": "Magic: The Gathering"114      },115      {116        "handle": "core-set-2021-singles",117        "categorySlug": "magic_the_gathering",118        "franchise": "Magic: The Gathering"119      },120      {121        "handle": "30th-anniversary-edition-singles",122        "categorySlug": "magic_the_gathering",123        "franchise": "Magic: The Gathering"124      },125      {126        "handle": "disney-lorcana-tcg",127        "categorySlug": "disney_lorcana",128        "franchise": "Disney Lorcana"129      },130      {131        "handle": "board-games",132        "categorySlug": "board_games"133      }134    ],135    "rules": [],136    "defaultCategory": null,137    "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",138    "keepOutOfStock": true,139    "fetchBarcodes": false,140    "wholeShop": false,141    "pageSize": 250,142    "titlePattern": "^(?<name>.+?) \\((?<set>[A-Z0-9]{2,6})\\)$"143  }144}145