{
  "version": "1.0",
  "connectors": [
    {
      "id": "brickeconomy",
      "displayName": "BrickEconomy",
      "sourceId": "brickeconomy",
      "sourceName": "BrickEconomy",
      "sourceType": "pricing_guide",
      "sourceUrl": "https://www.brickeconomy.com",
      "module": "firecrawl/brickeconomy",
      "enginePriority": [
        "firecrawl",
        "scrapfly"
      ],
      "categories": [
        "lego",
        "lego_sets"
      ],
      "regions": [
        "US"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD"
      ],
      "supportsListings": false,
      "supportsSold": false,
      "supportsAuctions": false,
      "supportsImages": true,
      "supportsCatalog": true,
      "supportsPopulation": false,
      "supportsLookup": true,
      "refreshFrequencyMinutes": 4320,
      "priority": "medium",
      "trustScore": 0.65,
      "attributionRequired": true,
      "termsUrl": "https://www.brickeconomy.com/legal-terms",
      "accessNotes": "Public set pages fetched through Firecrawl (markdown; ~1 credit/page). robots.txt allows all crawlers (explicitly including AI bots). Plain HTTPS returns 403 for non-browser agents, so Firecrawl is the primary engine and Scrapfly the fallback. We capture set facts (number, name, theme, subtheme, year, release/retire dates, pieces, minifigs), retail price, and BrickEconomy's estimated New/Sealed and Used values as guide observations — never as sales. Discovery via theme/top lists in config.seeds.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "seeds": [
          "https://www.brickeconomy.com/sets/top/most-valuable-lego-sets",
          "https://www.brickeconomy.com/sets/theme/star-wars/subtheme/ultimate-collector-series",
          "https://www.brickeconomy.com/sets/theme/icons",
          "https://www.brickeconomy.com/sets/theme/ideas",
          "https://www.brickeconomy.com/sets/theme/creator-expert",
          "https://www.brickeconomy.com/sets/theme/harry-potter",
          "https://www.brickeconomy.com/sets/theme/technic",
          "https://www.brickeconomy.com/sets/retired"
        ],
        "setsPerSeed": 60
      }
    },
    {
      "id": "chrono24",
      "displayName": "Chrono24",
      "sourceId": "chrono24",
      "sourceName": "Chrono24",
      "sourceType": "marketplace",
      "sourceUrl": "https://www.chrono24.com",
      "module": "scrapfly/chrono24",
      "enginePriority": [
        "scrapfly",
        "firecrawl"
      ],
      "categories": [
        "watches",
        "rolex",
        "patek_philippe",
        "audemars_piguet",
        "omega",
        "other_watches"
      ],
      "regions": [
        "global"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD"
      ],
      "supportsListings": true,
      "supportsSold": false,
      "supportsAuctions": false,
      "supportsImages": true,
      "supportsCatalog": false,
      "supportsPopulation": false,
      "supportsLookup": false,
      "refreshFrequencyMinutes": 720,
      "priority": "high",
      "trustScore": 0.7,
      "attributionRequired": true,
      "termsUrl": "https://www.chrono24.com/info/terms-of-use.htm",
      "accessNotes": "Public model listing pages (e.g. /rolex/daytona--mod2.htm) fetched through Scrapfly without JS rendering (Cloudflare shield → ~40 credits/page); robots.txt allows these paths (Crawl-delay 0.1). Each page embeds a schema.org ItemList of Offers (name, price in the site currency, image, listing URL) — we store asking prices as listings only, never as sales. No login, no per-listing detail fetch (seller details stay on Chrono24). Model pages are configured in config.seeds; pagination via --modN-P.htm.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "seeds": [
          "/rolex/daytona--mod2.htm",
          "/rolex/submariner--mod1.htm",
          "/rolex/gmt-master-ii--mod3.htm",
          "/rolex/datejust--mod4.htm",
          "/rolex/day-date--mod6.htm",
          "/rolex/explorer--mod8.htm",
          "/patekphilippe/nautilus--mod15.htm",
          "/patekphilippe/aquanaut--mod16.htm",
          "/patekphilippe/calatrava--mod14.htm",
          "/audemarspiguet/royal-oak--mod20.htm",
          "/audemarspiguet/royal-oak-offshore--mod21.htm",
          "/omega/speedmaster--mod24.htm",
          "/omega/seamaster--mod22.htm",
          "/cartier/santos--mod38.htm",
          "/tudor/black-bay--mod1128.htm",
          "/vacheronconstantin/overseas--mod1024.htm"
        ],
        "pagesPerSeed": 2,
        "pageSize": 120
      }
    },
    {
      "id": "comicconnect",
      "displayName": "ComicConnect (sold archive)",
      "sourceId": "comicconnect",
      "sourceName": "ComicConnect",
      "sourceType": "auction_house",
      "sourceUrl": "https://www.comicconnect.com",
      "module": "api/comicconnect",
      "enginePriority": [
        "api",
        "firecrawl",
        "scrapfly"
      ],
      "categories": [
        "comics",
        "marvel_comics",
        "dc_comics",
        "independent_comics"
      ],
      "regions": [
        "US"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD"
      ],
      "supportsListings": false,
      "supportsSold": true,
      "supportsAuctions": true,
      "supportsImages": true,
      "supportsCatalog": false,
      "supportsPopulation": false,
      "supportsLookup": false,
      "refreshFrequencyMinutes": 720,
      "priority": "high",
      "trustScore": 0.9,
      "attributionRequired": true,
      "termsUrl": "https://www.comicconnect.com/terms",
      "accessNotes": "Public sold archive (/browse/comics/?filtertype=Sold, ~479k results, 20 per page) fetched over plain HTTPS with the RareIndex user agent. robots.txt: Allow / with Content-Signal search=yes, ai-train=no (we only index sale facts and link back). Each card exposes title, publisher + grade, sold date/time, 'Sold For' price and whether a 15% buyer's premium applies (bp attribute) — we store hammer price with buyer_premium_included=false and keep the premium note in metadata. No login, no bidder data. 1.5 s politeness delay.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "browsePath": "/browse/comics/",
        "pagesPerRun": 25,
        "sortType": "ended_desc"
      }
    },
    {
      "id": "goldin",
      "displayName": "Goldin (sold auction results)",
      "sourceId": "goldin",
      "sourceName": "Goldin",
      "sourceType": "auction_house",
      "sourceUrl": "https://goldin.co",
      "module": "scrapfly/goldin",
      "enginePriority": [
        "scrapfly"
      ],
      "categories": [
        "pokemon",
        "magic_the_gathering",
        "yugioh",
        "one_piece_card_game",
        "basketball_cards",
        "baseball_cards",
        "football_cards",
        "hockey_cards",
        "soccer_cards",
        "f1_cards",
        "sports_memorabilia",
        "marvel_comics",
        "nintendo_games",
        "non_sport_cards"
      ],
      "regions": [
        "US"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD"
      ],
      "supportsListings": false,
      "supportsSold": true,
      "supportsAuctions": false,
      "supportsImages": true,
      "supportsCatalog": false,
      "supportsPopulation": false,
      "supportsLookup": true,
      "refreshFrequencyMinutes": 360,
      "priority": "high",
      "trustScore": 0.9,
      "attributionRequired": true,
      "termsUrl": "https://goldin.co/useragreement",
      "accessNotes": "Public 'Sold Items' result grids (https://goldin.co/buy/sc/<subcategory>?show_only=Sold%20Items&sort=Most_Recent_Bids&number_of_lots=240) rendered through Scrapfly (asp + JS rendering, ~6 credits per page of 240 sold lots). goldin.co/robots.txt allows /buy/ and /item/ and disallows /api/; we never call goldin.co/api ourselves — the lot data is read from the XHR (lots_v2 on their CloudFront search endpoint) that the public page performs during rendering, exactly what a browser does. Plain HTTP and Firecrawl return the empty SPA shell / an Akamai challenge. Prices: the grid shows the final price INCLUDING buyer's premium (current_price × (1 + buyer_premium%)); we store that as the sale price with buyerPremiumIncluded=true and keep the hammer price and BP % in metadata. Sale date = lot end_timestamp; lots whose end_timestamp is in the future (placeholder private-sale dates like 2235-06-04) are skipped and counted as anomalies. Cert numbers appear only in item-page descriptions (lookup).",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "seeds": [
          {
            "path": "/buy/sc/pokemon",
            "categorySlug": "pokemon"
          },
          {
            "path": "/buy/sc/Magic_The_Gathering",
            "categorySlug": "magic_the_gathering"
          },
          {
            "path": "/buy/sc/Yu-Gi-Oh!",
            "categorySlug": "yugioh"
          },
          {
            "path": "/buy/sc/One_Piece",
            "categorySlug": "one_piece_card_game"
          },
          {
            "path": "/buy/sc/Basketball",
            "categorySlug": "basketball_cards",
            "sport": "basketball"
          },
          {
            "path": "/buy/sc/Baseball",
            "categorySlug": "baseball_cards",
            "sport": "baseball"
          },
          {
            "path": "/buy/sc/Football",
            "categorySlug": "football_cards",
            "sport": "football"
          },
          {
            "path": "/buy/sc/Hockey",
            "categorySlug": "hockey_cards",
            "sport": "hockey"
          },
          {
            "path": "/buy/sc/Soccer",
            "categorySlug": "soccer_cards",
            "sport": "soccer"
          },
          {
            "path": "/buy/sc/Racing",
            "categorySlug": "f1_cards",
            "sport": "racing"
          },
          {
            "path": "/buy/sc/Marvel",
            "categorySlug": "marvel_comics"
          },
          {
            "path": "/buy/sc/Nintendo",
            "categorySlug": "nintendo_games"
          }
        ],
        "pageSize": 240,
        "maxPagesPerSeed": 40,
        "renderingWaitMs": 6000
      }
    },
    {
      "id": "phillips-watches",
      "displayName": "Phillips Watches (auction results)",
      "sourceId": "phillips",
      "sourceName": "Phillips",
      "sourceType": "auction_house",
      "sourceUrl": "https://www.phillips.com",
      "module": "firecrawl/phillips-watches",
      "enginePriority": [
        "firecrawl",
        "scrapfly"
      ],
      "categories": [
        "watches",
        "rolex",
        "patek_philippe",
        "audemars_piguet",
        "omega",
        "other_watches"
      ],
      "regions": [
        "CH",
        "US",
        "HK",
        "GB"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "CHF",
        "USD",
        "HKD",
        "GBP",
        "EUR"
      ],
      "supportsListings": false,
      "supportsSold": true,
      "supportsAuctions": true,
      "supportsImages": true,
      "supportsCatalog": false,
      "supportsPopulation": false,
      "supportsLookup": false,
      "refreshFrequencyMinutes": 10080,
      "priority": "high",
      "trustScore": 0.95,
      "attributionRequired": true,
      "termsUrl": "https://www.phillips.com/about/terms",
      "accessNotes": "Past watch sales are discovered from the public /auctions/past page (plain HTTPS; embedded JSON with saleNumber, title, end date, location). Each sale page is rendered through Firecrawl (JS wait ~6 s, 1 credit) to read the public lot list: lot number, maker, reference, model, estimate and 'Sold For' (Phillips publishes prices realised including buyer's premium). robots.txt disallows only /search and filter paths. No login, no bidder data. Large sales may lazy-load beyond the first ~70 lots — coverage is recorded per run.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "pastAuctionsUrl": "https://www.phillips.com/auctions/past",
        "salesPerRun": 6,
        "titleFilter": "watch"
      }
    },
    {
      "id": "pokemontcg",
      "displayName": "Pokémon TCG API (pokemontcg.io)",
      "sourceId": "pokemontcg",
      "sourceName": "Pokémon TCG API",
      "sourceType": "catalog",
      "sourceUrl": "https://pokemontcg.io",
      "module": "api/pokemontcg",
      "enginePriority": [
        "api",
        "feed"
      ],
      "categories": [
        "pokemon"
      ],
      "regions": [
        "US",
        "EU"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD",
        "EUR"
      ],
      "supportsListings": false,
      "supportsSold": false,
      "supportsAuctions": false,
      "supportsImages": true,
      "supportsCatalog": true,
      "supportsPopulation": false,
      "supportsLookup": false,
      "refreshFrequencyMinutes": 1440,
      "priority": "high",
      "trustScore": 0.8,
      "attributionRequired": true,
      "termsUrl": "https://docs.pokemontcg.io/",
      "accessNotes": "Public REST API v2 (https://api.pokemontcg.io/v2). Optional X-Api-Key (POKEMONTCG_API_KEY) raises limits (20k/day) — without a key ~1k/day and 30/min. Crawl = sets, then cards per set (pageSize 250, cursor {setIndex,page}). The API is intermittently unavailable (5xx); the connector retries with backoff and falls back to the maintainers' public GitHub mirror (PokemonTCG/pokemon-tcg-data, same card schema, no prices) for the catalog when the API keeps failing. Prices are TCGplayer (USD, per printing variant: normal/holofoil/reverseHolofoil/1stEdition…) and Cardmarket (EUR) daily aggregates with their own updatedAt → stored as price_observations, never as sales. Pokémon © Nintendo/Creatures/GAME FREAK; data attributed to pokemontcg.io.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "pageSize": 250,
        "requestIntervalMs": 2100,
        "mirrorBase": "https://raw.githubusercontent.com/PokemonTCG/pokemon-tcg-data/master"
      }
    },
    {
      "id": "pricecharting",
      "displayName": "PriceCharting",
      "sourceId": "pricecharting",
      "sourceName": "PriceCharting",
      "sourceType": "pricing_guide",
      "sourceUrl": "https://www.pricecharting.com",
      "module": "api/pricecharting",
      "enginePriority": [
        "api",
        "firecrawl",
        "scrapfly"
      ],
      "categories": [
        "video_games",
        "nintendo_games",
        "sega_games",
        "playstation_games",
        "xbox_games",
        "atari_retro_games",
        "pc_games",
        "lego_sets",
        "funko",
        "comics",
        "marvel_comics",
        "dc_comics",
        "independent_comics"
      ],
      "regions": [
        "US"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD"
      ],
      "supportsListings": false,
      "supportsSold": true,
      "supportsAuctions": false,
      "supportsImages": true,
      "supportsCatalog": true,
      "supportsPopulation": false,
      "supportsLookup": true,
      "refreshFrequencyMinutes": 1440,
      "priority": "high",
      "trustScore": 0.7,
      "attributionRequired": true,
      "termsUrl": "https://www.pricecharting.com/page/terms-of-service",
      "accessNotes": "Public product pages fetched over plain HTTPS with the RareIndex user agent (robots.txt only disallows /buy, /publish-offer, /stripe-connect). Each product page exposes PriceCharting guide values per condition and a table of recently completed eBay sales (date, title, price, eBay item id) — we store those as sales with the PriceCharting page as source URL. No account, no API key, no photos (TimeWarp is paid and not used). Console listings paginate through the public ?format=json cursor endpoint. ~1 request per product, 1.5 s politeness delay.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "seeds": [
          "nintendo-64",
          "nes",
          "super-nintendo",
          "gamecube",
          "gameboy",
          "gameboy-color",
          "gameboy-advance",
          "nintendo-ds",
          "nintendo-switch",
          "wii",
          "playstation",
          "playstation-2",
          "playstation-3",
          "playstation-4",
          "playstation-5",
          "psp",
          "xbox",
          "xbox-360",
          "xbox-one",
          "xbox-series-x",
          "sega-genesis",
          "sega-dreamcast",
          "sega-saturn",
          "sega-master-system",
          "sega-game-gear",
          "atari-2600",
          "neo-geo-aes",
          "turbografx-16",
          "pc-games",
          "lego-star-wars",
          "lego-creator",
          "lego-technic",
          "lego-icons",
          "lego-harry-potter",
          "lego-ideas",
          "lego-marvel-super-heroes",
          "lego-ninjago",
          "lego-castle",
          "lego-space",
          "lego-modular-buildings",
          "funko-pop-marvel",
          "funko-pop-star-wars",
          "funko-pop-disney",
          "funko-pop-animation",
          "funko-pop-television",
          "funko-pop-movies",
          "funko-pop-games",
          "funko-pop-rocks",
          "funko-pop-comics",
          "comic-books-amazing-spider-man",
          "comic-books-batman",
          "comic-books-action-comics",
          "comic-books-detective-comics",
          "comic-books-x-men",
          "comic-books-incredible-hulk",
          "comic-books-fantastic-four",
          "comic-books-avengers",
          "comic-books-spawn",
          "comic-books-walking-dead"
        ],
        "productsPerConsole": 200,
        "sort": "popularity"
      }
    },
    {
      "id": "scryfall",
      "displayName": "Scryfall (Magic: The Gathering)",
      "sourceId": "scryfall",
      "sourceName": "Scryfall",
      "sourceType": "catalog",
      "sourceUrl": "https://scryfall.com",
      "module": "api/scryfall",
      "enginePriority": [
        "api"
      ],
      "categories": [
        "magic_the_gathering"
      ],
      "regions": [
        "US",
        "EU"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD",
        "EUR"
      ],
      "supportsListings": false,
      "supportsSold": false,
      "supportsAuctions": false,
      "supportsImages": true,
      "supportsCatalog": true,
      "supportsPopulation": false,
      "supportsLookup": true,
      "refreshFrequencyMinutes": 1440,
      "priority": "high",
      "trustScore": 0.85,
      "attributionRequired": true,
      "termsUrl": "https://scryfall.com/docs/api",
      "accessNotes": "Official public API, no key. Bulk 'default_cards' JSONL (gzip, ~78 MB, refreshed daily) is streamed for the full catalog; single-card lookups use /cards/<set>/<number>. Scryfall asks for ≤10 req/s (we pace 100 ms), an identifying User-Agent and Accept headers. Prices (usd/usd_foil/usd_etched/eur/eur_foil) are Scryfall's daily market aggregates from TCGplayer/Cardmarket → stored as price_observations, never as sales. Card data © Wizards of the Coast; Scryfall requests attribution and no implication of endorsement.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "bulkType": "default_cards",
        "requestIntervalMs": 100
      }
    },
    {
      "id": "ygoprodeck",
      "displayName": "YGOPRODeck (Yu-Gi-Oh!)",
      "sourceId": "ygoprodeck",
      "sourceName": "YGOPRODeck",
      "sourceType": "catalog",
      "sourceUrl": "https://ygoprodeck.com",
      "module": "api/ygoprodeck",
      "enginePriority": [
        "api"
      ],
      "categories": [
        "yugioh"
      ],
      "regions": [
        "US",
        "EU"
      ],
      "languages": [
        "en"
      ],
      "currency": [
        "USD",
        "EUR"
      ],
      "supportsListings": false,
      "supportsSold": false,
      "supportsAuctions": false,
      "supportsImages": true,
      "supportsCatalog": true,
      "supportsPopulation": false,
      "supportsLookup": false,
      "refreshFrequencyMinutes": 1440,
      "priority": "high",
      "trustScore": 0.75,
      "attributionRequired": true,
      "termsUrl": "https://ygoprodeck.com/api-guide/",
      "accessNotes": "Public API v7 (https://db.ygoprodeck.com/api/v7/cardinfo.php), no key; rate limit 20 req/s — a full crawl is ONE request (~21 MB, ~14.5k cards / ~44k printings) plus optional misc=yes. The API carries no price timestamp: card_sets[].set_price (USD, per printing) and card_prices (cardmarket EUR / tcgplayer / ebay / amazon / coolstuffinc USD, card-level) are recorded as price_observations dated at fetch time with confidence 0.7 and metadata.price_scope. Images may not be hot-linked in bulk per the API guide (we store URLs, never mirror). Yu-Gi-Oh! © Konami.",
      "enabled": true,
      "schemaVersion": "1.0",
      "config": {
        "misc": true
      }
    }
  ]
}
