Etsy Listings Scraper
Pricing
from $0.36 / 1,000 listings
Etsy Listings Scraper
Scrape Etsy products by keyword, category, shop or listing URL: price, rating, reviews, ads and organic rank, bestseller badges. Reviews, shop details and emails as options. Export to JSON, CSV or Excel.
Pricing
from $0.36 / 1,000 listings
Rating
0.0
(0)
Developer
Nice Dev
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
5
Monthly active users
2 days ago
Last modified
Categories
Share
🛒 What is Etsy Listings Scraper?
Etsy Listings Scraper extracts listings from Etsy: title, price, discount, shop rating, shop, badges, ad slot and organic rank, for any keyword, category, shop or listing. Reviews, shop details, the shop's contact e-mail, demand signals and the full listing data are optional extras. It works as an Etsy API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.
Type a keyword (ceramic mug), paste Etsy search, category, shop or listing URLs, or give shop names and listing IDs, click Start, and download the listings in JSON, CSV or Excel. No login, no API key, nothing to set up.
📋 What data can you extract from Etsy?
One item per listing, 76 fields:
| Category | What you get |
|---|---|
| 🏷️ Listing | title, link, the Etsy id — Personalized Ceramic Mug: Handmade Pottery Cup |
| 💰 Price and discount | price, price before discount, discount in percent, currency — 32.77 EUR, 30% off |
| ⭐ Rating | the shop's average rating and number of reviews shown on the listing's card — 4.9 (153 reviews); the rating and reviews of the listing itself are an option (Listing page) |
| 🏪 Shop | shop name and link, owner's first name, age of the shop, where it ships from — 10 years on Etsy |
| 📈 Ads and ranking | ad or organic, place of the ad, Etsy's own organic rank over all pages, page, position, number of results of the search — organic rank 2 |
| 🏅 Badges | Bestseller, Etsy's Pick, Star Seller, free shipping, on sale, and the badges Etsy rates the listing eligible for even when it does not show them |
| 📝 Full listing details (option) | description, tags, materials, favorites, stock, category, every photo, made to order / digital / customizable, creation date, price in US dollars, the country code it ships from |
| 🔥 Demand signals, variations and shipping (option) | "In 20+ carts", people who bought it in the last 24 hours, "only 2 left", colors and sizes, price range, shipping cost and delivery estimate, returns and their window in days, the listing's own rating and reviews, video |
| 💬 Reviews (option) | rating, text, date, reviewer, photos, seller reply |
| 🧾 Shop details (option) | total sales, shop rating, location, opening year, Star Seller, active listings, links, banner, tagline, team and shop policies |
| 📧 Shop e-mail (option) | the shop's public contact e-mail |
| 🔎 Source | the keyword and the search URL that found the listing, the time it was read |
Every field, with an example, is listed in the Output section below. The fields of an option are empty unless you tick that option.
✅ Why use Etsy Listings Scraper?
- 🚀 Simple and fast to start: a keyword is enough, and the run gives you the listings page after page without any set-up (in our tests, 100 listings usually take 1 to 3 minutes, 1,000 listings 2 to 15 minutes).
- 🎯 Four ways in, in the same run: keywords, search or category URLs, shops, single listings by ID or URL. They add up, and a listing found twice is returned once.
- 📈 Ads told apart from organic results: for each listing, whether it is an ad, its place among the ads and Etsy's own rank among the organic results.
- 🧩 Extras à la carte: listing details, demand signals, reviews, shop details and the shop's e-mail, each one unticked until you tick it and charged only for what it reads or brings you.
- 🗂️ Several searches in one run, with a cap per search so that one big keyword cannot eat the whole budget.
- 🔔 Monitoring built in: tick Only new listings, schedule the Actor, and each run returns (and charges) only what it has never delivered before.
- 📅 Filters the Actor applies for you: shop rating, number of shop reviews, favorites, Bestsellers, Etsy's Picks, no ads, words to exclude, listing date — filtered-out listings are not saved and never count in
maxItems. Etsy's own filters (ready to ship in 1 or 3 days, Etsy's Pick, free shipping, price…) are sent with each search. - 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.
🚀 How to scrape Etsy
- Create a free Apify account.
- Open Etsy Listings Scraper and type a Search keyword (e.g.
ceramic mug). - Or paste your own Etsy URLs into Start URLs (search results with all their filters, category pages, shop pages, single listings), give Shop names, or give Listing URLs or IDs: everything you give is read in the same run.
- Set Max listings (100 by default, 0 = no limit) — and Max listings per search when you run several searches or shops — then click Start.
- Download the dataset in JSON, CSV, Excel or via API.
💰 How much does it cost to scrape Etsy?
This Actor uses pay per event pricing: you pay for each listing saved, plus a small fee for each run start. The extras are charged on top, only when you tick them: Full listing details (a higher price per listing, instead of the standard one), Listing page (per listing page read, even when the page shows no demand signal), Reviews (per review returned), Shop details (per listing that carries them) and Shop e-mail (per listing whose shop e-mail is found). The filters the Actor applies itself (shop rating, shop reviews, favorites, listing date, Bestsellers, Etsy's Picks, ads, excluded words) work on every listing it reads: a listing you keep costs its normal price, a listing a filter drops costs a small filter fee, lower than a listing (a little more when the filter needs the listing's own data) — filtering never costs more than taking everything. Platform usage (compute, proxy) is included in the price.
⚙️ Input
{"query": "ceramic mug","maxItems": 200}
Several searches in one currency, a cap per search, only the listings not delivered before:
{"searchQueries": ["ceramic mug", "linen apron"],"sortBy": "price_asc","minPrice": 10,"maxPrice": 60,"freeShippingOnly": true,"currency": "GBP","country": "GB","maxItemsPerQuery": 50,"onlyNew": true,"stateKey": "mugs-uk"}
Or with your own URLs, a shop and a listing:
{"startUrls": [{ "url": "https://www.etsy.com/search?q=ceramic+mug&order=price_asc" },{ "url": "https://www.etsy.com/c/home-and-living/kitchen-and-dining/drink-and-barware/drinkware/mugs" }],"shopNames": ["KJPottery"],"listingUrls": ["1179605879"],"maxItems": 500}
Only the listings that ship within 3 days, sorted by Etsy's reviews order, Etsy's Picks only:
{"query": "ceramic mug","sortBy": "highest_reviews","readyToShipWithin": "3","etsysPickOnly": true,"maxItems": 100}
With the extras you tick (each one is charged only when you tick it, see Pricing):
{"query": "ceramic mug","maxItems": 50,"includeDetails": true,"includeReviews": true,"maxReviewsPerListing": 20,"includeShopDetails": true}
| Field | Notes |
|---|---|
query, searchQueries | Free-text search, exactly as typed in Etsy's search box: ceramic mug. searchQueries adds more keywords, one search each (up to 100 more). |
startUrls | Search results (every filter set on the site is kept), category pages, shop pages and single listing pages, e.g. https://www.etsy.com/shop/KJPottery. Paste them one by one: importing a file of links is not supported. Pagination is automatic. They add up with the keywords, shops and listings. |
shopNames | Shop names or shop URLs: all the active listings of each shop, e.g. KJPottery. |
listingUrls | Single listings by ID or URL, e.g. 1179605879. |
maxItems | Stop after this many listings for the whole run (0 = unlimited). |
maxItemsPerQuery | Cap for EACH search (keyword, search URL or shop). 0 = no per-search cap. |
sortBy | Etsy's order: most_relevant (default), price_asc, price_desc, date_desc (most recent) or highest_reviews (Top customer reviews). Keyword searches only: shops, listings and pasted URLs are read without it. |
minPrice, maxPrice | Price bounds, in whole units of the currency Etsy shows. Empty = no bound. Keyword searches only: shops, listings and pasted URLs are read without them. |
freeShippingOnly, onSaleOnly, customizableOnly, giftWrapOnly | Etsy's own yes/no filters, sent with each keyword search. Keyword searches only: shops, listings and pasted URLs are read without them. |
listingType | physical (default), digital (instant downloads only) or all. Keyword searches only: shops, listings and pasted URLs are read without it. |
readyToShipWithin | Etsy's Ready to ship filter: any (default, no filter), 1 or 3 days. Sent with each keyword search and added to a pasted search or category URL that has no such filter of its own; shops and listings given by ID or URL are not filtered on it. |
shipTo, location, country | 2-letter country codes such as US, GB or DE: only listings that ship there, only shops located there, and the country Etsy shops for. shipTo and location apply to keyword searches only: shops, listings and pasted URLs are read without them. |
currency | Currency of the prices: USD (default), EUR, GBP… |
includeDetails, includeDemandSignals, includeReviews, includeShopDetails, includeShopEmail | The extras, all unticked by default and each charged only when ticked (see Pricing). The e-mail needs the shop details. |
maxReviewsPerListing | Cap on the reviews returned for each listing (20 by default, 0 = all the reviews found). |
postedAfter, postedBefore | Listing date range: 2026-09-01, or a period before now (7 days, 2 weeks, 1 month, 24 hours). |
excludeKeywords | Drop the listings whose title contains one of these words (case and accents ignored): personalized. |
minRating, minReviews, minFavorites | Drop the listings below these numbers. Rating and reviews are the shop's, as the card shows them (searches and categories), not the listing's own. |
bestsellersOnly, starSellerOnly, etsysPickOnly, excludeAds | Keep only Bestsellers, Star Sellers or Etsy's Picks (Etsy filters its searches and categories itself); drop the ads. |
onlyNew, stateKey, resetState | Monitoring: only the listings never delivered under this memory key, e.g. mugs-uk; resetState forgets the memory. |
| Advanced | proxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, maxRequestsPerMinute, minRequestIntervalMs, maxRequestRetries, debugLog. |
📦 Output
One listing of a keyword search, shortened to the main fields:
{"id": "4557204445","url": "https://www.etsy.com/listing/4557204445","title": "Minimally striped mug, Custom ceramic cup with pet portrait, Handmade personalized cat and dog statue cup, 400ml cup","price": 10.71,"originalPrice": 18.15,"discountPercent": 41,"currency": "EUR","imageUrl": "https://i.etsystatic.com/13079015/r/il/71c32c/8440244305/il_fullxfull.8440244305_pm5t.jpg","shopRating": 4.9,"shopReviewCount": 153,"shopName": "VALLDEAROMAS","shopUrl": "https://www.etsy.com/shop/VALLDEAROMAS","shopOwnerName": "Rosa","shopAge": "10 years on Etsy","isAd": false,"adSlot": null,"organicRank": 2,"position": 5,"page": 1,"searchTotalResults": 691995,"badges": ["Star Seller"],"eligibleBadges": [],"isBestseller": false,"isEtsysPick": false,"isStarSeller": true,"hasFreeShipping": false,"isOnSale": true,"images": ["https://i.etsystatic.com/13079015/r/il/71c32c/8440244305/il_fullxfull.8440244305_pm5t.jpg"],"searchQuery": "ceramic mug","searchUrl": "https://www.etsy.com/search?q=ceramic+mug&locale_override=EUR%7Cen-US%7CIT&page=1","scrapedAt": "2026-10-02T09:00:00.000Z"}
You can download the dataset in various formats such as JSON, HTML, CSV or Excel.
All 76 fields
| Fields | What you get |
|---|---|
id, url, title | Listing — 4557204445, https://www.etsy.com/listing/4557204445, the title |
price, originalPrice, discountPercent, currency | Price — 10.71, 18.15 (before the discount), 41, EUR. A listing given by ID or URL has no card: its price is the one before the sale, unless the Demand signals option reads its page, which gives the sale price, the price before it and the discount |
priceUsd | the price converted to US dollars by Etsy (Full listing details) |
imageUrl, images, imageCount | Photos — the first photo; every photo and their number (Full listing details). Every photo is the full size (il_fullxfull), whichever way the listing was found |
shopRating, shopReviewCount | Shop rating — 4.9, 153: the SHOP's rating and number of reviews as the card shows them, the same on all the listings of a shop; the count is rounded by Etsy above 999 on a search page (3.5k gives 3500, 12k gives 12000) and exact on a category page |
shopId, shopName, shopUrl | Shop — 13079015, VALLDEAROMAS, the shop page |
shopOwnerName, shopAge, shopLocation | the owner's first name, 10 years on Etsy, the place of the shop, as the card writes it under "Ships from": a city and a country (London, United Kingdom), a city and a US state, or a country alone. An object printed on demand can ship from another country: see shipsFromCountryCode |
isAd, adSlot, organicRank, position, page, searchTotalResults | Ranking — ad or not, place among the ads, Etsy's own rank among the organic results (all pages counted), place on its page, page, results announced for the search |
badges, eligibleBadges | Badges — Star Seller; the ones Etsy rates the listing eligible for, shown or not |
isBestseller, isEtsysPick, isStarSeller, hasFreeShipping, isOnSale | the same badges as yes / no, and null when the page that found the listing does not show that badge (a shop page prints no Bestseller or Etsy's Pick, a listing given by ID or URL has no card): null is not "no". For a listing given by ID or URL, the On sale flag is filled only when the Demand signals option reads its page. isBestseller is also yes when Etsy's own flag of the listing says so (Full listing details completes the card). isEtsysPick is also yes for any organic listing of a search Etsy filtered on Etsy's Picks, even when its card prints another badge, such as Bestseller |
description, tags, materials, etsySummary | Full listing details — the seller's text, the tags, the materials, the short summary Etsy writes when it has one. A list of an option you did not tick (tags, materials, categoryPath, demandSignals) is null, an empty list means the page was read and had none |
favorites, quantity | people who favorited it, stock |
categoryPath, categoryId, categoryUrl, sectionName | Etsy category from top to leaf, its id and page, the section of the shop |
whenMade, isMadeToOrder, isDigital, isCustomizable, hasVariations, isSoldOut, isTopRated, isAvailable, isOnVacation | what the seller says and the state of the listing and of its shop |
publishedAt, updatedAt | 2026-09-29T13:39:47.000Z — creation (or last renewal) and last update of the listing |
shipsFromCountryCode | the 2-letter code of the country the listing ships from, e.g. TR (Full listing details, or the Listing page); shopLocation above is the place of the shop |
inCartCount, boughtLast24h, stockLeft, demandSignals | Demand signals (Listing page) — 20 for "In 20+ carts", 2, 3 for "only 3 left", and the texts as Etsy shows them |
rating, reviewCount | Listing rating (Listing page) — the rating and number of reviews of the listing itself, e.g. 4.9 and 81, as its page gives them; the card's are the shop's |
variations, priceMin, priceMax | the choices (color, size…) with the price of each one when shown, the lowest and highest price |
shipsFromRegion, shippingCost, deliveryEstimate, returnsAccepted, returnWindowDays | where it ships from, the shipping cost (0 = free), the delivery estimate, whether returns are accepted and, when they are, the days of the returns window (21 for "within 21 days") |
videoUrl, madeBy | the listing's video, the first name the shop shows on the listing |
reviews | Reviews — rating, text, date, reviewer, photos and the seller's reply, as a list |
shop | Shop details — total sales, rating, location, opening year, Star Seller, active listings, links, banner, tagline, team and policies, as one object |
shopEmail | Shop e-mail — the shop's public contact e-mail |
searchQuery, searchUrl, scrapedAt | Source — the keyword, the search or shop page that found the listing, the ISO time it was read |
💡 Tips
How to get more results
Set maxItems to 0 and use a broad keyword. Etsy shows 20 pages, about 1,200 listings, for one search: when you ask for more, the Actor cuts the search into price ranges by itself and reads each one, and a listing found twice is saved once. For more than a keyword gives, add more keywords in searchQueries, or read whole shops with shopNames (all the active listings of a shop, up to about 10,000).
How to reduce costs
The price is per listing, so the levers are maxItems, maxItemsPerQuery, the filters (a filtered-out listing costs only the filter fee, lower than a listing) and onlyNew for recurring runs (you never pay twice for the same listing). Tick only the extras you need: each one is charged only when you tick it (the listing page for each page read, even when it shows no demand signal), and the listing's own price stays the same without them.
Four sources in one run
Keywords, search or category URLs, shop names and listing IDs add up: a run can read a keyword, two shops and ten listings together. A listing found by several of them is saved — and charged — once. A shop gives all its active listings with the data a shop page shows: price, discount, badges, photo (no rating, no review count, no owner name, no ad or rank — those exist only in a search). A listing given by ID or URL gives its title, price, shop, photo and Bestseller flag, plus the extras you tick. Rating and review filters keep these listings (Etsy shows neither there), the Bestseller and Etsy's Pick filters keep a shop's listings (a shop page prints neither badge; when an option reads the listing's own data (Full listing details, reviews, shop details, dates, minimum favorites…), Etsy's own Bestseller flag is known and the Bestseller filter then applies it), and Etsy's Pick and Star Seller filters keep the listings given by ID or URL. Prices of a listing given by ID or URL are in the seller's own currency.
Monitoring: only the new listings
Tick Only new listings (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved, not charged, and their listing data is not even read, except a listing given by ID or URL: its data is read at each run, then the listing is skipped, free of charge. The memory lives in a named key-value store of your account (etsy-listings-scraper-seen, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey (two schedules sharing a key would hide each other's listings), and tick resetState once to start over. With onlyNew, a listing that your filters drop is checked (and charged) once: the next runs with the same filters skip it for free. Change a filter, or tick resetState, to check those listings again.
Filter by listing date
postedAfter and postedBefore take a date (2026-09-01, the whole day is included, UTC) or a period before now (7 days, 2 weeks, 1 month; via the API also 24 hours or a full ISO date-time). Etsy's result pages show no date, so the Actor reads the data of each listing it finds to get it, which makes such a run slower. The filter reads publishedAt, the creation or last renewal date of the listing; a listing without a date is dropped as soon as a date bound is set. Filtered-out listings are not saved and do not count in maxItems (each listing dropped costs the filter fee, see Pricing); the run summary tells how many were filtered. Sorted by date (Most recent) with postedAfter, the run stops at the first listing older than your date instead of reading (and charging) the older ones that follow.
🔌 Integrations and API
Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.
🤖 Use with AI agents (MCP)
AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one item per Etsy listing. Actor id: nice_dev/etsy-listings-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/etsy-listings-scraper.
Smallest input, for a cheap first call:
{"query": "ceramic mug","maxItems": 10}
Key output fields: url, title, price, currency, shopRating, shopReviewCount, shopName, isAd, organicRank and badges.
Cost: pay per listing plus a small fee for each run start, see the pricing section above. Cap each call with maxItems and, through the API, with the run option maxTotalChargeUsd.
❓ FAQ
Is it legal to scrape Etsy?
The Actor only reads what Etsy shows publicly to any anonymous visitor. It logs in to nothing. Etsy's Terms of Use restrict automated access to its site: you are responsible for using the data in compliance with them and with the applicable law. Results can contain personal data, which is protected by GDPR: the first names of shop owners and the names of the people who wrote a review, as Etsy shows them publicly. Do not store or use them without a legitimate reason. This Actor is not affiliated with Etsy.
Does it need a login or a proxy?
No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session, up to 10 times on top of the retries (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).
Is the data safe to open in Excel or to show on a web page?
Titles, descriptions and reviews are the sellers' and buyers' own words, copied as they are. A text can begin with -, +, = or @ (a title such as -20% today): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. On a web page, escape every field like any text written by a stranger.
Known limitations
- Etsy filters that are not in the input can still be used by pasting a filtered search URL into
startUrls. - When you give more listings by ID or URL than Max listings, the Actor returns the first ones of your list.
- One search gives at most about 1,200 listings (20 pages of about 60 listings each, ads included). When Max listings asks for more, the search is cut into price ranges by the Actor: the order you chose and
organicRankhold inside each range, not between them, so the first rows are not the first of the sort (with the lowest price first, a range of dearer listings is read beside the cheapest one). WithonlyNewand the sort Most recent, only the first 20 pages are read: the new listings are on top. A shop gives up to about 10,000 listings. The sort by reviews (highest_reviews) is no deeper: Etsy shows its 20 first pages only. - Ads and Etsy's rank exist only in searches and categories:
adSlot,organicRank,position,pageandsearchTotalResultsarenullfor shops and for listings given by ID or URL, andisAdisfalsethere. A listing met first as an ad and also found among the organic results keepsisAdtrue and noorganicRank, in that run. - A shop page shows no rating, no review count, no owner name, no shop age and no origin; a listing given by ID or URL shows none of them either, and shows only the Bestseller badge. It has no discount either, unless the Demand signals option reads its page, which gives the sale price, the price before it and the discount.
shopRating,shopReviewCountand these fields are then empty, and the yes / no badge fields the page does not show arenull, notfalse. - The stars of a card are the shop's (
shopRating,shopReviewCount): the same couple on every listing of a shop. The listing's ownratingandreviewCountcome from its page, only when you tick Listing page. The ready-to-ship filter (readyToShipWithin) works on searches and categories: shops and listings given by ID are not filtered on it, and the log says so. - Etsy gives a shop's reviews, not a listing's: with
includeReviewsthe Actor keeps the reviews of the shop that point to the listing, among the latest 500 reviews of the shop at most, so older reviews of a listing can be missing. inCartCountis a lower bound: "In 20+ carts" gives20. Etsy shows these signals on some listings only, and they change from one moment to the next.publishedAtis the creation date of the listing, or the date of its last renewal: Etsy renews a listing's date when the seller renews it.currencyis the currency the price of the row is shown in;priceUsdis Etsy's own conversion.onlyNewremembers listing ids, not their content: a listing whose price changed is not returned again.- With
onlyNew, a listing that does not pass a time-dependent filter yet (a relative "posted before" date, or a minimum count that keeps rising: favorites, shop reviews) is checked again on the next run. - With
onlyNew, a shop of more than 20 pages (about 720 listings) is read until 20 pages in a row hold only listings already delivered, then the run moves on: a new listing that Etsy shows deeper than that in the shop is not returned. - If your filters drop almost everything that one search or shop returns (300 listings in a row), that search stops and the run goes on with the next ones; the run stops only when every search and shop is in that case.
- Two runs sharing the same
stateKeyat the same time may both return the same new listing (the ones they deliver within the same minute).
A run that reaches its timeout stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with onlyNew, remembered, and the run ends Succeeded with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).
A run the platform stops without warning (out of memory)
- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and
maxItemsstill counts them. - With
onlyNew, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the listings of its last 2 seconds once more.
Something doesn't work?
The last line of the log counts the listings saved, filtered out and no longer on Etsy (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store (the first 200 of them). A shop that Etsy does not know is said in the log and gives no listing. A run that saved nothing and had failed requests fails, and its last message gives the cause (a search URL that does not exist says so, instead of "run it again").
If Etsy changes its pages, you are told instead of paying for blank rows. A results page that counts listings but gives none the Actor can read is an error (listed in FAILED_REQUESTS), never a quiet "No listings found". If the first 20 listings read all lack their title, price or shop name — or, when the listing data is read, their description — the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. A listing that a filter drops counts among those 20. A run of fewer listings (a scheduled onlyNew run that finds a few new ones, a small Max listings) is checked at its end, from 5 listings: its listings are already saved, and the run fails with the missing field instead of ending green.
🛟 Support
Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which URLs failed and why.