TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1{2 "id": "face-to-face-games",3 "displayName": "Face to Face Games (Canadian TCG store, CAD)",4 "sourceId": "face-to-face-games",5 "sourceName": "Face to Face Games",6 "sourceType": "dealer",7 "sourceUrl": "https://www.facetofacegames.com",8 "module": "api/face-to-face-games",9 "enginePriority": [10 "api"11 ],12 "categories": [13 "magic_the_gathering",14 "pokemon",15 "disney_lorcana",16 "yugioh",17 "one_piece_card_game",18 "star_wars_tcg",19 "other_tcg"20 ],21 "regions": [22 "CA"23 ],24 "languages": [25 "en",26 "fr"27 ],28 "currency": [29 "CAD"30 ],31 "supportsListings": true,32 "supportsSold": false,33 "supportsAuctions": false,34 "supportsImages": true,35 "supportsCatalog": false,36 "supportsPopulation": false,37 "supportsLookup": true,38 "refreshFrequencyMinutes": 720,39 "priority": "medium",40 "trustScore": 0.75,41 "attributionRequired": true,42 "termsUrl": "https://www.facetofacegames.com/policies/terms-of-service",43 "accessNotes": "Face to Face Games (facetofacegames.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 12 configured collections (magic-the-gathering-singles, magic-the-gathering-high-end, magic-the-gathering-sealed, pokemon-singles, pokemon-high-end, pokemon-sealed, lorcana-singles, lorcana-sealed … (+4 more, see config.collections)) and /products/<handle>.json for URL lookups (~290k singles; MTG 168k, Pokémon 40k, high-end/graded 15k). 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 — events/WPN tickets, supplies (sleeves, deck boxes, playmats), the giant \"single\"/\"archive\"/flash-sale umbrella collections (duplicates of the per-game ones). No personal data is collected; seller = the store itself.",44 "enabled": true,45 "schemaVersion": "1.0",46 "acquisitionMethod": "Shopify storefront products.json",47 "historicalDepth": "none",48 "requires": [],49 "config": {50 "currency": "CAD",51 "market": "CA",52 "seller": "Face to Face Games",53 "location": "Toronto / Montréal, Canada",54 "collections": [55 {56 "handle": "magic-the-gathering-singles",57 "categorySlug": "magic_the_gathering",58 "franchise": "Magic: The Gathering"59 },60 {61 "handle": "magic-the-gathering-high-end",62 "categorySlug": "magic_the_gathering",63 "franchise": "Magic: The Gathering"64 },65 {66 "handle": "magic-the-gathering-sealed",67 "categorySlug": "magic_the_gathering",68 "franchise": "Magic: The Gathering"69 },70 {71 "handle": "pokemon-singles",72 "categorySlug": "pokemon",73 "franchise": "Pokémon"74 },75 {76 "handle": "pokemon-high-end",77 "categorySlug": "pokemon",78 "franchise": "Pokémon"79 },80 {81 "handle": "pokemon-sealed",82 "categorySlug": "pokemon",83 "franchise": "Pokémon"84 },85 {86 "handle": "lorcana-singles",87 "categorySlug": "disney_lorcana",88 "franchise": "Disney Lorcana"89 },90 {91 "handle": "lorcana-sealed",92 "categorySlug": "disney_lorcana",93 "franchise": "Disney Lorcana"94 },95 {96 "handle": "yu-gi-oh-premium",97 "categorySlug": "yugioh",98 "franchise": "Yu-Gi-Oh!"99 },100 {101 "handle": "one-piece",102 "categorySlug": "one_piece_card_game",103 "franchise": "One Piece"104 },105 {106 "handle": "star-wars-sealed",107 "categorySlug": "star_wars_tcg",108 "franchise": "Star Wars Unlimited"109 },110 {111 "handle": "riftbound-singles",112 "categorySlug": "other_tcg",113 "franchise": "Riftbound"114 }115 ],116 "rules": [],117 "defaultCategory": null,118 "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",119 "keepOutOfStock": true,120 "fetchBarcodes": false,121 "wholeShop": false,122 "pageSize": 250,123 "titlePattern": "^(?<name>.+?) - (?<number>[^\\s\\[]+) - [^\\[]*\\[(?<set>[a-z0-9]+)(?:-[^\\]]*)?\\]"124 }125}126