{
  "openapi": "3.0.1",
  "info": {
    "title": "Etsy Products Scraper — robots-allowed, no CAPTCHA",
    "description": "Drop-in compatible with crawlerbros/etsy-scraper — cheaper and reliable. Etsy keyword results as JSON: listing id, title, price, sale price, discount, rating, reviews, image, shop id, ad flag, position. Reads only the routes Etsy's own robots.txt allows, never the search URLs it disallows.",
    "version": "1.0",
    "x-build-id": "seWVBCfZvc88iMtyh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/diopside~etsy-products/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-diopside-etsy-products",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/diopside~etsy-products/runs": {
      "post": {
        "operationId": "runs-sync-diopside-etsy-products",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/diopside~etsy-products/run-sync": {
      "post": {
        "operationId": "run-sync-diopside-etsy-products",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "searchQueries": {
            "title": "Search keywords",
            "uniqueItems": true,
            "type": "array",
            "description": "Keywords to look up on Etsy, e.g. `leather wallet`. Same field name and shape as `crawlerbros/etsy-scraper`, so an existing input works unchanged.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Etsy URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Etsy market, search or category URLs. The keyword is read out of the URL and fetched from `/market/<keyword>`: a `/search?q=` URL is accepted for compatibility but is never requested, because Etsy's robots.txt disallows that path. Same field name as `crawlerbros/etsy-scraper`.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxItems": {
            "title": "Max items (per keyword)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum listings to return per keyword. 0 = every result Etsy will paginate through. Same field name as `crawlerbros/etsy-scraper`."
          },
          "maxPages": {
            "title": "Max pages (per keyword)",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "Stop after this many market pages per keyword (~48 listings per page). Whichever of this and `maxItems` is reached first wins. Same field name as `yumitori/etsy-listings-scraper`."
          },
          "includeAds": {
            "title": "Include sponsored listings",
            "type": "boolean",
            "description": "Etsy mixes promoted listings into the grid. Keep them (they are flagged with `isAd` / `badges.ad`) or drop them. Same field name as `yumitori/etsy-listings-scraper`.",
            "default": true
          },
          "dedupeAcrossQueries": {
            "title": "De-duplicate across keywords",
            "type": "boolean",
            "description": "Return each listing id at most once across the whole run, instead of once per keyword. You are charged per pushed listing, so leaving this on is also what keeps overlapping keywords from billing twice.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Etsy is behind DataDome. In our platform probe, raw Apify IPs and the Apify datacenter pool were 403-blocked on 12/12 market-page requests while RESIDENTIAL passed, so RESIDENTIAL is the default. Turning the proxy off will almost certainly return nothing.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          },
          "queries": {
            "title": "Search keywords (alias)",
            "type": "array",
            "description": "Alias of `searchQueries`, accepted for drop-in compatibility with `yumitori/etsy-listings-scraper`.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max results (alias)",
            "minimum": 0,
            "type": "integer",
            "description": "Alias of `maxItems`, accepted for drop-in compatibility with `yumitori/etsy-listings-scraper`."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Proxy exit country for the run. Etsy prices are returned in USD from the US storefront; this only changes which residential IPs are used. Same field name as `crawlerbros/etsy-scraper`.",
            "default": "US"
          },
          "includeDetails": {
            "title": "Include product details (not supported)",
            "type": "boolean",
            "description": "Accepted so `crawlerbros/etsy-scraper` inputs run unchanged, but it has NO effect: Etsy's `/listing/<id>` detail pages returned 403 DataDome on every proxy tier we measured, residential included. Setting it logs a warning rather than silently pretending. See the README for what this actor returns instead.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}