Etsy Scraper at a glance
Etsy Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes title, change type (incremental mode), shop, price and was, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Automation, Developer Tools
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 25 options
Scrape Etsy listings by keyword, category, or URL. Extract titles, shops, prices, discounts, availability, images, categories, and variations. Optional detail mode adds descriptions, materials, shipping origin, and item-level reviews. Supports incremental monitoring.
What Etsy Scraper can do
- Two ways to find listings. Search by keyword and/or category with Etsy's own price, sale, shipping and personalizable filters, or paste links directly. No need to build search URLs by hand.
- One flat record per listing. Title, shop, price, was-price/discount and images come back on every listing straight from the search results.
- Full detail on demand. Switch on listing detail to add availability, category, variations, description, materials, shipping origin, rating breakdown and item-level reviews, or leave it off for a lighter, faster run.
- Mixed link input. Drop listing links, bare listing ids, category/search links and shop links into the same list; the actor routes each one automatically.
- Built for schedules. Incremental mode returns only new and updated listings on recurring runs (unchanged ones are suppressed), and a refused run fails loudly instead of returning an empty dataset.
- Resume large crawls. Continue one interrupted run without re-collecting or double-charging listings already gathered, and long runs survive a platform migration without losing progress.
Choose what to collect
These inputs let you configure Etsy Scraper - Listings, Prices, Variations & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose 'search' for keywords + filters, 'url' to scrape pasted Etsy links directly (listing, category/search and shop links are all accepted), or 'reviews' to collect item-level reviews for the listings your sources point at. |
queriesarray | One or more keywords to search, for example 'handmade necklace' or 'vintage lamp'. Each keyword is searched separately. |
categoryPathstring | Only used when mode = search. Optional, an Etsy category path to scope the search or browse to, for example 'jewelry/necklaces'. To get one: open etsy.com, browse to the category, and copy the part of the address after '/c/', for example https://www.etsy.com/c/jewelry/necklaces → 'jewelry/necklaces'. A plain category name such as 'Jewelry' or 'Necklaces' also works; an unknown name stops the run with a clear error. |
sortBystring | How Etsy orders the results. |
freeShippingOnlyboolean | Optional. Keep only listings with free shipping (Etsy's own 'Free shipping' filter). |
personalizableOnlyboolean | Optional. Keep only listings that can be personalized (Etsy's own 'Personalizable' filter). |
shipToCountrystring | Optional. Two-letter country code to only show listings that ship to that country, for example 'US', 'AU', 'FR'. Leave empty for Etsy's default. |
Show 18 more inputs
| Input | What it controls |
|---|---|
urlsarray | Only used when mode = url, ignored in every other mode. Mix freely: listing links (https://www.etsy.com/listing//), bare listing ids, category/search links (https://www.etsy.com/c/... or https://www.etsy.com/search?q=...), or shop links (https://www.etsy.com/shop/). Multiple entries supported. |
onSaleOnlyboolean | Optional. Keep only listings currently on sale (Etsy's own 'On sale' filter). |
minPriceinteger | Optional. Only keep listings priced at or above this amount. |
maxPriceinteger | Optional. Only keep listings priced at or below this amount. |
fetchDetailsboolean | Collect each listing's full detail: description, materials, category breadcrumbs, extra images, shipping origin, variations, and, when present on the listing, its rating breakdown and item-level reviews (author, rating, date, body, photos). Turn off for a faster, lighter run that returns only the search-card fields (title, shop, price, was-price, image). |
includeReviewsboolean | Nest each listing's item-level reviews (author, rating, date, body, photos) under its row, in addition to the aggregate rating and review count. Each collected review is billed as a Review event. Turn off if you only want the listing fields. In Reviews mode this is always on. |
maxReviewsPerListinginteger | Maximum number of item-level reviews nested under each listing (and billed as Review events). Applies when item reviews are included and in Reviews mode. Values above 500 are treated as 500. |
maxItemsinteger | Maximum number of listings to return across the whole run. This is the run's cap. Use 0 for unlimited. |
maxPagesinteger | Maximum result pages walked per keyword / category / pasted link. 0 = unlimited (walk all pages), the run then stops only at Max listings or when a page repeats no new listings. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of listings without returning or charging for listings already collected there. Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. Change detection compares price, original price, discount, sale flag, availability, title, shop, description, materials, variations and the other listing fields; it ignores scrape time, favorites count and image/video URLs (and, outside Reviews mode, reviews, rating, review count and rating breakdown), so those alone never mark a listing UPDATED. In Reviews mode the reviews, rating, review count and rating breakdown do count, so new reviews mark a listing UPDATED. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each search/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and detail settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max listings capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Top-level field names to exclude from UPDATED change detection, in addition to the built-in handling: scrape time, favorites count, image and video URLs, and review helpful counts and photos never trigger UPDATED, and outside Reviews mode neither do reviews, rating, review count and rating breakdown (in Reviews mode those do count). The fields stay in the output; they just do not count as a change. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
titleTitlechangeTypeChange type (incremental mode) (text)shopNameShoppricePriceoriginalPriceWasdiscountPercentageDiscount %onSaleOn sale (boolean)availabilityAvailabilityratingRatingreviewCountReviewscategoryPathCategory (array)listingIdListing IDShow 28 more fields
imagesImage (image)urlURL (link)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)listedOnlistedOnfavoritesfavoritesreviewsreviewsreviewIdReview IDreviewAuthorReviewerreviewRatingRating (number)reviewDateDatereviewBodyReviewreviewPhotosPhotos (array)reviewHelpfulCountHelpful (number)reviewVariantContextVariantshopIdShop IDshopUrlShop link (link)currencyCurrencyquantityAvailableIn stock (number)descriptionDescriptionmaterialsMaterials (array)variationsVariations (array)shippingOriginShips from (object)ratingBreakdownRating breakdown (object)highlightsHighlights (array)videoUrlVideo (link)searchModeSourceExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"listingId": "4530068104",
"title": "Personalized initial keychain, custom letter charm",
"url": "https://www.etsy.com/listing/4530068104/personalized-initial-keychain",
"shopId": "14528878",
"shopName": "ExampleCraftStudio",
"shopUrl": "https://www.etsy.com/shop/ExampleCraftStudio",
"categoryPath": [
"Accessories",
"Keychains & Lanyards",
"Keychains"
],
"price": 16,
"currency": "USD",
"originalPrice": null,
"discountPercentage": null,
"onSale": false,
"availability": "in_stock",
"quantityAvailable": 38,
"images": [
"https://i.etsystatic.com/example/il_fullxfull.example.jpg"
],
"videoUrl": null,
"description": "Full listing description...",
"materials": [
"Cotton",
"Felt"
],
"shippingOrigin": {
"addressCountry": "US",
"addressRegion": "MI"
},
"rating": 5,
"reviewCount": 2,
"ratingBreakdown": {
"itemQuality": 5,
"shipping": 5,
"customerService": 5,
"buyersRecommend": 100
},
"reviews": [
{
"reviewId": "5150597893",
"author": "exampleBuyer1",
"rating": 5,
"date": "Jul 27, 2026",
"body": "Great quality, exactly as described!",
"photos": [],
"helpfulCount": null,
"variantContext": null
},
{
"reviewId": "5150597894",
"author": "exampleBuyer2",
"rating": 5,
"date": "Jul 20, 2026",
"body": "Fast shipping and beautiful packaging.",
"photos": [],
"helpfulCount": null,
"variantContext": null
}
],
"variations": [
{
"name": "Primary color",
"options": [
{
"variationId": "6788604158",
"label": "citron/blue"
}
]
}
],
"searchMode": "search"
}Ways to use this data
- Price monitoring and repricing: track a set of listings or a whole category for price drops, new sales and stock changes.
- Competitive research: compare shops, pricing and review scores across a niche or category.
- Marketplace analytics: build historical datasets of prices, discounts and ratings for trend analysis.
- Sourcing research: shortlist suppliers by category, price range, shipping origin and rating.
- Content and SEO teams: pull titles, categories and reviews to power gift guides or product roundups.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Etsy Scraper return?
The documented output for Etsy Scraper includes title, change type (incremental mode), shop, price, was, discount %, on sale and availability. Availability of each field depends on the source page and the selected mode.
How much does Etsy Scraper cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only listings that are new or have changed since the last run; unchanged listings are suppressed and not billed unless you turn on Emit unchanged listings. See "Resume and recurring updates" above for exactly how REAPPEARED and EXPIRED are classified.
What is the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific previous run: paste its run or dataset id and this run skips listings already collected there, returning only the remaining new ones. It is a one-time continuation. Incremental mode is for running the exact same search again and again, for example daily: the actor remembers its own state and classifies every listing against what it saw last time, without you ever pasting a run id.
How many reviews do I get per listing?
Etsy's listing page renders its most recent review block, typically the latest few reviews and not the listing's full history, and that is exactly what the actor returns under reviews, together with the listing's aggregate rating, review count and rating breakdown. Reviews mode applies the same collection to every listing your sources point at, and the dataset's Reviews view unwinds them to one row per review. The nested list is capped by Max reviews per listing (default 20, at most 500).
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
