# Etsy Scraper (`axlymxp/etsy-scraper`) Actor

Search Etsy by keyword and get prices, in-cart counts, last sale time, sponsored vs organic rank, stock, discounts, shop sales and badges. Optional tags, favorites and description. No login. Pay only for results.

- **URL**: https://apify.com/axlymxp/etsy-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** Automation, E-commerce, Agents
- **Stats:** 140 total users, 11 monthly users, 100.0% runs succeeded, 7 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 listing extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Etsy Product Scraper — Extract Listings, Prices & Seller Data

Extract Etsy product listings at scale via keyword search. No API key or Etsy login. Every listing comes with the demand signals product researchers look for: how many people have it **in their cart right now**, when it **last sold**, whether the placement is a **sponsored ad or an organic result**, its position in Etsy's results, stock, discount and promotion end time, shop sales and review counts, Bestseller and Star Seller badges. Switch on listing details to also get the 13 tags, materials, favorites and the full description.

***

### What Data You Get

Every result includes:

| Field | Description |
| --- | --- |
| `listing_id`, `title`, `url` | Listing identity and link |
| `shop_name`, `shop_url`, `shop_id` | Seller shop |
| `price` | What the buyer pays now (the sale price when a promotion applies) |
| `original_price`, `discount_percent`, `promotion_ends_at` | List price, discount % and when the sale ends (when discounted) |
| `in_cart_count` | People who currently have the listing in their cart |
| `last_sale_at` | When the listing last sold (ISO 8601, UTC) |
| `result_type` | `ad` (sponsored placement) or `organic` |
| `search_position` | Position in Etsy's result list for the query (ads included) |
| `quantity`, `is_sold_out` | Stock |
| `sales_count_estimate` | The shop's total sales |
| `review_count`, `avg_rating` | Shop review count and average rating |
| `review_photo_count`, `review_video_count` | Reviews with photos / videos for the listing |
| `is_bestseller`, `is_star_seller` | Badges |
| `is_made_to_order`, `personalization_available`, `is_handmade`, `is_vintage`, `is_digital` | Product type flags |
| `shipping`, `shop_location` | Shipping options and seller location |
| `images`, `thumbnail` | Image URLs |
| `currency_code`, `scraped_at` | Currency and extraction time |

With **Include tags, materials, favorites & description** (`includeDetails`) every row also gets:

| Field | Description |
| --- | --- |
| `tags` | The listing's 13 seller tags |
| `materials` | Materials |
| `favorites_count` | Number of favorites |
| `description` | Full listing description (plain text) |
| `when_made`, `ships_from_country` | Production type and ship-from country |
| `details_fetched` | `true` when the details were returned |

### Use Cases

#### Dropshipping product research

Collect a niche, then filter on `is_star_seller`, `is_bestseller` and `in_cart_count` to build a qualified product list with verified demand signals — without manually browsing Etsy.

#### Competitor price monitoring

Run the same keyword search on a schedule and track price changes across competitors. Export to Google Sheets via the Apify integration.

#### Market trend analysis

Compare `favorites_count` and `review_count` across categories to identify emerging niches before they saturate.

#### Feed AI agents and dashboards

Use the Apify MCP server to connect this actor to Claude, ChatGPT, or n8n workflows for on-demand Etsy market intelligence.

#### Supplier qualification

Find high-volume sellers (high `review_count`, `is_star_seller: true`) for potential sourcing partnerships.

***

### How to Use

Set your search parameters in the input and run. No configuration beyond the keywords is required to get results.

#### Input parameters

| Parameter         | Type    | Default      | Description                                                                   |
| ----------------- | ------- | ------------ | ----------------------------------------------------------------------------- |
| `keywords`        | string  | **required** | Search query, e.g. `"handmade ceramic mug"`                                   |
| `limit`           | integer | 100          | Maximum listings to collect (0 = as many as the run can reach, cap 100,000)   |
| `offset`          | integer | 0            | Deprecated, ignored (Etsy search has no paging)                               |
| `minPrice`        | number  | —            | Minimum price in USD                                                          |
| `maxPrice`        | number  | —            | Maximum price in USD                                                          |
| `shipTo`          | string  | `"US"`       | Shipping destination country code (`US`, `GB`, `CA`, `AU`, etc.)              |
| `sortOn`          | enum    | `"score"`    | `score` (relevance), `created_desc` (newest first), `price_asc`, `price_desc`; `best_seller` behaves like `score` |
| `freeShipping`    | boolean | false        | Free-shipping listings only                                                   |
| `isDiscounted`    | boolean | false        | On-sale listings only                                                         |
| `instantDownload` | boolean | false        | Digital download listings only                                                |
| `includeDetails`  | boolean | false        | Add tags, materials, favorites and description to every row (one extra request per listing) |

#### Example input

```json
{
    "keywords": "personalized gift",
    "limit": 500,
    "minPrice": 15,
    "maxPrice": 60,
    "shipTo": "US",
    "sortOn": "score",
    "freeShipping": true,
    "isDiscounted": false
}
```

***

### Example Output

```json
{
    "listing_id": "4385436268",
    "title": "Custom Ceramic Mug, Personalized Name Coffee Cup",
    "url": "https://www.etsy.com/listing/4385436268/...",
    "shop_name": "VisionCustomTee",
    "price": 5.07,
    "original_price": 14.5,
    "discount_percent": 65,
    "promotion_ends_at": "2026-10-08T04:59:59Z",
    "in_cart_count": 118,
    "last_sale_at": "2026-10-07T22:47:09Z",
    "result_type": "ad",
    "search_position": 1,
    "quantity": 856,
    "sales_count_estimate": 34451,
    "review_count": 5759,
    "avg_rating": 4.85,
    "review_photo_count": 31,
    "is_bestseller": true,
    "is_star_seller": true,
    "is_made_to_order": true,
    "personalization_available": true,
    "tags": ["Personalized Mug", "Custom Ceramic Mug", "Custom Coffee Mug"],
    "favorites_count": 449,
    "details_fetched": true,
    "scraped_at": "2026-10-08T09:13:38Z"
}
```

`tags`, `favorites_count` and `details_fetched` appear when `includeDetails` is on. The values come from a real run; the tag list is shortened.

### Checkpoint & Resume

For large runs, the actor saves its progress after each page. If a run is interrupted, re-run with the same `keywords` input and the actor will automatically continue from where it stopped — no duplicate data, no lost progress.

***

### Automate with Scheduling & Webhooks

Schedule recurring runs to track price trends or monitor new listings:

1. Open your actor run → **Schedule** tab
2. Set a CRON expression, e.g. `0 8 * * 1` for every Monday at 8am
3. Configure a webhook to POST results to your endpoint or trigger a Make.com / Zapier workflow

**API trigger example:**

```bash
curl -X POST "https://api.apify.com/v2/acts/axlymxp~etsy-scraper/runs" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": "handmade candle", "limit": 1000}'
```

***

### Use with AI Agents (MCP)

This actor is available on Apify's MCP Server. Connect it to Claude, ChatGPT, or any MCP-compatible AI agent to enable on-demand Etsy market research inside your AI workflows.

Configure at: [mcp.apify.com](https://mcp.apify.com)

**Example agent prompt:**

> "Find the top 20 best-selling personalized jewelry listings on Etsy under $50 with free shipping."

***

### FAQ

**Does this actor work without an Etsy API key?**
Yes. This actor accesses Etsy's publicly available marketplace data without requiring an Etsy developer account or API key.

**Can I filter by free shipping, discounts, or digital products?**
Yes. Use the `freeShipping`, `isDiscounted`, and `instantDownload` input parameters.

**What countries does the data cover?**
Etsy is a global marketplace. Use the `shipTo` parameter to filter by shipping destination (US, GB, CA, AU, DE, FR, and any other ISO country code).

**Does the actor resume if a run is interrupted?**
Yes. The actor saves a checkpoint after every batch of listings. Re-run with the same search input to continue; listings already delivered are not pushed or charged again.

**How many listings can I get for one keyword?**
Etsy's app search answers about 36 listings per request and has no paging. The actor therefore slices the search into price bands and combines relevance, newest-first and price-order searches, removing duplicates, to reach more listings. Popular keywords can reach thousands of distinct listings per run; narrow keywords have fewer, and the run ends with a status message when Etsy has nothing more to reveal. With the default sort the first rows are Etsy's own first results, followed by the top results of each price band and then deeper rankings. `search_position` is Etsy's real rank for those first results and is left out for listings found through the newest-first or price-band searches.

**What do `in_cart_count`, `last_sale_at` and `result_type` tell me?**
`in_cart_count` is how many shoppers currently have the listing in a cart, `last_sale_at` is when it last sold, and `result_type` shows whether Etsy served the result as a sponsored ad or an organic result. Together they show which products are selling right now and who is paying for placement.

**Why can the same listing appear twice?**
Etsy can show a listing once as an ad and once as an organic result. Filter on `result_type` or de-duplicate on `listing_id` if you only want one row per listing.

**What are `is_star_seller` and `is_bestseller`?**
`is_star_seller` reflects Etsy's Star Seller badge (awarded to shops with consistently high ratings and fast shipping). `is_bestseller` is the orange Bestseller badge on individual listings. Both are strong signals for dropshipping qualification.

**Is this legal to use?**
This actor scrapes publicly available data from Etsy.com. Use in accordance with Etsy's Terms of Service and applicable laws.

**How is this different from using the Etsy API?**
The official Etsy API requires developer registration and has strict rate limits. This actor does not require an API key and can extract at much higher volume for market research purposes.

# Actor input Schema

## `keywords` (type: `string`):

Primary search terms for Etsy listings

## `limit` (type: `integer`):

Maximum number of listings to collect (default 100, 0 = as many as the run can reach). Etsy answers about 36 listings per search, so the actor combines price bands and rankings to reach more; very popular keywords can return thousands, narrow keywords fewer. You are charged per listing.

## `offset` (type: `integer`):

Deprecated and ignored. Etsy's search has no paging; listings are collected price band by price band, and an interrupted run resumes by itself.

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

Minimum price filter in USD

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

Maximum price filter in USD

## `shipTo` (type: `string`):

Shipping destination country code (e.g. US, GB, CA, AU, DE, FR, JP)

## `sortOn` (type: `string`):

Which listings come first. Etsy's app search only honours relevance, newest first and price order, and the actor walks price bands in that order. 'Best Sellers' has no separate ranking on Etsy and behaves like Relevance; use the in_cart_count and is_bestseller columns to find top sellers.

## `freeShipping` (type: `boolean`):

Only include listings with free shipping

## `isDiscounted` (type: `boolean`):

Only include discounted listings

## `instantDownload` (type: `boolean`):

Only include digital download items

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

Include detailed review information (slower processing)

## `includeDetails` (type: `boolean`):

Open every listing to add its 13 tags, materials, favorites count, full description and 'when made'. Slower (one extra request per listing) and charged as an extra 'listing details' event per listing that returns details.

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

Used only when 'Include tags, materials, favorites & description' is on: Etsy rate-limits the listing-detail endpoint from cloud IPs, so those requests go through an Apify proxy. Search results need no proxy.

## Actor input object example

```json
{
  "keywords": "handmade jewelry",
  "limit": 20,
  "offset": 0,
  "shipTo": "US",
  "sortOn": "score",
  "freeShipping": false,
  "isDiscounted": false,
  "instantDownload": false,
  "includeReviews": false,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "keywords": "handmade jewelry",
    "limit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/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 = {
    "keywords": "handmade jewelry",
    "limit": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/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 '{
  "keywords": "handmade jewelry",
  "limit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call axlymxp/etsy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/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/9mLe73QOZ9dCOuJrw/builds/g5k1lGvCgLEhwdYN4/openapi.json
