Etsy Scraper - Listings, Shops, Prices and Reviews
Pricing
from $2.20 / 1,000 results
Etsy Scraper - Listings, Shops, Prices and Reviews
Extract Etsy listings, shops, categories, and public review samples across ship-to markets. Get prices, ratings, images, and shop details. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Etsy Scraper
Extract Etsy listings, shops, reviews, and categories for product research across ship-to markets, as rows you can export.
- Search products by keyword, category, or Etsy URL.
- Collect listing prices, images, ratings, and shop information.
- Request a shop's public review sample as separate rows.
- Export results or use them in scheduled reports and AI tools.
- Pay $3.00 per 1,000 delivered rows on the Free plan, plus a start fee.
What does Etsy Scraper do?
Etsy Scraper collects publicly accessible marketplace data from Etsy.com. Use it to compare prices, research sellers, or organize product categories. It is an unofficial tool, not affiliated with Etsy, and does not access private accounts or place orders.
- Product search:
searchaccepts a keyword or keyword list. - Shop search:
search_shopsfinds shops by keyword. - Categories:
categorycollects listings;categoriesreturns category rows. - Listing details:
listingaccepts a numeric listing ID. - Shops:
shopaccepts a shop name or numeric shop ID. - Featured pages:
featuredaccepts a featured or curated path. - Optional review rows:
includeShopReviewsis off by default. For numeric shop inputs, each returned review is billed like any other row.
enrichDetails is on by default. It adds available detail fields to listing rows rather than creating separately billed detail rows. Not every listing will have every field.
What data can you extract from Etsy?
Fields depend on the mode and what Etsy supplies. recordType identifies listings, shops, and categories. Numeric shop runs also use rowType to distinguish shop, listing, and review rows.
Listing rows
| Field | Description | Example |
|---|---|---|
listingId | Listing identifier | 1150212096 |
title | Product title | Handmade ceramic spoon rest |
url | Listing link | https://www.etsy.com/listing/1150212096 |
price | Current displayed price | 18.8 |
salePrice | Sale price, when supplied | 18.8 |
originalPrice | Price before discount | 47 |
discountPercent | Percentage discount | 60 |
currency | Price currency | USD |
ratingValue | Available rating; may be shop-level | 4.8 |
reviewCount | Available review count; scope varies | 120 |
shopId | Parent shop identifier | 65675236 |
shopName | Shop name | ExamplePottery |
imageUrl | Main image link | https://example.com/product.jpg |
images | Additional image links | [] |
shippingText | Available processing or shipping text | Ready to ship |
variations | Available product options | [] |
description | Listing description, when returned | Handmade ceramic kitchenware |
isAd | Advertising indicator | false |
shipTo | Requested destination market | US |
scrapedAt | Collection timestamp | 2026-10-24T08:00:00Z |
Shop rows
| Field | Description | Example |
|---|---|---|
recordType | Entity type | shop |
rowType | Type on numeric shop rows | shop |
shopId | Numeric shop identifier | 65675236 |
shopName | Shop name | ExamplePottery |
url | Shop link | https://www.etsy.com/shop/ExamplePottery |
shopHeadline | Public shop headline | Handmade pottery |
shopSales | Sales count, when supplied | 250 |
ratingValue | Shop rating | 4.8 |
reviewCount | Shop review count | 120 |
isStarSeller | Available Star Seller indicator | true |
Review rows
| Field | Description | Example |
|---|---|---|
rowType | Review entity type | review |
id | Generated review identifier | 0123456789abcdef01234567 |
shopId | Parent shop identifier | 65675236 |
shopName | Parent shop name | ExamplePottery |
listingId | Associated listing, when supplied | 1150212096 |
rating | Review rating | 5 |
review | Public review text | Well made and carefully packed. |
createDate | Date value supplied by Etsy | 1767225600 |
url | Parent shop link | https://www.etsy.com/shop/ExamplePottery |
scrapedAt | Collection timestamp | 2026-10-24T08:00:00Z |
Review rows do not include buyer identity fields. Reviews share the shop's row allowance with the shop row and its listings.
Category rows
| Field | Description | Example |
|---|---|---|
recordType | Category entity type | category |
categorySlug | Category path | jewelry/necklaces |
title | Category title | Necklaces |
url | Category link | https://www.etsy.com/c/jewelry/necklaces |
shipTo | Requested destination | US |
scrapedAt | Collection timestamp | 2026-10-24T08:00:00Z |
How to scrape Etsy
- Open Etsy Scraper in Apify Console.
- Fill one target field, such as
query. Clear any sample keyword when using another target. - Set
maxResultsto5and choose yourshipTomarket. - Click Start and wait for the run to finish.
- Open the dataset and download your rows or read them through the API.
Empty input starts an example search for ceramic planter, capped at 3 rows. Normal event prices apply; this is not a free preview. With mode set to auto, filling one target selects its matching mode. Etsy URLs determine the page type from their path.
Search listings
Fill query for one keyword, or searchQueries for several. Leave query empty when using the list. Price filters and sorting narrow the search.
Search shops
Set mode to search_shops and enter query. Results describe shops rather than individual products.
Category listings
Fill categorySlug, such as jewelry/necklaces. Nested category paths are accepted.
Listing details
Fill listingId with the digits from an Etsy listing link, or supply the link in startUrls.
Shop collection
Fill shopName or shopId. Numeric shop collection uses US/USD English settings and returns shop information plus first-page listings. With reviews enabled, rows are ordered shop, reviews, then listings; a small allowance can be consumed before any listing is returned.
Featured pages
Fill featuredPath with an existing featured or curated path. Availability depends on the page still being public.
Category tree
Choose mode: "categories"; no target is required. This returns categories, not product listings, and is not treated as an empty-input example.
What to fill in
| Field | What to enter | Default |
|---|---|---|
mode | Automatic selection or a mode above | auto |
query | One keyword | Empty; form sample ceramic planter |
searchQueries | Keyword list; leave query empty | Empty |
startUrls | Supported Etsy listing, shop, search, category, or featured links | Empty |
listingId | Numeric listing ID | Empty |
shopName | Name from the shop URL | Empty |
shopId | Numeric shop ID | Empty |
categorySlug | Path after /c/ | Empty |
featuredPath | Featured or curated page path | Empty |
maxResults | Rows per input, from 1 to 500 | 70; form sample 3 |
shipTo | Destination code, such as US, GB, or DE | US |
includeShopReviews | Public first-page review sample for numeric shops | false |
enrichDetails | Add available listing details | true |
order | most_relevant, price_asc, price_desc, or date_desc | most_relevant |
p | Starting search page | 1 |
priceMin | Minimum price | Unset |
priceMax | Maximum price | Unset |
instantDownload | Digital-download filter | Unset |
shipsFrom | Seller location filter | Empty |
readyToShip | Short delivery-window filter | Unset |
starSeller | Star Seller filter | Unset |
freeShipping | Free-shipping filter | Unset |
language | Optional language preference | Market preference |
currency | Optional currency preference | Market preference |
provider | Leave at the recommended setting | auto |
Search example:
{"query":"ceramic planter","maxResults":5}
Shop search example:
{"mode":"search_shops","query":"pottery","maxResults":3}
Category example:
{"categorySlug":"jewelry/necklaces","shipTo":"GB","maxResults":3}
Listing example:
{"listingId":"1150212096","enrichDetails":true,"maxResults":1}
Shop example:
{"shopId":"65675236","includeShopReviews":true,"maxResults":5}
Featured example:
{"featuredPath":"/featured/hub","maxResults":3}
Category tree example:
{"mode":"categories","maxResults":5}
maxItems and limit are aliases for maxResults. keyword maps to query, and country maps to shipTo. Close field-name misspellings are corrected; other unknown fields are ignored with a note. INPUT_REPORT in the default key-value store records how input was understood, including corrections and ignored fields.
When target types conflict, precedence is URLs, listing ID, shop ID, shop name, category, featured path, then search fields. Use one target type to avoid surprises. Invalid listing IDs or foreign URLs stop collection with INVALID_INPUT: <field> — <how to fix>, before any rows are charged. The start fee can still apply. Some invalid settings are normalized or ignored rather than rejected; check INPUT_REPORT.
Output example
Illustrative listing row; values are examples, not a current quote:
{"recordType": "listing","listingId": "1150212096","title": "Handmade ceramic spoon rest","price": 18.8,"salePrice": 18.8,"originalPrice": 47,"discountPercent": 60,"currency": "USD","shopName": "ExamplePottery","url": "https://www.etsy.com/listing/1150212096","shipTo": "US","scrapedAt": "2026-10-24T08:00:00Z"}
Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. JSON preserves nested fields such as images and variations. RUN_SUMMARY describes the run; ERROR_SUMMARY provides failure information when written.
Why use this Etsy scraper?
- Row-based pricing: apart from the start fee, you pay for delivered rows.
- Multiple inputs: keyword lists and URL lists reduce repeated setup.
- Useful identifiers: listing and shop IDs help compare exports over time.
- Visible errors: input validation names invalid fields; failed collection is not presented as a successful no-match search.
- No proxy configuration: you do not need to set up proxies.
Rows already written to the dataset remain available after a stop. Do not assume a stopped or timed-out run will deliver rows that have not yet reached its dataset.
How much does it cost to scrape Etsy?
The Actor uses pay-per-event pricing. Platform usage is included in these prices.
| Apify plan | Start event | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.002 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
Start billing is one event per GB of allocated memory, with a minimum of one event. At the default 512 MB, one start costs $0.005.
maxResults applies to each input, defaults to 70, and accepts up to 500. Larger requests are collected in parts of 70. All row types count together. Free-plan runs are capped at 200 rows in total, with a developer-set limit of 10 runs of this Actor. These limits do not make the rows free.
The whole run stops at the Maximum cost per run you set in run options, named maxTotalChargeUsd in the API. This can reduce delivery below the requested row count.
Example: two keywords returning 5 rows each deliver 10 rows. On the Free plan at 512 MB, the event cost is 10 × $0.003 + $0.005 = $0.035. A run returning no rows can still incur the start fee.
Use with AI agents and the API
Apify MCP server
In Claude, ChatGPT, Cursor, VS Code, or another compatible remote MCP client, add:
https://mcp.apify.com?tools=lentic_clockss/etsy-scraper
Sign in with Apify through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns its run and dataset IDs; read the rows using get-dataset-items.
Clients without remote MCP support can use npx @apify/actors-mcp-server --tools lentic_clockss/etsy-scraper with APIFY_TOKEN set locally. Keep your token private.
Example prompt: “Find five Etsy listings for ceramic planters shipping to the US and return their titles, prices, currencies, and links.”
Apify API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/etsy-scraper").call(run_input={"query": "ceramic planter", "maxResults": 5})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/etsy-scraper').call({query: 'ceramic planter', maxResults: 5});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Over HTTP, send input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~etsy-scraper/runs with your bearer token. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your webhook. Apify Schedules can start recurring runs.
FAQ
Is it legal to scrape Etsy?
This Actor targets public data. You are responsible for checking applicable terms and data-protection law before collecting or using it. Personal data requires a lawful basis. Public visibility alone does not settle those obligations.
Why did my run end as ABORTED?
The run was stopped rather than completed. Check its status message and log for the reason. Do not expect automatic recovery. Review any saved rows before starting another run.
How many results can I get?
Request 1–500 rows per input. Available matches, page limits, your cost cap, and Free-plan limits may reduce that number. Numeric shop results cover first-page listings and optional first-page reviews, not the entire shop history.
Why are some fields empty?
Etsy does not expose every field on every page. Some fields need detail enrichment, which may be skipped or incomplete. Missing optional values can be null, empty, or absent; a missing field is not proof of a zero value.
Can I scrape by category or shop?
Yes. Use categorySlug for category listings, shopName or shopId for a shop, and mode: "categories" for category rows.
Does ship-to selection change currency?
shipTo sets market preferences. The input offers 30 country codes plus ROW, a USD fallback. Preferences do not guarantee localized prices or shipping eligibility; check returned currency and shipping fields.
Is this the official Etsy API?
No. This is an independent scraper. It does not provide official API credentials, private account access, checkout, or purchasing functions.
Why did a run return no rows?
A valid search can have no matches. Read RUN_SUMMARY and the status message; a capacity refusal can also end with zero rows and QUEUE_FULL. Failed collection may instead produce ERROR_SUMMARY. Do not treat every empty dataset as evidence that no products exist.
Limitations
- No login-only pricing, private account data, or order actions.
- Numeric shop collection requires US/USD English settings and is limited to first-page listings and review samples.
- Search can stop at page 99 for supported US/USD English searches; a high starting page does not guarantee results.
- Detail enrichment is bounded and does not guarantee complete fields for every row.
- Featured pages can disappear, and category coverage can be incomplete.
- Ratings on listing rows may describe the shop; compare their scope before analysis.
- No guaranteed delivery of rows not yet saved when a run stops or times out.
Related scrapers
More e-commerce and marketplace scrapers from the same publisher:
- Walmart Product Scraper
- Temu Product Scraper
- Allegro Scraper
- TikTok Shop Product Scraper
- Amazon Search, Category & Best Sellers Scraper
- Coupang Product Scraper
- MercadoLibre Scraper
- Rakuten Japan Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.