How to Scrape Etsy Shop and Product Data (Tags, Prices, Ratings)

Etsy hides clean, structured data in a JSON blob on every product page - name, price, ratings, tags. Parse that instead of fighting the HTML, and mine those tags for the keyword research your competitors pay for.

Etsy is a goldmine for product and keyword research - millions of active listings, each tagged and rated by real buyers. The catch is that the official Open API v3 caps you at roughly 10,000 requests a day and 10 per second, and gates the interesting endpoints behind OAuth. For competitor and market research at any real scale, you'll scrape the public pages instead. The good news: Etsy hands you clean, structured data if you know where to look. This guide shows the reliable way to scrape Etsy shop and product data - price, ratings and tags - without wrestling the HTML.

The reliable trick: parse the ld+json, not the HTML

Every Etsy product page embeds a <script type="application/ld+json"> block: schema.org Product data with the title, SKU, price, currency, and an aggregateRating carrying the star value and review count. Parsing that JSON is far more stable than chasing CSS classes that Etsy rotates. Load the page through a proxy, pull the blob, and you have a clean record in a few lines:

import json, requests
from bs4 import BeautifulSoup

proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}

def scrape_listing(url):
    r = requests.get(url, proxies=proxies, timeout=20)
    soup = BeautifulSoup(r.text, "html.parser")
    blob = soup.find("script", {"type": "application/ld+json"})
    data = json.loads(blob.string)
    return {
        "title":  data.get("name"),
        "price":  data.get("offers", {}).get("price"),
        "curr":   data.get("offers", {}).get("priceCurrency"),
        "rating": data.get("aggregateRating", {}).get("ratingValue"),
        "reviews": data.get("aggregateRating", {}).get("reviewCount"),
    }

print(scrape_listing("https://www.etsy.com/listing/1234567890/example"))
Diagram of an Etsy scraping pipeline from search page to listing IDs to ld+json product parsing
Search pages surface the IDs; each product page's ld+json blob carries the structured record.

The fields worth pulling - especially the tags

Beyond price and rating, the highest-value signal is tags. Every Etsy listing can carry up to 13 tags, and they are exactly the phrases sellers believe buyers search for. Collect tags across the top-selling listings in a category and you've reverse-engineered a keyword map - the same data specialist SEO tools resell. Pair it with review counts as a proxy for demand, and you can rank a category by what's actually selling. Add the listing's favourite count and its listed date where available, and you can separate proven sellers from new arrivals riding a trend - the difference between a keyword worth targeting and one that only looks busy. This is where scraping pays for itself faster than any paid dataset. Our product review scraping guide covers turning that review text into sentiment signals.

Scraping search and shop pages

Search and shop pages behave differently. Their ld+json only lists the first eight items even when the page renders dozens, so for listing discovery you parse the HTML cards, not the JSON. Grab the listing links, dedupe the numeric IDs, then fetch each product page for the full record. Etsy's search URL accepts a page parameter, so you can walk results in a loop:

import re

def find_listing_ids(query, pages=3):
    ids = set()
    for page in range(1, pages + 1):
        url = f"https://www.etsy.com/search?q={query}&page={page}"
        r = requests.get(url, proxies=proxies, timeout=20)
        # listing links look like /listing/<id>/<slug>
        for m in re.findall(r"/listing/(\d+)/", r.text):
            ids.add(m)
    return ids

ids = find_listing_ids("ceramic+mug", pages=3)
print(len(ids), "unique listings")

Product images sit on the i.etsystatic.com CDN and are linked directly in the markup if you need thumbnails. For shop-level research, the shop page carries the seller's rating, sales count and policies - useful for ranking competitors by volume.

Get residential IPs built for marketplace scraping

Variations, pagination and keeping bandwidth low

Two details separate a toy scraper from one that runs at scale. First, variations: many Etsy listings sell multiple options - sizes, colours, personalisations - each with its own price. The ld+json offers field can be a single object or an array of them, so handle both, or you'll silently record only the first price and misread a whole category. Second, pagination: search results are paged, and Etsy caps how deep you can walk any single query. Rather than trying to page to the end of a broad term, split a category into narrower queries (by material, style or price band) so each search returns a shallow, complete set. You get better coverage and trip fewer anti-bot checks than one scraper grinding through page 40 of "gifts".

Bandwidth is the cost that sneaks up on marketplace scraping. A full Etsy product page pulls a lot of images and scripts you don't need if you only want the ld+json. When you fetch with plain HTTP, you're already skipping image downloads - the markup is text. Reserve JavaScript rendering for the few pages that genuinely need it, because a rendered page can cost many times the bytes of a raw fetch. Cache aggressively: a listing's tags and title rarely change hour to hour, so a conditional refresh beats re-downloading everything. Our guide to cutting proxy bandwidth costs covers the HEAD-check and asset-blocking tactics that keep a per-GB bill sane.

Getting past the CAPTCHA wall

Etsy runs anti-bot checks, and a headless browser or datacenter IP hitting search pages trips a CAPTCHA quickly. Three things keep you through it. First, use residential proxies - real ISP-assigned IPs read as shoppers, not servers. Second, match the geo to the marketplace you're studying; prices and shipping estimates change by country. Third, pace yourself - steady, human-like intervals beat bursts. If you'd rather not manage rendering and retries at all, a Scraper API handles the fingerprint, rotation and JavaScript for you and returns the parsed page, which is usually less code than maintaining a headless fleet. For the wider pattern, see our guide to marketplace automation across Amazon, eBay and Etsy.

One line on ethics: scrape public listing data, respect Etsy's Terms and robots directives, and don't harvest sellers' personal contact details - that crosses from market research into a data-protection problem. This is guidance, not legal advice; check your own use case.

Stats panel showing Etsy exposes 8 listings in ld+json, 13 tags per listing, and a 10,000 per day API cap
The public pages carry more than the API returns - if your IPs can reach them without a block.

Frequently asked questions

How do I scrape data from Etsy?

Load each product page through a residential proxy and parse the embedded ld+json block, which holds the title, price, currency and rating as clean schema.org data. For discovery, parse the search-page HTML cards to collect listing IDs, then fetch each product page. This is more stable than scraping rotating CSS classes.

Does Etsy have an API for scraping?

Etsy's official Open API v3 exists but caps around 10,000 requests a day and 10 per second, and gates many endpoints behind OAuth. For competitor research at scale, most people scrape the public pages, which often expose more than the API returns - including the full tag list on each listing.

How do I get Etsy tags for keyword research?

Each listing can carry up to 13 tags, present in the page markup. Scrape the top-selling listings in a category, collect their tags, and rank by frequency to build a keyword map. Weighting by review count approximates demand, giving you a data-backed picture of what sells and what buyers search for.

Why does Etsy show a CAPTCHA when I scrape?

A datacenter IP or aggressive headless browser reads as a bot. Use residential proxies so requests look like real shoppers, match the geo to the marketplace, and pace requests at human-like intervals. A Scraper API that renders and rotates for you removes most CAPTCHA triggers without extra code.

Scraping Etsy well is mostly about reading the JSON it already gives you and reaching the page without a block. Parse the ld+json, mine the tags, spread requests across clean residential IPs, and you have a live feed of prices, ratings and search intent - the raw material for real product research.

Scrape Etsy at scale with Scraper API