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%
5.7 KB · 114 lines json
Raw Blame History
1{2  "id": "fusion-gaming",3  "displayName": "Fusion Gaming (Canadian TCG & board-game store, CAD)",4  "sourceId": "fusion-gaming",5  "sourceName": "Fusion Gaming",6  "sourceType": "dealer",7  "sourceUrl": "https://www.fusiongamingonline.com",8  "module": "api/fusion-gaming",9  "enginePriority": [10    "api"11  ],12  "categories": [13    "magic_the_gathering",14    "pokemon",15    "star_wars_tcg",16    "disney_lorcana",17    "one_piece_card_game",18    "other_tcg",19    "board_games"20  ],21  "regions": [22    "CA"23  ],24  "languages": [25    "en"26  ],27  "currency": [28    "CAD"29  ],30  "supportsListings": true,31  "supportsSold": false,32  "supportsAuctions": false,33  "supportsImages": true,34  "supportsCatalog": false,35  "supportsPopulation": false,36  "supportsLookup": true,37  "refreshFrequencyMinutes": 720,38  "priority": "medium",39  "trustScore": 0.75,40  "attributionRequired": true,41  "termsUrl": "https://www.fusiongamingonline.com/policies/terms-of-service",42  "accessNotes": "Fusion Gaming (fusiongamingonline.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 10 configured collections (mtg-singles, mtg-sealed-products, pokemon-singles, pokemon-all-sealed, star-wars-unlimited-singles, lorcana-singles-1, one-piece-singles, riftbound-singles-in-stock … (+2 more, see config.collections)) and /products/<handle>.json for URL lookups (~256k products; MTG singles 52k, Pokémon singles 9k+). 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 — accessories/playmats/sleeves/dice collections, event tickets, \"items-with-noprice\" collection. No personal data is collected; seller = the store itself.",43  "enabled": true,44  "schemaVersion": "1.0",45  "acquisitionMethod": "Shopify storefront products.json",46  "historicalDepth": "none",47  "requires": [],48  "config": {49    "currency": "CAD",50    "market": "CA",51    "seller": "Fusion Gaming",52    "location": "Winnipeg, MB, Canada",53    "collections": [54      {55        "handle": "mtg-singles",56        "categorySlug": "magic_the_gathering",57        "franchise": "Magic: The Gathering"58      },59      {60        "handle": "mtg-sealed-products",61        "categorySlug": "magic_the_gathering",62        "franchise": "Magic: The Gathering"63      },64      {65        "handle": "pokemon-singles",66        "categorySlug": "pokemon",67        "franchise": "Pokémon"68      },69      {70        "handle": "pokemon-all-sealed",71        "categorySlug": "pokemon",72        "franchise": "Pokémon"73      },74      {75        "handle": "star-wars-unlimited-singles",76        "categorySlug": "star_wars_tcg",77        "franchise": "Star Wars Unlimited"78      },79      {80        "handle": "lorcana-singles-1",81        "categorySlug": "disney_lorcana",82        "franchise": "Disney Lorcana"83      },84      {85        "handle": "one-piece-singles",86        "categorySlug": "one_piece_card_game",87        "franchise": "One Piece"88      },89      {90        "handle": "riftbound-singles-in-stock",91        "categorySlug": "other_tcg",92        "franchise": "Riftbound"93      },94      {95        "handle": "riftbound-sealed-product",96        "categorySlug": "other_tcg",97        "franchise": "Riftbound"98      },99      {100        "handle": "board-games-all",101        "categorySlug": "board_games"102      }103    ],104    "rules": [],105    "defaultCategory": null,106    "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",107    "keepOutOfStock": true,108    "fetchBarcodes": false,109    "wholeShop": false,110    "pageSize": 250,111    "titlePattern": "^(?<name>.+?) \\[(?<set>[^\\]]+)\\]$"112  }113}114