Etsy Products

Research a niche before you open a shop, price your products against the market, or track the tags and best sellers of competing shops. Give it keywords, Etsy category links or listing URLs and it returns one JSON row per listing: price and sale price, favorites, the listing's own rating and review count, tags, materials, variations, shipping and delivery estimate, and the shop's sales count and rating. Review text is optional.

Sample output

One row as the API returns it. Long text is shortened here; names inside text read [name].

Show the sample as
Download
Sample row, one field per line
FieldValue
rowTypelisting
platformetsy
listingId962939986
titleLeather Envelope Wallet for Women, Personalized Mini Card Wallet, Full Grain Crazy Horse
urlhttps://www.etsy.com/listing/962939986
price64
currencyUSD
salePrice57.6
discountPercent10
onSaletrue
favorites4,979
rating4.95

Call it from code or from your agent

This is the request. Small runs answer in the same call; large ones return a run ID.

TerminalOpens at launch
curl -X POST https://scrapers-api.arcadiumdata.io/v1/scrapers/etsy-products/runs \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "searchTerms": [
        "ceramic mug"
      ],
      "maxResultsPerSearch": 20
    }
  }'
$3.5021,000 listings: $3.50, plus the run start fee of $0.002. A failed or empty run costs $0.

What each row holds

Every row says what it is in rowType: listing rows are charged, coverage and error rows are free.

The listing 46 fields

The listing
FieldTypeWhat it holds
platformstringAlways 'etsy'.
listingIdstringEtsy listing id (the number in the listing URL). Listing and review rows.
urlstringListing page URL.
titlestringListing title as the seller wrote it.
descriptionListing description (first 300 characters by default, full or none on request). Emails and phone numbers removed.
pricenumberPrice before any sale, in 'currency' (the seller's currency). Lowest variation price when prices vary.
currencystringCurrency code of price and salePrice, e.g. USD, EUR, GBP.
salePricenumberPrice during a running sale, in 'currency'; null when not on sale.
discountPercentnumberSale discount in percent; null when not on sale.
onSalebooleanTrue when a sale discount is running.
priceUsdThe price converted by Etsy to US dollars.
quantityItems in stock as the listing states.
isAvailableTrue when the listing can be bought now.
isSoldOutTrue when the listing is sold out.
favoritesnumberHow many shoppers saved the listing as a favorite.
ratingnumberAverage star rating of this listing (not the shop), 1 to 5; null without reviews.
reviewCountnumberNumber of reviews of this listing.
ratingCountsReviews of this listing per star, e.g. {'5': 236, '4': 6, '3': 2, '2': 0, '1': 1}.
tagsarrayThe seller's search tags (up to 13).
materialsarrayMaterials the seller lists.
categorystringEtsy category of the listing, e.g. Wallets.
categoryPathFull category path, e.g. Bags and purses > Wallets and money clips > Wallets.
taxonomyIdEtsy taxonomy id of the category.
variationsarrayBuyer options, e.g. [{name: 'Primary color', options: [{value: 'Tan', price: 64, available: true}]}]. Option price is null when the option does not change the price.
hasVariationPricingTrue when the price depends on the chosen option.
imagesFull-size image URLs, main image first.
whenMadestringWhen the item was made as Etsy states it, e.g. 'made_to_order', '2020_2026', 'before_2006'.
isDigitalTrue for digital downloads (no shipping).
isCustomizableTrue when the item can be personalized.
isMadeToOrderTrue when the item is made after the order.
isBestsellerTrue when the listing carries Etsy's Bestseller badge.
shipsFromCountrystringCountry code the item ships from, e.g. US, TR.
shippingobjectShipping as Etsy shows it to a US shopper: {shipsFrom, freeShipping, cost, costText, deliveryEstimate, deliverTo, returns}. Null for digital items or when 'includeShipping' is off.
shopSectionThe shop's own section the listing is in.
shopobjectThe shop as a business: {shopId, shopName, url, sales, rating, reviewCount, location, country, activeListings, favorites, openedAt, isStarSeller}. No owner names.
createdAtListing date Etsy keeps (ISO). A renewal resets it.
updatedAtLast change of the listing (ISO).
isAdbooleanTrue for a paid placement (only with includeAds; no searchRank).
searchInputstringThe search term or URL that found the listing; null for a listing URL input.
searchRanknumber1-based organic position in the results of searchInput.
reviewIdReview rows: Etsy's transaction id of the reviewed purchase, unique per review.
textReview rows: the review text with personal names, emails and phone numbers removed; null for a rating without text.
dateReview rows: review date (YYYY-MM-DD).
sellerResponseReview rows: the shop's public reply, if any.
hasPhotoReview rows: true when the buyer attached a photo (not exported).
scrapedAtWhen the row was collected (ISO).
Error rows, free 3 fields
Error rows, free
FieldTypeWhat it holds
inputError rows: the input (term, URL or id) that failed.
codeError rows: invalid_input, not_found, blocked, unavailable, filter_unsupported or no_match.
messageError rows: what went wrong, in plain words.

What it can't do

  • It does not return seller contact details such as names, emails or phone numbers.
  • Prices are what the site shows at run time, in the currency the site shows.
  • It reads only what the site shows to a visitor without an account.

What you send

Every field is optional. The example request above fills the ones shown here.

Main input fields
FieldTypeWhat it does
searchTermsarrayKeywords to search Etsy for, for example "ceramic mug" or "personalized necklace". Each term is searched on its own; every listing keeps the term and its position in the results. Also read from queries, searchQueries, searchQuery, search or keywords (other Etsy actors' names).
maxResultsPerSearchintegerListings per search term or search/category URL, e.g. 50 (the default). Each page holds 40 to 64 results; Etsy pages up to about 250 pages deep. Also read from maxResults, maxResultsPerTerm, maxListings or maxPages (x 36).
More options (14)
More input fields
FieldTypeWhat it does
startUrlsarrayListing URLs or ids (e.g. https://www.etsy.com/listing/962939986 or 962939986) for full details, and search or category URLs (e.g. https://www.etsy.com/c/jewelry/necklaces) to read their results. Also read from listingUrls, urls or listingIds; objects with a url field work too.
maxItemsintegerOptional cap on charged rows (listings plus reviews) for the whole run, e.g. 500. Empty means no cap beyond the per-search limit.
sortBystring (one of 5)Order of search results: relevance (Etsy's default), newest, price_asc, price_desc or top_reviews, for example newest. Also read from sort, sortOrder or sortOn (other Etsy actors' names and values).
minPricenumberOnly listings priced at or above this amount, in the shopper currency (US dollars for the default US storefront), e.g. 20.
maxPricenumberOnly listings priced at or below this amount, in US dollars, e.g. 60.
shipTostringTwo-letter country code the items must ship to, e.g. US, GB or DE. Empty means any.
freeShippingbooleanOnly listings that ship for free (to the US storefront).
onSalebooleanOnly listings with a running discount (salePrice and discountPercent are filled).
includeAdsbooleanAlso return the sponsored listings shown among the results (isAd: true, no rank). Off by default; they do not count towards the per-search limit.Default false
maxReviewsPerListingintegerNewest reviews to return per listing as separate review rows (text, rating, date, shop reply; no reviewer names), e.g. 20. 0 = none (the default); the rating summary is always on the listing.
reviewSortstring (one of 4)Which reviews come first when reviews are requested: newest, relevance, highest or lowest rating.Default "newest"
descriptionstring (one of 3)Listing description in the output: short (first 300 characters, the default), full, or none. Emails and phone numbers are removed.
includeShippingbooleanAdds the shipping block per listing: ships from, free or cost, delivery estimate to the US and the returns policy.Default true
includeErrorRowsbooleanAdds a free row for every input that returned nothing or could not be read, so a failure is never silent.Default true

Questions people ask before they top up

What does a run cost?

Each listing costs $0.0035, which is $3.50 per 1,000. A run that delivers rows also pays a $0.002 start fee.

Listing reviews: $1.00 per 1,000.

A run that returns rows costs at least $0.005, start fee included. Failed runs, empty runs and duplicate rows cost $0. You set the most a run may cost, and it stops there.

Do you ever return personal data?

Not about reviewers or users. Reviewer names, profile links, photos, emails and phone numbers are not collected. When a name appears inside a review or a reply, it is replaced with [name].

Job titles and company sizes stay where a site shows them, because they describe a role rather than a person. On YouTube, channel names and URLs are the publisher labels YouTube shows publicly.

How fresh is the data?

Each run reads the live site when you start it, so rows are as current as the site itself.

More from E-commerce sourcing

  • Price tiers, minimum order, units sold, repurchase rate, supplier scores

    $1.50per 1,000 products

  • Price, discount, units sold, rating, ships from, search rank

    $1.25per 1,000 products