Vivino Wine Data Scraper
Pricing
Pay per event
Vivino Wine Data Scraper
🍷 Export public Vivino wine vintages, ratings, taste profiles, ranks, merchant prices, discounts, bottle details, and availability for analysis or monitoring.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Turn public Vivino pages into structured wine, vintage, rating, taste, rank, price, and merchant data.
Use the Actor for one wine lookup, a catalog export, or a scheduled price and reputation snapshot.
It accepts public Vivino listing, search, explore, and wine-detail URLs.
The output is ready for JSON, CSV, Excel, APIs, webhooks, data warehouses, and Apify integrations.
What does Vivino Wine Data Scraper do?
Vivino Wine Data Scraper follows the URLs you provide and saves one dataset record per wine vintage or merchant offer.
It can:
- 🍷 identify wines, vintages, wineries, regions, and countries;
- ⭐ collect ratings, rating counts, review counts, and label counts;
- 🏆 capture global, country, region, winery, and wine-type ranks;
- 👃 extract taste structure, flavor groups, grapes, and food pairings;
- 💶 collect merchant prices, currencies, discounts, and bottle sizes;
- 📦 expose inventory and bottles-sold values when Vivino publishes them;
- 🔗 preserve canonical Vivino and merchant source URLs;
- 📅 produce repeatable snapshots for monitoring workflows.
The scraper reads anonymous server-rendered page data.
No Vivino account or private API key is required for public pages.
Who is it for?
Wine retailers and distributors
Compare assortment, merchant prices, bottle formats, and visible inventory across selected catalogs.
Wineries and brand teams
Track rating volume, review volume, rank movement, taste positioning, and merchant availability for your wines.
Market researchers
Build structured samples by region, vintage, winery, style, grape, rating, or price.
Collectors and buyers
Export current offers for a shortlist instead of checking many product pages manually.
Data and BI teams
Feed normalized wine records into dashboards, databases, spreadsheets, and recurring alert pipelines.
Why use this Vivino scraper?
Manual comparison is slow because wine identity, reputation signals, and merchant offers appear in different parts of a page.
This Actor flattens those signals into a consistent row shape.
Key benefits include:
- URL-first inputs that are easy to verify;
- one schema for direct detail and discovered listing results;
- stable vintage-and-price deduplication;
- typed numbers instead of formatted text;
- conservative request sequencing and retries;
- optional Apify Proxy configuration for geographic catalogs;
- explicit failure when every input yields no useful record.
What Vivino data can you extract?
| Group | Fields |
|---|---|
| Wine identity | wineId, wineName, wineType, style |
| Vintage | vintageId, vintageName, year |
| Winery | wineryId, wineryName |
| Origin | regionId, regionName, countryCode, countryName |
| Reputation | rating, ratingsCount, reviewsCount, labelsCount |
| Taste | acidity, fizziness, intensity, sweetness, tannin, flavor groups |
| Pairing | grapes, foodPairings |
| Rankings | wine and vintage global/country/region/winery ranks |
| Top lists | topListRank, topListName |
| Offer | priceId, price, discountedFrom, currency |
| Bottle | bottle name, volume, inventory, bottles sold |
| Merchant | merchant ID, name, country, and destination URL |
| Traceability | image, canonical URL, source URL, scrape timestamp |
Fields are omitted when Vivino does not publish them for a particular wine or market.
How much does it cost to scrape Vivino wine data?
The Actor uses pay-per-event pricing.
A run has a small start event and a result event for each dataset row.
The current source package uses:
- Actor start: $0.005 per run;
- BRONZE wine-offer result: $0.00014208 per saved row;
- lower per-row rates on higher Apify plans.
For example, a five-row BRONZE test is about $0.00571 in Actor events, excluding your Apify platform usage.
The exact live prices appear in the Actor pricing tab and are authoritative.
Use a small maxItems value before scaling a new source URL.
How to scrape Vivino in 4 steps
- Open the Actor input page.
- Add one or more public Vivino listing, search, explore, or wine-detail URLs.
- Choose the maximum number of wine offers and listing pages.
- Click Start and export the default dataset when the run finishes.
The prefilled example extracts a small set from one public wine detail URL.
Input parameters
| Parameter | Type | Default | Purpose |
|---|---|---|---|
startUrls | array | required | Public Vivino sources to process |
maxItems | integer | 5 | Maximum dataset rows |
maxPages | integer | 2 | Maximum listing/search pages |
includeOffers | boolean | true | Emit all visible merchant offers |
proxyConfiguration | object | direct | Optional Apify Proxy routing |
maxPages applies to listing and search pagination.
Wine detail requests do not consume that page limit.
Supported Vivino URLs
Supported inputs include:
- locale home or catalog pages such as
https://www.vivino.com/en/; - public search result URLs copied from Vivino;
- public explore URLs copied from Vivino;
- canonical wine paths containing
/w/<wine-id>; - vintage URLs with a
yearquery parameter; - offer URLs with a
price_idquery parameter.
Only vivino.com hosts are accepted.
External domains fail validation before scraping begins.
Example input
{"startUrls": [{"url": "https://www.vivino.com/en/it-s-cristina-lugana-lugana-white-wine-v/w/1127731?year=2024"}],"maxItems": 5,"maxPages": 1,"includeOffers": true,"proxyConfiguration": {"useApifyProxy": false}}
Set includeOffers to false when one representative vintage row is enough.
Example output
{"wineId": 1127731,"wineName": "Lugana","vintageId": 179467428,"vintageName": "S. Cristina Lugana 2024","year": 2024,"wineType": "White wine","wineryName": "S. Cristina","regionName": "Lugana","countryName": "Italy","rating": 4.1,"ratingsCount": 808,"reviewsCount": 170,"grapes": ["Turbiana"],"price": 16.5,"currency": "EUR","merchantName": "Weinzeche Handelsgesellschaft mbH","bottle": "Bottle (0.75l)","canonicalUrl": "https://www.vivino.com/en/it-s-cristina-lugana-lugana-white-wine-v/w/1127731?year=2024","scrapedAt": "2026-07-18T04:32:43.451Z"}
Live values vary by visitor market and scrape time.
Detail pages and merchant offers
A detail page may expose several merchants and several prices.
With includeOffers: true, the Actor emits a row for each unique vintage-and-price combination until maxItems is reached.
Wine-level fields repeat across those rows so each export row remains self-contained.
With includeOffers: false, the Actor emits one representative row for the vintage.
This makes the same Actor useful for both reputation datasets and price comparison datasets.
Catalog and search workflows
Listing and search pages are discovery sources.
The Actor extracts public /w/<id> links, visits each detail page, and enriches it with structured vintage data.
Use a search URL when you want a narrow product universe.
Use a home or catalog URL for a broad sample.
Use explicit detail URLs for stable watchlists.
Price and reputation monitoring
For recurring intelligence:
- Save a task with a stable list of wine or catalog URLs.
- Keep
maxItemsaligned with the expected catalog size. - Schedule the task daily or weekly.
- Store each run in your warehouse or spreadsheet.
- Compare
price,rating,ratingsCount, ranks, and inventory over time.
The scrapedAt field identifies each observation time.
Data quality and deduplication
Rows are deduplicated by vintage ID and price ID when those identifiers are available.
The Actor uses canonical detail URLs without offer-specific price_id parameters for stable comparison.
Numeric source values remain numbers.
Missing optional values are omitted rather than filled with invented defaults.
A run fails instead of reporting success with an empty dataset when no useful wine can be extracted.
Tips for reliable runs
- Start with one known public detail URL.
- Keep the first run at five items or fewer.
- Copy complete URLs from your target Vivino locale.
- Use explicit detail URLs for critical watchlists.
- Increase
maxPagesonly when the listing is paginated. - Enable Apify Proxy if direct requests are blocked from your execution geography.
- Keep concurrency conservative when running many separate tasks.
- Recheck source coverage after Vivino redesigns a page.
Apify integrations
Google Sheets
Send finished dataset rows to a sheet used by purchasing, sales, or category teams.
Webhooks
Trigger a downstream comparison job when a run succeeds.
Make
Schedule a task, filter changed prices, and route alerts to email or chat.
Zapier
Create lightweight notifications from new wine-offer rows.
Slack
Post rating milestones, newly visible merchants, or price decreases to a channel.
Data warehouses
Load datasets into BigQuery, Snowflake, PostgreSQL, or another analytical store.
Run with the Apify API using Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/vivino-wine-data-scraper').call({startUrls: [{ url: 'https://www.vivino.com/en/it-s-cristina-lugana-lugana-white-wine-v/w/1127731?year=2024' }],maxItems: 5,maxPages: 1,includeOffers: true});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Run with the Apify API using Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/vivino-wine-data-scraper').call(run_input={'startUrls': [{'url': 'https://www.vivino.com/en/it-s-cristina-lugana-lugana-white-wine-v/w/1127731?year=2024'}],'maxItems': 5,'maxPages': 1,'includeOffers': True,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item)
Run with cURL
curl "https://api.apify.com/v2/acts/automation-lab~vivino-wine-data-scraper/runs?token=$APIFY_TOKEN" \-X POST \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.vivino.com/en/it-s-cristina-lugana-lugana-white-wine-v/w/1127731?year=2024"}],"maxItems": 5,"maxPages": 1,"includeOffers": true}'
Fetch dataset items after the run finishes by using its defaultDatasetId.
Use Vivino Wine Data Scraper with MCP
Connect the Actor to Claude Code:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/vivino-wine-data-scraper"
For Claude Desktop, Cursor, or VS Code, add an HTTP MCP server configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/vivino-wine-data-scraper"}}}
Example prompts:
- “Extract all visible offers for these five Vivino wine URLs.”
- “Compare merchant prices and bottle sizes in the returned dataset.”
- “Summarize rating, review-count, and global-rank differences.”
- “Create a CSV-ready list of wines under €20.”
Export and storage formats
Apify datasets can be downloaded as:
- JSON;
- CSV;
- Excel;
- XML;
- RSS;
- JSONL.
Use the dataset API for incremental processing.
Use dataset views for a concise table of the most important wine and offer fields.
Performance and memory
The Actor is HTTP-only and defaults to 256 MB of memory.
Requests run sequentially to reduce load and lower block risk.
A small direct-detail run normally completes well within the five-minute timeout.
Large listing jobs depend on page size, detail count, locale behavior, and remote response time.
Proxy configuration
Direct HTTP is the default because public pages work anonymously in the validated route.
Enable Apify Proxy when:
- your execution IP receives a block page;
- you need a catalog localized to another market;
- repeated source requests are rate-limited.
Choose a country that matches the catalog you intend to observe.
Prices and merchants can differ by market.
Is it legal to scrape Vivino?
This Actor extracts publicly available page data.
You are responsible for your use case, request volume, applicable law, contractual obligations, and Vivino terms.
Do not collect private account data.
Do not use the Actor to bypass authentication or access controls.
Apply appropriate retention and sharing rules to exported data.
When in doubt, obtain legal advice for your jurisdiction and workflow.
Limitations
- Output reflects public data available to the run's market and time.
- Some wines have no current merchant offer.
- Optional taste, rank, inventory, or discount fields may be absent.
- The Actor does not log in to Vivino.
- The Actor does not submit reviews, purchases, or account actions.
- Search terms are supplied by copying a Vivino search URL, not as a separate keyword field.
- A major upstream redesign may require extractor maintenance.
Troubleshooting
Why did my run return no records?
Confirm that every input is a public vivino.com listing, search, explore, or /w/<id> page.
Open the URL without signing in.
If it works in your browser but not in the Actor, enable Apify Proxy and choose the matching country.
The Actor intentionally fails a total extraction loss so empty monitoring runs are visible.
Why are merchant prices different from my browser?
Vivino can localize merchants, currencies, availability, and prices by country.
Use a proxy country that matches your comparison market and keep that country consistent between scheduled runs.
Why do several rows contain the same wine?
Each row represents a unique vintage or merchant offer.
Set includeOffers to false when you need one representative row per detail page.
Why is a taste or rank field missing?
Vivino does not publish every optional field for every wine and vintage.
The Actor omits unavailable fields rather than guessing values.
Frequently asked questions
Can I scrape one wine?
Yes. Provide one detail URL and set maxItems to 1 if one representative row is sufficient.
Can I monitor a wine list?
Yes. Add several detail URLs to one task and schedule it.
Can I export to Excel?
Yes. Download the dataset in Excel format from the run page.
Does it scrape reviews text?
No. It captures rating and review-count signals, not individual review bodies.
Does it require residential proxy traffic?
Not by default. The validated public route works with direct HTTP, while proxy routing remains optional.
Can it scrape all 16 million wines?
The Actor is designed for bounded listings, search results, and explicit watchlists. Very large extraction plans should be split into controlled tasks with responsible request rates.
Related scrapers
Combine this Actor with other public marketplace and review workflows:
All related links above point to automation-lab Actors.
Support
If a public Vivino URL stops producing expected fields, open an Actor issue with:
- the exact input URL;
- the run ID;
- the expected field or record count;
- whether the page opens anonymously;
- the market or proxy country used.
That evidence makes source changes faster to reproduce and fix.