{
  "openapi": "3.0.1",
  "info": {
    "title": "Etsy Shop Details Scraper 🏪 Sales, Reviews & Emails",
    "description": "Paste Etsy shop URLs for one row per shop: lifetime sales, rating, listings, Star Seller, slogan and logo. Optional: every shop review as its own row, plus contact emails and the shop's products. JSON/CSV/Excel.",
    "version": "0.0",
    "x-build-id": "EV5uym4HsSZOYcZ8a"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~etsy-shop-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-etsy-shop-scraper",
        "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/memo23~etsy-shop-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-etsy-shop-scraper",
        "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/memo23~etsy-shop-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-etsy-shop-scraper",
        "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": {
          "startUrls": {
            "title": "Etsy shop URLs",
            "type": "array",
            "description": "Etsy shop URLs — <code>https://www.etsy.com/shop/{name}</code> or <code>{name}.etsy.com</code>, one per shop. Each shop gives one shop row (name, lifetime sales, rating + review count, total listings, Star Seller, year opened, admirers, location, slogan, logo). Product, search and category URLs also work and give product rows.",
            "items": {
              "type": "string"
            }
          },
          "shopNames": {
            "title": "Shop names",
            "type": "array",
            "description": "Etsy shop names, e.g. <code>CandlesByLauraCo</code>, one per line. Same result as pasting the shop URL.",
            "items": {
              "type": "string"
            }
          },
          "shopSearchQueries": {
            "title": "Find shops by keyword",
            "type": "array",
            "description": "Keywords for Etsy's shop search, e.g. <code>candles</code> or <code>vintage jewelry</code>. Etsy matches them against shop names and returns 12 shops a page; the run keeps reading pages until it has found <b>Maximum rows</b> shops. Each shop found gives one shop row.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "type": "integer",
            "description": "Cap on billed rows for the whole run: shop rows, review rows and product rows together. For shop rows only, set it to the number of shops you want (a keyword search stops once it has found this many).",
            "default": 10
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Pages fetched in parallel. Keep it moderate (3–8).",
            "default": 5
          },
          "shopDetails": {
            "title": "Shop details row (one row per shop URL)",
            "type": "boolean",
            "description": "One shop row (rowType: \"shop\") per shop. This is the core of the actor; leave it on.",
            "default": true
          },
          "shopReviews": {
            "title": "Shop reviews (one row per review)",
            "type": "boolean",
            "description": "For each shop URL, add one row per customer review (rowType: \"shopReview\"): reviewer, date, star rating, review text, buyer photo, and the item the review is about. Newest first. Each review row is a billed result and counts toward Maximum rows, so raise Maximum rows to the number of reviews you want.",
            "default": false
          },
          "maxReviewsPerShop": {
            "title": "Maximum reviews per shop",
            "minimum": 1,
            "type": "integer",
            "description": "Stop collecting a shop's reviews after this many rows. Maximum rows still caps the whole run.",
            "default": 100
          },
          "shopProducts": {
            "title": "Also scrape each shop's products",
            "type": "boolean",
            "description": "Off: each shop gives its shop row (and review rows) only. On: the run also reads the shop's listings into product rows (~40 fields each), which are billed rows and count toward Maximum rows.",
            "default": false
          },
          "searchQuery": {
            "title": "Product search keyword",
            "type": "string",
            "description": "A keyword to search Etsy products for, e.g. \"ceramic mug\". Gives product rows, not shop rows. To find shops, use <b>Find shops by keyword</b> above."
          },
          "includeReviews": {
            "title": "Include sample reviews on product rows",
            "type": "boolean",
            "description": "When product rows are collected, include the recent customer reviews carried in each listing's structured data (author, rating, text, date).",
            "default": true
          },
          "enrichSeller": {
            "title": "Also enrich product rows with shop/seller data",
            "type": "boolean",
            "description": "When product rows are collected, add the shop's lifetime sales, Star-Seller status, total listings, rating, and slogan/description onto each product row (one cached fetch per shop).",
            "default": false
          },
          "enrichEmails": {
            "title": "Enrich with seller contact emails (billed per email)",
            "type": "boolean",
            "description": "Best-effort: discover each shop's own website (from its name + country) and harvest a contact email. Adds contactEmail, contactWebsite and a detailed emailEnrichment object. Billed per email found — never charged for misses.",
            "default": false
          },
          "qualifyByPayment": {
            "title": "💳 Qualify by payment (flag businesses that take money online)",
            "type": "boolean",
            "description": "Requires \"Enrich with contact emails\". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments, paymentProcessors, stripeLiveKey and paymentConfidence. No extra charge — included with each enriched company.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy for the seller website visits made by contact-email discovery. Etsy pages themselves need no proxy setup.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}