{
  "id": "etsy",
  "displayName": "Etsy Open API v3 (vintage & collectibles listings) — gated",
  "sourceId": "etsy",
  "sourceName": "Etsy",
  "sourceType": "marketplace",
  "sourceUrl": "https://www.etsy.com",
  "module": "api/etsy",
  "enginePriority": ["api"],
  "categories": ["vintage_toys", "cameras", "pens", "clocks", "design_furniture", "antiques", "porcelain", "glass_crystal", "silver", "jewelry", "other_watches", "movie_posters", "music", "books", "postcards", "advertising", "pokemon", "sports_cards", "comics", "typewriters", "scientific_instruments"],
  "regions": ["US", "GB", "CA", "DE", "FR", "AU"],
  "languages": ["en"],
  "currency": ["USD", "GBP", "EUR", "CAD", "AUD"],
  "supportsListings": true,
  "supportsSold": false,
  "supportsAuctions": false,
  "supportsImages": true,
  "supportsCatalog": false,
  "supportsPopulation": false,
  "supportsLookup": true,
  "refreshFrequencyMinutes": 360,
  "priority": "medium",
  "trustScore": 0.7,
  "attributionRequired": true,
  "termsUrl": "https://www.etsy.com/legal/api",
  "acquisitionMethod": "official API (x-api-key)",
  "historicalDepth": "none",
  "requires": ["ETSY_API_KEY"],
  "accessNotes": "Official Etsy Open API v3 (developers.etsy.com/documentation, OpenAPI contract at etsy.com/openapi/generated/oas/3.0.0.json). Auth: the application keystring in the x-api-key header (Etsy's request guide shows the 'keystring:shared_secret' form; either value works in ETSY_API_KEY — we send it verbatim). No OAuth is needed for the application-scoped read endpoints we use: GET /v3/application/listings/active (findAllListingsActive: keywords, taxonomy_id, min_price/max_price, sort_on=created, sort_order=desc, limit ≤ 100, offset), GET /v3/application/listings/batch?listing_ids=…&includes=Images,Shop (one call per page to attach images and the public shop name/country/review score) and GET /v3/application/seller-taxonomy/nodes (taxonomy ids resolved by node-name path and cached in the cursor). Prices are Money {amount, divisor, currency_code} in each shop's own currency → native currency listings; images url_fullxfull; created/ending epoch timestamps → listedAt/endsAt. Etsy publishes no sold prices, so this is a listings-only source; supplies, made-to-order and non-active listings are skipped and 'when_made' eras are kept as metadata. Rate limits (Etsy default): 10 requests/second and 10,000 requests/day per app — a run uses ≤ 8 queries × (1 search + 1 batch) calls every 6 h. Credentials: register at https://www.etsy.com/developers/register, create an app (personal-access apps are approved instantly; commercial access requires Etsy's review under the API Terms of Use https://www.etsy.com/legal/api) and copy the keystring into ETSY_API_KEY. Until then the framework reports the connector DISABLED (requires) and the crawler exits with a missing_credentials anomaly. Fixtures are synthesised from the official OpenAPI schema (ShopListing, Money, ListingImage), not live captures — see the fixture note. Category slugs come from the configured query seeds (keywords + taxonomy path), confidence 0.7 (title-level identification only).",
  "enabled": true,
  "schemaVersion": "1.0",
  "config": {
    "limit": 100,
    "pagesPerQuery": 1,
    "backfillPages": 5,
    "queriesPerRun": 8,
    "fetchImages": true,
    "sortOn": "created",
    "sortOrder": "desc",
    "queries": [
      { "keywords": "vintage pokemon card", "taxonomyPath": ["Toys & Games", "Games & Puzzles", "Card Games"], "categorySlug": "pokemon" },
      { "keywords": "vintage baseball card", "taxonomyPath": ["Art & Collectibles", "Collectibles"], "categorySlug": "sports_cards" },
      { "keywords": "vintage comic book", "taxonomyPath": ["Books, Movies & Music", "Books", "Comics & Graphic Novels"], "categorySlug": "comics" },
      { "keywords": "vintage film camera", "taxonomyPath": ["Electronics & Accessories", "Cameras & Equipment"], "categorySlug": "cameras" },
      { "keywords": "vintage fountain pen", "categorySlug": "pens" },
      { "keywords": "antique mantel clock", "categorySlug": "clocks" },
      { "keywords": "mid century modern chair", "taxonomyPath": ["Home & Living", "Furniture"], "categorySlug": "design_furniture" },
      { "keywords": "antique porcelain vase", "categorySlug": "porcelain" },
      { "keywords": "murano glass vase", "categorySlug": "glass_crystal" },
      { "keywords": "sterling silver antique", "categorySlug": "silver" },
      { "keywords": "vintage wristwatch", "taxonomyPath": ["Accessories", "Watches"], "categorySlug": "other_watches" },
      { "keywords": "original movie poster", "categorySlug": "movie_posters" },
      { "keywords": "vintage vinyl record first pressing", "categorySlug": "music" },
      { "keywords": "first edition book", "taxonomyPath": ["Books, Movies & Music", "Books"], "categorySlug": "books" },
      { "keywords": "antique postcard", "categorySlug": "postcards" },
      { "keywords": "vintage advertising sign", "categorySlug": "advertising" },
      { "keywords": "vintage typewriter", "categorySlug": "typewriters" },
      { "keywords": "antique microscope", "categorySlug": "scientific_instruments" },
      { "keywords": "vintage tin toy", "taxonomyPath": ["Toys & Games", "Toys"], "categorySlug": "vintage_toys" }
    ]
  }
}
