Wine-Searcher scraper from list: wine and spirits
Pricing
from $10.00 / 1,000 wine data extracteds
Wine-Searcher scraper from list: wine and spirits
Extract popularity, critic scores, cheapest prices and merchant info from Wine-Searcher.com, for wines and spirits alike: bourbon, tequila, cognac and whisky all work. Input names, URLs or LWIN codes and get structured JSON back. Billing is success-only, errors are free. By MrBridge (mr-bridge.com)
Pricing
from $10.00 / 1,000 wine data extracteds
Rating
5.0
(1)
Developer
MrBridge
Maintained by CommunityActor stats
2
Bookmarked
107
Total users
13
Monthly active users
16 hours
Issues response
19 hours ago
Last modified
Categories
Share
Wine-Searcher Scraper from List: popularity, scores & prices
What is Wine-Searcher Scraper from List?
Wine-Searcher Scraper from List is an Apify Actor that extracts structured wine data from Wine-Searcher.com, the world's largest wine price comparison site with 18M+ searches per month. Provide wine names, Wine-Searcher URLs or LWIN codes, and the scraper returns popularity rankings, critic scores, cheapest worldwide prices and winery details in JSON or CSV format.
No Wine-Searcher account needed, no API key, no rate limits. A pay-per-event alternative to the official Wine-Searcher API, billed only when a wine is actually extracted. Failed extractions, blocked pages, missing wines and empty results are reported in the dataset but never charged to your account.
Features
- Three input modes: search by wine name, paste Wine-Searcher URLs, or use industry-standard LWIN codes
- Critic scores & reviews: aggregated ratings from Wine-Searcher's critic database, plus
criticScoreskeyed by publication so a spreadsheet gets one stable column per critic - Cheapest worldwide prices: lowest available price with merchant name, excluding auctions and pre-arrival offers
- Always per-bottle pricing: case listings (e.g. EU merchants selling "Case of 12") are auto-normalized so
cheapestPriceAmountis always the price for one 75cl bottle. ThebottlesPerUnitfield tells you whether normalization happened. - Your currency, on every row: pick one of 30 ISO currencies and every price comes back converted in
cheapestPriceConverted, at a live rate fetched once per run. The original amount and its detected currency are always kept. - Winery info & popularity: producer details, the Wine-Searcher popularity ranking as published, and
winePopularityRankas a plain integer you can sort on - Every row states its outcome: a
statusfield with a fixed vocabulary (ok,not_found,blocked,timeout,parse_empty,invalid_input,failed), so you never have to guess whether a row is a result or a failure - POS / inventory-ready: paste wine names from your point-of-sale system as-is. Category prefixes, bottle sizes and commas are stripped automatically.
- LWIN auto-detection: LWIN7, LWIN11, LWIN16 and LWIN18 codes all accepted. Numeric or string format, with or without
inputType. - Retries failed requests and saves partial results on timeout: one bad input never kills the run, memory stays bounded, and on a soft deadline the actor exits gracefully with whatever it already extracted
- Only successful extractions are billed at $0.025/wine: errors, blocked requests, timeouts, missing wines and empty results are reported in the dataset for visibility but never billed.
Which wine scraper should I use?
| Need | Best scraper | What it does |
|---|---|---|
| Look up specific wines by name, URL or LWIN | Wine-Searcher Scraper from List (this one) | Critic scores, cheapest prices, winery info & popularity for each wine |
| Discover all wines for a grape variety | Wine-Searcher Grape Scraper | Browse and extract wines by grape variety on Wine-Searcher |
| Get Vivino user ratings & taste profiles | Vivino Wine Data Scraper | Vivino ratings, prices, taste profiles & reviews |
| Browse wines by region on Vivino | Vivino Wine Scraper | Browse and extract all wines from a Vivino region |
| Monitor Millesima prices & stock | Millesima Wine Scraper | Prices, stock and critic ratings from Millesima |
In short: Use this actor when you have a known list of wines and want Wine-Searcher data (critic scores, market prices, popularity). Use the Grape Scraper when you want to discover wines by grape variety.
Tip: Use the Grape Scraper to discover wines by grape variety, then this actor to get detailed data for each wine.
Why scrape Wine-Searcher?
Wine-Searcher aggregates 20M+ offers from 80,000+ merchants worldwide. The data is used by wine retailers (competitor pricing, catalog benchmarking), sommeliers and buyers (scores and market prices before purchase), collectors and investors (cellar valuation, popularity tracking), and data teams (recommendation engines, pricing models, BI dashboards).
What data can this scraper extract?
| Data Point | Description | Always included |
|---|---|---|
| Status | Outcome of the row: ok, not_found, blocked, timeout, parse_empty, invalid_input or failed | Yes |
| Wine name | Full name as listed on Wine-Searcher | Yes |
| Appellation | Appellation and country of origin | Yes |
| Critic score | Aggregated critic score (0–100) | Yes |
| Critic reviews count | Number of critic reviews | Yes |
| Wine style | Style descriptor (e.g. "Red - Savory and Classic") | Yes |
| Grape variety | Grape variety or blend (e.g. "Chardonnay", "Bordeaux Blend Red") | Yes |
| Vintage | Structured vintage, falling back to a leading four-digit year in the wine name; null only when neither source provides a year, including non-vintage wines | Yes |
| Label image URL | Absolute URL to the wine label image | Yes |
| Critic reviews | Per-critic reviews - array of { author, score } (e.g. Robert Parker 95, Jasper Morris 90). Nested array: a CSV column number is a position, not a critic | Yes |
| Critic scores by publication | The same reviews as an object keyed by publication name, so a CSV carries criticScores/Wine Spectator and similar stable columns you can sort and filter | Yes |
| Cheapest price | Lowest available price worldwide, always per 75cl bottle (case listings auto-divided) | Yes |
| Currency | Currency code of the original offer (EUR, USD, GBP…) | Yes |
| Cheapest price (target currency) | Cheapest price converted to the currency you selected. It is identical to cheapestPriceEur when the target is EUR (null if no rate is available) | Yes |
| Target currency | The ISO code you asked for, stated on every row even when the conversion could not be done | Yes |
| Cheapest price (EUR) | Backward-compatible euro price. It is identical to cheapestPriceConverted when the target is EUR (null if conversion unavailable) | Yes |
| Merchant | Merchant offering the lowest price | Yes |
| Bottles per unit | 1 = single bottle, ≥2 = case (price already normalized to per-bottle) | Yes |
| Offers count | Total number of merchant offers | Yes |
| Winery name | Producer / winery name | Yes |
| Winery URL | Winery page URL on Wine-Searcher | Yes |
| Popularity ranking | Wine-Searcher popularity ranking as published, e.g. "1,826th" | Yes |
| Popularity rank (number) | The same ranking as an integer, e.g. 1826, so you can sort a spreadsheet on it. A smaller number is a better rank | Yes |
| Wine-Searcher URL | Direct link to the wine page | Yes |
| Scraped at | ISO timestamp of extraction | Yes |
Most fields are populated for the large majority of wines. A few depend on Wine-Searcher having the relevant page for that wine and may be
nullfor niche or very new entries:winePopularityandwinePopularityRankandwineryUrl(require a producer page on Wine-Searcher),criticReviews(requires listed critic reviews), andcheapestPriceEurandcheapestPriceConverted(require a known exchange rate). A missing popularity rank is an empty cell, never a zero.
Quick start: test in 60 seconds
- Click "Try for free" to open this actor in Apify Console
- The default input includes sample wines. Leave them or paste your own.
- Click "Start"
- Download your results from the Dataset tab (JSON, CSV, Excel)
That's it! No Wine-Searcher account needed, no API key, no rate limits.
Maximum 500 wines per run. For larger catalogs, split your list across multiple runs.
Option 1: Search by wine name
- Go to the Wine-Searcher Scraper from List on Apify
- Select "Wine Names" from the input type dropdown
- Enter wine names, one per line. Include the full domaine name and the vintage year for the most accurate match.
- Click Start to run the scraper
Example:
Domaine Leflaive Puligny-Montrachet Les Pucelles 2020 Château Beaucastel Hommage à Jacques Perrin 2019
Tips: The more specific the name, the more accurate the match. "Petrus 2015" works, but "Domaine du Château de Meursault Meursault Les Charmes 2020" is more precise.
Always include the vintage when you care about price. A name with or without a year resolves equally well, but the year decides which vintage's price you get back - and prices vary widely between vintages of the same wine. Send "Petrus 2015" to price the 2015; send "Petrus" and you get whatever vintage Wine-Searcher surfaces first.
POS / inventory systems? If your wine list comes from a point-of-sale or inventory system with category prefixes and bottle sizes (e.g. Champagne, Dom Perignon Brut, 2013, Champagne, France or Dessert Wine, Dolce Late Harvest (375ml), Napa Valley), just paste them as-is. The actor automatically cleans the names before searching.
Option 2: Provide Wine-Searcher URLs
- Select "Wine-Searcher URLs" from the input type dropdown
- Paste one Wine-Searcher URL per line. Any URL from
wine-searcher.com/find/...works. - Click Start
Example:
https://www.wine-searcher.com/find/lwin11316442021 https://www.wine-searcher.com/find/petrus/2015
Option 3: Use LWIN codes
- Select "LWIN Codes" from the input type dropdown
- Enter one LWIN code per line. Supports all formats:
- LWIN11 (10-11 digits): specific wine + vintage, e.g.
11316442021 - LWIN7 (7 digits): wine across all vintages, e.g.
1131644 - LWIN16/LWIN18: automatically truncated to LWIN11
- LWIN11 (10-11 digits): specific wine + vintage, e.g.
- Click Start
Example:
11316442021 11084042019 1131644
LWIN (Liquid Wine Identifier Number) is the global standard for identifying wines. You can find LWIN codes on Liv-ex, Wine-Searcher, or your wine management software.
From the MrBridge wine suite
Built by MrBridge. More on this Wine-Searcher tool and the other MrBridge scrapers. See it applied in Champagne Hidden Gems 2026.
How do I configure the scraper?
| Parameter | Type | Default | Description |
|---|---|---|---|
inputType | string | auto-detected | How wines are identified: wineNames, urls or lwins. Auto-detected if omitted |
wineNames | array | - | Wine names to search on Wine-Searcher (max 500) |
urls | array | - | Direct Wine-Searcher URLs (max 500) |
lwins | array | - | LWIN codes, string or number format (max 500) |
targetCurrency | string | USD | ISO code every price is converted to in cheapestPriceConverted. 30 currencies available. Leave it out and you get US Dollars |
Example: Search by wine name
{"inputType": "wineNames","wineNames": ["Domaine Leflaive Puligny-Montrachet Les Pucelles 2020","Petrus 2015","Opus One 2019"]}
Example: Scrape by LWIN codes, priced in euros
{"inputType": "lwins","lwins": ["11316442021", "11084042019", "1131644"],"targetCurrency": "EUR"}
Output example
The Overview export starts with a stable 23-column core, from inputValue through targetCurrency. Publication-specific criticScores/<publication> columns follow as a variable tail, so their number depends on the critics present in that batch. Read CSV fields by header, not by total column count.
The output inputType reports the route actually used to resolve that row. A wine submitted by name can therefore show lwin when the Actor upgrades it to a more reliable identifier lookup; it does not mean your input mode was misread.
{"inputValue": "11316442021","inputType": "lwin","status": "ok","wineSearcherUrl": "https://www.wine-searcher.com/find/lwin11316442021","wineName": "2021 Domaine Jean-Claude Bachelet et Fils Blanchot du Dessus","appellation": "Chassagne-Montrachet Premier Cru, France","score": 92,"criticReviewsCount": 2,"style": "White - Buttery and Complex","grapeVariety": "Chardonnay","vintage": 2021,"labelImageUrl": "https://www.wine-searcher.com/images/labels/12/16/11921216.jpg","criticReviews": [{ "author": "Jasper Morris - Inside Burgundy", "score": 90 },{ "author": "Robert Parker The Wine Advocate", "score": 95 }],"criticScores": {"Jasper Morris - Inside Burgundy": 90,"Robert Parker The Wine Advocate": 95},"cheapestPriceAmount": 459.76,"cheapestPriceCurrency": "EUR","cheapestPriceConverted": 496.54,"targetCurrency": "USD","cheapestPriceEur": 459.76,"cheapestPriceMerchant": "Lay & Wheeler Wine Merchants","bottlesPerUnit": 1,"offersCount": 5,"offersPages": 1,"wineryName": "Jean-Claude Bachelet","wineryUrl": "https://www.wine-searcher.com/merchant/22937-jean-claude-bachelet","winePopularity": "2,622nd","winePopularityRank": 2622,"scrapedAt": "2025-03-07T10:00:00.000Z"}
A row that did not produce a wine carries the same status field with a different value, plus error explaining what happened in plain language:
{"inputValue": "Chateau Nonexistent 1999","inputType": "wineName","status": "not_found","wineSearcherUrl": "https://www.wine-searcher.com/find/Chateau+Nonexistent+1999","error": "Redirect led to another results page - no direct wine page found","targetCurrency": "USD","scrapedAt": "2025-03-07T10:00:00.000Z"}
How to read a result
status is the one field to filter on. It has exactly seven values and every row carries one:
status | What it means | Charged |
|---|---|---|
ok | Wine extracted with non-empty data | Yes |
not_found | No wine page on Wine-Searcher for this input | No |
blocked | Wine-Searcher refused the request after retries | No |
timeout | The request for this wine expired | No |
parse_empty | Page fetched, nothing extractable from it | No |
invalid_input | Malformed LWIN, wrong-domain URL or empty name | No |
failed | Processing or an upstream service failed, read error for the detail | No |
The vocabulary is fixed. A new failure mode gets a new value and a changelog entry, never a free-text status, so a filter you write today keeps working. Each value states only what we can actually establish: a request that came back with a service error is failed rather than blocked, because we cannot tell you Wine-Searcher refused it when it did not.
How much does it cost?
| Tier | Cost | What you get |
|---|---|---|
| Per wine | $0.025/wine | Charged only when a wine is genuinely extracted |
| Free tier | $5 free credits/month | ~200 wines for free every month |
| Starter plan | $29/month | ~1,160 wines/month |
This Actor uses Apify's pay-per-event pricing with a success-only billing rule. A wine record is submitted for billing as it is written, through Actor.pushData(row, 'wine-extracted'), so the platform decides whether the row can be charged before the row lands. Only a non-empty wine record is ever submitted. The write and the charge are two steps inside that one call and not a transaction, which is why a run that hits a delivery problem stops rather than continuing (see the reconciliation note below). No setup fee, no monthly minimum. Start with $5 free credits.
Estimates based on event pricing only. Actual costs may include minimal platform compute fees. The free $5 credit covers both.
Cost estimates
| Wines | Cost |
|---|---|
| 10 | $0.25 |
| 100 | $2.50 |
| 500 | $12.50 |
What you pay for vs what you don't
| Scenario | Pushed to dataset? | Charged $0.025? |
|---|---|---|
| Wine successfully extracted (full data) | ✅ Yes (status: "ok") | ✅ Yes |
| Wine not found on Wine-Searcher | ✅ Yes (status: "not_found") | ❌ Free |
| Page returned empty / parse-empty (site change canary) | ✅ Yes (status: "parse_empty") | ❌ Free |
| Blocked by anti-bot after retries | ✅ Yes (status: "blocked") | ❌ Free |
| Network or scraping service error | ✅ Yes (status: "failed") | ❌ Free |
| Timeout on a single wine | ✅ Yes (status: "timeout") | ❌ Free |
| Invalid input (malformed LWIN, wrong-domain URL) | ✅ Yes (status: "invalid_input") | ❌ Free |
| Run aborted by user / migration / soft deadline | partial dataset preserved | only paid wines counted |
Check your bill against your data. On a run that finishes normally, the number of rows with status: "ok" is the number of charged events for that run: one ok row, one billed event, and no other status is ever billed. So a reconciliation is a single count:
billed = sum(1 for w in wines if w["status"] == "ok")
That equality holds by construction rather than by promise. An ok row is submitted for billing as it is written, so the platform decides whether it can be charged before the row lands. If you set a maximum total charge and the run reaches it, the remaining wines are not delivered at all rather than delivered unbilled, and the run says so in its log.
A run that ends in failure is the one case where the counts may differ. Writing a row and charging for it are two steps inside a single call, not a transaction. When one of those calls fails, the Actor stops launching new work, but the wines already being processed keep going: one or more writes already in flight may have stored an ok row while its matching charge cannot be confirmed from inside the run. The Actor does not paper over it. The run fails rather than continuing with a dataset that no longer matches your invoice, and the log names every wine affected. Everything already written is kept. If a run of yours ever ends this way and the counts do not add up, open the Actor's Issues tab with the run ID and it will be sorted out.
To continue from there, open the failed run in the Apify Console and click Resurrect. A resurrected run restarts on the same dataset, so the wines already delivered are detected and skipped, and only the rest are scraped and billed. Starting a new run does the opposite: it gets a new, empty dataset, so it has no way of knowing what the failed run delivered and will scrape and bill your whole list again.
Tips for best results
- Use LWIN codes when available. They're the most reliable input mode, with zero ambiguity. Otherwise include the full producer name + vintage year in wine names ("Petrus 2015", not "Petrus").
- POS / inventory lists: paste as-is. Category prefixes, bottle sizes and commas are stripped automatically.
- Pick your currency once, in the Target Currency field. Every price then comes back converted in
cheapestPriceConverted, at a single live rate fetched at the start of the run, so the whole batch is comparable. The originalcheapestPriceAmountandcheapestPriceCurrencyare preserved, andcheapestPriceEurstill gives you euros whatever you selected. - Export the Overview view for spreadsheets. Its first 23 columns are a stable core: popularity is in columns 5 and 6, and prices start at column 13. The
criticScores/<publication>columns come after that core and vary with the publications found in each batch. - Know when a row was reused. By default, an extraction made within the previous 30 days may be served again. The all-fields data keeps the original
scrapedAttimestamp, while the Overview deliberately omits it; the run log reports how many rows came from an earlier extraction and how many inputs required source fetching. - Keep the default timeout (4 h). A measured 500-wine production batch completed in 2 h 09 on 25 August 2026, which leaves a wide margin under the 4 h ceiling. Your own runs will vary with how many of your wines Wine-Searcher has to search for by name, so treat this as an order of magnitude rather than a guarantee.
Integrate into your workflow
Push results into Google Sheets, Airtable, your DB, or call the actor from your own code. Common patterns below.
Programmatic API call
Use the Apify API or the official client libraries. Get your token from Settings → Integrations.
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("mrbridge/wine-searcher-scraper-from-list").call(run_input={"inputType": "lwins","lwins": ["11316442021", "11084042019"],"targetCurrency": "USD",})wines = client.dataset(run["defaultDatasetId"]).list_items().items# Keep the rows that produced a wine. This is also the count you were billed for.extracted = [w for w in wines if w["status"] == "ok"]
The same pattern works in Node.js (ApifyClient), or via raw cURL against /v2/acts/{actorId}/run-sync-get-dataset-items for batches under 50 wines (300 s sync limit).
Dataset export formats
For spreadsheets, ask for the Overview view. Its first 23 columns form a stable core: winePopularity and winePopularityRank are columns 5 and 6, and cheapestPriceAmount starts the price block at column 13. The publication-specific criticScores/<publication> columns follow that core as a variable tail. The view omits the positional criticReviews array, but its total width still depends on which critics appear in the batch.
https://api.apify.com/v2/datasets/{DATASET_ID}/items?view=overview&format=csv
The same view is available on the Dataset tab of any run, and on the run's Output tab as a ready-made link. For everything else, append ?format= to the dataset URL: json (default), csv, xlsx, xml, jsonl. Filter fields with ?fields=wineName,status,cheapestPriceConverted or exclude with ?omit=wineSearcherUrl,inputType.
No-code integrations
Connect this actor to your tools without writing code via the Integrations tab in the Apify Console:
| Platform | Setup |
|---|---|
| Google Sheets | Auto-export results to a sheet; map wineName, score, cheapestPriceAmount and run on a schedule |
| Airtable | Sync wine data to an Airtable base with field mapping |
| Zapier | Trigger Zaps on Run succeeded → push to 5,000+ apps |
| Make | Visual workflows: scrape → transform → insert into DB |
| n8n | Self-hosted workflow automation with the Apify trigger node |
See the Apify Integrations docs for full setup.
Scheduled runs and webhooks
Schedule recurring runs (Apify Console → Schedules) using cron, e.g. 0 2 * * * for daily at 2 AM UTC or 0 8 * * 1 for weekly on Monday. Combine with a webhook (Integrations tab → Run succeeded) to push the dataset to your endpoint when each run finishes. No polling needed.
Handling catalogs larger than 500 wines
Split your list into batches of 500 and chain the runs:
batches = [all_lwins[i:i+500] for i in range(0, len(all_lwins), 500)]for batch in batches:client.actor("mrbridge/wine-searcher-scraper-from-list").call(run_input={"inputType": "lwins", "lwins": batch},)
Troubleshooting
"Wine not found" in results
- Check for typos in the wine name
- Include the full producer name (e.g., "Domaine Leflaive Puligny-Montrachet" instead of "Puligny-Montrachet")
- Add or remove the vintage year
- Very rare or brand-new wines may not be in Wine-Searcher's database
- The result will carry
"status": "not_found". No charge applies.
Prices differ from what I see on Wine-Searcher
- Prices reflect the UK fine-wine merchant market (the deepest source of offers, including in-bond pricing) and the cheapest offer available at scrape time, which changes as merchants update stock and pricing
- Use
cheapestPriceConvertedfor a figure in the currency you selected, orcheapestPriceEurfor euros, both comparable across wines regardless of the merchant's local currency - Auctions, pre-arrival and "by request" offers are always excluded
The converted price column is empty
- The row still names the currency you asked for in
targetCurrency. An emptycheapestPriceConvertedmeans there was no amount to convert, or no live rate available for that pair during the run. - Nothing is ever converted at a stale or guessed rate. An empty cell is the honest answer, and
cheapestPriceAmountwithcheapestPriceCurrencystill gives you the merchant's own figure.
Sorting the popularity column gives nonsense
- Sort on
winePopularityRank, the integer, not onwinePopularity, which is the published string with its ordinal suffix and thousands separator - A smaller rank is a better rank. An unknown rank is an empty cell rather than a zero, so it never sorts to the top.
Wrong wine returned for a name search
- Use LWIN codes or full Wine-Searcher URLs for zero-ambiguity matching
- Include the full domaine name and vintage year in name searches
Blocked by Wine-Searcher (403 errors)
- Use wine names (
wineNamesmode) instead of manual URLs. The actor handles encoding and search optimization automatically. - If using URLs, avoid adding country/currency filters (
/usa/usd); they increase blocking risk. - Retries and request pacing are handled automatically; transient blocks usually clear on a re-run.
Run timed out
The default 4 h timeout is sized for the 500-wine run limit at the target-friendly default concurrency of 6. A measured 500-wine batch took 2 h 09 in August 2026. If your run reaches the 4 h timeout, inspect its log for repeated upstream failures or interruptions. Split larger catalogs across multiple runs instead of raising the per-run batch size.
Which bottle format is used for prices?
Standard 75cl bottles. If no 75cl offer exists, falls back to 62.5cl (Tokaji, dessert wines) then 50cl. Auctions, pre-arrival and "by request" offers are always excluded. Case listings are auto-divided to per-bottle (see bottlesPerUnit).
FAQ
Does Wine-Searcher have an official API? Yes, but it's expensive and restricted. This actor provides a pay-per-event alternative at $0.025/wine with no monthly commitment.
How fast is the scraper?
The actor scrapes 6 wines in parallel by default - a conservative pace that keeps blocks under control on Wine-Searcher - at roughly 3–4 wines per minute. The default of 6 is the recommended balance; power users calling the actor via the API can override maxConcurrency (1–10) to tune throughput.
What are LWIN codes and where can I find them? LWIN (Liquid Wine Identifier Number) is the wine industry's universal identification system managed by Liv-ex. LWIN7 identifies a wine regardless of vintage; LWIN11 adds the vintage year. You can look up LWINs on Liv-ex, Wine-Searcher itself, or your wine management platform.
Is there a rate limit? No. Built-in rate limiting and retry logic handle blocking automatically, and concurrency is auto-optimised for the batch size.
Why is the cheapest price sometimes lower than what I see on Wine-Searcher?
The actor normalizes case listings to per-bottle pricing. If a merchant lists "Case of 12, €408" on Wine-Searcher, the actor returns cheapestPriceAmount: 34 (= €408 ÷ 12) and sets bottlesPerUnit: 12. Prices are always per 75cl bottle as documented. To reconstruct the case price, multiply cheapestPriceAmount × bottlesPerUnit.
Which currency do prices come back in?
The merchant's own currency in cheapestPriceAmount and cheapestPriceCurrency, plus a conversion to whichever of the 30 ISO currencies you selected in cheapestPriceConverted. US Dollars if you select nothing. cheapestPriceEur is always euros, whatever you selected, so anything already reading it keeps working. One exchange rate is fetched at the start of each run and applied to the whole batch, which is what makes the rows comparable with each other.
How do I tell a real result from a failure?
Read status. A row with status: "ok" is a wine that was extracted, and it is the only kind of row that is billed. Any other value tells you what went wrong, with error giving the plain-language detail beside it. You never have to test whether a field is missing.
What is the difference between blocked, timeout and failed?
They say how much we actually know. blocked means Wine-Searcher itself refused the request. timeout means the request expired. failed covers everything else that went wrong on our side or on a service between us and the site, where naming a specific cause would be a guess. In all three cases the row is free and error carries the detail.
Why does my CSV have a different number of columns from one run to the next?
The all-fields export flattens criticReviews by position. The Overview view replaces that unstable block with a stable 23-column core followed by criticScores keyed by publication. Each critic column is named and sortable, but the critic tail is still variable: a batch containing more publications produces more columns. Build fixed imports against the first 23 headers and accept the remaining criticScores/* columns dynamically.
Can I send LWIN codes as numbers or omit the inputType field?
Yes to both. Numbers and strings both work for LWINs. If inputType is omitted, the actor auto-detects from whichever array is populated (lwins, urls, or wineNames).
Is my data stored anywhere outside my Apify account? No. Results are stored only in your Apify dataset (default 31-day retention, fully under your control). Nothing is shared with third parties.
Can I export to Google Sheets, Excel, or my database? Yes. CSV/Excel/JSON downloads from the Dataset tab, automated push via the Google Sheets/Airtable/Zapier/Make/n8n integrations, or programmatic access via the Apify API. For spreadsheet work, pick the Overview view first. See the Integrate section above.
Resources
- Apify API Documentation: full API reference for programmatic access
- Apify Platform Integrations: connect to Google Sheets, Zapier, Make, n8n, and more
- Apify Proxy Documentation: configure residential or datacenter proxies
- Wine-Searcher Grape Scraper: browse wines by grape variety
- Vivino Wine Data Scraper: Vivino ratings, prices and taste profiles
- Millesima Wine Scraper: Millesima prices and critic ratings
Legal & compliance
What this Actor extracts. This Actor extracts only publicly available data displayed on Wine-Searcher.com, the same information any visitor sees when browsing the site. It does not bypass paywalls, log into accounts, scrape private user data or extract personal information.
Your responsibilities as a user.
- Use the extracted data in compliance with applicable laws in your jurisdiction (data protection, copyright, fair-use)
- Respect Wine-Searcher's Terms of Service
- Do not redistribute the raw scraped content as a competing price-comparison product
- Aggregated insights, internal pricing intelligence, and integration into your own catalog are typical legitimate uses
Affiliation. This tool is independent. It is not affiliated with, endorsed by, or sponsored by Wine-Searcher, Liv-ex, or any wine merchant.
Data minimization. The Actor stores results only in your own Apify dataset (default 31-day retention, fully under your control). No data is shared with third parties or transmitted outside the Apify run.
License. Provided as-is for personal and commercial use under standard Apify Store terms.
Feedback
This Actor is actively maintained, and every reported issue is tracked and addressed. If you spot a bug, a wine that returns the wrong popularity, or a feature you'd like to see, open a thread on the Actor's Issues tab in the Apify Console. Reviews on the Apify Store help us prioritise the roadmap, so if the Actor saved you time, please consider leaving one.
Built with Apify.