# Etsy Search Scraper 2026 (`devcake/etsy-search-scraper`) Actor

Scrape Etsy products by keyword, and by image. Extract listings with prices, ratings, images, and full product details including description, tags, materials, and shipping info.

- **URL**: https://apify.com/devcake/etsy-search-scraper.md
- **Developed by:** [devcake](https://apify.com/devcake) (community)
- **Categories:** E-commerce, Social media, Other
- **Features:** Limited permissions
- **Stats:** 406 total users, 134 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Scrape Etsy Data: Listings, Prices, Media & Shop Data at Scale

Etsy product research needs structured rows you can pivot, not screenshots you can scroll. The **Etsy Product Data Scraper** finds Etsy listings **three ways - by keyword, by photo, or by an existing listing ID** - and then enriches each listing with its full product details. Every record includes price and sale price, the **complete image gallery and videos**, tags, materials, taxonomy, shop location and sales, stock, and engagement signals. Run one query, batch a niche catalog, or hand over a photo and get visually matching products back.

### 🛒 What It Does

The Actor finds listings from any of three sources and then retrieves the full product detail for each one. Results come back already structured: title, price, sale price, all gallery images, videos, badges, and the sponsored-placement flag.

- **Keyword search** - one or more search terms.
- **Search by photo** - provide image URLs or base64 images and get visually similar Etsy products.
- **Visually similar to a listing** - provide Etsy listing IDs or URLs and get products that look like that listing.

With detail enrichment on (the default), the Actor also adds description, tags, materials, category, shop name, location, total shop sales, stock quantity, and rating data. Each row also tells you how it was found — the `source` column is `search`, `image`, or `similar`.

### 🛒 How It Works

You give the Actor one or more things to look for, and it returns matching Etsy listings with their details. There are three ways to search, and you can use them together in a single run:

- 🔎 **By keyword** — add search terms such as "ceramic mug" or "monster high". The Actor collects the listings Etsy shows for each term.
- 🖼️ **By photo** — add image links (or images as text). The Actor finds Etsy listings that *look* like each picture.
- 🎯 **By listing ID** — add an Etsy listing link or its ID. The Actor finds products that look like that listing's main photo.

**How the results come together**

1. The Actor searches every source you provide and gathers the listings it finds.
2. Duplicates are removed automatically, so the same product never appears twice.
3. Your **Maximum Results** limit is split evenly between the sources you use — for example, one keyword plus one photo with a limit of 20 returns up to 10 each.
4. With **Full Product Details** on, the Actor adds the description, tags, materials, category, shop and stock information for every listing.
5. Each row tells you how it was found: `source` is `search`, `image`, or `similar`, and `source_input` shows the exact query, image, or listing ID behind it.

### 🛒 Why use this Actor?

- **Dropshippers and resellers** building niche catalogs from real Etsy listings with prices, sales, stock, and media.
- **Market researchers** comparing shops, price ranges, categories, and bestsellers in a vertical.
- **Visual sourcing** - upload a product photo and find the Etsy listings that match what you are looking at.
- **AI / ML teams** training product-search and recommendation models on structured Etsy records.
- **Trend hunters** monitoring sponsored vs organic results, bestseller badges, and category shifts over time.

### 🛒 Data You Get

| Field | Description |
|-------|-------------|
| `listing_id` | Unique Etsy listing ID |
| `title` / `title_en` | Listing title from search / detail |
| `price_num`, `price_int` | Numeric price and minor-unit price |
| `discount_price` | Sale price when the listing is discounted |
| `price_with_shipping` | Price including shipping |
| `has_variation_pricing` | Whether the price varies by variant |
| `currency_code` | Currency (USD, EUR, GBP, …) |
| `shop_name`, `shop_id`, `shop_url` | Shop identity and link |
| `shop_location`, `shop_sold_count` | Shop location and total sales |
| `shop_rating`, `shop_review_count` | Shop reputation signals |
| `rating`, `review_count` | Listing rating and review count |
| `image_url`, `images` | Primary image and full gallery |
| `videos` | Product video URLs |
| `detail_url` | Direct link to the listing |
| `quantity` | Available stock |
| `favorites` | Demand signal (number of saves) |
| `is_available`, `is_sold_out` | Stock state |
| `is_bestseller`, `is_top_rated`, `is_ad` | Badges and sponsored flag |
| `tags`, `materials` | Seller tags and materials |
| `ships_from_country`, `when_made` | Shipping origin and production date |
| `taxonomy_path`, `category_name`, `section_name` | Category breadcrumb and shop section |
| `description` | Full product description |
| `create_date`, `update_date` | Listing created / last updated timestamps |
| `source` | How the listing was found: `search`, `image`, or `similar` |
| `source_input` | The query, image reference, or listing ID that produced the row |

### 🛒 How to use it

1. **Open the Actor** and click *Try for free* — the input prefills with `["monster high"]`.
2. **Edit `searchQueries`** to one or more niche terms, **or** use the **Search by Image** section (photo or listing ID).
3. **Search by photo**: paste **direct image links** (not product pages) or base64 into `imageSearch`.
4. **Visually similar**: paste Etsy listing IDs or listing URLs into `visuallySimilarListings`.
5. **Set `maxListings`** and leave **Enrich with Full Product Details** on for the complete record.
6. **Start the run** and download the dataset as CSV, JSON, or Excel.

### 🛒 Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | array of strings | `["monster high"]` | One or more Etsy search terms. |
| `imageSearch` | array of strings | `[]` | A direct image link (any website) or base64 / data-URI image. Must point to the image itself, not to a product page. Returns visually similar products. |
| `visuallySimilarListings` | array of strings | `[]` | Etsy listing IDs or listing URLs. Returns visually similar products. |
| `currency` | string | `USD` | Currency for all prices (also sets the search region). Options: USD, EUR, GBP, CAD, AUD, JPY, INR, BRL. |
| `maxListings` | integer | `48` | Maximum unique listings across all queries, images, and listing IDs. |
| `enrichWithDetails` | boolean | `true` | Fetch the full product details for every listing. |

### 🛒 Output

```json
{
  "listing_id": "4577825069",
  "shop_id": "66534999",
  "title": "3D Printed Vase, Modern Ribbed Flower Vase, Sculptural Home Decor",
  "title_en": "3D Printed Vase, Modern Ribbed Flower Vase, Minimalist Table Centerpiece, Housewarming Gift",
  "description": "Fluted Ceramic Vase with Ruffled Rim...",
  "price": "$42.47",
  "price_num": 42.47,
  "price_int": 4247,
  "currency_code": "USD",
  "discount_price": "$16.99",
  "price_with_shipping": "$20.99",
  "has_variation_pricing": false,

  "shop_name": "Hexlayerworks",
  "shop_url": "https://www.etsy.com/shop/Hexlayerworks",
  "shop_location": "Pittsburgh, Pennsylvania",
  "shop_sold_count": 9,
  "shop_rating": 4.9,
  "shop_review_count": 128,

  "rating": 4.8,
  "review_count": 26,

  "image_url": "https://i.etsystatic.com/53330866/r/il/09da89/8261484691/il_fullxfull.8261484691_jdq2.jpg",
  "images": [
    "https://i.etsystatic.com/53330866/r/il/09da89/8261484691/il_fullxfull.8261484691_jdq2.jpg",
    "https://i.etsystatic.com/53330866/r/il/340bf5/8205227113/il_fullxfull.8205227113_shlt.jpg"
  ],
  "videos": ["https://v.etsystatic.com/c/video/upload/ac_none,du_15,q_auto:good/emsang5pqqtpkcsdpkej.mp4"],
  "detail_url": "https://www.etsy.com/listing/4577825069",

  "quantity": 887,
  "favorites": 3294,
  "is_available": true,
  "is_sold_out": false,
  "is_bestseller": false,
  "is_top_rated": false,

  "tags": ["3d printed vase", "modern flower vase", "ribbed vase"],
  "materials": ["PLA"],
  "ships_from_country": "US",
  "when_made": "made_to_order",
  "taxonomy_path": "Home And Living > Home Decor > Home Accents > Vases",
  "category_name": "",
  "section_name": "Vases",

  "is_ad": true,
  "create_date": 1790879142,
  "update_date": 1790879142,

  "source": "image",
  "source_input": "https://example.com/my-photo.jpg"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### 🛒 Tips

- Combine sources in one run: keyword queries, photo searches, and listing-ID searches all share `maxListings`, so results are deduplicated automatically.
- Run one query per niche for clean, comparable datasets.
- Keep enrichment **on** for descriptions, tags, materials, and shop data.
- For photo search, smaller images upload faster and cost less; large photos are automatically resized and re-encoded.
- Schedule the Actor weekly and diff `favorites` / `price_num` to track trends.

### 🛒 FAQ

#### Can I search Etsy by image?

Yes. Put image URLs (or base64 images) in the **Search by Photo** field and the Actor returns visually similar Etsy listings. You can also pass an Etsy listing ID or URL to get products that look like that listing.

#### Does scraping Etsy violate their terms of service?

Etsy's terms restrict automated access at high volumes. This Actor is intended for research, price comparison, and analytics. Consult Etsy's terms for your use case.

#### Search-only vs enriched output?

Search-only output returns title, price, sale price, all images, videos, badges, and shop ID for every listing. Enriched output adds the full product detail: description, tags, materials, taxonomy, shop location and sales, stock, and ratings.

#### How is this different from HTML scraping?

The Actor works directly with Etsy's product data, so results are already structured and include the full media gallery — including videos — without opening product pages.

### 🛒 Related Actors

#### 🔍 Search Etsy by image — Etsy Visual Search Scraper

Have a picture but not the words? The **Etsy Visual Search Scraper** finds Etsy listings that look just like a photo, or similar to an existing listing — ideal for visual sourcing and product research.

👉 **[Etsy Visual Search Scraper](https://apify.com/devcake/etsy-visual-search)** — find similar Etsy products by image.

### 🛒 Disclaimer

This Actor is not affiliated with or endorsed by Etsy. Use it responsibly and in line with applicable laws and Etsy's terms.

# Actor input Schema

## `searchQueries` (type: `array`):

Etsy keyword searches. Each query is processed independently. Leave empty to run only photo / listing-id searches.

## `imageSearch` (type: `array`):

Find products visually similar to an image. Provide a direct image link (any website - it must point to the image itself, not to a product page) or a base64 / data-URI image. Each image is processed independently.

## `visuallySimilarListings` (type: `array`):

Etsy listing IDs or listing URLs. Returns products visually similar to each listing's main image.

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

Currency for all prices (also sets the shipping region used for search).

## `maxListings` (type: `integer`):

Maximum number of unique listings to return across all queries, images, and listing IDs.

## `enrichWithDetails` (type: `boolean`):

Add full product details for every listing: description, tags, materials, category, shop location, stock, and engagement metrics.

## Actor input object example

```json
{
  "searchQueries": [
    "monster high"
  ],
  "imageSearch": [],
  "visuallySimilarListings": [],
  "currency": "USD",
  "maxListings": 48,
  "enrichWithDetails": true
}
```

# Actor output Schema

## `listings` (type: `string`):

Scraped Etsy listing results.

# 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 = {
    "searchQueries": [
        "monster high"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("devcake/etsy-search-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 = { "searchQueries": ["monster high"] }

# Run the Actor and wait for it to finish
run = client.actor("devcake/etsy-search-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 '{
  "searchQueries": [
    "monster high"
  ]
}' |
apify call devcake/etsy-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devcake/etsy-search-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/sfwpiOD5hC1xhodWj/builds/ZcqyKAdvsbikp7RAE/openapi.json
