# Etsy Shop Catalog Scraper (`astravalabs/etsy-shop-catalog-scraper`) Actor

Scrape any Etsy shop's entire product catalog in one run — every listing (title, price, image, URL, position) across all catalog pages, deduped. Batch many shops in parallel, with localized currency for 32 countries. Fast, no proxy or captcha setup, no start fee — pay only for listings kept.

- **URL**: https://apify.com/astravalabs/etsy-shop-catalog-scraper.md
- **Developed by:** [Astrava Labs](https://apify.com/astravalabs) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Etsy Shop Catalog Scraper

Point it at any Etsy shop and get the shop's **entire product catalog** in one
run — every listing across the whole storefront, not just a page. Batch many
shops in parallel. No proxy, no captcha, no setup.

> Want a shop's **reviews**? Use our dedicated **Etsy Reviews Scraper**.

### Quick start

```json
{
  "shops": ["ArtFablePets", "https://www.etsy.com/shop/WilshireGoodsShop"],
  "country": "US"
}
````

Pass shops as bare slugs (`ArtFablePets`) or full URLs — both work.

### What you get

One row per catalog listing in the default dataset, across every catalog page:
`shop`, `listing_id`, `title`, `url`, `price`, `currency`, `image_url`, and
`position` (its place in the catalog), plus `shop_id` and `scraped_at`.

### What you control

| Input | Default | What it does |
|---|---|---|
| `shops` | — | 1+ shop slugs or URLs, scraped in parallel |
| `maxListings` | all | Cap catalog listings per shop (cost guardrail) |
| `catalogSort` | shop's order | Fetch order: newest, price ↑/↓, relevance, or the shop's own arrangement. Pairs with `maxListings` to grab, e.g., the newest N |
| `country` | `US` | Localizes the currency prices are shown in (32 countries) |

### Use it for

- **Competitor teardowns.** Pull a rival's entire catalog and see everything they
  sell and how they price it.
- **Supplier / sourcing research.** Enumerate a shop's whole range at once instead
  of clicking through catalog pages.
- **Price & assortment monitoring.** Localize to any of 32 currencies and track a
  shop's lineup over time.

### Output

The dataset exports as JSON, CSV, Excel, or JSONL. A per-shop run report
(resolved shop id, listings count, completed flag) lands in the key-value store
under `RUN_REPORT`.

### Notes

- Pay-per-result: billed per listing saved, with no per-run start fee.
  `maxListings` is your cost guardrail.
- Fewer listings than `maxListings`? Etsy's catalog pagination stops when the shop
  runs out of items — the actor stops cleanly there.

> ⚠️ Unofficial. Not affiliated with, endorsed by, or sponsored by Etsy, Inc.
> "Etsy" is a trademark of Etsy, Inc., used here descriptively.

# Actor input Schema

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

Etsy shops to scrape — either bare shop slugs ("ArtFablePets") or full shop URLs ("https://www.etsy.com/shop/ArtFablePets"). Both are reduced to the slug.

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

Cap catalog listings saved per shop. Leave empty (or 0) to scrape the whole catalog until pagination runs out. Set a value as a cost guardrail for large shops.

## `catalogSort` (type: `string`):

Order listings are fetched in. "Shop's order" is the owner's own arrangement (default). The others pair well with "Max listings" — e.g. Newest first to grab a shop's latest N products.

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

ISO-3166 country code — localizes the currency the catalog prices are shown in.

## Actor input object example

```json
{
  "shops": [
    "ArtFablePets"
  ],
  "catalogSort": "custom",
  "country": "US"
}
```

# Actor output Schema

## `catalog` (type: `string`):

The dataset: one row per shop listing (title, price, image, URL, position).

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

Per-shop status (resolved shop\_id, listings count, completed) and run totals.

# 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 = {
    "shops": [
        "ArtFablePets"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("astravalabs/etsy-shop-catalog-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 = { "shops": ["ArtFablePets"] }

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

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

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

```

## CLI example

```bash
echo '{
  "shops": [
    "ArtFablePets"
  ]
}' |
apify call astravalabs/etsy-shop-catalog-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=astravalabs/etsy-shop-catalog-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Etsy Shop Catalog Scraper",
        "description": "Scrape any Etsy shop's entire product catalog in one run — every listing (title, price, image, URL, position) across all catalog pages, deduped. Batch many shops in parallel, with localized currency for 32 countries. Fast, no proxy or captcha setup, no start fee — pay only for listings kept.",
        "version": "0.0",
        "x-build-id": "1qGfmRAXL26q1F6fz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/astravalabs~etsy-shop-catalog-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-astravalabs-etsy-shop-catalog-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/astravalabs~etsy-shop-catalog-scraper/runs": {
            "post": {
                "operationId": "runs-sync-astravalabs-etsy-shop-catalog-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/astravalabs~etsy-shop-catalog-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-astravalabs-etsy-shop-catalog-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "shops"
                ],
                "properties": {
                    "shops": {
                        "title": "Shops",
                        "minItems": 1,
                        "type": "array",
                        "description": "Etsy shops to scrape — either bare shop slugs (\"ArtFablePets\") or full shop URLs (\"https://www.etsy.com/shop/ArtFablePets\"). Both are reduced to the slug.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxListings": {
                        "title": "Max listings per shop",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap catalog listings saved per shop. Leave empty (or 0) to scrape the whole catalog until pagination runs out. Set a value as a cost guardrail for large shops."
                    },
                    "catalogSort": {
                        "title": "Sort catalog by",
                        "enum": [
                            "custom",
                            "date_desc",
                            "price_asc",
                            "price_desc",
                            "relevance"
                        ],
                        "type": "string",
                        "description": "Order listings are fetched in. \"Shop's order\" is the owner's own arrangement (default). The others pair well with \"Max listings\" — e.g. Newest first to grab a shop's latest N products.",
                        "default": "custom"
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "US",
                            "GB",
                            "CA",
                            "AU",
                            "NZ",
                            "DE",
                            "FR",
                            "IT",
                            "ES",
                            "NL",
                            "IE",
                            "BE",
                            "AT",
                            "PT",
                            "SE",
                            "NO",
                            "DK",
                            "PL",
                            "CH",
                            "CZ",
                            "HU",
                            "RO",
                            "BG",
                            "HR",
                            "JP",
                            "SG",
                            "HK",
                            "IN",
                            "IL",
                            "ZA",
                            "BR",
                            "MX"
                        ],
                        "type": "string",
                        "description": "ISO-3166 country code — localizes the currency the catalog prices are shown in.",
                        "default": "US"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
