Etsy Scraper - Listings, Shops, Prices and Reviews avatar

Etsy Scraper - Listings, Shops, Prices and Reviews

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Etsy Scraper - Listings, Shops, Prices and Reviews

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

kane liu

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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: search accepts a keyword or keyword list.
  • Shop search: search_shops finds shops by keyword.
  • Categories: category collects listings; categories returns category rows.
  • Listing details: listing accepts a numeric listing ID.
  • Shops: shop accepts a shop name or numeric shop ID.
  • Featured pages: featured accepts a featured or curated path.
  • Optional review rows: includeShopReviews is 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

FieldDescriptionExample
listingIdListing identifier1150212096
titleProduct titleHandmade ceramic spoon rest
urlListing linkhttps://www.etsy.com/listing/1150212096
priceCurrent displayed price18.8
salePriceSale price, when supplied18.8
originalPricePrice before discount47
discountPercentPercentage discount60
currencyPrice currencyUSD
ratingValueAvailable rating; may be shop-level4.8
reviewCountAvailable review count; scope varies120
shopIdParent shop identifier65675236
shopNameShop nameExamplePottery
imageUrlMain image linkhttps://example.com/product.jpg
imagesAdditional image links[]
shippingTextAvailable processing or shipping textReady to ship
variationsAvailable product options[]
descriptionListing description, when returnedHandmade ceramic kitchenware
isAdAdvertising indicatorfalse
shipToRequested destination marketUS
scrapedAtCollection timestamp2026-10-24T08:00:00Z

Shop rows

FieldDescriptionExample
recordTypeEntity typeshop
rowTypeType on numeric shop rowsshop
shopIdNumeric shop identifier65675236
shopNameShop nameExamplePottery
urlShop linkhttps://www.etsy.com/shop/ExamplePottery
shopHeadlinePublic shop headlineHandmade pottery
shopSalesSales count, when supplied250
ratingValueShop rating4.8
reviewCountShop review count120
isStarSellerAvailable Star Seller indicatortrue

Review rows

FieldDescriptionExample
rowTypeReview entity typereview
idGenerated review identifier0123456789abcdef01234567
shopIdParent shop identifier65675236
shopNameParent shop nameExamplePottery
listingIdAssociated listing, when supplied1150212096
ratingReview rating5
reviewPublic review textWell made and carefully packed.
createDateDate value supplied by Etsy1767225600
urlParent shop linkhttps://www.etsy.com/shop/ExamplePottery
scrapedAtCollection timestamp2026-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

FieldDescriptionExample
recordTypeCategory entity typecategory
categorySlugCategory pathjewelry/necklaces
titleCategory titleNecklaces
urlCategory linkhttps://www.etsy.com/c/jewelry/necklaces
shipToRequested destinationUS
scrapedAtCollection timestamp2026-10-24T08:00:00Z

How to scrape Etsy

  1. Open Etsy Scraper in Apify Console.
  2. Fill one target field, such as query. Clear any sample keyword when using another target.
  3. Set maxResults to 5 and choose your shipTo market.
  4. Click Start and wait for the run to finish.
  5. 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.

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

FieldWhat to enterDefault
modeAutomatic selection or a mode aboveauto
queryOne keywordEmpty; form sample ceramic planter
searchQueriesKeyword list; leave query emptyEmpty
startUrlsSupported Etsy listing, shop, search, category, or featured linksEmpty
listingIdNumeric listing IDEmpty
shopNameName from the shop URLEmpty
shopIdNumeric shop IDEmpty
categorySlugPath after /c/Empty
featuredPathFeatured or curated page pathEmpty
maxResultsRows per input, from 1 to 50070; form sample 3
shipToDestination code, such as US, GB, or DEUS
includeShopReviewsPublic first-page review sample for numeric shopsfalse
enrichDetailsAdd available listing detailstrue
ordermost_relevant, price_asc, price_desc, or date_descmost_relevant
pStarting search page1
priceMinMinimum priceUnset
priceMaxMaximum priceUnset
instantDownloadDigital-download filterUnset
shipsFromSeller location filterEmpty
readyToShipShort delivery-window filterUnset
starSellerStar Seller filterUnset
freeShippingFree-shipping filterUnset
languageOptional language preferenceMarket preference
currencyOptional currency preferenceMarket preference
providerLeave at the recommended settingauto

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 planStart eventPrice per rowPrice 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 ApifyClient
client = 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

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.

More e-commerce and marketplace scrapers from the same publisher:

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.