{
  "$comment": "Central per-domain acquisition policy (SPEC §16). Resolution: exact host → parent domain → defaults. Connectors read it via policyFor(url); never hard-code rate limits or timeouts in connector code. Keys are hosts without www.",
  "version": "1.0",
  "defaults": {
    "minIntervalMs": 1000,
    "concurrency": 2,
    "timeoutMs": 45000,
    "maxRetries": 2,
    "crawlDepth": 3,
    "backfillMaxPages": 200,
    "userAgent": "bot",
    "circuitFailures": 6,
    "circuitCooldownMs": 600000
  },
  "domains": {
    "api.scryfall.com": { "minIntervalMs": 120, "concurrency": 2, "notes": "Scryfall asks for 50–100 ms between requests; bulk files preferred." },
    "api.pokemontcg.io": { "minIntervalMs": 1500, "concurrency": 1, "maxRetries": 4, "timeoutMs": 60000, "notes": "Flaky; 500s frequent; GitHub mirror fallback." },
    "db.ygoprodeck.com": { "minIntervalMs": 100, "concurrency": 2, "notes": "20 req/s documented limit." },
    "tcgcsv.com": { "minIntervalMs": 300, "concurrency": 3 },
    "mtgjson.com": { "minIntervalMs": 2000, "concurrency": 1, "timeoutMs": 180000, "notes": "large gzip bulk files" },
    "pricecharting.com": { "minIntervalMs": 1500, "concurrency": 2, "crawlDepth": 4, "backfillMaxPages": 400 },
    "sportscardspro.com": { "minIntervalMs": 1500, "concurrency": 2 },
    "comicconnect.com": { "minIntervalMs": 2000, "concurrency": 1, "backfillMaxPages": 500 },
    "brickeconomy.com": { "minIntervalMs": 3000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "chrono24.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["scrapfly"], "scrapfly": { "renderJs": true, "asp": true, "maxCreditsPerRun": 2000 } },
    "goldin.co": { "minIntervalMs": 5000, "concurrency": 1, "engines": ["scrapfly"], "scrapfly": { "renderJs": true, "asp": true } },
    "catawiki.com": { "minIntervalMs": 3000, "concurrency": 1, "engines": ["scrapfly", "firecrawl"] },
    "amiami.com": { "minIntervalMs": 3000, "concurrency": 1, "country": "jp", "currency": "JPY", "locale": "ja" },
    "suruga-ya.jp": { "minIntervalMs": 3000, "concurrency": 1, "country": "jp", "currency": "JPY", "locale": "ja" },
    "aucfree.com": { "minIntervalMs": 3000, "concurrency": 1, "country": "jp", "currency": "JPY", "locale": "ja" },
    "auctions.yahoo.co.jp": { "minIntervalMs": 4000, "concurrency": 1, "country": "jp", "currency": "JPY", "locale": "ja", "engines": ["scrapfly"], "scrapfly": { "country": "jp", "renderJs": false } },
    "downloads.s3.cardmarket.com": { "minIntervalMs": 2000, "concurrency": 1, "timeoutMs": 180000, "currency": "EUR", "notes": "Cardmarket public price-guide / product bulk files (daily)." },
    "cardmarket.com": { "minIntervalMs": 5000, "concurrency": 1, "currency": "EUR", "engines": ["api"], "notes": "Only the public bulk files are read; storefront pages are Cloudflare-protected and not crawled." },
    "myshopify.com": { "minIntervalMs": 1500, "concurrency": 1, "notes": "Shopify storefront JSON; polite 1 req / 1.5 s per shop." },
    "api.ebay.com": { "minIntervalMs": 300, "concurrency": 3, "notes": "Browse API (OAuth client credentials); 5 000 calls/day default quota." },
    "openapi.etsy.com": { "minIntervalMs": 300, "concurrency": 2, "notes": "10 req/s, 10 000/day per API key." },
    "api.trademe.co.nz": { "minIntervalMs": 1000, "concurrency": 1, "country": "nz", "currency": "NZD" },
    "app.rakuten.co.jp": { "minIntervalMs": 1100, "concurrency": 1, "country": "jp", "currency": "JPY", "notes": "1 req/s per app id." },
    "shopping.yahooapis.jp": { "minIntervalMs": 1100, "concurrency": 1, "country": "jp", "currency": "JPY" },
    "psacard.com": { "minIntervalMs": 6000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"], "notes": "Only public /cert/<n> verification pages; APR and population require a Collectors login and are never fetched." },
    "cgccomics.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "cgccards.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "beckett.com": { "minIntervalMs": 5000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "gosgc.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["api", "firecrawl", "scrapfly"] },
    "pcgs.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "ngccoin.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "pmgnotes.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "watagames.com": { "minIntervalMs": 4000, "concurrency": 1 },
    "my.taggrading.com": { "minIntervalMs": 4000, "concurrency": 1, "engines": ["firecrawl"], "firecrawl": { "waitForMs": 8000 } },
    "numisbids.com": { "minIntervalMs": 3000, "concurrency": 1, "backfillMaxPages": 1000, "notes": "Deep historical coin-auction archive; archive pages are refreshed at most monthly." },
    "sixbid.com": { "minIntervalMs": 3000, "concurrency": 1 },
    "auctionet.com": { "minIntervalMs": 1000, "concurrency": 2, "currency": "SEK", "notes": "Public JSON API." },
    "hibid.com": { "minIntervalMs": 3000, "concurrency": 1, "engines": ["api", "scrapfly"] },
    "comiclink.com": { "minIntervalMs": 4000, "concurrency": 1, "backfillMaxPages": 600 },
    "mycomicshop.com": { "minIntervalMs": 4000, "concurrency": 1 },
    "watchcharts.com": { "minIntervalMs": 5000, "concurrency": 1, "engines": ["firecrawl", "scrapfly"] },
    "collectiblend.com": { "minIntervalMs": 3000, "concurrency": 1 },
    "buyee.jp": { "minIntervalMs": 4000, "concurrency": 1, "currency": "JPY" },
    "magi.camp": { "minIntervalMs": 4000, "concurrency": 1, "country": "jp", "currency": "JPY", "locale": "ja" },
    "yuyu-tei.jp": { "minIntervalMs": 4000, "concurrency": 1, "country": "jp", "currency": "JPY", "locale": "ja" },
    "hareruyamtg.com": { "minIntervalMs": 4000, "concurrency": 1, "country": "jp", "currency": "JPY" },
    "cardrush-pokemon.jp": { "minIntervalMs": 4000, "concurrency": 1, "country": "jp", "currency": "JPY", "locale": "ja" },
    "ruten.com.tw": { "minIntervalMs": 3000, "concurrency": 1, "country": "tw", "currency": "TWD", "locale": "zh" },
    "api.firecrawl.dev": { "minIntervalMs": 0, "concurrency": 8, "timeoutMs": 120000, "maxRetries": 1, "circuitFailures": 20 },
    "api.scrapfly.io": { "minIntervalMs": 0, "concurrency": 6, "timeoutMs": 150000, "maxRetries": 1, "circuitFailures": 20 }
  }
}
