Vivino region scraper: wine ratings and prices
Pricing
from $3.00 / 1,000 results
Vivino region scraper: wine ratings and prices
Explore Vivino by region or producer and extract every wine on the page: wine ratings, number of ratings, prices, vintages and full taste profiles. Use it to build a wine list, run market research, track a cellar or compare producers. Export to JSON, CSV or Excel. By MrBridge (mr-bridge.com)
Pricing
from $3.00 / 1,000 results
Rating
5.0
(1)
Developer
MrBridge
Maintained by CommunityActor stats
0
Bookmarked
98
Total users
5
Monthly active users
5 days ago
Last modified
Categories
Share
Vivino Wine Scraper
Scrape wine data at scale from Vivino (60M+ users, 12M+ wines). No browser, no account, no API key. HTTP only.
Filter by region (299 appellations, 31 countries), producer, grape, price or rating. Get ratings, prices, taste profiles and year-by-year vintages in JSON, CSV or Excel.

Which wine scraper should I use?
| Need | Best scraper | What it does |
|---|---|---|
| Browse wines by region (Bourgogne, Italy, Napa...) | Vivino Wine Scraper (this one) | Scrape any region, grape, or producer; ratings, prices, taste profiles, vintages |
| Look up specific wines by name or URL | Vivino Wine Data Scraper | Search Vivino by wine name or paste Vivino URLs |
| Critic ratings (Parker, Spectator, Decanter...) | Millesima Wine Scraper | Prices + scores from 18 major critics |
| Grape popularity, scores & prices | Wine-Searcher Grape Scraper | Popularity, critic scores & prices by grape variety on Wine-Searcher |
| Popularity, scores & prices for a known wine list | Wine-Searcher Scraper from List | Wine-Searcher data by wine name, URL or LWIN code |
In short: use this actor to discover wines in a region; use the Vivino Wine Data Scraper when you already know which wines you want.
At a glance: input form
Five primary filters at the top of the form, followed by six dedicated sections. Just pick what you need and click Start.
┌──── PRIMARY FILTERS ──────────────────────────────────────│ Wine Region ▸ Bourgogne ▾ (299 options)│ Wine Type ▸ White ▾ (Red, White, Sparkling…)│ Grape Variety ▸ All Grapes ▾ (21 options)│ Producer / Winery ▸ (text input, partial match)│ Maximum Wines ▸ 100 (default; up to 10 000)│├──── ▾ Rating Range ────────────── filter wines by rating│ Minimum Rating ▸ 3.5│ Maximum Rating ▸ 5.0│├──── ▾ Price Range ─────────────── filter wines by price│ Minimum Price ▸ (empty = no minimum)│ Maximum Price ▸ (empty = no maximum)│├──── ▾ Regional Settings ───────── country & currency for prices│ Market Country ▸ France ▾ (15 markets)│ Currency ▸ EUR ▾ (8 currencies)│├──── ▾ Output Settings ─────────── sorting order│ Sort By ▸ Highest Rated ▾│ Sort Order ▸ Descending ▾│├──── ▾ Vintage Analysis ────────── year-by-year ratings (slower)│ Include All Vintages [ ]│ Vintage Start Year 2005│└──── ▾ Advanced ────────────────── developer optionsDebug Mode [ ]
→ See Input Parameters below for the full reference.
Why use this scraper?
Vivino lists 60M+ users and 12M+ wines. Use this scraper for:
- Market research: analyze wine trends, pricing, and consumer preferences
- Inventory monitoring: track ratings and popularity for your wine selection
- Investment analysis: monitor vintage ratings for fine wine investments
- Producer comparison: compare producers and regions side by side
- Cellar tracking: build a database of highly-rated wines to taste
Key features
Pick filters in the UI
No coding required. Pick filters from dropdown menus and click Start.
Filters available
| Filter | Description |
|---|---|
| Region | 299 wine regions across 31 countries: France, Italy, Spain, Portugal, Germany, USA, Argentina, Australia... |
| Sub-regions | Drill down to specific appellations: Meursault, Pauillac, Barolo, Napa Valley, Rioja Alta, and more |
| Wine Type | Red, White, Sparkling, Rosé, Dessert, Fortified |
| Grape Variety | 21 varietals: Pinot Noir, Chardonnay, Cabernet Sauvignon, Syrah, Nebbiolo, Tempranillo... |
| Producer | Search by winery name (partial match supported) |
| Rating | Filter by minimum/maximum Vivino rating (1-5 stars) |
| Price | Set price range in your preferred currency |
Vintage analysis
Enable "Include All Vintages" to get ratings for every vintage year of each wine. Useful for:
- Tracking vintage quality variations
- Finding the best years for a specific wine
- Investment-grade wine analysis
Includes wines without prices
Unlike other scrapers that only return wines with marketplace listings, this scraper uses Vivino's winery API to include all wines, even those not currently for sale.
Built by MrBridge
MrBridge builds and maintains this scraper. Full details on this scraper on MrBridge, or explore the MrBridge scraper catalog. Curious how consumer and critic scores diverge? Our Consumer vs Critic 2026 study digs into 266 wines.
Input parameters
The input form mirrors the Apify console UI: five primary filters at the top, followed by six grouped option sections.
Primary Filters
| Parameter | Type | Default | Description |
|---|---|---|---|
region | Select | All Regions | Wine region or appellation; 299 regions across 31 countries with sub-regions for France, Italy, and Spain |
wineType | Select | All Types | Red, White, Sparkling, Rose, Dessert, or Fortified |
grape | Select | All Grapes | Grape variety; 21 options: Pinot Noir, Chardonnay, Cabernet Sauvignon, Syrah, Nebbiolo, Tempranillo, and more |
wineryName | Text | - | Producer/winery name. Examples: Coche-Dury, Romanee-Conti, Rayas. Partial match supported. |
maxWines | Number | 100 | Maximum wines to scrape (1-10,000). Throughput depends on the region, so keep the total within your run timeout. |
Rating Range
Filter wines by rating (optional)
| Parameter | Type | Default | Description |
|---|---|---|---|
minRating | Number | 3.5 | Minimum Vivino rating (1–5 stars) |
maxRating | Number | 5 | Maximum Vivino rating (1–5 stars) |
Price Range
Filter wines by price (optional)
| Parameter | Type | Default | Description |
|---|---|---|---|
priceRangeMin | Number | - | Minimum price in selected currency |
priceRangeMax | Number | - | Maximum price in selected currency |
Regional Settings
Configure country and currency for prices
| Parameter | Type | Default | Description |
|---|---|---|---|
countryCode | Select | France | Country for price availability and currency conversion |
currencyCode | Select | EUR | Currency for displaying prices |
Output Settings
Configure sorting order
| Parameter | Type | Default | Description |
|---|---|---|---|
orderBy | Select | Highest Rated | Sort by rating, popularity, price, or discount |
order | Select | Descending | Descending (highest first) or ascending (lowest first) |
Vintage Analysis
Enable to get year-by-year ratings for each wine
| Parameter | Type | Default | Description |
|---|---|---|---|
includeAllVintages | Checkbox | No | Fetch ratings for all vintage years per wine. Creates one row per vintage. Significantly slower, but useful for investment analysis. |
vintageStartYear | Number | 2005 | Start year for vintage scanning (min: 1970) |
Advanced
Developer options
| Parameter | Type | Default | Description |
|---|---|---|---|
debug | Checkbox | No | Enable verbose logging for troubleshooting |
Output data
Each wine record includes:
{"wineName": "Meursault Blanc","wineryName": "Domaine Coche-Dury","vintageYear": 2019,"fullName": "Domaine Coche-Dury Meursault Blanc 2019","rating": 4.6,"ratingsCount": 245,"price": 450,"priceStatus": "available","regionName": "Meursault","wineType": "White","isNatural": false,"sweetness": 1.8,"tannin": null,"imageUrl": "https://images.vivino.com/thumbs/..._375x500.jpg","wineUrl": "https://www.vivino.com/meursault-blanc/w/85904","vintageUrl": "https://www.vivino.com/domaine-coche-dury-meursault-blanc/v/2019","wineId": 85904,"vintageId": 12345678,"wineryId": 11620,"regionId": 2246,"countryName": "France","currency": "EUR","acidity": 3.2,"intensity": 3.7,"fizziness": null,"tasteProfile": [{"group": "earth","count": 35,"primaryKeywords": [{ "name": "minéraux", "count": 18 },{ "name": "cuir", "count": 8 }],"secondaryKeywords": [{ "name": "vanille", "count": 3 }]},{"group": "citrus_fruit","count": 34,"primaryKeywords": [{ "name": "citron", "count": 18 },{ "name": "agrume", "count": 10 }],"secondaryKeywords": []}],"scrapedAt": "2026-04-06T12:00:00.000Z"}
Every wine row carries the fields below. The Output tab documents each one with its type and an example, and that page is the reference if this list ever drifts.
- Identity:
wineName,wineryName,fullName,vintageYear,wineUrl,vintageUrl,imageUrl,wineId,vintageId,wineryId,regionId - Region:
regionName,countryName,wineType,isNatural - Market:
price,currency - Ratings:
rating,ratingsCount - Taste structure:
sweetness,tannin,acidity,intensity,fizziness - Taste profile:
tasteProfile(flavor groups with primary/secondary keywords and mention counts) - Metadata:
scrapedAt
Vintage mode (includeAllVintages: true) produces one row per vintage year, each with its own rating and ratingsCount. vintageYear is the canonical year field and is filled in both modes. Vintage rows additionally carry year, a historical alias kept so existing integrations do not break.
Why some wines have no price
Vivino publishes a price only where a merchant is actually offering that wine on the market you selected. On mainstream regions almost everything is priced. On rare or allocated regions most of the top wines are not for sale anywhere, so most rows come back without one.
Every row therefore carries a priceStatus field, so you never have to guess why a price is missing:
priceStatus | Meaning | price |
|---|---|---|
available | A merchant offers this wine on the selected market | a number |
no_offer | The lookup succeeded and no merchant offers it on that market | null |
retrieval_failed | The price could not be determined reliably, so absence must not be assumed | null |
A row without a price still carries the wine, its producer, region, type, rating, review count, and the taste structure and flavour profile when Vivino provides them.
The run summary reports the split, so an integration can check coverage without parsing the log:
{"totalWines": 50,"winesWithPrice": 2,"winesWithoutOffer": 46,"priceRetrievalFailures": 2,"priceFillRate": 0.04}
winesWithPrice + winesWithoutOffer + priceRetrievalFailures always equals totalWines, and the counts are on unique wines, not on vintage rows. When fewer than half the wines carry a price, the run status message says so in plain language.
Choosing a market matters. The countryCode field decides which offers exist. A wine with no merchant in that country stays unpriced whatever currency you pick.
Usage examples
Example 1: top Burgundy white wines
Find the best-rated white Burgundy wines:
{"region": "bourgogne","wineType": "white","minRating": 4.2,"maxWines": 200}
Example 2: specific producer with all vintages
Get all wines and vintages from Domaine de la Romanée-Conti:
{"wineryName": "Romanee-Conti","includeAllVintages": true,"maxWines": 50}
Example 3: affordable Châteauneuf-du-Pape
Find value wines under €50:
{"region": "chateauneuf-du-pape","minRating": 4.0,"priceRangeMax": 50,"orderBy": "ratings_average","maxWines": 100}
Example 4: Pinot Noir comparison
Compare Pinot Noir across regions:
{"grape": "pinot-noir","minRating": 4.0,"maxWines": 500,"orderBy": "ratings_count"}
Supported regions (299 regions, 31 countries)
The full list is available in the Wine Region dropdown in the Apify console. Coverage by country:
| Country | Regions | Examples |
|---|---|---|
| France | 101 | Bourgogne (Meursault, Puligny-Montrachet, Vosne-Romanée…), Bordeaux (Margaux, Pauillac, Saint-Émilion, Pomerol…), Rhône (Châteauneuf-du-Pape, Côte-Rôtie, Hermitage…), Loire, Champagne, Beaujolais, Alsace, Provence, Languedoc, Jura, Corse |
| Italy | 64 | Piemonte (Barolo, Barbaresco…), Toscana (Brunello di Montalcino, Chianti Classico, Bolgheri…), Veneto (Amarone, Prosecco, Soave), Sicilia (Etna), Lombardia (Franciacorta), Campania, Puglia, Umbria, Friuli |
| Spain | 35 | Rioja, Ribera del Duero, Priorat, Cava, Navarra, Rías Baixas, Jerez |
| Portugal | 9 | Douro, Porto, Alentejo, Dão, Vinho Verde, Madeira |
| Germany | 9 | Mosel, Rheingau, Pfalz, Rheinhessen, Nahe |
| Austria | 7 | Wachau, Kamptal, Burgenland |
| USA | 11 | Napa Valley, Sonoma County, Willamette Valley, Paso Robles, Russian River Valley |
| Argentina | 6 | Mendoza, Uco Valley, Salta, Patagonia |
| Chile | 8 | Maipo Valley, Colchagua Valley, Casablanca Valley |
| Australia | 10 | Barossa Valley, McLaren Vale, Margaret River, Yarra Valley, Hunter Valley |
| New Zealand | 5 | Marlborough, Central Otago, Hawke's Bay |
| South Africa | 8 | Stellenbosch, Swartland, Franschhoek, Hemel-en-Aarde |
| Greece | 5 | Santorini, Naoussa, Nemea |
| + 19 more countries | 21 | Hungary, Georgia, Lebanon, Croatia, Israel, Slovenia, Canada, Brazil, Uruguay, Mexico, UK, Romania, Bulgaria, Moldova, Turkey, Japan, Morocco, India |
France, Italy and Spain include sub-region drill-down (Bourgogne → Meursault, Piemonte → Barolo, Rioja → Rioja Alta…). Selecting a parent region automatically includes its sub-regions.
Pricing
This scraper uses Apify's pay-per-event billing. Two events are charged:
- One result row, one
apify-default-dataset-itemevent. Every wine written to the dataset is one billable row. In vintage mode each vintage year is its own row, so one wine typically produces 10 to 20 rows. - A small
apify-actor-startevent at run start. Apify charges it automatically, and the number of events depends on the memory allocated to the run.
You pay for data delivered to the dataset, not for compute time. Errors are written to the key-value store rather than the dataset, so failed requests are never billed.
Event prices depend on your Apify plan, and they get lower on higher plans. Because of that, no fixed per-row figure is quoted here, and any figure copied into a README goes stale the moment pricing moves.
The pricing tab is the single source of truth for the current prices on your plan. Check it there before planning a large run, and use the max cost per run field to cap what a run can spend.
Speed
- Standard mode: fast on regions where most wines are offered for sale, several times slower where they are not, because each unpriced wine costs an extra lookup.
- Vintage mode: slower, and highly variable. Each wine triggers one request per candidate year from
vintageStartYearonward, with an early stop once Vivino stops returning data. A wine with a long review history costs far more requests than a recent one, so sizemaxWinesagainst your run timeout rather than against a fixed rate.
Export formats
Download your data in multiple formats:
- JSON: for developers and APIs
- CSV: for Excel and spreadsheets
- Excel: direct .xlsx export
- XML: for legacy systems
Integrate into your workflow
This actor runs on Apify and integrates natively with popular automation platforms and programming languages.
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-powerful-scraper/run-sync-get-dataset-items" \-X POST \-H "Content-Type: application/json" \-H "Authorization: Bearer YOUR_APIFY_TOKEN" \-d '{"region": "bourgogne","wineType": "white","minRating": 4.0,"maxWines": 100}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('mrbridge/vivino-powerful-scraper').call({region: 'bourgogne',wineType: 'white',minRating: 4.0,maxWines: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} wines`);
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("mrbridge/vivino-powerful-scraper").call(run_input={"region": "bourgogne","wineType": "white","minRating": 4.0,"maxWines": 100,})for wine in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{wine['fullName']} - {wine['rating']}★ - {wine.get('price', 'N/A')} {wine.get('currency', '')}")
Scheduled runs: automated market monitoring
Set up a schedule in the Apify Console to track regional wine data over time:
- Create a Task with your saved input (region, filters, settings)
- Go to the Schedules tab → Create schedule
- Set a cron expression, e.g.
0 2 * * 1for every Monday at 2 AM UTC
| Schedule | Cron expression | Use case |
|---|---|---|
| Every Monday | 0 2 * * 1 | Weekly regional price report |
| 1st of month | 0 0 1 * * | Monthly market snapshot |
| Daily at 6 AM | 0 6 * * * | Active trading desk |
Webhooks: push results to your system
Get notified when a run completes. No polling needed:
- Go to the actor's Integrations tab in the Apify Console
- Select event: Run succeeded
- Enter your endpoint URL
- Apify sends a POST request with the
datasetIdand run metadata
No-code integrations
Connect this actor to your tools without writing code:
| Platform | What it does | Setup |
|---|---|---|
| Google Sheets | Export wine data to a Google Sheet automatically | Integrations tab → Google Drive |
| Airtable | Sync wines to an Airtable base with field mapping | Integrations tab → Airtable |
| Zapier | Trigger Zaps on run completion → push to 5,000+ apps | Apify Zapier connector |
| Make | Visual workflows: scrape → transform → insert into DB | Apify Make module |
| n8n | Self-hosted workflow automation with Apify trigger node | Apify n8n community node |
For Zapier, Make and n8n setup, see the Apify Integrations docs. Actor ID for run-actor steps: onpKx0FzTy6OfOjXg.
Tips for best results
- Use region filters when searching for specific producers; speeds up the search significantly.
- Start with smaller
maxWinesto test filters before large scrapes. - Enable
includeAllVintagesonly when you need year-by-year data. Slower, but unique signal. - Combine filters for precise results: region + grape + rating range.
- Use
debugmode to see detailed logs if results look unexpected.
Limitations
- Vivino's API may rate-limit requests during high-traffic periods
- Some wines without user reviews may not have rating data
- Vintage data is limited to years with actual user reviews on Vivino
- Price data exists only where a merchant offers the wine on the market you selected, which is what
priceStatusreports on every row
FAQ
How much does it cost per wine?
Billing is pay-per-event: one apify-default-dataset-item event per result row, plus a small apify-actor-start event when the run starts. Event prices depend on your Apify plan and get lower on higher plans, so the pricing tab is the source of truth for what a row costs you. Note that vintage mode bills one row per vintage year, not one per wine.
Is it legal to scrape Vivino?
Yes, scraping publicly available data is legal in most jurisdictions, as confirmed by the 2022 US Ninth Circuit ruling in hiQ Labs v. LinkedIn. This scraper only reads pages any visitor can see without logging in. No private user data is collected. Review Apify's web scraping legality guide and ensure your specific use case complies with Vivino's Terms of Service and applicable laws (GDPR if you store review text from EU users).
Can I use this scraper via MCP?
This Actor is a scraper, not an MCP server: it runs, returns a dataset and exits. To use Vivino data inside an MCP workflow, call it through the standard Apify MCP integration by adding mrbridge/vivino-powerful-scraper to your client config.
How many wines should I ask for?
The form is prefilled with 5 for a quick, low-cost first run. The field default is 100, chosen so a run completes well inside the default one-hour timeout. The ceiling is 10,000. Throughput varies a lot by region, because every wine the market cannot price costs an extra lookup, so size the number against your run timeout rather than against a fixed rate. Vintage analysis multiplies rows per wine on top of that.
Can I scrape wines that aren't currently for sale?
Yes, and they are billed like any other row because they carry the same twenty-odd fields. The price field is null and priceStatus says no_offer. If instead it says retrieval_failed, the price could not be read reliably and absence should not be assumed.
What happens if Vivino rate-limits me?
The scraper handles rate limits with exponential backoff and retries. Sustained 429 errors cause the run to exit gracefully (always SUCCEEDED) with whatever data was already collected. Lower the concurrency or run during off-peak hours if you hit limits repeatedly.
Legal disclaimer
This scraper is intended for personal use, research, and legitimate business purposes. Please respect Vivino's terms of service and rate limits. The data scraped belongs to Vivino and its users.
Support & feedback
- Issues: report a bug or request a feature on the Issues tab of this Actor
- Questions: contact us through Apify support