# Etsy Scraper — Listings, Shops, Reviews & Keyword Research (`crawl_craft/etsy-scraper`) Actor

Etsy research tools charge monthly and still hide the raw data. Get it yourself: listings, shops, reviews, prices, sales estimates, keyword research and ad ranks, exported to JSON, CSV or Excel. Pay per result, no subscription, no login.

- **URL**: https://apify.com/crawl_craft/etsy-scraper.md
- **Developed by:** [Crawl Craft](https://apify.com/crawl_craft) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🚀 What is Etsy Scraper?

Etsy Scraper is an Apify Actor that collects public Etsy data in bulk: listings, prices, shop details, reviews and keyword reports. Paste Etsy links or type keywords, shop names and listing IDs, then download structured rows as JSON, CSV or Excel. No Etsy login is needed.

- 🔎 **Every Etsy source in one run:** mix search, category, listing and shop links with keywords, shop names and listing IDs, which makes it a handy Etsy bulk scraper.
- 📈 **Organic and sponsored ranks:** separate organic and ad ranks per search are the basis for Etsy ad rank tracking across keywords.
- 🏪 **Shop reports with a sales estimate:** each shop gets a rating, review count, sections and an estimated monthly sales figure.
- 🔄 **Change tracking between runs:** schedule the Actor and see which listings are new and which values moved.
- 💰 **Simple pricing:** $3 per 1,000 results on the Free plan and less on paid plans, with no extra setup.

Click **Try for free**, paste an Etsy link and press **Start**.

### 📊 What data can you extract from Etsy?

This Etsy data scraper returns four kinds of rows in one dataset, and the `recordType` field tells them apart: `listing`, `shop`, `review` and `keyword`. The rows are saved in this order: keyword reports, shop reports, listings, then reviews. You can export them from the Apify dataset as JSON, CSV, Excel, XML or HTML.

The tables below list every field name from the dataset schema, with the description and the schema example where one exists. A dash means the schema gives no example value. Some groups of fields only appear when you switch on the matching option: demand signals (`views24h`, `inCartCount`, `stockLeft` and similar), shipping and returns, and change tracking (`isNew`, `changes`).

#### Listing rows

Listing rows hold the core Etsy product data: title, prices, photos, badges and shipping. They also carry Etsy seller data such as owner, years on Etsy, total sales and location.

| Field | Description | Example |
|---|---|---|
| `recordType` | listing, shop, review or keyword. | `listing` |
| `listingId` | Etsy listing ID. | `1721240021` |
| `title` | Listing title. | Dainty Birth Flower Necklace, 14K Gold |
| `listingUrl` | Link to the listing. | https://www.etsy.com/listing/1721240021/dainty-birth-flower-necklace |
| `image` | Main photo in full size. | https://i.etsystatic.com/17431768/r/il/b7a6d4/5994858321/il_fullxfull.5994858321_j2e1.jpg |
| `images` | Every listing photo in full size (with demand signals). | — |
| `photoCount` | Number of photos (with demand signals). | `10` |
| `videoUrl` | Listing video, when there is one. | — |
| `price` | Regular price (before a sale) in the run currency. | `35.0` |
| `discountedPrice` | Current sale price; null when not on sale. | `21.0` |
| `discountPct` | Sale discount in percent. | `40` |
| `currencyCode` | Currency of all prices in the row. | `USD` |
| `onSale` | True when the listing is discounted. | `true` |
| `priceIsFrom` | True when the price is the lowest of several options. | `false` |
| `shopId` | Etsy shop ID. | `17431768` |
| `shopName` | Shop name. | YourNamesJewelry |
| `shopUrl` | Link to the shop. | https://www.etsy.com/shop/YourNamesJewelry |
| `shopOwner` | First name of the shop owner. | Grace |
| `shopYearsOnEtsy` | How long the shop has sold on Etsy, in years. | `8.0` |
| `shopSales` | Total sales of the shop. | `281600` |
| `shopSalesIsRounded` | True when Etsy shows the sales rounded (e.g. 281.6k). | `true` |
| `sellerLocation` | Where the shop is located. | Texas, United States |
| `acceptsCustomOrders` | True when the shop is open to custom orders. | `true` |
| `shopRating` | Average shop rating (1-5). | `4.8` |
| `shopRatingCount` | Number of shop reviews. | `42600` |
| `isStarSeller` | Shop has the Star Seller badge. | `false` |
| `isBestseller` | Listing has the Bestseller badge. | `false` |
| `isPopularNow` | Listing shows "Popular now". | `true` |
| `isEtsyPick` | Listing is an Etsy's Pick. | `false` |
| `isLimitedStock` | Listing shows "Limited stock". | `false` |
| `isFreeShipping` | Listing shows free shipping. | `false` |
| `isDigital` | Listing is a digital download. | `false` |
| `isHandmade` | True when made by the seller; null when the listing shows no maker line. | — |
| `makerType` | made, designed, handpicked or sourced, from the "Made by" line. | — |
| `variationSwatches` | Number of colour/material swatches on the card. | `4` |
| `views24h` | Views in the last 24 hours (with demand signals). | `20` |
| `views24hIsCapped` | True when Etsy shows the views as "20+". | `true` |
| `inCartCount` | Number of carts the listing is in (with demand signals). | `20` |
| `inCartCountIsCapped` | True when Etsy shows the carts as "20+". | `true` |
| `stockLeft` | "Only N left" count. | `3` |
| `boughtLast24h` | Bought in the last 24 hours. | — |
| `highSalesVolume` | Listing shows "High sales volume". | `true` |
| `isRareFind` | Listing shows "Rare find". | `false` |
| `saleEndsText` | Sale banner text, e.g. when the sale ends. | 40% off sale for a limited time |
| `shippingCost` | Shipping cost to the ship-to country (with shipping). | `0.0` |
| `isFreeShippingToCountry` | Free shipping to the ship-to country. | `true` |
| `shipsFrom` | Where the item ships from. | Hong Kong |
| `deliveryEstimate` | Estimated delivery window. | Oct 16-29 |
| `returnsAccepted` | Returns accepted. | `true` |
| `exchangesAccepted` | Exchanges accepted. | `true` |
| `returnWindowDays` | Days to return the item. | `30` |
| `runningAds` | True for sponsored (ad) placements. | `true` |
| `organicRank` | Rank among organic results of the search. | — |
| `adRank` | Rank among sponsored results of the search. | `1` |
| `page` | Search result page. | `1` |
| `positionOnPage` | Position on the page (or in the shop). | `1` |
| `sourceQuery` | Keyword or shop the row came from. | necklace |
| `sourceType` | keyword, searchUrl, category, listingId or shop. | keyword |
| `totalResults` | Total results Etsy reports for the search (or shop listings). | `453751` |
| `isAvailable` | False when Etsy no longer shows the listing. | `true` |
| `isNew` | Change monitor: listing was not seen in the previous run. | `false` |
| `changes` | Change monitor: {field: {from, to}} for what moved since the previous run. | — |
| `scrapedAt` | Time the row was collected (UTC, ISO 8601). | 2026-10-09T12:36:40+00:00 |

#### Shop rows

Shop rows hold the Etsy shop data in one place: rating, reviews, sections and an estimated monthly sales figure. Each shop report includes an Etsy shop sales estimate, which is an estimate only and not a number published by Etsy.

| Field | Description | Example |
|---|---|---|
| `shopId` | Etsy shop ID. | `17431768` |
| `shopName` | Shop name. | YourNamesJewelry |
| `shopUrl` | Link to the shop. | https://www.etsy.com/shop/YourNamesJewelry |
| `owner` | First name of the shop owner. | Grace |
| `yearsOnEtsy` | How long the shop has sold on Etsy, in years. | `8.0` |
| `totalSales` | Total sales of the shop. | `281600` |
| `totalSalesIsRounded` | True when Etsy shows the sales rounded. | `true` |
| `location` | Where the shop is located. | Texas, United States |
| `acceptsCustomOrders` | True when the shop is open to custom orders. | `true` |
| `rating` | Average shop rating (1-5). | `4.8` |
| `reviewCount` | Number of shop reviews. | `42620` |
| `totalListings` | Active listings in the shop. | `369` |
| `listingsScraped` | Listings collected in this run. | `40` |
| `sections` | Shop sections with their listing counts. | `[{"sectionId": "23684255", "name": "Name Necklace", "listingCount": 99}]` |
| `avgListingPrice` | Average price of the collected listings. | `24.85` |
| `currencyCode` | Currency of all prices in the row. | `USD` |
| `pctOnSale` | Share of collected listings on sale. | `97.5` |
| `reviewsSampled` | Supporting figure for the sales estimate. | `20` |
| `reviewsLast30d` | Supporting figure for the sales estimate. | `190.0` |
| `reviewSampleDays` | Supporting figure for the sales estimate. | `3` |
| `estMonthlySales` | Estimated sales per month. | `1583` |
| `estMonthlyRevenue` | Estimated monthly revenue. | `39338.55` |
| `salesEstimateMethod` | Supporting information for the sales estimate. | — |
| `topReviewedListings` | Listings with the most reviews in the sample. | — |
| `reviewsSinceLastRun` | Change monitor: new reviews since the previous run. | `0` |
| `estSalesSinceLastRun` | Change monitor: estimated sales since the previous run. | `0` |
| `lastRunAt` | Change monitor: time of the previous run. | 2026-10-09T15:07:37+00:00 |
| `scrapedAt` | Time the row was collected (UTC, ISO 8601). | 2026-10-09T12:36:40+00:00 |

#### Review rows

| Field | Description | Example |
|---|---|---|
| `shopName` | Shop name. | YourNamesJewelry |
| `reviewId` | Etsy review ID. | `5225076635` |
| `reviewer` | Reviewer display name. | Savannah |
| `reviewerUrl` | Reviewer profile link. | https://www.etsy.com/people/sdeboer33 |
| `date` | Review date (YYYY-MM-DD). | 2026-10-09 |
| `text` | Review text. | The necklace is beautiful! |
| `listingId` | Etsy listing ID. | `1721240021` |
| `listingTitle` | Title of the reviewed listing. | Initial Birthstone Necklace |
| `photo` | Photo added by the buyer. | — |
| `sellerResponse` | The shop's reply. | — |

#### Keyword report rows

| Field | Description | Example |
|---|---|---|
| `keyword` | Search keyword (or search link) of the report. | necklace |
| `totalResults` | Total results Etsy reports for the search (or shop listings). | `453751` |
| `competitionLevel` | very low, low, medium, high or very high (by total results). | very high |
| `sampleSize` | Organic listings in the sample. | `467` |
| `adsInSample` | Sponsored listings in the sample. | `132` |
| `currencyCode` | Currency of all prices in the row. | `USD` |
| `avgPrice` | Average price. | `46.72` |
| `medianPrice` | Median price. | `30.0` |
| `p25Price` | Lower quartile price. | `19.5` |
| `p75Price` | Upper quartile price. | `41.25` |
| `minPrice` | Lowest price. | `1.75` |
| `maxPrice` | Highest price. | `1080.0` |
| `pctBestseller` | Share with the Bestseller badge. | `1.3` |
| `pctPopularNow` | Share showing "Popular now". | `2.1` |
| `pctOnSale` | Share of collected listings on sale. | `97.5` |
| `avgDiscountPct` | Average discount of listings on sale. | `34.9` |
| `pctFreeShipping` | Share with free shipping. | `60.4` |
| `pctStarSeller` | Share from Star Seller shops. | `53.7` |
| `pctEtsyPick` | Share of Etsy's Picks. | `1.5` |
| `pctDigital` | Share of digital downloads. | `0.0` |
| `pctHandmade` | Share made by the seller (where shown). | — |
| `avgShopRating` | Average shop rating. | `4.84` |
| `uniqueShops` | Different shops in the sample. | `240` |
| `topShopShare` | Share of the sample held by the biggest shop. | `26.6` |
| `topShops` | Shops with the most listings in the sample. | `[{"shopName": "CaitlynMinimalist", "listings": 124}]` |
| `avgViews24h` | Average views in 24h (with demand signals). | — |
| `pctInCarts` | Share that is in at least one cart (with demand signals). | — |
| `relatedKeywords` | Etsy's related long-tail keywords. | `[{"keyword": "name necklace", "facet": "Personalization", "display": "Name"}]` |
| `topTitleTerms` | Most used 1-3 word phrases in titles. | `[{"term": "necklace", "listings": 366, "share": 0.784}]` |

### 💡 Use cases for Etsy data

- **Niche and keyword research:** read the competition level, price bands and related keywords in a keyword report to judge a niche, much like an Etsy keyword research tool would.
- **Listing optimisation:** use `topTitleTerms` and `relatedKeywords` as input for Etsy SEO keyword research on your own titles.
- **Competitor analysis:** compare shop ratings, sales totals and sections for Etsy competitor research.
- **Shop dashboards:** schedule the Actor and send shop reports to a spreadsheet or BI tool for Etsy shop analytics.
- **Product discovery:** sort by most in carts or most viewed in 24h to find Etsy trending products.
- **Sourcing ideas:** compare prices, badges and shipping on many listings as a starting point for Etsy dropshipping research.
- **Price monitoring:** turn on change tracking to track Etsy price changes between runs.
- **Advertising visibility:** `runningAds`, `adRank` and `organicRank` show where Etsy sponsored listings appear for a keyword.
- **Review analysis:** collect Etsy shop reviews with buyer text, dates and seller replies for sentiment work or quality checks.

### 🧩 Why use Etsy Scraper for Etsy data?

Search results, listings, shops and reviews all come from one input form, so you do not need a separate Etsy product scraper for each task. Filters then keep only on-sale, free-shipping, digital or Star Seller listings.

Prices, sale prices and discount percent sit side by side in every row. Sponsored placements are flagged and ranked separately, so the output doubles as Etsy ads data for every search.

Sorting by carts or views gives Etsy product research a live demand angle. Demand signals add Etsy demand data such as views, carts and stock left. The shipping option adds Etsy shipping costs, delivery estimates and return terms for your ship-to country.

Nothing needs to be installed or hosted, unlike a self-built Etsy web scraper. Setup takes minutes with a link, a keyword, a listing ID or a shop name.

### 🛠️ How to scrape Etsy listings, shops and reviews

These six steps show how to scrape data from Etsy without writing code.

1. Create a free Apify account.
2. Open Etsy Scraper on the Apify Store.
3. Add at least one source: an Etsy link in **Etsy links (bulk)**, a keyword in **Search keywords**, a listing ID or a shop name.
4. Set **Max pages per search** and any filters, such as **Min price** or **Free shipping only**.
5. Click **Start** and wait for the run to finish.
6. Open the dataset and download the rows as JSON, CSV or Excel.

Need more than one source? You can combine links, keywords, listing IDs and shop names in a single run. Teams that want an Etsy data extractor without code can run everything from the input form.

### 💰 How much does it cost to scrape Etsy?

Etsy Scraper uses tiered pay-per-event pricing: $3 per 1,000 results on the Free plan and less on paid plans. Every saved row counts as one result (the event is `main_result`), whether it is a listing, a shop report, a review or a keyword report. On the Free plan, a run that saves 1,000 rows therefore costs $3. Each run also has a small start charge of $0.00005 (the Actor Start event).

| Apify plan | Price per 1,000 results |
|---|---|
| Free | $3 |
| Bronze | $2.7 |
| Silver | $2.4 |
| Gold / Platinum / Diamond | $2 |

Free plan users are limited to 10 items per run, with no monthly limit. Paid Apify plans have no per-run item limit. See the Pricing tab for current rates.

If you set a spend limit on your account, the run stops cleanly once the limit is reached and keeps the rows saved so far.

### ⬇️ Input

The only required input is at least one source: **Etsy links (bulk)** (`urls`), **Search keywords** (`queries`), **Listing IDs** (`listingIds`) or **Shop names** (`shops`). Links can be search, category, market, listing or shop pages, and local versions such as `etsy.com/uk/...` work too. Keyword and search-link inputs make the run an Etsy search scraper that records the page and position of every result.

![Etsy Scraper input form with Etsy links and search keywords](IMAGE_URL_PLACEHOLDER "etsy-scraper-input-form.png")

See the Input tab for every option. This is an example input, built from the pre-filled values of the input form:

```json
{
  "urls": ["https://www.etsy.com/search?q=necklace"],
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

#### Main input options

| Option | What it does |
|---|---|
| `urls` | One Etsy link per line: search, category, market, listing or shop pages. |
| `queries` | Search keywords typed like a shopper would, e.g. "boho wall art". Each keyword is a separate search with its own ranks and keyword report. |
| `listingIds` | Etsy listing IDs (e.g. 1721240021) or listing links. A listing Etsy no longer shows comes back with `isAvailable` = false. |
| `shops` | Shop names (e.g. YourNamesJewelry) or shop links. Each shop gets a shop report, its listings and its reviews. |
| `maxPages` | How many result pages to read for each search (about 48 listings plus ads per page). Pre-filled with 1. |
| `maxResults` | Stop each search after this many listings. 0 means everything the pages return. |
| `sort` | relevance, newest, price-asc, price-desc, reviews, carts or views. The carts and views orders use live demand and switch on demand signals. |
| `country` and `currency` | Ship-to country for results, prices and shipping quotes (35 countries), and an optional currency (25 currencies). |
| `minPrice`, `maxPrice` | Price range in the run currency. |
| `onSaleOnly`, `freeShippingOnly`, `digitalOnly`, `handmadeOnly`, `starSellerOnly`, `etsyPicksOnly` | Keep only matching listings. |
| `shopLocation`, `minShopRating`, `minShopReviews` | Filter by shop location ID, shop rating and shop review count. |
| `titleIncludes`, `titleExcludes` | Keep or drop listings by words in the title. |
| `includeAds` | Keep sponsored listings (marked with `runningAds` = true and an `adRank`). |
| `dedupeAcrossQueries` | Save each listing once even if several searches find it. |
| `includeSellerDetails` | Fill shop owner, years on Etsy, total sales, location and custom orders on every listing. |
| `includeDemandSignals` | Add views, carts, stock left and related fields. Slower. |
| `includeShipping` and `shipToPostalCode` | Add shipping cost, ships from, delivery estimate and returns. Slower. |
| `includeReviews`, `reviewRate` | Save shop reviews as rows. `reviewRate` is a tuning value for the sales estimate; leave the default if you are unsure. |
| `keywordResearch` | One keyword report per search. |
| `monitor`, `monitorKey`, `monitorOnlyChanges` | Compare with the previous run, name the saved history, and optionally save only new or changed listings. |
| `proxyConfiguration` | Optional proxy settings. Leave the default if you are unsure. |

💡 Keep **Max pages per search** low for a first test run.

⚠️ Options that add demand, shipping or seller details make runs slower.

#### How to scrape Etsy reviews for a shop

Add the shop name or shop link to **Shop names**. Keep **Shop reviews** (`includeReviews`) switched on and set the maximum number of reviews per shop. Each review becomes a row with the buyer, date, text and reviewed listing, which is what people usually expect from an Etsy reviews scraper. Download the same dataset to export Etsy reviews as CSV or Excel.

#### How to scrape one Etsy shop

Add the shop name or link to **Shop names** and set **Max listings per shop**. You get one shop report, the shop's listings and its reviews, which covers the usual jobs of an Etsy shop scraper.

#### How to check a single listing

Add the listing ID or link to **Listing IDs**. This is the quickest Etsy listing scraper setup for price and availability checks, and a listing that Etsy no longer shows comes back with `isAvailable` set to false.

#### How to export Etsy listings to CSV

Run your search, open the dataset and choose CSV as the download format. Apify exports the dataset as a table, so every field above becomes a column.

#### How to track Etsy price changes between runs

Switch on **Track changes between runs**, give the history a **Monitor name** and schedule the Actor. From the second run on, `isNew` marks new listings and `changes` lists what moved, such as price, rank, views, carts, stock, bestseller status, availability and shipping.

#### How to run Etsy keyword research

Type your keywords into **Search keywords** and keep **Keyword research report** switched on. Each keyword returns one report with total results, competition level, price bands, badge shares, top shops, related keywords and the most used title terms.

### ⬆️ Output

The scraped results are shown as a dataset in the **Storage** tab. The table view is for convenience and doesn't show **all the fields**.

![Etsy listings in the Apify dataset table view](IMAGE_URL_PLACEHOLDER "etsy-listings-output-table.png")

You can export Etsy data from the dataset as JSON, CSV, Excel, XML or HTML. Downloading is one click in the dataset view, so no separate Etsy data downloader is needed.

The samples below are examples assembled from the example values in the dataset schema. They are not a captured run, and they show only fields that have an example value.

#### Listing output example

```json
{
  "recordType": "listing",
  "listingId": 1721240021,
  "title": "Dainty Birth Flower Necklace, 14K Gold",
  "listingUrl": "https://www.etsy.com/listing/1721240021/dainty-birth-flower-necklace",
  "price": 35.0,
  "discountedPrice": 21.0,
  "discountPct": 40,
  "currencyCode": "USD",
  "onSale": true,
  "shopId": 17431768,
  "shopName": "YourNamesJewelry",
  "shopUrl": "https://www.etsy.com/shop/YourNamesJewelry",
  "shopOwner": "Grace",
  "shopYearsOnEtsy": 8.0,
  "shopSales": 281600,
  "sellerLocation": "Texas, United States",
  "shopRating": 4.8,
  "shopRatingCount": 42600,
  "isStarSeller": false,
  "isBestseller": false,
  "isPopularNow": true,
  "isFreeShipping": false,
  "runningAds": true,
  "adRank": 1,
  "page": 1,
  "positionOnPage": 1,
  "sourceQuery": "necklace",
  "sourceType": "keyword",
  "totalResults": 453751,
  "isAvailable": true,
  "scrapedAt": "2026-10-09T12:36:40+00:00"
}
```

#### Shop report output example

```json
{
  "shopId": 17431768,
  "shopName": "YourNamesJewelry",
  "owner": "Grace",
  "yearsOnEtsy": 8.0,
  "totalSales": 281600,
  "location": "Texas, United States",
  "rating": 4.8,
  "reviewCount": 42620,
  "totalListings": 369,
  "listingsScraped": 40,
  "avgListingPrice": 24.85,
  "estMonthlySales": 1583,
  "estMonthlyRevenue": 39338.55
}
```

#### Review output example

```json
{
  "shopName": "YourNamesJewelry",
  "reviewId": 5225076635,
  "reviewer": "Savannah",
  "date": "2026-10-09",
  "text": "The necklace is beautiful!",
  "listingTitle": "Initial Birthstone Necklace"
}
```

#### Keyword report output example

```json
{
  "keyword": "necklace",
  "totalResults": 453751,
  "competitionLevel": "very high",
  "sampleSize": 467,
  "adsInSample": 132,
  "avgPrice": 46.72,
  "medianPrice": 30.0,
  "uniqueShops": 240,
  "topShops": [
    { "shopName": "CaitlynMinimalist", "listings": 124 }
  ],
  "relatedKeywords": [
    { "keyword": "name necklace", "facet": "Personalization", "display": "Name" }
  ]
}
```

### ⚠️ Limitations and error handling

- **Free plan:** runs are limited to 10 items per run. Paid Apify plans have no per-run limit.
- **Result depth:** the number of result pages Etsy offers for a search depends on the sort order, so a high **Max pages per search** may stop early. The run log tells you when that happens.
- **Capped numbers:** Etsy shows views and carts as "20+" for busy listings, and `views24hIsCapped` and `inCartCountIsCapped` tell you when that applies.
- **Estimates:** `estMonthlySales` and `estMonthlyRevenue` are estimates only, not figures published by Etsy.
- **Seller fields:** shop sales and seller location may stay empty in some runs, while owner and years on Etsy are still filled when available.
- **Handmade filter:** it drops listings marked as Designed by, Handpicked by or Sourced by a seller, and keeps listings that show no maker line.
- **Currency:** if Etsy does not support the currency you pick, prices come back in USD and `currencyCode` says USD.
- **Unavailable listings:** a listing ID that Etsy no longer shows returns a row with `isAvailable` set to false.
- **No private data:** the Actor reads public Etsy pages only. It does not log in, so account, order and customer data are out of reach.

Problems are reported in the run log and in the final status message. If one page or one part of the data cannot be loaded, the log says so and the rows collected so far are still saved. The Actor does not write separate error rows to the dataset. A short run summary is also stored in the key-value store.

### 🔌 Integrating Etsy Scraper with other apps

As an Etsy scraping tool on the Apify platform, it can be started from the Apify API, scheduled, and combined with webhooks that fire when a run finishes. See the API tab for ready-made code snippets. You can also connect it to tools such as Make, Zapier or Google Sheets through the [Apify integrations](https://docs.apify.com/platform/integrations).

Scheduled runs work well together with change tracking, because every run is compared with the previous run that used the same monitor name. A schedule makes the Actor behave like an Etsy data crawler that revisits the same searches and shops on a timetable. Weekly shop reports can feed ongoing Etsy competitor analysis.

### 🔗 More Apify Actors by crawl_craft

These Actors come from the same developer. They cover other platforms and are not related to Etsy data. They are listed only so you can find the rest of the account.

| Actor | What it extracts | When to use it |
|---|---|---|
| [TikTok Video Scraper](https://apify.com/crawl_craft/tiktok-video-scraper) | TikTok video stats, captions, hashtags, author and music data | When your task is about TikTok videos, not Etsy. |
| [TikTok User Search Scraper](https://apify.com/crawl_craft/tiktok-user-search-scraper) | TikTok creator profiles found by keyword | When you need TikTok profiles in bulk. |
| [Ats Jobs API](https://apify.com/crawl_craft/ats-jobs-api) | Open jobs from Greenhouse, Lever and Ashby | When you need job listings from company career boards. |

### ⚖️ Is it legal to scrape Etsy?

Etsy Scraper only extracts data that is publicly visible on Etsy, and it does not extract private data such as account details. Results can still contain personal data, such as reviewer names and shop owner first names. Only collect personal data when you have a legitimate reason, consider GDPR (Regulation (EU) 2016/679) and Etsy's terms, and consult a lawyer if you are unsure. For background, read Apify's posts on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) and [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/).

### ❓ FAQ

#### How much does it cost to run Etsy Scraper?

It costs $3 per 1,000 results on the Free plan and less on paid plans, on the pay-per-event model, and each saved row is one result. Free plan users can get up to 10 items per run.

#### Can you scrape Etsy without an API key or login?

Yes. The Actor works on public pages and asks for no Etsy login or API key. Only Apify account access is needed to run it.

#### Is this an Etsy API alternative?

It can serve that purpose for public listing, shop and review data, because no Etsy API key is involved. It cannot give access to private seller account data.

#### How many results can I get?

Set **Max pages per search** and **Max listings per search** to control the size. Free plan runs are limited to 10 items, and the number of pages Etsy offers depends on the sort order.

#### Can I get private data?

No. The Actor returns public Etsy data only.

#### Do I need proxies?

Proxy settings are optional. Leave the default if you are unsure.

#### Can I use it with the Apify API, Python or Node.js?

Yes. Any Apify Actor can be started and its dataset read through the Apify API and client libraries. The API tab shows ready-made snippets.

#### Is the sales estimate exact?

No. The monthly sales and revenue figures in shop reports are estimates. Read them as a rough guide, not as official Etsy numbers.

#### Can I use it as an Etsy price scraper?

Yes. Every listing row carries the regular price, the sale price, the discount percent and the currency, so price comparisons need no extra cleanup.

#### Can I use it as an Etsy listings scraper for a whole niche?

Yes. A search link or keyword returns one row per listing, and you can read as many pages as the **Max pages per search** setting allows.

### 💬 Your feedback

Found a bug or want a new field? Open a report in the Issues tab of this Actor page. If you need a custom solution, such as extra fields or a tailored export for your project, write to hello.crawlcraft@gmail.com.

# Actor input Schema

## `urls` (type: `array`):

One Etsy link per line, as many as you like. Supported: search pages (https://www.etsy.com/search?q=necklace\&min=20 — the link's filters and page number are used), category and market pages (https://www.etsy.com/c/jewelry/necklaces, https://www.etsy.com/market/boho_rug — searched by their keyword), listing pages (https://www.etsy.com/listing/1721240021) and shop pages (https://www.etsy.com/shop/YourNamesJewelry, a section_id in the link is kept). Local versions such as etsy.com/uk/... work too.

## `queries` (type: `array`):

Keywords typed like a shopper would, e.g. "boho wall art". Each keyword is a separate search with its own ranks and its own keyword report. A link pasted here is handled as a link.

## `listingIds` (type: `array`):

Etsy listing IDs (e.g. 1721240021) or listing links. Returns the card data of each listing — handy for price and availability tracking. A listing Etsy no longer shows comes back with isAvailable = false.

## `shops` (type: `array`):

Shop names (e.g. YourNamesJewelry) or shop links. Each shop gets a shop report (rating, sales, sections, sales estimate), its listings and its reviews.

## `maxPages` (type: `integer`):

How many result pages to read for each search (about 48 listings plus ads per page). The number of pages available depends on the sort order. Free plan users are limited to 10 items per run; paid plans have no limit.

## `maxResults` (type: `integer`):

Stop each search after this many listings (after your filters). 0 = everything the pages above return. Free plan users are limited to 10 items per run; paid plans have no limit.

## `sort` (type: `string`):

Order of search results. "Most in carts" and "Most viewed" re-rank each search by live demand and switch on demand signals automatically (slower).

## `country` (type: `string`):

Country used for search results, prices and shipping quotes. Prices are shown in this country's currency unless you pick a currency below.

## `currency` (type: `string`):

Show prices in another currency, e.g. EUR. Leave empty to use the ship-to country's currency. If Etsy does not support the currency, prices come back in USD and currencyCode says USD.

## `minPrice` (type: `number`):

Lowest price to keep, in the run currency (the sale price counts when a listing is on sale).

## `maxPrice` (type: `number`):

Highest price to keep, in the run currency. If min is above max, the two are swapped.

## `onSaleOnly` (type: `boolean`):

Keep only discounted listings.

## `freeShippingOnly` (type: `boolean`):

Keep only listings that show free shipping.

## `digitalOnly` (type: `boolean`):

Keep only digital download listings.

## `handmadeOnly` (type: `boolean`):

Drops listings marked as Designed by, Handpicked by or Sourced by a seller. Listings that show no maker line are kept.

## `starSellerOnly` (type: `boolean`):

Keep only listings from Star Seller shops.

## `etsyPicksOnly` (type: `boolean`):

Keep only listings picked by Etsy's editors.

## `shopLocation` (type: `string`):

Only shops located in a region, as an Etsy location ID (the locationQuery value in an Etsy search link, e.g. 2635167 = United Kingdom).

## `minShopRating` (type: `number`):

Keep only listings whose shop rating is at least this value, e.g. 4.8.

## `minShopReviews` (type: `integer`):

Keep only listings whose shop has at least this many reviews, e.g. 1000.

## `titleIncludes` (type: `array`):

Keep a listing only when its title contains at least one of these words (not case-sensitive).

## `titleExcludes` (type: `array`):

Drop every listing whose title contains one of these words (not case-sensitive), e.g. digital, download.

## `includeAds` (type: `boolean`):

Keep sponsored (ad) listings. They are marked with runningAds = true and their own adRank; organic listings get organicRank.

## `dedupeAcrossQueries` (type: `boolean`):

Save each listing once even if several searches find it. Turn off to keep a row per search — useful for tracking the rank of one listing for several keywords.

## `maxScanned` (type: `integer`):

When strict filters drop most rows, stop a search after checking this many listings. 0 = no cap.

## `includeSellerDetails` (type: `boolean`):

Fill shop owner, years on Etsy, total sales, location and custom orders on every listing (slower).

## `includeDemandSignals` (type: `boolean`):

Adds views in the last 24 hours, number of carts, stock left, bought in the last 24 hours, high sales volume, sale end text, all photos and photo count (slower).

## `includeShipping` (type: `boolean`):

Adds shipping cost to the ship-to country, ships from, delivery estimate, returns and exchanges accepted, and return window (slower).

## `shipToPostalCode` (type: `string`):

Postal code for shipping quotes in countries with calculated shipping. Leave empty to use a capital-city code for US, GB, CA, AU and IN.

## `maxListingsPerShop` (type: `integer`):

How many listings to collect from each shop. 0 = all. Free plan users are limited to 10 items per run; paid plans have no limit.

## `shopSort` (type: `string`):

Order of each shop's listings.

## `includeReviews` (type: `boolean`):

Save the shop's reviews as rows and add a monthly sales estimate to the shop report.

## `maxReviewsPerShop` (type: `integer`):

How many of the newest reviews to collect per shop. 0 = all. Free plan users are limited to 10 items per run; paid plans have no limit.

## `reviewRate` (type: `number`):

Tuning value for the sales estimate. Leave the default if you are unsure.

## `keywordResearch` (type: `boolean`):

One report per search: total results, competition level, price bands, share of bestsellers / sale / free shipping / Star Sellers, top shops, related keywords and the most used title words.

## `monitor` (type: `boolean`):

Compare every listing with the previous run: isNew marks new listings and changes lists what moved (price, rank, views, carts, stock, bestseller, availability, shipping). Shop reports get reviews and estimated sales since the last run.

## `monitorKey` (type: `string`):

Name of the saved history. Use a different name for each thing you track, e.g. necklace-us.

## `monitorOnlyChanges` (type: `boolean`):

With change tracking on, save only listings that are new or changed since the last run (the first run saves everything).

## `concurrency` (type: `integer`):

How many pages or listings are loaded at the same time. Lower it if runs are unstable.

## `maxRetries` (type: `integer`):

Total tries per request when it fails.

## `proxyConfiguration` (type: `object`):

Optional. Choose the proxy settings for your run. Leave the default if you are unsure.

## Actor input object example

```json
{
  "urls": [
    "https://www.etsy.com/search?q=necklace"
  ],
  "maxPages": 1,
  "maxResults": 0,
  "sort": "relevance",
  "country": "US",
  "minPrice": 0,
  "onSaleOnly": false,
  "freeShippingOnly": false,
  "digitalOnly": false,
  "handmadeOnly": false,
  "starSellerOnly": false,
  "etsyPicksOnly": false,
  "includeAds": true,
  "dedupeAcrossQueries": true,
  "maxScanned": 3000,
  "includeSellerDetails": true,
  "includeDemandSignals": false,
  "includeShipping": false,
  "maxListingsPerShop": 10,
  "shopSort": "date_desc",
  "includeReviews": true,
  "maxReviewsPerShop": 10,
  "reviewRate": 0.12,
  "keywordResearch": true,
  "monitor": false,
  "monitorKey": "default",
  "monitorOnlyChanges": false,
  "concurrency": 5,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every row with all its fields — keyword reports, shop reports, listings and reviews.

## `runReport` (type: `string`):

Summary of the run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.etsy.com/search?q=necklace"
    ],
    "maxPages": 1,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawl_craft/etsy-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://www.etsy.com/search?q=necklace"],
    "maxPages": 1,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawl_craft/etsy-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.etsy.com/search?q=necklace"
  ],
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawl_craft/etsy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawl_craft/etsy-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MCYfXAqYLorMONh7h/builds/oS06mkQayuCdFr31l/openapi.json
