Wine-Searcher Scraper at a glance
Wine-Searcher Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes wine, vintage, appellation, region and grape, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.70 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Automation, Developer Tools
- Pricing
- $2.70 per 1,000 results (Free plan), from $1.70 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 18 options
Look up wines on wine-searcher.com by name, URL, or LWIN code. Returns 30+ fields, including critic scores, prices, grape, region, appellation, producer, label image, user ratings, food pairing, live offer counts, cheapest merchant offer, and optional critic review breakdown.
What Wine-Searcher Scraper can do
- Three input styles, one list. Wine names, Wine-Searcher URLs, or LWIN codes (LWIN7 / 11 / 16 / 18). Auto-detect routes each item automatically, so a mixed list just works.
- A rich per-wine record. 30+ fields, including critic score, average price, grape, region, appellation, producer, description, and label image.
- Optional merchant offers. Turn on offer extraction for the cheapest live offer, merchant name and link, the full worldwide offers list, and the number of offers and merchants.
- Optional critic review breakdown. Turn on review collection for a per-critic reviewer name, score, and tasting note for each wine.
- Price-spread stats already computed. With merchant offers turned on, highest and median price are normalised to one standard 750ml bottle, so a case offer or a magnum never skews the comparison for you.
- Fails loudly, not silently. When Wine-Searcher cannot be reached at all, the run stops with a clear message instead of quietly returning an empty dataset.
Choose what to collect
These inputs let you configure Wine-Searcher Scraper - Wine Prices, Scores, Offers & LWIN. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
inputTypestring · required | How the items below are formatted. 'Auto-detect' inspects each item and routes it automatically (a wine-searcher.com URL, an all-digit LWIN code, or otherwise a wine name). |
wineNamesarray | Full wine names, ideally with vintage year, e.g. 'Domaine Leflaive Puligny-Montrachet Les Pucelles 2020'. Up to 1000 items. |
urlsarray | Direct wine-searcher.com/find/... links: a wine page (name and vintage) or an LWIN page. Up to 1000 items. |
lwinsarray | Liv-ex Wine Identification Numbers (LWIN7, LWIN11, LWIN16, LWIN18), numeric or string. Up to 1000 items. |
fetchOffersboolean | When on, the actor also extracts the cheapest merchant offer (price + merchant), the full offers list, and the cheapest price converted to your display currency. Adds a little time per wine. Leave off for a faster, cheaper run that still returns scores, average price, grape, region and the offer count. |
fetchReviewsboolean | When on, the actor also collects the per-critic review breakdown (reviewer name and score) for each wine. Each review captured is one enriched data item. |
maxReviewsPerWineinteger | Only used when Fetch critic reviews is on. Keeps at most this many critic reviews per wine; each review delivered is one enriched data item. Values above 200 are treated as 200. |
Show 11 more inputs
| Input | What it controls |
|---|---|
concurrencyinteger | Deprecated and ignored. Lookup parallelism is managed automatically. |
maxItemsinteger | The single cap on this run: process at most this many wines from your list. Set to 0 for no limit (process the whole list). Keeps a first run cheap and predictable. |
resumeFromRunIdstring | Optional. ID of a previous run of this actor (or a dataset ID). Wines already collected there are skipped, so this run only looks up the rest of your list. Max wines then counts only the new wines. One-off continuation of a SPECIFIC run - for ongoing scheduled tracking of the same wine list use Incremental mode below instead. |
incrementalModeboolean | For a wine list you run on a schedule (e.g. daily/weekly): remembers what this exact list returned last time and classifies every wine as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, so you can act on only what changed. Compared: critic score, prices and currency, offers (merchant, price, unit), critic reviews (author, score, note), region, appellation, description, label image path and every other output field. Never compared: scrapedAt, each offer's priceValidUntil, the order of offers and criticReviews, and the host/query part of the label image URL (change more with Ignore fields below). Off by default so existing scheduled runs are unaffected. Uses State key below to isolate different lists; see Emit unchanged rows / Emit expired rows to control which of those get pushed (both bill extra rows when on). |
stateKeystring | Names the saved baseline Incremental mode compares against. Leave empty to auto-derive one from your exact wine list (Input type + wineNames/urls/lwins) - convenient when you re-run the SAME list every time, but editing the list also changes this auto key, starting a fresh baseline. If you plan to add or remove wines over time and still want EXPIRED reported for ones you drop, set your own fixed text here so every run shares one baseline regardless of list edits. Ignored when Incremental mode is off. |
emitUnchangedboolean | When Incremental mode is on: also push rows classified UNCHANGED (identical to last run), not just NEW/UPDATED/REAPPEARED/EXPIRED. Off by default to save you from paying for rows that didn't change. Turning this on bills the per-result event (and the detail-enrichment surcharge, when fetched) for every unchanged row too. |
emitExpiredboolean | When Incremental mode is on: push a synthetic EXPIRED row for wines tracked in a previous run that this run could not find. Only fires after a run that completely covered your whole tracked list: if Resume from run/dataset ID was used, if the run stopped early (a connection/session ceiling), or if Max wines cut the list short, expiry reporting is skipped for that run (with a log line saying why) because a partial scan can't tell 'gone' apart from 'not reached yet'. Off by default; turning it on bills the per-result event for each EXPIRED row emitted. EXPIRED rows count against Max wines like any other row; if the cap is reached, the remaining gone wines stay tracked and are reported on a later run rather than being emitted uncapped. |
ignoreFieldsForChangesarray | Extra fields to leave out when Incremental mode decides whether a wine changed. Use a field name (e.g. description) or a dotted path for a field inside a list (e.g. offers.merchantUrl). The fields are still written to every row; they just never turn a wine into UPDATED or appear in changedFields. Already excluded by default: scrapedAt, each offer's priceValidUntil, list order of offers and criticReviews, and the host/query part of labelImageUrl. Ignored when Incremental mode is off. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
wineNameWine (text)vintageVintage (number)appellationAppellation (text)regionRegion (text)grapeVarietyGrape (text)styleStyle (text)scoreCritic Score (number)criticReviewsCount# Critic Reviews (number)avgPriceAvg Price (number)avgPriceCurrencyCurrency (text)cheapestPriceAmountCheapest (number)cheapestPriceCurrencyCheapest Cur. (text)Show 20 more fields
cheapestPriceMerchantMerchant (text)bottlesPerUnitBottles/Unit (number)offersCount# Offers (number)highestPriceAmountHighest / 750ml btl (number)medianPriceAmountMedian / 750ml btl (number)merchantCount# Merchants (number)producerProducer (text)labelImageUrlLabel (image)wineSearcherUrlURL (link)statusStatus (text)criticScorescriticScorescheapestPriceEurCheapest (EUR) (number)cheapestPriceConvertedCheapest (converted) (number)targetCurrencyDisplay currency (text)offersofferscriticReviewscriticReviewschangeTypeChange (text)changedFieldsChanged fields (array)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"inputValue": "Petrus 2015",
"inputType": "wineNames",
"wineSearcherUrl": "https://www.wine-searcher.com/find/sample/2015",
"wineName": "2015 Sample Wine, Pomerol, France",
"vintage": 2015,
"appellation": "Pomerol, France",
"region": "Pomerol",
"origin": "Pomerol, France",
"grapeVariety": "Merlot",
"producer": "Sample Producer",
"beverageType": "Wine",
"style": "Red - Savoury and Classic",
"description": "Short producer or wine description text.",
"labelImageUrl": "https://www.wine-searcher.com/images/labels/00/00/000000000.jpg",
"score": 97,
"scoreBestRating": 100,
"criticReviewsCount": 20,
"criticReviews": [
{
"author": "Sample Critic",
"score": 95,
"bestRating": 100,
"tastingNote": "Tasted January 2018."
}
],
"avgPrice": 5076,
"avgPriceCurrency": "EUR",
"cheapestPriceAmount": 3400,
"cheapestPriceCurrency": "EUR",
"cheapestPriceMerchant": "Sample Merchant",
"cheapestPriceMerchantUrl": "https://www.wine-searcher.com/out/0000",
"bottlesPerUnit": 1,
"offers": [
{
"price": 3400,
"priceCurrency": "EUR",
"merchant": "Sample Merchant",
"merchantUrl": "https://www.wine-searcher.com/out/0000",
"unitDescription": "Bottle (750ml)",
"bottlesPerUnit": 1,
"availability": "InStock",
"itemCondition": "NewCondition",
"priceValidUntil": "2026-12-31"
}
],
"offersCount": 13,
"highestPriceAmount": 4500,
"highestPriceCurrency": "EUR",
"medianPriceAmount": 3800,
"merchantCount": 11,
"wineryName": "Sample Producer",
"searchLocation": "France",
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Wine merchants and retailers: benchmark your prices against average and cheapest market prices for the same vintage.
- Sommeliers and collectors: look up critic scores, tasting notes, and provenance details before buying or listing a bottle.
- Cellar and portfolio valuation: resolve a list of LWIN codes to current average and market prices for a valuation report.
- Market analysts: track price spread across regions and currencies for a set of wines over time.
- Auction houses and wine funds: verify critic scores and merchant offer counts before quoting a lot.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Wine-Searcher Scraper return?
The documented output for Wine-Searcher Scraper includes wine, vintage, appellation, region, grape, style, critic score and # critic reviews. Availability of each field depends on the source page and the selected mode.
How much does Wine-Searcher Scraper cost?
It costs $2.70 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Why did my run fail instead of returning an empty dataset?
A run fails when it returns no wines at all and at least one lookup could not be reached, for example because every connection attempt was refused. That is a connection problem, not a real answer, so it is reported as a failure rather than a silent empty dataset. If at least one wine is returned, or every lookup was read but simply had no matching page on Wine-Searcher (a misspelled name, a bad URL, or an unknown LWIN code), the run succeeds; unmatched items are logged as not found and are not written to the dataset.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.
