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.4 KB · 108 lines json
Raw Blame History
1{2  "id": "capsule-toronto",3  "displayName": "Capsule Toronto (Canadian sneaker store, CAD)",4  "sourceId": "capsule-toronto",5  "sourceName": "Capsule Toronto",6  "sourceType": "dealer",7  "sourceUrl": "https://www.capsuletoronto.com",8  "module": "api/capsule-toronto",9  "enginePriority": [10    "api"11  ],12  "categories": [13    "sneakers",14    "nike_jordan",15    "new_balance_asics_other",16    "adidas_yeezy"17  ],18  "regions": [19    "CA"20  ],21  "languages": [22    "en"23  ],24  "currency": [25    "CAD"26  ],27  "supportsListings": true,28  "supportsSold": false,29  "supportsAuctions": false,30  "supportsImages": true,31  "supportsCatalog": false,32  "supportsPopulation": false,33  "supportsLookup": true,34  "refreshFrequencyMinutes": 720,35  "priority": "medium",36  "trustScore": 0.75,37  "attributionRequired": true,38  "termsUrl": "https://www.capsuletoronto.com/policies/terms-of-service",39  "accessNotes": "Capsule Toronto (capsuletoronto.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 7 configured collections (footwear, womens-footwear, jordan, nike, new-balance, asics, converse) and /products/<handle>.json for URL lookups (~9k footwear SKUs; Nike 2.4k, Jordan 1k, New Balance 900). 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 — apparel (t-shirts, sweaters, outerwear, bottoms), headwear, accessories, bags — the exclude regex also drops anything whose product_type is not Footwear. No personal data is collected; seller = the store itself.",40  "enabled": true,41  "schemaVersion": "1.0",42  "acquisitionMethod": "Shopify storefront products.json",43  "historicalDepth": "none",44  "requires": [],45  "config": {46    "currency": "CAD",47    "market": "CA",48    "seller": "Capsule Toronto",49    "location": "Toronto, ON, Canada",50    "collections": [51      {52        "handle": "footwear",53        "categorySlug": "sneakers"54      },55      {56        "handle": "womens-footwear",57        "categorySlug": "sneakers"58      },59      {60        "handle": "jordan",61        "categorySlug": "nike_jordan",62        "brand": "Jordan"63      },64      {65        "handle": "nike",66        "categorySlug": "nike_jordan",67        "brand": "Nike"68      },69      {70        "handle": "new-balance",71        "categorySlug": "new_balance_asics_other",72        "brand": "New Balance"73      },74      {75        "handle": "asics",76        "categorySlug": "new_balance_asics_other",77        "brand": "ASICS"78      },79      {80        "handle": "converse",81        "categorySlug": "new_balance_asics_other",82        "brand": "Converse"83      }84    ],85    "rules": [86      {87        "match": "\\b(air )?jordan\\b|\\bnike\\b",88        "categorySlug": "nike_jordan"89      },90      {91        "match": "\\badidas\\b|\\byeezy\\b",92        "categorySlug": "adidas_yeezy"93      },94      {95        "match": "new balance|\\basics\\b|\\bsalomon\\b|\\bhoka\\b|\\bpuma\\b|\\breebok\\b|\\bsaucony\\b|\\bconverse\\b|\\bvans\\b|\\bon running\\b|\\bmizuno\\b",96        "categorySlug": "new_balance_asics_other"97      }98    ],99    "defaultCategory": null,100    "exclude": "gift card|^[^|]*\\|(?![^|]*Footwear \\|)[^|]*\\||birkenstock|\\bsandals?\\b|\\bslides?\\b|\\bclogs?\\b|\\bmules?\\b|\\bloafers?\\b|\\bboots?\\b|\\bugg\\b|\\bcrocs\\b|\\bsocks?\\b|\\blaces\\b|insoles?|cleaner|shoe trees?",101    "keepOutOfStock": true,102    "fetchBarcodes": false,103    "wholeShop": false,104    "pageSize": 250,105    "titlePattern": "^(?<name>.+?) (?<number>[A-Z]{1,3}\\d{3,6}-\\d{3}|\\d{6}-\\d{3}|[A-Z]{1,2}\\d{3,4}[A-Z]{0,3}\\d{0,3})$"106  }107}108