Vivino Wine Data Scraper: ratings, prices & taste profiles avatar

Vivino Wine Data Scraper: ratings, prices & taste profiles

Pricing

from $2.00 / 1,000 wine result extracteds

Go to Apify Store
Vivino Wine Data Scraper: ratings, prices & taste profiles

Vivino Wine Data Scraper: ratings, prices & taste profiles

Extract wine ratings, prices, taste profiles, reviews, and grape varieties from Vivino. Search by wine name or URL. Fast HTTP-only approach with no browser needed. Export JSON, CSV, or Excel.

Pricing

from $2.00 / 1,000 wine result extracteds

Rating

4.9

(7)

Developer

MrBridge

MrBridge

Maintained by Community

Actor stats

4

Bookmarked

184

Total users

41

Monthly active users

3 days ago

Last modified

Share

What does Vivino Wine Data Scraper do?

Vivino Wine Data Scraper is an Apify Actor that extracts structured wine data from Vivino, the world's largest wine marketplace with 60M+ users. Provide a mix of wine names and Vivino URLs; the scraper auto-detects each entry and returns ratings, prices, taste profiles, reviews, and full wine details in JSON or CSV.

No browser, no Vivino account, no API key, no rate limits.

Key capabilities:

  • Mixed input, auto-routed: paste wine names (with or without vintage) and Vivino URLs in any combination
  • Taste profiles: body, acidity, tannins, sweetness, fizziness, flavor notes, food pairings
  • User reviews: up to 100 per wine with ratings, comments, and dates
  • Market-specific pricing: pick a shipping destination and currency for local prices and wine availability
  • Streaming + dedup: up to 250 wines per run, no duplicates across URLs and names
  • Pay-per-event: pay per result returned in the dataset (~$0.003 each), not compute time

Which Vivino scraper should I use?

NeedBest scraperWhat it does
Look up specific wines by name or URLVivino Wine Data Scraper (this one)Search by name or paste Vivino URLs; returns ratings, prices, taste profiles, and reviews
Browse wines by region (all wines from Bordeaux, Italy, and more)Vivino Wine ScraperBrowse and extract all wines from a region or category on Vivino

In short: use this Actor when you know which wines you want. Use the Vivino Wine Scraper when you want to discover wines in a region.

Why scrape Vivino?

With 60M+ users and 12M+ wines cataloged, Vivino is the reference dataset for wine ratings and pricing. Common uses: monitoring competitor prices across markets, building wine lists from community ratings and taste profiles, enriching e-commerce catalogs with ratings and images, and researching wine-market trends by region.

What data does this scraper extract?

Data PointDescriptionAlways included
Wine nameFull name as listed on VivinoYes
Winery / ProducerProducer nameYes
Vintage yearHarvest yearYes
Wine typeRed, White, Rosé, Sparkling, Dessert, FortifiedYes
Region & CountryWine region and country of originYes
Grape varietiesList of grape varietalsYes
Average ratingVivino community rating (1-5)Yes
Ratings countNumber of ratings on VivinoYes
PricePrice in your selected currencyWhen available*
Vivino URLDirect link to the wine pageYes
ImageWine bottle image URLWhen available*
Food pairingsRecommended food pairings (Beef, Lamb, Pasta)Yes
DescriptionWine description textYes
Alcohol contentABV percentageWhen available*
Taste profileBody, acidity, tannins, sweetness, fizziness, flavor notesOptional (off by default)
User reviewsRating, comment, date, usernameOptional (off by default)

*Availability varies by market and extraction path; missing values are null.

How to use Vivino Wine Data Scraper

  1. Open Vivino Wine Data Scraper on Apify (a free account is needed only at run time).
  2. In the Wines field, paste a mix of wine names and Vivino URLs (one per line). The scraper auto-detects each entry.
  3. Optionally adjust localization (Country Code, Currency Code, Ship To Country) for market-specific prices.
  4. Click Start. Download results from the Dataset tab in JSON, CSV, Excel, or XML.

Matching modes: Basic vs Advanced

When you search by wine name, the Actor matches your text to Vivino's catalog. The matchingMode setting controls how hard it works:

  • Basic (default) - fast and predictable. Use it when your wine names already read like Vivino: full producer name, correct spelling, optional vintage. Examples: Domaine Leflaive Puligny-Montrachet 2022, Opus One 2019. A clean catalogue export usually falls here. About 6 seconds per wine.
  • Advanced - runs the full fallback cascade for names that differ from Vivino: last-name/first-name order (Bachelet Jean Claude), an omitted & Fils, abbreviations, or a cuvée stated without its appellation. It tries extra winery-slug variants, parses producer pages, and re-searches with shortened queries to recover micro-domaine wines that Basic misses. This costs time - about 15-25 seconds per wine on hard names - so reach for it when a Basic run leaves too many NAME_SEARCH_ERROR rows.

Both modes share the same matching gates, so neither bills a wrong cuvée: an unresolved name becomes an unbilled error row, never a mismatched (billed) wine. Direct Vivino URLs ignore this setting - they always resolve to exactly one wine.

Each run is capped at 250 wines (the limit that keeps an Advanced run within the 3-hour timeout). For larger catalogues, split into ≤250-wine batches and run them in parallel via the API, Tasks, or schedules.

Input parameters

ParameterTypeDefaultDescription
winesarraysampleMixed list of Vivino URLs and wine names, max 250 per run. Auto-detected per entry.
searchModestringautoVintage handling: auto, name_and_vintage, name_only
matchingModestringbasicName-matching effort: basic (fast; names match Vivino) or advanced (full cascade for messy or divergent names). See Matching modes.
includeTasteProfilebooleanfalseFetch taste profile (body, acidity, tannins, sweetness, fizziness, flavor notes). Off by default; turn on for richer output
includeReviewsbooleanfalseFetch user reviews (increases cost)
maxReviewsPerWineinteger10Maximum reviews per wine (1-100)
shipTostring--Shipping destination country (ISO 3166-1 alpha-2). Controls wine visibility per market. Example: ES, US, FR
countryCodestringFRCountry for pricing and wine-origin filtering (ISO 3166-1 alpha-2)
currencyCodestringEURCurrency for prices (ISO 4217)
proxyConfigurationobjectoffApify proxy settings. Off by default (the Actor's own IP suits light, solo runs). A bare proxy toggle without a group simply runs on the direct IP (Vivino rejects the default datacenter pool). For real IP rotation on parallel runs, set the residential group explicitly (apifyProxyGroups: ["RESIDENTIAL"]). Residential is premium paid bandwidth, so reserve it for heavy or parallel runs.

Example input

{
"wines": [
"Château Margaux 2015",
"https://www.vivino.com/cloudy-bay-sauvignon-blanc/w/18978",
"Opus One",
"Penfolds Grange 2018",
"Dom Pérignon"
],
"includeTasteProfile": true,
"includeReviews": false,
"shipTo": "FR",
"countryCode": "FR",
"currencyCode": "EUR"
}

Output format

Each wine produces one dataset item. The structure:

{
"wineId": 13548,
"vintageId": 167890,
"vivino_url": "https://www.vivino.com/chateau-margaux-margaux/w/13548?year=2015",
"name": "Chateau Margaux Margaux",
"winery": "Chateau Margaux",
"vintage": 2015,
"wine_type": "Red",
"region": "Margaux",
"country": "France",
"appellation": "Margaux",
"grape_varieties": ["Cabernet Sauvignon", "Merlot"],
"food_pairings": ["Beef", "Lamb", "Game (deer, venison)"],
"alcohol": 13.5,
"wine_description": "A powerful, structured Left Bank red with dark fruit and fine tannins.",
"average_rating": 4.6,
"ratings_count": 312,
"wine_average_rating": 4.5,
"wine_ratings_count": 12345,
"price": 450.0,
"currency": "EUR",
"merchant_url": "https://www.vivino.com/merchant/...",
"is_natural": false,
"image_url": "https://images.vivino.com/thumbs/chateau-margaux_pl_480x640.png",
"label_image_url": "https://images.vivino.com/thumbs/chateau-margaux_pl_375x500.png",
"taste_profile": {
"body": 4.2,
"acidity": 3.8,
"tannins": 4.5,
"sweetness": 1.1,
"fizziness": null,
"flavor_notes": ["black fruit", "oak", "spices", "earth", "tobacco"]
},
"reviews": [
{
"rating": 4.5,
"note": "Excellent wine with deep fruit flavors and a long finish.",
"created_at": "2024-03-15T10:30:00.000Z",
"user_name": "WineLover42",
"vintage_year": 2015
}
],
"scrapedAt": "2026-03-03T12:00:00.000Z",
"inputSource": "url",
"searchQuery": null,
"shipTo": null
}

The example above shows the common fields; each row also carries market/value fields (discounted_from, discount_percent, vfm_score, vfm_category, bottle_volume_ml, lwin, lwin_canonical) and id fields (winery_id, winery_seo_name, region_id, country_code, requested_vintage). average_rating / ratings_count are the requested vintage's figures; wine_average_rating / wine_ratings_count are the wine's all-vintages totals; any value Vivino lacks for your market is null. taste_profile is omitted when includeTasteProfile: false; reviews when includeReviews: false. inputSource is "url" or "search".

Error rows

Inputs that fail to resolve to a wine (no Vivino match, too-short query, URL parse error) still produce a dataset row, with name and winery set to "Not found" so the row is never mistaken for empty. Error rows carry two additional fields:

{
"searchQuery": "Nonexistent Wine 9999",
"inputSource": "search",
"name": "Not found",
"winery": "Not found",
"error": "NAME_SEARCH_ERROR",
"errorMessage": "No match found for \"Nonexistent Wine 9999\"",
"scrapedAt": "2026-03-03T12:00:00.000Z"
}

error is one of URL_PROCESSING_ERROR (URL could not be parsed or page fetch failed) or NAME_SEARCH_ERROR (no Vivino match, too-short query, or empty result). The default Overview view surfaces the error/errorMessage columns, and a dedicated Errors view filters to failed inputs only.

Billing of not-found rows: a name search that Vivino's own catalog confirms has no matching wine - a definitive "not on Vivino" answer (typically a non-wine query, e.g. a spirit) - is billed as one result, because the search work was performed and a conclusive answer delivered. All other error rows are never billed: a rate-limited search, an unmatched name that required the full fallback search, an invalid URL, or a fetch failure.

Alternative candidates on uncertain matches

When a wine name search is uncertain, the Actor also returns one or two alternative candidates (other cuvées from the same producer) so you can pick the right one. They are fully enriched, carry "isAlternative": true with the primary's searchQuery, expose a matchScore (higher = more confident), and are never billed - you pay only for the single primary result.

{ "searchQuery": "Domaine Leflaive Puligny Montrachet", "name": "Puligny-Montrachet Clavoillon", "matchScore": 4.34, "isAlternative": false }
{ "searchQuery": "Domaine Leflaive Puligny Montrachet", "name": "Puligny-Montrachet Les Pucelles", "matchScore": 4.34, "isAlternative": true }

Confident matches produce no alternatives. Alternatives apply to name searches only; direct URLs always resolve to one wine.

Run summary in Key-Value Store

Every run writes a JSON summary to the default Key-Value Store under last-run-summary (input counts, processed total, cache hits/misses, and resilience metrics such as rate-limit trips and charge-limit status). Useful for drift detection and capacity planning.

{
"input": { "count": 10, "urlCount": 2, "nameCount": 8, "matchingMode": "basic" },
"output": { "processed": 10 },
"cache": { "hits": 6, "misses": 14 },
"resilience": { "rateLimit429Trips": 0, "chargeLimitReached": false }
}

How much does scraping Vivino cost?

Vivino Wine Data Scraper uses a pay-per-event pricing model: no startup fee, and you are charged only per result returned in the dataset (one wine = one event, about $0.003). The $5 free monthly credit covers roughly 1,600 wines.

See the Pricing tab for the full price table by Apify subscription tier (Free, Starter, Scale, Business) - higher tiers unlock automatic discounts.

What is not charged: an unmatched name that required the full fallback search, a rate-limited search, an invalid URL, a too-short query, a fetch failure, and any alternative candidates surfaced on uncertain matches (see Output format). What is charged: each wine returned, and a catalog-confirmed not-found - a definitive "not on Vivino" answer (typically a non-wine query). If a run is stopped early on a persistent rate-limit, the wines it did not reach are returned as unbilled WATCHDOG_SKIPPED rows so you can re-run them later; you are never charged for a skipped wine.

Producer-name searches: if you search by a bare producer name with no specific wine (for example Penfolds or Domaine Leflaive), the Actor returns the producer's flagship wine plus its most popular bottlings, up to three. Each returned wine counts as one billed result. Searching for a specific wine (producer plus cuvee name) is unchanged and returns that one wine.

Cap your run cost: set ACTOR_MAX_TOTAL_CHARGE_USD in the Run options to enforce a hard ceiling per run - the Actor stops gracefully (dataset preserved) when the cap is reached.

Tips & troubleshooting

  • Include vintage years for precise matching (Chateau Margaux 2015, not Chateau Margaux).
  • Start without reviews to keep runs fast and cheap; add them later if needed.
  • Use Advanced matching when a Basic run leaves many NAME_SEARCH_ERROR rows (messy or last-name-first producer names); keep Basic for clean lists.
  • Ship To Country controls market-specific availability (ES for Spain-only listings); Country Code sets the pricing currency.
  • Proxy configuration is off by default and unneeded for light, solo runs. Enable it only when running several batches in parallel, so each rotates through different IPs instead of sharing one and hitting Vivino's 429 wall. Vivino rejects the default datacenter pool, so a bare proxy toggle (no group) just runs on the direct IP. For real rotation, choose the residential pool explicitly (apifyProxyGroups: ["RESIDENTIAL"]). Residential is premium paid bandwidth, best reserved for heavy or parallel runs.

Common issues

  • "No results found": check typos, try with or without the vintage year, or set searchMode: "name_only". Very niche or new wines may not be on Vivino.
  • Empty price: prices depend on countryCode and shipTo; try the wine's country of origin (IT for Italian wines).
  • Wrong wine returned: include the full producer name (Chateau Margaux Margaux, not Margaux) and the vintage year.
  • Rate-limited or timed out on a large list: split into ≤250-wine batches and run them in parallel; enable proxy for IP rotation across concurrent runs.

Integrate into your workflow

Send results to Google Sheets, Airtable, your database, or your own API.

API integration

Call this Actor programmatically using the Apify API. Get your API token from Settings → Integrations.

cURL:

curl "https://api.apify.com/v2/acts/mrbridge~vivino-wine-data-scraper/run-sync-get-dataset-items" \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-d '{
"wines": ["Chateau Margaux 2015", "Opus One 2019"],
"includeTasteProfile": true
}'

Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('mrbridge/vivino-wine-data-scraper').call({
wines: ['Chateau Margaux 2015', 'Opus One 2019'],
includeTasteProfile: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

(Python and other languages: use the Apify API client the same way.)

Export formats, schedules, webhooks

  • Export: append ?format=json|csv|xlsx|xml to the dataset URL; filter with ?fields=name,average_rating,price or ?omit=reviews,image_url.
  • Schedules: save a Task, then set a cron expression in the Schedules tab (e.g. 0 8 * * 1 for Mondays at 8 AM UTC) for recurring price tracking.
  • Webhooks: on "Run succeeded", receive datasetId and run metadata at your endpoint - no polling.

No-code integrations

PlatformWhat it does
Google SheetsExport wine data to a sheet automatically
AirtableSync wines to a base with field mapping
ZapierTrigger Zaps on run completion → push to 5,000+ apps
MakeVisual workflows: scrape → transform → insert into DB
n8nSelf-hosted workflow automation with the Apify trigger node

Setup for each: see the Apify Integrations docs. Actor ID for run-actor steps: qRSfN5MBLbaEbSU6n.

FAQ

Does Vivino have an official API? No, Vivino does not provide a public API. This scraper uses Vivino's internal endpoints to extract data.

How fast is the scraper? By URL or with Basic matching, expect ~30-50 wines per minute. With reviews and shipTo enabled, throughput drops to ~5-10 per minute. Advanced matching runs at ~15-25 seconds per hard name. Vivino's rate limiting can slow large batches; the scraper retries and cools down automatically.

Can I scrape large volumes? Yes. Deduplication is automatic within a run. Each run accepts up to 250 wines; for larger catalogues, split into ≤250-wine batches and run them in parallel or on a schedule.

What if a wine is not found? The scraper logs a warning and continues with the next wine. Check for typos or try with or without the vintage year.

Can I use this scraper via MCP? Yes, via the standard Apify MCP integration - add mrbridge/vivino-wine-data-scraper to your MCP client (Claude Desktop, Cursor, and more). It runs as a tool inside Apify's catalog-wide MCP server, not its own endpoint.

What regions and countries are supported? All wines on Vivino are supported worldwide. Use the Country Code setting (e.g. FR, US, GB, DE, IT) to get prices in your local market.

Is my data stored? Results stay in your Apify dataset for 31 days (default retention), fully under your control. No wine data is shared with third parties, no Vivino account or personal data is involved, and requests are stateless and GDPR-compliant.

Scraping publicly available data is generally legal (see the 2022 hiQ Labs v. LinkedIn ruling). This scraper only reads pages any visitor can see on Vivino.com without logging in, and never touches private user data or paid features. Review Apify's legality guide and ensure your use case complies with Vivino's Terms of Service and applicable laws (GDPR, especially if you store review text from identifiable users).

Provided as-is for personal and commercial use; not affiliated with or endorsed by Vivino.

Your feedback

We're always working on improving the performance of this Actor. If you have technical feedback for Vivino Wine Data Scraper or simply found a bug, please create an issue on the Actor's Issues tab on Apify Console.

For faster support on matching problems: include your run ID in the issue, and consider enabling Settings → Login & Privacy → Share run data with developers in your Apify account - it lets the maintainer open your run directly (input, log, results) and diagnose a wrong or missing match in minutes instead of guesswork. You can turn the setting off again at any time.

More free wine-data tools and studies at mr-bridge.com.

Related Actors: Vivino Wine Scraper (browse wines by region), Millesima Wine Scraper (wine prices and critic ratings), Wine-Searcher Scraper from List (popularity, critic scores, prices from Wine-Searcher).