To scrape Etsy data, give a scraper a keyword or a list of Etsy shop, category or listing URLs and let it save each product as a row: title, current price, the original price when the item is on sale, shop name and rating, favorites, variations such as size and color, photos and the date it was listed. The fastest way is the Etsy Scraper on Scrape.ly, which costs $3.40 per 1,000 listings and needs no Etsy account, API key or proxy of your own.
This guide covers the no-code steps, the API (curl, Python, Node.js and AI agents over MCP), the cost and the pitfalls. Everything comes from a real run on 23 October 2026: wall art between $10 and $500.
What data you can get from Etsy
The Etsy Scraper writes one row per listing. These are the fields you'll use most:
| Field | What it holds |
|---|---|
name, id, url | Listing title, Etsy listing ID and link |
Price | The current price as Etsy shows it, in US dollars ("Now$21.00" on a sale) |
Original Price | The price before the sale, when there is one |
seller | Shop name, shop URL, shop rating and the shop's review count |
numberOfReviews, favorites | Review count and how many shoppers favorited the listing |
listedOn | The date the listing was published or renewed |
variations | Option groups and values: size, color, frame, material |
variationPrices | The price for each option, when you switch it on |
highlights | Materials and badges such as "Made to order" |
images, videos | Photo and video URLs |
relatedSearches | Up to 12 related Etsy market searches with links |
shipping | Shipping details when the public page shows them |
description | The listing description, when you switch it on |
Sale prices, videos, highlights and shipping appear only when the listing page shows them.
How to scrape Etsy data without code
- Open the Actor's page in the Scrape.ly Store.
- Pick a ready-made input. We used Wall art from 10 to 500 USD, 10 listings. Other presets cover products from one Etsy shop and one listing with description and variant prices.
- Change the keyword and price range to yours. This is the exact input of our run:
{
"search": "wall art",
"maxItems": 10,
"minPrice": 10,
"maxPrice": 500,
"startUrls": [],
"sort": "most_relevant",
"endPage": 1,
"includeDescription": false,
"includeVariationPrices": false
}- Click Start. Ten listings took 23 seconds.
- Export the listings as JSON, CSV or Excel.
The fields that matter most:
search: a keyword, as you'd type it into Etsy's search box. The keyword search runs first.startUrls: Etsy listing, shop, category, market or search URLs. Use a shop URL to pull a competitor's catalog, or a category URL for a whole niche.maxItems: listings to save for the whole run (default 10).minPrice,maxPrice: a US dollar range for searches.endPage: the last result page to read. A logged-out keyword search shows about 12 listings per page; category and market pages show about 48.sort:most_relevant,price_asc,price_desc,highest_reviewsordate_desc.includeDescription,includeVariationPrices: add the description and the price of every option. They make runs slower, so they're off by default.
How to scrape Etsy with the API
Create an API token under Settings → API & Integrations and export it as SCRAPELY_TOKEN.
Our run took 23 seconds, inside the 45-second window of the synchronous endpoint, so one request returns the listings:
curl -X POST "https://api.scrape.ly/v2/actors/shelfbright~etsy-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $SCRAPELY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"search": "wall art", "minPrice": 10, "maxPrice": 500, "maxItems": 10}'For more than a few dozen listings, or with descriptions and variation prices switched on, use the asynchronous flow instead: start the run with /runs, wait, then read the dataset, as the Actors API docs show. A call that runs past 45 seconds answers 408 while the run keeps going, so don't send it again.
Python (pip install scrapely-client-python). call() waits however long the run takes. Etsy prices arrive as display text, so this example turns them into numbers and shows the discount:
import os
import re
from scrapely_client import ScrapelyClient
client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")
def usd(text):
return float(re.sub(r"[^\d.]", "", text)) if text else None
run = client.actor("shelfbright/etsy-scraper").call(
run_input={"search": "wall art", "minPrice": 10, "maxPrice": 500, "maxItems": 10}
)
print(run.status) # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
for item in client.dataset(run.default_dataset_id).iterate_items():
now, was = usd(item["Price"]), usd(item.get("Original Price"))
off = f"{100 * (1 - now / was):.0f}% off" if was else ""
print(f'{now:8.2f} {off:8} {item["favorites"]:>6} favs {item["seller"]["name"][:20]:20} {item["name"][:45]}')Node.js (npm install scrapely-client), here pulling five listings from one shop:
import { ScrapelyClient } from 'scrapely-client';
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });
const run = await client.actor('shelfbright/etsy-scraper').call({
startUrls: [{ url: 'https://www.etsy.com/shop/EnjoyTheWood' }],
maxItems: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.name, i.Price, i['Original Price'], i.favorites, i.listedOn]));For AI agents, add the Scrape.ly MCP server. In Cursor, put this in ~/.cursor/mcp.json:
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}In Claude Code, run claude mcp add --transport http scrapely https://api.scrape.ly/mcp and sign in with /mcp. Then ask: "Use scrapely to run shelfbright/etsy-scraper for 'linen napkin', 10 listings, and give me a table of price, sale price, favorites and shop rating." A 10-listing run finishes inside the 45 seconds call-actor waits; for longer runs the agent polls get-actor-run and then reads the rows. The Etsy API page shows the same Actor as an API product.
A real run: wall art from $10 to $500
We ran the "Wall art from 10 to 500 USD, 10 listings" preset on 23 October 2026. It returned 10 listings in 23 seconds and was charged $0.0387. The first five rows:
| Listing | Price | Original price | Shop | Shop rating | Favorites | Listed on |
|---|---|---|---|---|---|---|
| Original Wine Bar Oil Painting, Three Women In Hats Artwork, Gold Framed Canvas… | Now$183.75 | $245.00 | GoldFrameVintageArt | 4.87 | 6 | Oct 21, 2026 |
| Coastal Wave \ | Neutral Wave Canvas Art \ | Ocean Waves Print… | Now$21.00 | $28.00 | TailoredCanvases | 4.87 | 389 | Oct 22, 2026 |
| Personalized City Map Print Set: Custom Home Town Art (Set of 3) | Now$25.98 | $64.95 | TheArtable | 4.81 | 285 | Oct 22, 2026 |
| Dancing People Vinyl Record Framed Wall Art Print, Retro Music Decor, New Home Gift | Now$15.62 | $31.24 | DoormatCenter | 4.74 | 1,935 | Oct 21, 2026 |
| 3D Wooden World Map, Framed Travel Push Pin Board, Wall Art Living Room | Now$49.00 | $81.67 | EnjoyTheWood | 4.82 | 1,852 | Oct 22, 2026 |
Etsy shops are businesses, so their names stay in. What the full ten show:
- Everything was on sale. All 10 listings showed a sale price next to an original price, with discounts from 20% to 60%. If you track Etsy prices, store both fields, or a "price drop" may just be a sale banner.
- Favorites measure demand. Favorites ranged from 4 to 1,935. The two most-favorited listings (a vinyl record print and a wooden world map) were both under $50 on sale.
- Shop quality comes with every row. Shop ratings ran from 4.37 to 4.98, so you can filter out weak sellers without a second request.
- Rich listings. Nine of ten offered variations (size, frame, color), seven had a video, and every listing had between 4 and 20 photos.
- Fresh dates.
listedOnranged from 11 to 22 October 2026. Etsy shows the date a listing was published or renewed, so treat it as "last renewed", not "created". - Shipping was blank. None of the ten public pages showed shipping details, which is common for Etsy. Budget for it separately in price comparisons.
The log, without the platform's start-up lines:
2026-10-23T03:01:28.662Z [Scrapely] Container started (setup 3.0 s)
2026-10-23T03:01:29.815Z [scrapely.actor] INFO Challenge solver source: platform.
2026-10-23T03:01:29.937Z [scrapely.actor] INFO Searching for wall art
2026-10-23T03:01:37.461Z [scrapely.actor] INFO Fetching 10 listings.
2026-10-23T03:01:48.110Z [scrapely.actor] INFO Challenge solves: 1, failed: 0, proxy rotations: 0
2026-10-23T03:01:48.110Z [scrapely.actor] INFO Saved 10 listings.
2026-10-23T03:01:48.890Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=falseEtsy put up one bot check during the run. The Actor solved it with the platform's own solver on the default datacenter proxy, without rotating a single proxy, and carried on. You don't configure anything for it.
What it costs
The Actor charges one event: $0.0034 per listing saved, which is $3.40 per 1,000 listings. Platform usage (compute and datacenter proxy) is billed on top.
For our run: 10 listings × $0.0034 = $0.034 in listing fees. The run was charged $0.0387 in total, because it also used $0.0031 of compute, $0.0016 of datacenter proxy traffic and $0.00005 of dataset writes. A 1,000-listing job costs $3.40 in listing fees plus usage, well inside the Free plan's $5 of monthly credit, and a maximum charge per run stops a job before it goes over.
What to watch out for when scraping Etsy
- Prices are display text, in US dollars.
Pricereads "Now$21.00" on a sale and "$129.00" otherwise. Strip everything but digits and the decimal point, as in the Python example, and keepOriginal Pricebeside it. - Sort on category URLs. Etsy currently refuses sorted keyword searches from logged-out visitors. The Actor falls back to relevance order and says so in its status instead of failing; for a price-sorted or newest-first list, paste a category URL, where sorting works.
- Page size differs by source. A keyword search shows about 12 listings per page (20 pages give about 240); category and market pages show about 48. For big jobs, paste category URLs and raise
endPage. - Big runs take minutes. 1,000 listings took about 12 minutes in the publisher's tests, so use the asynchronous API or a schedule, and leave descriptions and variation prices off unless you need them.
- Filters apply to searches only. Price range and sort affect keyword, search and category pages; listing URLs ignore them.
- Sellers own their photos and text. Use images and descriptions for analysis, not to republish on your own store.
Is it legal to scrape Etsy?
The Actor reads public listing pages that anyone can open without an account. It never logs in and has no access to buyer accounts, orders or private shop statistics. Prices, titles, ratings and favorites are public product information, and shops are businesses.
Etsy sets rules for its platform. Its developer documentation says apps built on the Open API "must not sidestep the API to retrieve or post Etsy data" and that "Screen-scraping is not allowed" for those apps, and Etsy's Terms of Use govern how the site itself may be used. Read the current versions before you build a product on Etsy data, keep request volumes modest, and respect sellers' rights over their photos and descriptions.
Privacy law matters less here than on most sites, because the output holds shop and product data rather than buyer data. If you add descriptions, they may name the person behind a shop; treat that as personal data under the GDPR and the CCPA. Our guide on whether web scraping is legal covers the general rules. This is not legal advice.
Why Scrape.ly for Etsy
- No app review, no API key. Etsy's Open API v3 is built for "inventory, sales orders, and shop management". To use it you register an app for a keystring and shared secret; Personal Apps go through "a deeper review process", Commercial Access is "reviewed manually", and every key has per-second and per-day rate limits. The Actor runs the moment you press Start.
- More than name and price. ScraperAPI's Etsy tutorial (March 2026) collects name, price and URL with CSS classes such as
h3.v2-listing-card__titleandspan.currency-value; when Etsy renames a class, the script returns nothing. The Actor returns the sale price, original price, shop rating, favorites, variations and related searches as named fields. - Bot checks handled. Etsy challenged our run once; the platform's solver cleared it without any setup.
- Built for cross-marketplace pricing. The same publisher maintains the eBay Scraper and scrapers for Amazon, Walmart and Google Shopping. Our price scraping guide shows how to compare them, and how to scrape eBay covers the resale side.
FAQ
Does Etsy have an API for product data?
Yes, the Etsy Open API v3, but it's designed for shop management and needs a registered app. Apps beyond your own shop go through Etsy's review, and every key has rate limits. For public listing data without an app, use a scraper such as the Etsy Scraper.
Can I scrape Etsy with Python?
Yes. Install scrapely-client-python, call shelfbright/etsy-scraper with a keyword or URLs, and iterate over the dataset, as in the example above. You don't need BeautifulSoup selectors or a proxy service.
How do I scrape all products from an Etsy shop?
Paste the shop URL, such as https://www.etsy.com/shop/EnjoyTheWood, into startUrls and set maxItems to the number of listings you want. The shop preset shows the shape.
Can I scrape Etsy sales numbers?
Not as order data: buyer accounts, orders and private shop statistics aren't public. Favorites, review counts and the shop's review count are public, and they're the usual stand-ins for demand.
How much does it cost to scrape Etsy data?
$0.0034 per listing, so $3.40 per 1,000, plus a little compute and proxy usage. Our 10-listing run was charged $0.0387 in total.




