# Etsy Products & Listings Scraper (Search, Shop, Category) (`heyitsgautham/etsy-products-scraper`) Actor

Scrape Etsy products from keywords, search, category, shop and listing URLs: title, price, sale, shop, ratings, badges, images. Free price summary per search or shop: median, quartiles, share on sale, top shops. Details add favorites, description, stock. $1 per 1,000, +$3.40 with details.

- **URL**: https://apify.com/heyitsgautham/etsy-products-scraper.md
- **Developed by:** [Gautham Krishna](https://apify.com/heyitsgautham) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.92 / 1,000 products

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

## Etsy Products & Listings Scraper (Search, Shop, Category)

Get Etsy listings as clean rows with price, sale price, shop and rating, for sellers and analysts doing product and price research.

Use cases, each with a ready-to-run example:

- [Scrape the Etsy search results for a keyword](https://apify.com/heyitsgautham/etsy-products-scraper/examples/etsy-search-personalized-necklace)
- [Get every product from an Etsy shop](https://apify.com/heyitsgautham/etsy-products-scraper/examples/etsy-shop-products)
- [See the median price and quartiles of a niche](https://apify.com/heyitsgautham/etsy-products-scraper/examples/etsy-price-summary-wedding-invitations)
- [Find the newest listings for a keyword](https://apify.com/heyitsgautham/etsy-products-scraper/examples/newest-etsy-listings)
- [Get listings with full details, favorites and reviews](https://apify.com/heyitsgautham/etsy-products-scraper/examples/etsy-digital-planner-listing-details)
- [See the listings that ship to the UK, priced in pounds](https://apify.com/heyitsgautham/etsy-products-scraper/examples/etsy-listings-uk-gbp)

Each row has the title, price, sale price, discount, shop, shop rating, badges, free shipping and a full-size image.
Feed it keywords or Etsy URLs (search, category, shop or listing) and it returns one row per product.
Turn on listing details to also get the description, all images, favorites, listing reviews, materials, stock, shipping cost and more.
Turn on the price summary to also get one free row per keyword or URL with the price median and quartiles, the share on sale and the top shops.

You pay **$1 per 1,000 products**, and less on Apify Store discount tiers (Bronze, Silver, Gold), down to $0.92 per 1,000 on Silver and Gold.
Listing details add **$3.40 per 1,000**, only for rows where the details loaded.
Failed rows are **never charged**.

### At a glance

| Topic | Details |
|---|---|
| Input | Keywords, or Etsy search, category, market, shop or listing URLs. Filters: price range, ships-to country, free shipping, currency and sort order |
| Output | One JSON row per product: title, price, sale price and discount, shop, shop rating, badges, free shipping, image and position. With listing details on, also the description, listing rating and review count, favorites, materials and stock. With the price summary on, one free summary row per keyword or URL |
| Price | $0.001 per product ($1 per 1,000), or $0.95 per 1,000 on Bronze and $0.92 on Silver and Gold. Listing details add $0.0034 ($3.40 per 1,000) on every tier. No start fee. Failed rows are free |
| Tested | Final test run: 57 of 57 valid inputs returned products, and details loaded on 280 of 281 rows. 700 products without details took 22 seconds. Price summary test: 60 of 61 inputs returned 40 products and a summary each, and all 60 summaries matched an independent recount from their rows, to within a cent of rounding |

### What you can scrape

| Input | Example | What you get |
|---|---|---|
| Keyword | `ceramic mug` | Etsy search results, the same as the Etsy search box |
| Search URL | `https://www.etsy.com/search?q=boho+rug&min=50&max=200` | Search results with the URL's filters kept |
| Category URL | `https://www.etsy.com/c/jewelry/necklaces` | Category results |
| Market URL | `https://www.etsy.com/market/ceramic_mug` | That market page's results |
| Shop URL | `https://www.etsy.com/shop/CaitlynMinimalist` | The shop's catalogue, page by page |
| Listing URL or ID | `https://www.etsy.com/listing/1371848548` or `1371848548` | That one product, always with details |

Locale URLs such as `etsy.com/uk/...` or `etsy.com/ca/...` work too.
Put bare listing IDs in the keywords field, since the URL field only accepts URLs.

### Fields

Every product row has these fields:

| Field | What it holds |
|---|---|
| `status` | `ok` for a product. Other values are explained below |
| `listingId`, `title`, `url` | The listing |
| `price`, `currency` | Current price. With details on, `maxPrice` is the highest variation price |
| `isOnSale`, `originalPrice`, `discountPercent` | Sale data when the item is discounted |
| `shopId`, `shopName`, `shopUrl` | The seller. Keyword search cards often hide the shop name, so `shopName` can be empty without details |
| `shopRating`, `shopReviewCount` | The rating and review count Etsy shows on the card. These are shop-level numbers. Etsy rounds big counts, so 3.9k becomes 3900 |
| `freeShipping` | `true` when Etsy marks free shipping |
| `badges` | Such as `Bestseller`, `Star Seller`, `Popular now`, `Etsy's Pick` |
| `isAd` | `true` for sponsored listings. Ads are left out unless you turn them on |
| `image` | Full-size main image |
| `input`, `position` | Which keyword or URL found it, and its place in the results |

With listing details on, rows also get:

| Field | What it holds |
|---|---|
| `description` | Full listing description. Email addresses and phone numbers are removed |
| `images` | All listing images, full size |
| `rating`, `reviewCount` | The listing's own rating and review count |
| `favorites` | How many shoppers saved the listing |
| `materials`, `category` | From the listing |
| `availability`, `quantityAvailable` | Stock status and quantity |
| `shippingCost`, `shipsFrom`, `listedOn` | Shipping to the selected country, origin and listing date |
| `inCarts` | Such as `20+` when Etsy shows it |
| `relatedSearches` | Up to 20 search phrases Etsy links from the listing |
| `detailsIncluded` | `true` when the details loaded |

### Price summary row

Set `priceSummary` to `true` for Etsy price research in one call.
Each keyword, search, market, category or shop URL that returned products then gets one extra row with `status` set to `summary`, after its products.
Listing URLs get none.
It covers the products returned, so `maxItems` sets the sample size, and sponsored listings count only when `includeAds` is on.
The row is free, and it is worked out from the products already returned, so it adds no requests.
In our test, the same 61 inputs used 0.0132 GB of proxy traffic with the summary on and with it off.

| Field | What it holds |
|---|---|
| `input` | The keyword or URL it summarises |
| `productCount` | Products returned for that input |
| `currency`, `pricedCount` | The currency of the price fields, and how many products they cover |
| `priceMin`, `priceP25`, `priceMedian`, `priceP75`, `priceMax`, `priceAverage` | The current price, sale price included. Quartiles interpolate between products, like Excel's `QUARTILE.INC` |
| `onSalePercent`, `medianDiscountPercent` | Share of products on sale, and the median `% off` among them |
| `freeShippingPercent` | Share with free shipping to the ships-to country |
| `starSellerPercent` | Share from Star Sellers, over the products whose page shows the badge. Category cards and listing details show it. Keyword, search, market and shop cards do not, so it is `null` there unless listing details are on |
| `shopCount`, `topShops` | Distinct shops, and up to 10 shops with 2 or more listings, most listings first. `shopName` is `null` when the search cards hid it |
| `message` | Only when a results page failed or your maximum charge stopped the run, so the summary covers fewer products |

With listing details on, the row also has these, over the products whose listing page loaded:

| Field | What it holds |
|---|---|
| `detailsCount` | Products with details |
| `favoritesMedian`, `favoritesMax` | Favorites |
| `favoritesByPriceQuarter` | The products sorted by price and cut into 4 groups of near-equal size, with each group's price range and median favorites |
| `listingReviewCountMedian`, `listingRatingAverage` | The listings' own review counts and ratings, where the page shows them |
| `shippingCostMedian` | Shipping cost to the ships-to country, where the page states it |

Prices are never converted between currencies.
Etsy prices every product in the run's `currency`, and every product in our tests, in USD and in EUR, came back in it.
If a listing page ever answers in another currency, the summary leaves those products out of the price fields and adds `otherCurrencies` with a count per currency.

A keyword summary without details, from a test run on 2026-10-17:

```json
{
  "status": "summary",
  "input": "soy candle",
  "productCount": 40,
  "currency": "USD",
  "pricedCount": 40,
  "priceMin": 3.25,
  "priceP25": 13.03,
  "priceMedian": 17.99,
  "priceP75": 22.1,
  "priceMax": 54.99,
  "priceAverage": 19.04,
  "onSalePercent": 30,
  "medianDiscountPercent": 17.5,
  "freeShippingPercent": 10,
  "starSellerPercent": null,
  "shopCount": 39,
  "topShops": [
    { "shopId": "7997672", "shopName": "TeresaLynns", "listings": 2 }
  ]
}
```

Part of the summary for the same keyword from another test run, with listing details on and 20 products.
The price, sale, shipping and shop fields are left out here:

```json
{
  "starSellerPercent": 75,
  "detailsCount": 20,
  "favoritesMedian": 1150.5,
  "favoritesMax": 17539,
  "favoritesByPriceQuarter": [
    { "priceFrom": 5.83, "priceTo": 11.04, "listings": 5, "favoritesMedian": 1418 },
    { "priceFrom": 11.65, "priceTo": 12, "listings": 5, "favoritesMedian": 895 },
    { "priceFrom": 12.9, "priceTo": 22, "listings": 5, "favoritesMedian": 2596 },
    { "priceFrom": 26.25, "priceTo": 54.99, "listings": 5, "favoritesMedian": 765 }
  ],
  "listingReviewCountMedian": 298,
  "listingRatingAverage": 4.85,
  "shippingCostMedian": 0
}
```

### Input

```json
{
  "searchQueries": ["ceramic mug", "leather wallet men"],
  "startUrls": [
    { "url": "https://www.etsy.com/c/jewelry/necklaces" },
    { "url": "https://www.etsy.com/shop/CaitlynMinimalist" },
    { "url": "https://www.etsy.com/listing/1371848548/handmade-ceramic-mug-large-size" }
  ],
  "maxItems": 100,
  "includeDetails": false,
  "priceSummary": true,
  "sortBy": "price_asc",
  "minPrice": 10,
  "maxPrice": 60,
  "shipsTo": "GB",
  "freeShipping": false,
  "currency": "USD"
}
```

`maxItems` applies to each keyword or URL separately.
Sort, price, ships-to and free-shipping filters apply to keywords, search URLs, market URLs and category URLs.
Shops always list in Etsy's own order.

### Output example

Real rows from test runs on 2026-10-10.

A keyword result without details:

```json
{
  "status": "ok",
  "input": "ceramic mug",
  "position": 6,
  "listingId": "4535842002",
  "title": "Artisan Striped Coffee Mug Set with Saucers, Four Ceramic Tea Cups, Colorful Modern Drinkware, Housewarming Gift, Coffee Lover Gift 11-180",
  "url": "https://www.etsy.com/listing/4535842002/artisan-striped-coffee-mug-set-with",
  "price": 16,
  "isOnSale": true,
  "originalPrice": 20,
  "discountPercent": 20,
  "shopId": "61803485",
  "shopName": "MintHarper",
  "shopRating": 4.6,
  "shopReviewCount": 31,
  "freeShipping": true,
  "badges": ["Bestseller"],
  "shipsFrom": null,
  "isAd": false,
  "image": "https://i.etsystatic.com/61803485/r/il/de7087/8511996156/il_fullxfull.8511996156_7zb0.jpg",
  "shopUrl": "https://www.etsy.com/shop/MintHarper",
  "currency": "USD"
}
```

A category result with details on (description, images and related searches shortened here):

```json
{
  "status": "ok",
  "input": "https://www.etsy.com/c/home-and-living/kitchen-and-dining/cookware",
  "position": 5,
  "listingId": "691230080",
  "title": "Personalized Cutting Board, Fathers Day, Grilling Gift, Gift from daughter, Dad Gift, Personalized Grilling Board, Gift for Husband, Wood 71",
  "url": "https://www.etsy.com/listing/691230080/personalized-cutting-board-fathers-day",
  "price": 30,
  "maxPrice": 54.6,
  "currency": "USD",
  "isOnSale": true,
  "originalPrice": 50,
  "discountPercent": 40,
  "shopId": "19269755",
  "shopName": "WallThingsCo",
  "shopUrl": "https://www.etsy.com/shop/WallThingsCo",
  "shopRating": 4.94,
  "shopReviewCount": 8178,
  "rating": 4.9,
  "reviewCount": 314,
  "favorites": 1305,
  "freeShipping": true,
  "shippingCost": 0,
  "shipsFrom": "Westby, WI",
  "listedOn": "Oct 7, 2026",
  "badges": ["Etsy's Pick"],
  "isAd": false,
  "availability": "InStock",
  "quantityAvailable": 725,
  "category": "Home & Living < Kitchen & Dining < Cookware < Cutting Boards",
  "materials": ["Walnut/Maple/Cherry"],
  "relatedSearches": ["daddys grilling board", "grilling bbq", "custom cuttingboard father's day stepdad"],
  "description": "*** Fast Shipping ***\n***Give a Gift That Lasts!***\n...",
  "image": "https://i.etsystatic.com/19269755/r/il/b4c867/1919879321/il_fullxfull.1919879321_t8eu.jpg",
  "images": [
    "https://i.etsystatic.com/19269755/r/il/b4c867/1919879321/il_fullxfull.1919879321_t8eu.jpg",
    "https://i.etsystatic.com/19269755/r/il/358626/1872355402/il_fullxfull.1872355402_b8i2.jpg"
  ],
  "detailsIncluded": true
}
```

### Row status

| `status` | Meaning | Charged |
|---|---|---|
| `ok` | A product | Yes |
| `unavailable` | The listing or shop no longer exists, or the listing is sold out or private | No |
| `no_results` | Etsy found nothing for this input | No |
| `summary` | The price summary for one keyword or URL, when `priceSummary` is on | No |
| `invalid_input` | Not a keyword or a supported Etsy URL | No |
| `error` | Etsy kept blocking the request after all retries | No |

If a listing page fails to load while details are on, you still get the product row with its search data.
That row has `detailsIncluded: false` and a `message`, and it is charged as a product only.

### Pricing

Prices are per 1,000 products or listing details.

| Event | No discount | Bronze | Silver | Gold |
|---|---|---|---|---|
| Product returned | $1 | $0.95 | $0.92 | $0.92 |
| Listing details loaded for that product | $3.40 | $3.40 | $3.40 | $3.40 |
| Unavailable, no results, invalid input or failed request | Free | Free | Free | Free |
| Price summary row | Free | Free | Free | Free |

Bronze, Silver and Gold are Apify Store discount tiers, and Apify's Pricing tab shows them as Starter, Scale and Business.
Apify decides which tier an account is on.

A run of 1,000 search results costs $1, or $0.92 on Silver and Gold.
The same run with listing details costs $4.40, or $4.32 on Silver and Gold.
Details cost more because each one loads a full listing page through a residential proxy.
Set a maximum cost per run in the run options and the scraper stops once it is reached.

### Speed

In our tests, 700 products without details took 22 seconds.
With details on, 281 products from 59 different inputs took 4 to 6 minutes at the default concurrency of 10.

### Run it on a schedule

Etsy prices change often, and each run returns the listings and prices as they are at that moment.
A daily run sent to a sheet builds a price history for a search, and with `priceSummary` on, the free `summary` row gives one line of price quartiles per keyword per day.
The scraper has no only-new mode, so every run charges for every listing it returns.
Keep `maxItems` at what you need.

1. Set your input and click **Save as a new task**.
2. On the task page, click **Actions**, then **Schedule**, and pick how often it runs.
   [Apify's schedules guide](https://docs.apify.com/actors/running/schedules) covers cron times and time zones.
3. On the task's **Integrations** tab, choose where each run's results go.

| Integration | What it does |
|---|---|
| [Slack](https://docs.apify.com/integrations/slack) | Posts a message to your channel when a run finishes |
| [Google Drive](https://docs.apify.com/integrations/drive) | Saves each run's results as a file in your Drive |
| [Webhook](https://docs.apify.com/integrations/webhooks) | Sends the finished run, with its dataset ID, to your own URL |
| [Make](https://docs.apify.com/integrations/make), [Zapier](https://docs.apify.com/integrations/zapier), [n8n](https://docs.apify.com/integrations/n8n) | Adds each new row to a Google Sheet, a CRM or a database |

Each listing has a stable `listingId`, so a sheet can line up one listing's price across runs.

### Use it from AI agents

The scraper works as a tool through the [Apify MCP server](https://mcp.apify.com) in Claude, Cursor, VS Code and other MCP clients.
An agent can pass a keyword or a shop URL and get structured product rows back.
You can also call it through the [Apify API](https://docs.apify.com/api/v2), schedule it, or connect it to Make, Zapier and n8n.

### More from heyitsgautham

Other actors from the same account.

- [Google Trends Scraper: Related Queries & Trending Searches](https://apify.com/heyitsgautham/google-trends-scraper) for Google Trends interest over time and related queries for a product keyword.
- [YouTube Search Results & Rank Tracker Scraper](https://apify.com/heyitsgautham/youtube-search-scraper) for YouTube search results with rank, for the videos ranking on a product keyword.
- [YouTube Video & Shorts Comments Scraper with Replies](https://apify.com/heyitsgautham/youtube-comments-scraper) for the comments and replies on a video or Short, for sentiment analysis and audience research.
- [Trustpilot Reviews & TrustScore Scraper](https://apify.com/heyitsgautham/trustpilot-reviews-scraper) for Trustpilot reviews and each company's TrustScore, for any business on any Trustpilot country site.

### FAQ

**Why is `shopName` empty on some keyword results?**
Etsy's search cards show the shop name for only some results.
Turn on `includeDetails` and every row gets the shop name from its listing page.
Category and shop results always have it.

**Can I get more than about 900 results for one keyword?**
Etsy stops search results at around 20 pages for visitors who are not signed in.
Split the search with price ranges or sort orders to reach more listings.

**Why do prices differ from what I see on Etsy?**
Etsy prices depend on currency and destination country.
Set `currency` and `shipsTo` to match what you want to compare.

**Does it log in or use the Etsy API?**
No.
It reads the same public pages any visitor sees, with no account.

**Does it return customer reviews or seller contact details?**
No.
It does not collect reviewer names, emails or phone numbers, and it strips emails and phone numbers out of descriptions.

### Limitations

- Etsy's bot protection blocks some requests. The scraper retries on new residential IPs, which keeps failures rare but not zero. Failed rows are free.
- The tags a seller typed are not shown on Etsy's public listing page. `relatedSearches` holds the search phrases Etsy links instead.
- Variation prices are summarised as `price` (lowest) and `maxPrice` (highest), not listed per option.
- Etsy changes its pages from time to time. If something breaks, open an issue on the Issues tab.

# Actor input Schema

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

Each keyword runs an Etsy search, the same as typing it into the Etsy search box.

## `startUrls` (type: `array`):

Search, category (/c/...), market, shop or listing URLs. Filters already in a search or category URL are kept.

## `maxItems` (type: `integer`):

Stops each keyword or URL after this many products. A listing URL always returns one product. Etsy shows at most about 20 pages (around 900 products) for one search.

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

Adds the full description, all images, listing rating and review count, favorites, materials, category, stock, shipping cost, ships-from, listed date, badges and shop name. Slower, about 1 to 3 seconds per product. Listing URLs always get these details.

## `priceSummary` (type: `boolean`):

Adds one free row with status summary for each keyword, search, market, category or shop URL. It gives the price count, min, quartiles, median, max and average, the share on sale, with free shipping and from Star Sellers, and the top shops by listing count. With listing details on, it also gives favorites, favorites by price quarter, listing reviews, rating and shipping cost. It is worked out from the products already returned, so it adds no requests and no charge.

## `sortBy` (type: `string`):

Order for keyword searches and category pages.

## `minPrice` (type: `integer`):

In the currency below.

## `maxPrice` (type: `integer`):

In the currency below.

## `shipsTo` (type: `string`):

Two-letter country code such as US, GB, DE or AU. Only returns items that ship there. Leave empty for no shipping filter (prices and free-shipping flags then follow the US).

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

Only items with free shipping to the country above.

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

Three-letter code for prices, such as USD, EUR, GBP, CAD or AUD.

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

Etsy mixes paid ads into results. Off by default. When on, ad rows have isAd set to true.

## `maxConcurrency` (type: `integer`):

How many requests run in parallel.

## `useProxy` (type: `boolean`):

Leave on. Etsy blocks data-center IPs.

## Actor input object example

```json
{
  "searchQueries": [
    "ceramic mug"
  ],
  "maxItems": 20,
  "includeDetails": false,
  "priceSummary": false,
  "sortBy": "most_relevant",
  "freeShipping": false,
  "currency": "USD",
  "includeAds": false,
  "maxConcurrency": 10,
  "useProxy": true
}
```

# Actor output Schema

## `products` (type: `string`):

One row per Etsy listing with title, price, sale price, shop, ratings, badges, shipping and images, plus listing-page details when requested. Only rows with status ok are charged.

# 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": [
        "ceramic mug"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("heyitsgautham/etsy-products-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": ["ceramic mug"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("heyitsgautham/etsy-products-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": [
    "ceramic mug"
  ],
  "maxItems": 20
}' |
apify call heyitsgautham/etsy-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,heyitsgautham/etsy-products-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/IPTGxH3YBdJ5i4MkH/builds/3cEIrGcouPLnEhp8s/openapi.json
