# Etsy Scraper — Products, Prices, Shops & Reviews (`unfenced-group/etsy-scraper`) Actor

Scrape Etsy products by keyword, category, shop or product URL. Price, sale price, discount, shop rating, Star Seller and ad flags; optional full details: description, images, stock, variations, shipping, returns, favorites, reviews. 22 marketplaces.

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

## Pricing

from $0.46 / 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 Scraper — Products, Prices, Shops & Reviews

![Etsy Scraper](https://api.apify.com/v2/key-value-stores/lzhdNvTO4Z2UtgdcP/records/banner.png)

Extract Etsy product listings by keyword, category, shop or product URL: price, sale price and discount, shop name and rating, Star Seller and Bestseller badges, ad placements, and — with full details on — the description, all images, stock quantity, variations, shipping, returns, production partners, recent purchases and reviews. 22 country marketplaces in local currency. No API key or Etsy account required.

***

### Why this scraper?

#### 🔎 Four ways in

Search by keyword, crawl a whole category (up to about 16,000 products), read a shop's profile with its featured products, or fetch single product pages. Mix them in one run.

#### 💰 Price and discount data

Current price, original price, discount percentage, variation price range and currency on every row, read from the marketplace you choose.

#### 🏷️ Seller and placement signals

Star Seller, Bestseller (with its category), Etsy's Pick and Popular now badges, plus a flag for every sponsored product so you can see which shops advertise on a keyword.

#### 📦 Full product records

With full details on: description, all images and video, stock quantity, variations, materials, dimensions, shipping cost, ships-from location, delivery estimate, returns window, shop sales, shop policies and the latest reviews.

#### 📈 Demand signals

Recent purchases ("13 bought in the last 24 hours"), shopper cart counts where Etsy shows them, review count and review highlight tags.

#### 🏭 Production partners

The businesses a shop names as helping to make an item — useful for supplier research and spotting print-on-demand listings.

#### ♻️ Faster repeat runs

With full details on, product pages read in the last few days are reused when the price has not changed, so scheduled runs finish faster. Each reused row says when its page was read.

#### 🔁 Price monitoring

Every row carries `changeStatus` (`NEW`, `UNCHANGED`, `PRICE_DROP`, `PRICE_INCREASE`) and the previous price from earlier runs. Schedule it and switch on **Only new and changed products** for a clean daily feed.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array of strings | `[]` | Keywords to search, for example `"linen apron"`. Each keyword returns up to `maxItems` products. |
| `startUrls` | array of URLs | `[]` | Etsy category (`/c/…`), keyword (`/market/…`), search (`/search?q=…`), shop (`/shop/…`) or product (`/listing/…`) pages. Locale URLs such as `/uk/` keep their currency. |
| `marketplace` | string | `"us"` | Etsy country site for keyword searches: `us`, `uk`, `ca`, `au`, `ie`, `nz`, `de`, `fr`, `nl`, `it`, `es`, `be`, `at`, `ch`, `se`, `dk`, `no`, `fi`, `pl`, `pt`, `in`, `sg`. Sets the price currency. |
| `maxItems` | integer | `100` | Maximum products per keyword and per start URL. `0` means no limit. |
| `fetchDetails` | boolean | `false` | Open every product page for the full record (see the second table below). Slower and charged at the with-details rate. |
| `minPrice` | integer | (empty) | Keep products priced at or above this amount, in the marketplace currency. |
| `maxPrice` | integer | (empty) | Keep products priced at or below this amount, in the marketplace currency. |
| `onlyOnSale` | boolean | `false` | Keep only discounted products. |
| `freeShippingOnly` | boolean | `false` | Keep only products that ship for free. |
| `starSellerOnly` | boolean | `false` | Keep only products from Star Seller shops. |
| `excludeAds` | boolean | `false` | Leave out sponsored products. |
| `onlyChanges` | boolean | `false` | Save only products that are new or changed price since earlier runs. |
| `detailCacheDays` | integer | `3` | With full details on, reuse a product page an earlier run in your account read within this many days, as long as the price is unchanged. `0` always reads fresh. |

If you give no keyword and no URL, the actor searches `"linen apron"` as an example.

***

### Output schema

Every field below is present on every record. Fields Etsy does not publish for a product are `null` (or `[]` for lists), never omitted.

#### Always present

| Field | Type | Description |
|---|---|---|
| `id` | string | Etsy listing ID (same as `listingId`). |
| `listingId` | string | Etsy listing ID. |
| `url` | string | Product page URL. |
| `title` | string | Product title. |
| `price` | number | Current price in `currency`. |
| `originalPrice` | number | Price before the discount (null when not on sale). |
| `discountPercent` | number | Discount percentage (null when not on sale). |
| `currency` | string | ISO currency code, for example `USD`, `GBP`, `EUR`. |
| `isOnSale` | boolean | True when a discount is shown. |
| `availability` | string | `InStock` or `OutOfStock`. |
| `freeShipping` | boolean | True when the product ships for free to the marketplace country. |
| `isAd` | boolean | True when the product appears as a sponsored placement. |
| `isStarSeller` | boolean | Shop holds Etsy's Star Seller badge. |
| `isBestseller` | boolean | Product carries the Bestseller badge. |
| `isEtsysPick` | boolean | Product carries the Etsy's Pick badge. |
| `isPopularNow` | boolean | Product carries the Popular now badge. |
| `isDigitalDownload` | boolean | Product is a digital download. |
| `favorites`, `lastListedDate` | null | Filled with full details on (see below). |
| `inCartCount` | integer | Shoppers with the item in their cart, when Etsy shows it (mostly on shop pages; null otherwise). |
| `imageUrl` | string | Main image, full size. |
| `thumbnailUrl` | string | Thumbnail as shown in the grid. |
| `images` | array | Image URLs (the main image only unless full details are on). |
| `shopName` | string | Shop name. |
| `shopId` | string | Etsy shop ID. |
| `shopUrl` | string | Shop page URL. |
| `shopRating` | number | Shop star rating. |
| `shopReviewCount` | integer | Number of shop reviews. |
| `shipsFromRegion` | string | Ships-from state or region, when shown. |
| `summary` | string | One-line summary: title, price, shop. |
| `changeStatus` | string | `NEW`, `UNCHANGED`, `PRICE_DROP` or `PRICE_INCREASE` compared with earlier runs. |
| `firstSeenAt` | string | When this actor first saw the product (ISO 8601). |
| `previousPrice` | number | Price at the previous run (null for new products). |
| `priceChange` | number | Price difference since the previous run. |
| `marketplace` | string | Marketplace code used for the run. |
| `sourceMode` | string | `search`, `category`, `shop` or `listing`. |
| `searchQuery` | string | Keyword that found the product (null for URL sources). |
| `sourceUrl` | string | Page the product was read from. |
| `page` | integer | Result page number. |
| `position` | integer | Position within the source. |
| `detailFetched` | boolean | True when the product page was read. |
| `detailCachedAt` | string | When the product page used for this row was read, if it came from an earlier run (null when read in this run). |
| `isRepost` | boolean | Always false (kept for portfolio schema compatibility). |
| `publishDate`, `publishDateISO`, `originalPublishDate`, `originalUrl` | null | Etsy does not publish listing dates; always null. |
| `contentHash` | string | Stable hash of listing ID and title. |
| `source` | string | Always `etsy.com`. |
| `scrapedAt` | string | Time the row was saved (ISO 8601). |

#### With `fetchDetails: true`

| Field | Type | Description |
|---|---|---|
| `descriptionText` | string | Full description as plain text. |
| `descriptionMarkdown` | string | Full description with paragraph breaks kept. |
| `descriptionHtml` | null | Etsy descriptions are plain text; always null. |
| `priceMin` / `priceMax` | number | Lowest and highest variation price. |
| `stockQuantity` | integer | Quantity available. |
| `lowStockQuantity` | integer | Set when Etsy shows "Only N left". |
| `rating` | number | Product review rating. |
| `reviewCount` | integer | Number of product reviews. |
| `reviews` | array | Latest reviews: `rating`, `date`, `text`. Reviewer names are not collected. |
| `reviewHighlights` | array | Etsy's review highlight tags, for example "Great quality". |
| `favorites` | integer | Number of shoppers who favorited the product (null when Etsy hides the count, typically for new items). |
| `pageLanguage` | string | Language of the product page read, normally `en-US`. If Etsy only served a translated page, title and description are still the seller's original text. |
| `lastListedDate` | string | Date the listing was last listed or renewed (YYYY-MM-DD). Etsy renews many listings automatically, so this is not the original creation date. |
| `images` | array | All image URLs, full size. |
| `imageCount` | integer | Number of images. |
| `imageAltTexts` | array | Image descriptions. |
| `videoUrl` | string | Product video URL. |
| `category` | string | Etsy category, for example `Accessories < Aprons`. |
| `categoryPath` | array | Category breadcrumb. |
| `materials` | array | Materials listed by the seller. |
| `dimensions` | array | Width, height, length or depth when listed. |
| `variations` | array | Options per variation: `name`, `options[].value`, `options[].priceText`, `options[].soldOut`. |
| `madeBy` | string | "Handmade by", "Designed by" or "Vintage from" line. |
| `isMadeToOrder` | boolean | Item is made to order. |
| `productionPartners` | array | Businesses the shop names as production partners. |
| `purchasesRecent` | integer | Recent purchases Etsy shows (for example 13). |
| `purchasesRecentPeriod` | string | Period for `purchasesRecent`, for example `24 hours`. |
| `bestsellerCategory` | string | Category of the Bestseller badge. |
| `shipsFrom` | string | Ships-from city and region. |
| `shipsFromCountry` | string | Ships-from country code. |
| `shippingCost` | number | Cost to ship to the marketplace country (0 when free). |
| `deliveryEstimate` | string | Estimated delivery window, for example `Sep 23-28`. |
| `returnsAccepted` | boolean | Returns and exchanges accepted. |
| `returnWindowDays` | integer | Return window in days. |
| `shopSales` | integer | Total shop sales. |
| `shopId`, `shopRating`, `shopReviewCount` | — | Also filled from the product page when a product URL is the source. |
| `shopYearsOnEtsy` | number | Years the shop has been on Etsy (a fraction for shops under a year, e.g. 0.8). |
| `shopLogoUrl` | string | Shop logo. |
| `shopPolicies` | array | Shop policy texts: `topic`, `text`. |

#### Shop start URLs add

| Field | Type | Description |
|---|---|---|
| `shopLocation` | string | Shop country. |
| `shopTagline` | string | Shop headline. |
| `shopBannerUrl` | string | Shop banner image. |
| `shopLatestActivity` | string | Date of the shop's latest activity. |

#### Example record

```json
{
    "id": "1042603482",
    "listingId": "1042603482",
    "url": "https://www.etsy.com/listing/1042603482/japanese-apron-with-pockets-vintage",
    "title": "Japanese Apron with pockets, Vintage Style Cooking Smock for Women, Small to Plus Size",
    "price": 23.5,
    "originalPrice": null,
    "discountPercent": null,
    "currency": "USD",
    "isOnSale": false,
    "priceMin": 23.5,
    "priceMax": 27.5,
    "availability": "InStock",
    "stockQuantity": 654,
    "lowStockQuantity": null,
    "freeShipping": false,
    "shippingCost": 5.98,
    "shipsFrom": "Henderson, NV",
    "shipsFromCountry": "US",
    "shipsFromRegion": "NV",
    "deliveryEstimate": "Sep 23-28",
    "returnsAccepted": true,
    "returnWindowDays": 30,
    "isAd": false,
    "isStarSeller": true,
    "isBestseller": true,
    "bestsellerCategory": "Aprons",
    "isEtsysPick": true,
    "isPopularNow": false,
    "isDigitalDownload": false,
    "isMadeToOrder": false,
    "madeBy": "Designed by WilshireGoodsShop",
    "productionPartners": [
        "N.T. Atelier, China"
    ],
    "purchasesRecent": 5,
    "purchasesRecentPeriod": "24 hours",
    "inCartCount": null,
    "rating": 4.9,
    "reviewCount": 3328,
    "favorites": 51780,
    "lastListedDate": "2026-09-19",
    "reviewHighlights": [
        "Great quality",
        "As described",
        "Fast shipping"
    ],
    "reviews": [
        {
            "rating": 5,
            "date": "2026-09-18",
            "text": "This was exactly what I was wanting. Thank you so much. The quality is great. The way it fit was what I was wanting. I prefer the aprons like this from long ago."
        },
        {
            "rating": 5,
            "date": "2026-09-15",
            "text": "Item was as described and arrived quickly."
        }
    ],
    "category": "Accessories < Aprons",
    "categoryPath": [
        "Accessories",
        "Aprons"
    ],
    "materials": [
        "Cotton"
    ],
    "dimensions": [],
    "variations": [
        {
            "name": "Color",
            "options": [
                {
                    "value": "Black",
                    "priceText": "$23.50 - $27.50",
                    "soldOut": false
                },
                {
                    "value": "Green",
                    "priceText": "$23.50 - $25.00",
                    "soldOut": false
                }
            ]
        },
        {
            "name": "Size",
            "options": [
                {
                    "value": "S-See description",
                    "priceText": "$23.50",
                    "soldOut": false
                },
                {
                    "value": "M/L-See description",
                    "priceText": "$25.00",
                    "soldOut": false
                }
            ]
        }
    ],
    "imageUrl": "https://i.etsystatic.com/24091653/r/il/8f1a48/4030105345/il_fullxfull.4030105345_n3rg.jpg",
    "thumbnailUrl": "https://i.etsystatic.com/24091653/c/2668/2120/57/68/il/8f1a48/4030105345/il_340x270.4030105345_n3rg.jpg",
    "images": [
        "https://i.etsystatic.com/24091653/r/il/8f1a48/4030105345/il_fullxfull.4030105345_n3rg.jpg",
        "https://i.etsystatic.com/24091653/r/il/521f23/4455989322/il_fullxfull.4455989322_4wf0.jpg",
        "https://i.etsystatic.com/24091653/r/il/918052/3223418428/il_fullxfull.3223418428_6g6p.jpg"
    ],
    "imageCount": 10,
    "imageAltTexts": [
        "May include: Olive green apron dress with a scoop neck and a tie-back waist. The dress has two large front pockets and is worn over a black t-shirt. The fabric has a slightly wrinkled texture."
    ],
    "videoUrl": "https://v.etsystatic.com/c/video/upload/ac_none,du_15,q_auto:good/InShot_20210724_031243620_fpkgvp.mp4",
    "shopName": "WilshireGoodsShop",
    "shopId": "24091653",
    "shopUrl": "https://www.etsy.com/shop/WilshireGoodsShop",
    "shopRating": 4.9,
    "shopReviewCount": 9776,
    "shopSales": 40600,
    "shopYearsOnEtsy": 6,
    "shopLocation": null,
    "shopTagline": null,
    "shopLogoUrl": "https://i.etsystatic.com/24091653/r/isla/7e646e/50089861/isla_500x500.50089861_ltfa67os.jpg",
    "shopBannerUrl": null,
    "shopLatestActivity": null,
    "shopPolicies": [
        {
            "topic": "Returns & Exchanges",
            "text": "We accept returns within 30 days of delivery for items that are unused and clean. While we don’t offer direct exchanges, you’re welcome to return the item for a refund and place a new order for the one you prefer."
        }
    ],
    "descriptionHtml": null,
    "descriptionText": "A cute Japanese pinafore apron, a durable yet aesthetic smock dress that complements your style. With its large pockets and coverall design, it makes the perfec…",
    "descriptionMarkdown": "A cute Japanese pinafore apron, a durable yet aesthetic smock dress that complements your style. With its large pockets and coverall design, it makes the perfec…",
    "summary": "Japanese Apron with pockets, Vintage Style Cooking Smock for Women, Small to Plus Size — 23.5 USD — by WilshireGoodsShop",
    "publishDate": null,
    "publishDateISO": null,
    "isRepost": false,
    "originalPublishDate": null,
    "originalUrl": null,
    "firstSeenAt": "2026-09-19T13:08:32.158Z",
    "previousPrice": null,
    "priceChange": null,
    "changeStatus": "NEW",
    "marketplace": "us",
    "sourceMode": "category",
    "searchQuery": null,
    "sourceUrl": "https://www.etsy.com/c/home-and-living",
    "page": 1,
    "position": 12,
    "detailFetched": true,
    "contentHash": "7cb4420c71415665",
    "source": "etsy.com",
    "scrapedAt": "2026-09-19T13:20:15.527Z"
}
```

***

### Examples

**Search two keywords in the UK marketplace:**

```json
{
    "searchQueries": ["linen apron", "ceramic mug"],
    "marketplace": "uk",
    "maxItems": 200
}
```

**Discounted Star Seller products in a category, full details:**

```json
{
    "startUrls": [{ "url": "https://www.etsy.com/c/jewelry" }],
    "onlyOnSale": true,
    "starSellerOnly": true,
    "maxItems": 100,
    "fetchDetails": true
}
```

**A shop's profile with its featured products, and a single product:**

```json
{
    "startUrls": [
        { "url": "https://www.etsy.com/shop/WilshireGoodsShop" },
        { "url": "https://www.etsy.com/listing/1042603482" }
    ],
    "maxItems": 0
}
```

**Daily price monitoring feed (schedule this):**

```json
{
    "searchQueries": ["personalized cutting board"],
    "maxItems": 300,
    "onlyChanges": true
}
```

***

### 💰 Pricing

**$0.49 per 1,000 products** from search, category and shop pages.
**$2.19 per 1,000 products with full details** (`fetchDetails: true`, or a product URL).

You only pay for products saved to your dataset. Failed retries are never charged. A product whose page could not be opened is saved and charged at the standard rate.

| Products | Standard | With full details |
|---|---|---|
| 100 | ~$0.05 | ~$0.22 |
| 1,000 | ~$0.49 | ~$2.19 |
| 10,000 | ~$4.90 | ~$21.90 |
| 100,000 | ~$49.00 | ~$219.00 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower both rates by one cent per tier, down to $0.46 and $2.16 per 1,000 from the Business tier up. Use **Max products per source** to control your spend exactly.

***

### Performance

| Run size | Standard | With full details |
|---|---|---|
| 100 products | under 1 minute | 3–6 minutes |
| 1,000 products | 2–5 minutes | 30–50 minutes |
| 10,000 products | 20–40 minutes | several hours — split into runs |

***

### Known limitations

- A shop URL returns the shop profile and the products on the shop's first page (typically 16–24). Etsy loads the rest of a shop's catalogue in the browser, so it is not reachable here.
- Keyword pages list about 7 new products per page, so large keyword runs take more pages than category runs. For volume, use a category URL.
- Etsy shows cart counts mainly on shop pages; on search and category rows `inCartCount` is usually null.
- Etsy does not publish listing creation dates, tags or view counts on its public pages, so these are not in the output.
- For a keyword with no real matches Etsy still fills the page with unrelated products; the actor detects this and returns nothing for that keyword rather than charging you for unrelated rows.
- Product details and shop pages take 20–40 seconds each. They run in parallel, but large detail runs are slow.

***

### Technical details

- **Source:** etsy.com — 22 country marketplaces
- **Coverage:** keyword pages, all category pages (up to 250 pages each), shop catalogues and product pages
- **Compliance:** only pages Etsy's robots.txt allows for crawlers are read; a search URL is converted to the matching keyword page
- **Change tracking:** a named store keeps each product's first-seen date and last price for 180 days
- **Retry:** automatic retry with a fresh connection on every failed page

***

### Rate this actor

If this scraper does its job, a short review on the **Reviews** tab helps other users find it. Something not working? Open an issue on the **Issues** tab instead — issues get fixed.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Keywords to search on Etsy, one per line, for example "linen apron" or "ceramic mug". Each keyword is read from Etsy's public keyword page for that term and returns up to Max products per source.

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

Etsy pages to scrape. Supported: category pages (https://www.etsy.com/c/jewelry), keyword pages (https://www.etsy.com/market/linen\_apron), search pages (converted to the keyword page), shop pages (https://www.etsy.com/shop/ShopName) and product pages (https://www.etsy.com/listing/1042603482). Locale URLs such as /uk/ or /de-en/ keep their local currency.

## `marketplace` (type: `string`):

Which Etsy country site to read for search keywords, which sets the currency of prices. Start URLs keep the country in their own path.

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

Maximum number of products to save for each search keyword and each start URL. Use 0 for no limit (a category holds up to about 16,000 products).

## `fetchDetails` (type: `boolean`):

Open every product page for the full description, all images and video, stock quantity, variations, materials, shipping cost, ships-from location, delivery estimate, returns policy, production partners, recent purchases, rating, recent reviews and shop sales. Slower (about 20 to 40 seconds per product, run in parallel) and charged at the product-with-details rate.

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

Only keep products priced at or above this amount, in the marketplace currency.

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

Only keep products priced at or below this amount, in the marketplace currency.

## `onlyOnSale` (type: `boolean`):

Only keep products that show a discount against their original price.

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

Only keep products that ship for free to the marketplace country.

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

Only keep products from shops with Etsy's Star Seller badge.

## `excludeAds` (type: `boolean`):

Leave out products placed on the page as Etsy Ads. Keep them to see which shops advertise on a keyword.

## `onlyChanges` (type: `boolean`):

Only save products that are new since earlier runs or whose price changed. Use with scheduled runs for price and assortment monitoring.

## `detailCacheDays` (type: `integer`):

With full details on, a product page read by an earlier run in your account is reused if it is at most this many days old and the product's price has not changed. Rows from the cache carry detailCachedAt. Set 0 to always read product pages fresh.

## Actor input object example

```json
{
  "searchQueries": [
    "linen apron",
    "ceramic mug"
  ],
  "startUrls": [
    {
      "url": "https://www.etsy.com/c/jewelry"
    }
  ],
  "marketplace": "uk",
  "maxItems": 100,
  "fetchDetails": true,
  "minPrice": 10,
  "maxPrice": 100,
  "onlyOnSale": true,
  "freeShippingOnly": true,
  "starSellerOnly": true,
  "excludeAds": true,
  "onlyChanges": true,
  "detailCacheDays": 3
}
```

# Actor output Schema

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

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/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 = {
    "searchQueries": ["linen apron"],
    "maxItems": 20,
}

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

```

## MCP server setup

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