[
  {
    "id": "yahoo-auctions-jp",
    "name": "Yahoo! Auctions Japan (ヤフオク!)",
    "domain": "auctions.yahoo.co.jp",
    "country": "JP",
    "supportedCountries": ["JP"],
    "languages": ["ja"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "yugioh", "one_piece_card_game", "trading_cards", "rolex", "omega", "other_watches", "nike_jordan", "sneakers", "action_figures", "gundam", "nintendo_games", "designer_toys"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "The Yahoo! Auctions Web API was retired in 2020; the public HTML pages embed pageData JSON (live) and Next.js state (closed)." },
    "urls": { "search": "https://auctions.yahoo.co.jp/search/search?p={q}&b={offset}", "product": "https://auctions.yahoo.co.jp/jp/auction/{id}", "sold": "https://auctions.yahoo.co.jp/closedsearch/closedsearch?p={q}&b={offset}", "sitemap": null, "robots": "https://auctions.yahoo.co.jp/robots.txt" },
    "data": { "liveListings": true, "soldResults": true, "auctionResults": true, "historical": "months", "images": true, "seller": false, "saleDate": true, "realizedPrice": true, "fees": false, "grading": true, "certNumber": false, "itemId": true, "gtin": false, "population": false, "catalog": false },
    "access": { "pagination": "offset", "jsRendering": false, "antiBot": "low", "cloudflare": false, "robots": "Allow /closedsearch/closedsearch explicitly; /search/*?*n=, *mode=, *s1=, *o1=, *min=/*max= and /closedsearch/*?*istatus= etc. disallowed → only p, auccat and b are sent. /user/, /seller/, /members/ disallowed and never fetched.", "rateLimit": "self-imposed 4 s / request", "preferredEngine": "api" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave1",
    "difficulty": "medium",
    "reliability": 0.75,
    "legal": "LY Corporation terms of service; public pages only, honest UA, robots respected; seller names are masked by the site; no bidding/login.",
    "status": "implemented",
    "connectors": ["yahoo-auctions-jp"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Plain HTTPS with the bot UA returned full pages (200, ~0.9 MB) for search, closed search and item pages. 6 711 live / 83 670 closed lots for 'ポケモンカード PSA10'. Closed pages beyond the site window: see aucfree."
  },
  {
    "id": "buyee",
    "name": "Buyee (proxy shopping for Yahoo! Auctions / Mercari)",
    "domain": "buyee.jp",
    "country": "JP",
    "languages": ["en", "ja"],
    "sourceType": "marketplace",
    "categories": ["trading_cards", "action_figures", "watches"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": "https://buyee.jp/item/search/query/{q}", "product": "https://buyee.jp/item/yahoo/auction/{id}", "sold": null, "sitemap": null, "robots": "https://buyee.jp/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "high", "cloudflare": true, "robots": "robots.txt itself returns 403 to the bot UA", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "hard",
    "reliability": 0.5,
    "legal": null,
    "status": "rejected",
    "connectors": [],
    "statusReason": "Adds no access: Yahoo! Auctions serves its public pages directly to the bot UA (yahoo-auctions-jp). Buyee returns 403 to non-browser clients (even /robots.txt) and only mirrors Yahoo/Mercari items with a proxy fee.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "mercari-jp",
    "name": "Mercari Japan (メルカリ)",
    "domain": "jp.mercari.com",
    "country": "JP",
    "languages": ["ja", "en"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "trading_cards", "action_figures", "sneakers", "watches"],
    "api": { "available": false, "docsUrl": null, "auth": "partner", "notes": "api.mercari.jp/v2/entities:search requires app-signed (DPoP) requests; unsigned calls return UnsupportedVersionException." },
    "urls": { "search": "https://jp.mercari.com/search?keyword={q}", "product": "https://jp.mercari.com/item/{id}", "sold": null, "sitemap": null, "robots": "https://jp.mercari.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": true, "auctionResults": false, "historical": "months" },
    "access": { "pagination": "cursor", "jsRendering": true, "antiBot": "high", "cloudflare": false, "robots": "Disallows /v1/ and /v2/ (the API paths) plus account pages; search HTML allowed but is an empty SPA shell.", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave1",
    "difficulty": "very_hard",
    "reliability": 0.7,
    "legal": "Mercari terms prohibit unauthorised automated access; API requires signed requests → circumvention would be needed.",
    "status": "blocked",
    "connectors": [],
    "statusReason": "Search HTML is a JS shell with zero item data (verified: 0 titles server-side); the JSON API needs DPoP-signed headers generated by the app (robots also disallows /v1/, /v2/). Sold prices are therefore not lawfully reachable without circumvention.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Rakuma (fril.jp) checked too: robots.txt disallows /search/ with any parameter and every category/brand filter → no discovery path; rejected separately."
  },
  {
    "id": "rakuma",
    "name": "Rakuma (ラクマ, Rakuten flea market)",
    "domain": "fril.jp",
    "country": "JP",
    "languages": ["ja"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "trading_cards", "sneakers", "watches"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": "https://fril.jp/s?query={q}", "product": "https://item.fril.jp/{id}", "sold": null, "sitemap": null, "robots": "https://fril.jp/robots.txt" },
    "data": { "liveListings": true, "soldResults": true, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "medium", "cloudflare": false, "robots": "Disallow /search/ (only /search/$ allowed) and every filter/sort/category/brand query parameter.", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "hard",
    "reliability": 0.6,
    "legal": null,
    "status": "rejected",
    "connectors": [],
    "statusReason": "robots.txt forbids every search/browse path with parameters, leaving no compliant discovery route to listings.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "rakuten-ichiba",
    "name": "Rakuten Ichiba (楽天市場) — Item Search API",
    "domain": "openapi.rakuten.co.jp",
    "country": "JP",
    "languages": ["ja"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "yugioh", "one_piece_card_game", "trading_cards", "rolex", "omega", "other_watches", "nike_jordan", "sneakers", "gundam", "action_figures", "nintendo_games", "lego_sets"],
    "api": { "available": true, "docsUrl": "https://webservice.rakuten.co.jp/documentation/ichiba-item-search", "auth": "api_key", "notes": "Free application id; since API version 2026-07-01 an access key is also required (applicationId + accessKey). 1 request/s. JSON, formatVersion=2 recommended. Unauthenticated calls → 401 invalid_token." },
    "urls": { "search": "https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20260701?applicationId=…&accessKey=…&keyword={q}", "product": "https://item.rakuten.co.jp/{shop}/{item}/", "sold": null, "sitemap": null, "robots": null },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "seller": true, "gtin": false },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "n/a (official API)", "rateLimit": "1 req/s per application id", "preferredEngine": "api" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.75,
    "legal": "Rakuten Web Service terms: attribution required, 1 req/s, no redistribution of raw data beyond permitted use.",
    "status": "gated",
    "connectors": ["rakuten-ichiba"],
    "statusReason": "Needs RAKUTEN_APP_ID (+ RAKUTEN_ACCESS_KEY for new apps). Connector implemented against the documented response shape; fixture built from the documentation.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Legacy endpoint app.rakuten.co.jp/services/api/IchibaItem/Search/20220601 still answers (401 without key) and is used when only an application id is available."
  },
  {
    "id": "yahoo-shopping-jp",
    "name": "Yahoo! Shopping Japan — itemSearch V3 API",
    "domain": "shopping.yahooapis.jp",
    "country": "JP",
    "languages": ["ja"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "yugioh", "one_piece_card_game", "trading_cards", "rolex", "omega", "other_watches", "nike_jordan", "adidas_yeezy", "sneakers", "gundam", "action_figures", "nintendo_games", "lego_sets"],
    "api": { "available": true, "docsUrl": "https://developer.yahoo.co.jp/webapi/shopping/v3/itemsearch.html", "auth": "api_key", "notes": "Free Yahoo! JAPAN Client ID (appid). 50 results/page, start+results ≤ 1000, 1 query/s (429 beyond). Returns JAN codes, new/used condition, store, brand, genre." },
    "urls": { "search": "https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch?appid=…&query={q}", "product": "https://store.shopping.yahoo.co.jp/{store}/{code}.html", "sold": null, "sitemap": null, "robots": null },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "seller": true, "gtin": true },
    "access": { "pagination": "offset", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "n/a (official API)", "rateLimit": "1 query/s", "preferredEngine": "api" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.75,
    "legal": "Yahoo! JAPAN Web API guidelines: credit display required; commercial use per guidelines.",
    "status": "gated",
    "connectors": ["yahoo-shopping-jp"],
    "statusReason": "Needs YAHOO_JP_APP_ID. Connector implemented against the documented response; fixture is the documentation's sample response.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Unauthenticated call verified → 401 'Authentication parameters in your request incompleted'."
  },
  {
    "id": "snkrdunk",
    "name": "SNKRDUNK (スニーカーダンク)",
    "domain": "snkrdunk.com",
    "country": "JP",
    "languages": ["ja", "en"],
    "sourceType": "marketplace",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy", "pokemon", "trading_cards"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "The SPA loads prices from /en/v1/* JSON endpoints." },
    "urls": { "search": null, "product": "https://snkrdunk.com/en/sneakers/{styleCode} · https://snkrdunk.com/en/trading-cards/{id}", "sold": null, "sitemap": "https://snkrdunk.com/en/sitemap/sitemap-index-en-product-sneaker.xml", "robots": "https://snkrdunk.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": true, "auctionResults": false, "historical": "months" },
    "access": { "pagination": "sitemap", "jsRendering": true, "antiBot": "low", "cloudflare": false, "robots": "Disallow: /en/v1/* — the only place prices live. Product HTML (200) contains title/og tags but no price.", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["JPY"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "hard",
    "reliability": 0.7,
    "legal": null,
    "status": "blocked",
    "connectors": [],
    "statusReason": "Product pages are server-rendered without any price (verified on /en/sneakers/019332 and /en/trading-cards/843266); prices come from /en/v1/* which robots.txt disallows. Sitemaps (5 sneaker + 9 card shards) exist but yield only URLs/titles.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Would be a strong JP sneaker + card source (lowest ask, recent sales) if SNKRDUNK ever opens the API or robots."
  },
  {
    "id": "ruten",
    "name": "Ruten (露天拍賣)",
    "domain": "ruten.com.tw",
    "country": "TW",
    "languages": ["zh"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "one_piece_card_game", "yugioh", "trading_cards", "rolex", "other_watches", "nike_jordan", "sneakers", "action_figures", "gundam", "nintendo_games", "designer_toys"],
    "api": { "available": true, "docsUrl": null, "auth": "none", "notes": "Undocumented but public JSON used by the site: rtapi search (ids + TotalRows) and rapi items/v2/list (details, ≤ 30 ids)." },
    "urls": { "search": "https://rtapi.ruten.com.tw/api/search/v3/index.php/core/prod?q={q}&type=direct&sort=rnk/dc&offset={n}&limit=30", "product": "https://www.ruten.com.tw/item/show?{id}", "sold": null, "sitemap": null, "robots": "https://www.ruten.com.tw/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "seller": true },
    "access": { "pagination": "offset", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "www: /item/show? and /search/*.php disallowed (not fetched); rtapi: Allow / except /api/gsa/ and /api/feedback/; rapi: no robots.txt (404).", "rateLimit": "self-imposed 2 s", "preferredEngine": "api" },
    "currency": ["TWD"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.65,
    "legal": "Public storefront data only; sold_num is an aggregate counter (kept as metadata, never a sale).",
    "status": "implemented",
    "connectors": ["ruten"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "75 130 results for '寶可夢 PSA10'; item JSON carries TWD price, stock, post/update time, storefront name, images."
  },
  {
    "id": "shopee-tw",
    "name": "Shopee Taiwan (蝦皮購物)",
    "domain": "shopee.tw",
    "country": "TW",
    "languages": ["zh"],
    "sourceType": "marketplace",
    "categories": ["trading_cards", "sneakers", "action_figures"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "api/v4/search/search_items answers 403 without browser fingerprint headers." },
    "urls": { "search": "https://shopee.tw/search?keyword={q}", "product": null, "sold": null, "sitemap": null, "robots": "https://shopee.tw/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "offset", "jsRendering": true, "antiBot": "blocking", "cloudflare": false, "robots": "Crawl-delay 1 for *, search filters disallowed", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["TWD"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "very_hard",
    "reliability": 0.5,
    "legal": null,
    "status": "blocked",
    "connectors": [],
    "statusReason": "Anti-bot: JSON search endpoint returns 403 to non-browser clients; the site is a JS shell. Not retried.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "carousell",
    "name": "Carousell (SG / HK)",
    "domain": "carousell.sg",
    "country": "SG",
    "supportedCountries": ["SG", "HK", "MY", "PH"],
    "languages": ["en", "zh"],
    "sourceType": "marketplace",
    "categories": ["watches", "sneakers", "trading_cards"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "api-service/filter/search/3.3/products/ is robots-allowed but answers 403 to the bot UA." },
    "urls": { "search": "https://www.carousell.sg/search/{q}", "product": "https://www.carousell.sg/p/{slug}", "sold": null, "sitemap": "https://www.carousell.sg/sitemap.xml", "robots": "https://www.carousell.sg/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "cursor", "jsRendering": true, "antiBot": "high", "cloudflare": true, "robots": "Disallow /search/ and /*? for *; Allow /api-service/*? and /smart_render/*?", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["SGD", "HKD"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "very_hard",
    "reliability": 0.5,
    "legal": null,
    "status": "blocked",
    "connectors": [],
    "statusReason": "Search pages are robots-disallowed and the allowed api-service endpoint returns 403 (Cloudflare) to the bot UA.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "bunjang",
    "name": "Bunjang (번개장터)",
    "domain": "bunjang.co.kr",
    "country": "KR",
    "languages": ["ko"],
    "sourceType": "marketplace",
    "categories": ["pokemon", "yugioh", "one_piece_card_game", "trading_cards", "rolex", "other_watches", "nike_jordan", "adidas_yeezy", "sneakers", "action_figures", "gundam", "lego_sets", "designer_toys"],
    "api": { "available": true, "docsUrl": null, "auth": "none", "notes": "Undocumented public JSON used by m.bunjang.co.kr: api.bunjang.co.kr/api/1/find_v2.json (search, 100/page, 0-based) and /api/pms/v3/products-detail/{pid} (detail, not used)." },
    "urls": { "search": "https://api.bunjang.co.kr/api/1/find_v2.json?q={q}&order=date&page={n}&n=100", "product": "https://m.bunjang.co.kr/products/{pid}", "sold": null, "sitemap": null, "robots": "https://m.bunjang.co.kr/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "m.bunjang.co.kr: Allow / for *, Disallow /login /apps /talk2; named AI-training bots disallowed. api host: 403 JSON for robots.txt (no rules).", "rateLimit": "self-imposed 2.5 s", "preferredEngine": "api" },
    "currency": ["KRW"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.6,
    "legal": "Terms page is a JS shell (not readable to the bot); public listing data only, no seller identifiers stored.",
    "status": "implemented",
    "connectors": ["bunjang"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "3 079 results for '포켓몬카드 PSA10'; rows carry KRW price, status, category id, tags, region label, favourites."
  },
  {
    "id": "kream",
    "name": "KREAM (크림, Naver)",
    "domain": "kream.co.kr",
    "country": "KR",
    "languages": ["ko"],
    "sourceType": "marketplace",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy", "new_balance_asics_other", "designer_toys", "trading_cards"],
    "api": { "available": false, "docsUrl": null, "auth": "partner", "notes": "api.kream.co.kr returns 403 unless the app's signed request headers (webRequestSecret) are sent." },
    "urls": { "search": "https://kream.co.kr/search?keyword={q}", "product": "https://kream.co.kr/products/{id}", "sold": null, "sitemap": "https://kream.co.kr/sitemap.xml", "robots": "https://kream.co.kr/robots.txt" },
    "data": { "liveListings": true, "soldResults": true, "auctionResults": false, "historical": "years" },
    "access": { "pagination": "cursor", "jsRendering": true, "antiBot": "medium", "cloudflare": false, "robots": "Allow / (disallow /my*, /history*, /bridge/)", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["KRW"],
    "freshness": "realtime",
    "priority": "wave2",
    "difficulty": "very_hard",
    "reliability": 0.8,
    "legal": "이용약관 (/agreement) forbids abnormal use of the service functions via automated means; no explicit public-data crawling clause.",
    "status": "planned",
    "connectors": [],
    "statusReason": "Not implemented: the product API needs app-secret request headers (would be circumvention); the SSR HTML only exposes a Nuxt payload serialised as a JS function and an og:product:price meta whose meaning (last trade vs. lowest ask) is ambiguous — storing it would violate the data-honesty rule. Revisit if KREAM publishes a partner API.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Product page /products/34586 carried product:price:amount 440000 KRW and '즉시 구매가 없음' (no instant-buy price) at the same time."
  },
  {
    "id": "watchcharts",
    "name": "WatchCharts",
    "domain": "watchcharts.com",
    "country": "US",
    "languages": ["en"],
    "sourceType": "analytics_provider",
    "categories": ["watches", "rolex", "patek_philippe", "audemars_piguet", "omega", "other_watches"],
    "api": { "available": true, "docsUrl": "https://watchcharts.com/api", "auth": "partner", "notes": "Commercial data API (paid, partner agreement)." },
    "urls": { "search": null, "product": "https://watchcharts.com/watch_model/{id}", "sold": null, "sitemap": null, "robots": "https://watchcharts.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": false, "auctionResults": false, "historical": "years" },
    "access": { "pagination": "none", "jsRendering": true, "antiBot": "blocking", "cloudflare": true, "robots": "Unreadable: /robots.txt itself returns 403 to the bot UA (as do / and /terms).", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "daily",
    "priority": "wave2",
    "difficulty": "very_hard",
    "reliability": 0.85,
    "legal": "Terms could not be read (403); WatchCharts sells its market data commercially.",
    "status": "blocked",
    "connectors": [],
    "statusReason": "403 for every path with the honest UA (robots.txt, home, terms — re-verified 2026-09-08, also via Firecrawl → 404/403). Circumventing would require a browser fingerprint against an explicit block; market-index values are the company's paid product.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "loupe-this",
    "name": "Loupe This",
    "domain": "loupethis.com",
    "country": "US",
    "languages": ["en"],
    "sourceType": "auction_house",
    "categories": ["watches", "rolex", "patek_philippe", "audemars_piguet", "omega", "other_watches"],
    "api": { "available": true, "docsUrl": null, "auth": "none", "notes": "Public JSON:API behind the site: api.loupethis.com/api/v1/auctions?status=closed|live&per_page=100&page=N&include=brand; meta.pagination gives total pages/count." },
    "urls": { "search": "https://api.loupethis.com/api/v1/auctions?status=closed&per_page=100&page={n}", "product": "https://loupethis.com/auctions/{slug}", "sold": "https://loupethis.com/results", "sitemap": null, "robots": "https://loupethis.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": true, "auctionResults": true, "historical": "years", "images": true, "seller": false, "saleDate": true, "realizedPrice": true, "fees": true, "grading": false, "certNumber": false, "itemId": true },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "Disallow: (empty) on both loupethis.com and api.loupethis.com", "rateLimit": "self-imposed 1.5 s", "preferredEngine": "api" },
    "currency": ["USD"],
    "freshness": "realtime",
    "priority": "wave1",
    "difficulty": "easy",
    "reliability": 0.9,
    "legal": "Public auction results; sold price includes the 10 % buyer's premium (flagged). Bidder ids ignored.",
    "status": "implemented",
    "connectors": ["loupe-this"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "4 251 closed lots (43 pages) since 2021; ~30 live lots per week."
  },
  {
    "id": "chronext",
    "name": "CHRONEXT",
    "domain": "chronext.com",
    "country": "DE",
    "supportedCountries": ["DE", "GB", "US", "CH", "EU"],
    "languages": ["en", "de"],
    "sourceType": "dealer",
    "categories": ["watches", "rolex", "patek_philippe", "audemars_piguet", "omega", "other_watches"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Frontastic front end; pages return JSON when Accept: application/json is sent (not used). Category HTML is server-rendered with .product-tile elements; product pages carry schema.org Product." },
    "urls": { "search": "https://www.chronext.com/{brand}/{model}", "product": "https://www.chronext.com/{brand}/{model}/{reference}/V{id}", "sold": null, "sitemap": "https://www.chronext.com/sitemap.xml", "robots": "https://www.chronext.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "seller": true },
    "access": { "pagination": "offset", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "Allow /; disallow checkout/cart/campaign and two-letter country prefixes", "rateLimit": "self-imposed 4 s (pages are ~3.7 MB)", "preferredEngine": "api" },
    "currency": ["USD", "EUR", "GBP", "CHF"],
    "freshness": "daily",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.8,
    "legal": "Dealer asking prices, public pages, honest UA.",
    "status": "implemented",
    "connectors": ["chronext"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "Displayed currency follows the requester's geo (USD seen from North America) — stored as shown."
  },
  {
    "id": "european-watch-company",
    "name": "European Watch Company",
    "domain": "europeanwatch.com",
    "country": "US",
    "languages": ["en"],
    "sourceType": "dealer",
    "categories": ["watches", "rolex", "patek_philippe", "audemars_piguet", "omega", "other_watches"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Server-rendered Next.js inventory grid (/all) + schema.org Product on item pages; sitemap-products.xml lists the same ~750 URLs." },
    "urls": { "search": "https://www.europeanwatch.com/all", "product": "https://www.europeanwatch.com/watch/{slug}-{id}", "sold": null, "sitemap": "https://www.europeanwatch.com/sitemap-products.xml", "robots": "https://www.europeanwatch.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none", "seller": true },
    "access": { "pagination": "none", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "Allow /; disallow /private/ /api/ /app/ /profile/", "rateLimit": "self-imposed 3 s", "preferredEngine": "api" },
    "currency": ["USD"],
    "freshness": "daily",
    "priority": "wave2",
    "difficulty": "easy",
    "reliability": 0.8,
    "legal": "Dealer asking prices, public pages.",
    "status": "implemented",
    "connectors": ["european-watch-company"],
    "statusReason": null,
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": "One ~5 MB page = whole inventory (750 watches)."
  },
  {
    "id": "wind-vintage",
    "name": "Wind Vintage",
    "domain": "windvintage.com",
    "country": "US",
    "languages": ["en"],
    "sourceType": "dealer",
    "categories": ["watches", "rolex", "other_watches"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Squarespace site; /watch-listings?format=json-pretty works but is a blog collection with 3 posts." },
    "urls": { "search": "https://www.windvintage.com/watch-listings", "product": "https://www.windvintage.com/watch-listings/{slug}", "sold": null, "sitemap": "https://www.windvintage.com/sitemap.xml", "robots": "https://www.windvintage.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "none", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "Disallow /search, /config, /api/ (Squarespace default); AI-training bots disallowed", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "weekly",
    "priority": "later",
    "difficulty": "medium",
    "reliability": 0.5,
    "legal": null,
    "status": "rejected",
    "connectors": [],
    "statusReason": "Inventory is 3 blog-style posts without structured prices (mostly sells by appointment); the 5 685-URL sitemap is editorial content. Not worth a connector.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "the1916company",
    "name": "The 1916 Company (WatchBox / Govberg)",
    "domain": "the1916company.com",
    "country": "US",
    "languages": ["en"],
    "sourceType": "dealer",
    "categories": ["watches", "rolex", "patek_philippe", "audemars_piguet", "omega", "other_watches"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Salesforce Commerce Cloud storefront; /pre-owned-watches/rolex/ returns 404 for the bot UA; sitemaps list no product URLs." },
    "urls": { "search": null, "product": null, "sold": null, "sitemap": "https://www.the1916company.com/sitemap_index.xml", "robots": "https://www.the1916company.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "unknown", "jsRendering": true, "antiBot": "medium", "cloudflare": true, "robots": "Disallow /search*, /api/*, ?q=, scroll/pmin/pmax params, demandware paths", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "daily",
    "priority": "later",
    "difficulty": "hard",
    "reliability": 0.7,
    "legal": null,
    "status": "planned",
    "connectors": [],
    "statusReason": "No product sitemap (sitemap_0-pipeline/sitemap_1 hold 60 static pages) and the category URL returned 404 to the bot; inventory grid appears JS/API driven under /api/* (robots-disallowed). Needs a Scrapfly render experiment before deciding.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "restocks",
    "name": "Restocks",
    "domain": "restocks.net",
    "country": "NL",
    "languages": ["en", "nl", "de", "fr"],
    "sourceType": "marketplace",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy", "new_balance_asics_other"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": null, "product": null, "sold": null, "sitemap": null, "robots": "https://restocks.net/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "unknown", "jsRendering": true, "antiBot": "blocking", "cloudflare": true, "robots": "unreachable", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["EUR"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "very_hard",
    "reliability": 0.6,
    "legal": null,
    "status": "blocked",
    "connectors": [],
    "statusReason": "TLS handshake rejected for the bot client (LibreSSL alert internal error on restocks.net and www) and Firecrawl scrape timed out — site unreachable to non-browser clients.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "wethenew",
    "name": "Wethenew",
    "domain": "wethenew.com",
    "country": "FR",
    "languages": ["fr", "en"],
    "sourceType": "marketplace",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy", "new_balance_asics_other"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": "Shopify shop, but /products.json answers 403 to the bot UA." },
    "urls": { "search": null, "product": "https://wethenew.com/products/{handle}", "sold": null, "sitemap": null, "robots": "https://wethenew.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "high", "cloudflare": true, "robots": "Standard Shopify robots (search, cart, sorted collections disallowed)", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["EUR"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "hard",
    "reliability": 0.65,
    "legal": null,
    "status": "blocked",
    "connectors": [],
    "statusReason": "Shopify storefront JSON (/products.json) returns 403 to the honest UA (bot protection); HTML home is 200 but products.json is the only structured route.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "kikikickz",
    "name": "Kikikickz",
    "domain": "kikikickz.com",
    "country": "FR",
    "languages": ["fr", "en"],
    "sourceType": "marketplace",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": null, "product": null, "sold": null, "sitemap": null, "robots": "https://www.kikikickz.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "unknown", "jsRendering": true, "antiBot": "blocking", "cloudflare": true, "robots": "unreachable (403)", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["EUR"],
    "freshness": "realtime",
    "priority": "later",
    "difficulty": "very_hard",
    "reliability": 0.6,
    "legal": null,
    "status": "blocked",
    "connectors": [],
    "statusReason": "403 for the bot UA on every path including /robots.txt.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "sole-supplier",
    "name": "The Sole Supplier (Sole Market)",
    "domain": "thesolesupplier.co.uk",
    "country": "GB",
    "languages": ["en"],
    "sourceType": "analytics_provider",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy", "new_balance_asics_other"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": null, "product": "https://thesolesupplier.co.uk/sole-market/{brand}/{model}/{slug}/", "sold": null, "sitemap": "https://thesolesupplier.co.uk/sitemaps/index.xml", "robots": "https://thesolesupplier.co.uk/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "sitemap", "jsRendering": true, "antiBot": "low", "cloudflare": false, "robots": "Sole Market pages allowed at /sole-market/*/*/*/ but every filter (size, colour, sort, q, gender) disallowed", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["GBP"],
    "freshness": "daily",
    "priority": "later",
    "difficulty": "medium",
    "reliability": 0.5,
    "legal": null,
    "status": "rejected",
    "connectors": [],
    "statusReason": "Affiliate aggregator of retailers' retail prices (not resale market data) — duplicates retailer feeds without adding transactions or asks.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "sneakers123",
    "name": "Sneakers123",
    "domain": "sneakers123.com",
    "country": "AT",
    "languages": ["en", "de", "ja"],
    "sourceType": "analytics_provider",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy", "new_balance_asics_other"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": null, "product": null, "sold": null, "sitemap": "https://sneakers123.com/sitemap.xml", "robots": "https://www.sneakers123.com/robots.txt" },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "sitemap", "jsRendering": false, "antiBot": "none", "cloudflare": false, "robots": "Allow / (search/sort/brand filters disallowed)", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["EUR"],
    "freshness": "daily",
    "priority": "later",
    "difficulty": "medium",
    "reliability": 0.5,
    "legal": null,
    "status": "rejected",
    "connectors": [],
    "statusReason": "Retail price comparison of shop inventories (affiliate), not collectible resale/market data.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "sole-retriever",
    "name": "Sole Retriever",
    "domain": "soleretriever.com",
    "country": "US",
    "languages": ["en"],
    "sourceType": "analytics_provider",
    "categories": ["sneakers", "nike_jordan", "adidas_yeezy"],
    "api": { "available": false, "docsUrl": null, "auth": "none", "notes": null },
    "urls": { "search": null, "product": null, "sold": null, "sitemap": "https://www.soleretriever.com/sitemap.xml", "robots": "https://www.soleretriever.com/robots.txt" },
    "data": { "liveListings": false, "soldResults": false, "auctionResults": false, "historical": "none" },
    "access": { "pagination": "sitemap", "jsRendering": true, "antiBot": "high", "cloudflare": true, "robots": "Allow /collections/*; disallow /api/*, /search?, user pages", "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "daily",
    "priority": "later",
    "difficulty": "hard",
    "reliability": 0.5,
    "legal": null,
    "status": "blocked",
    "connectors": [],
    "statusReason": "Release-date / raffle aggregator (no market prices) and the allowed /collections/* path returns 403 (Cloudflare) to the bot UA.",
    "verified": true,
    "verifiedAt": "2026-09-08",
    "notes": null
  },
  {
    "id": "watchuseek",
    "name": "WatchUSeek forums (sales corner)",
    "domain": "watchuseek.com",
    "country": "US",
    "languages": ["en"],
    "sourceType": "forum",
    "categories": ["watches"],
    "api": { "available": false, "docsUrl": null, "auth": "login", "notes": null },
    "urls": { "search": null, "product": null, "sold": null, "sitemap": null, "robots": null },
    "data": { "liveListings": true, "soldResults": false, "auctionResults": false, "historical": "years" },
    "access": { "pagination": "page_number", "jsRendering": false, "antiBot": "medium", "cloudflare": true, "robots": null, "rateLimit": null, "preferredEngine": "none" },
    "currency": ["USD"],
    "freshness": "daily",
    "priority": "later",
    "difficulty": "hard",
    "reliability": 0.3,
    "legal": "User-generated forum posts with personal data (member names, PayPal details).",
    "status": "rejected",
    "connectors": [],
    "statusReason": "Forum classifieds: unstructured member posts with personal data, no reliable price/sale fields — out of scope per brief.",
    "verified": false,
    "verifiedAt": null,
    "notes": null
  }
]
