Vivino Wine Reviews Scraper
Pricing
from $0.00001 / review (one row per review)
Vivino Wine Reviews Scraper
Scrapes user reviews and tasting notes from Vivino (vivino.com), including the review text, star rating, vintage year, review language, like and comment counts, and the reviewer's name and profile statistics.
Pricing
from $0.00001 / review (one row per review)
Rating
0.0
(0)
Developer
ActorFlow
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape user reviews and tasting notes from Vivino (vivino.com) for any wine. This Vivino reviews scraper extracts the full review text, the reviewer's star rating, the vintage reviewed, the review language, like and comment counts, and the reviewer's name and profile statistics. Filter by language or minimum rating, then export to JSON, CSV or Excel — or call it as an API. Paste a Vivino wine link, press Start.
Target website: vivino.com
✨ Features of this Vivino reviews scraper
- Two output formats — choose one JSON result per wine (all its reviews in one
reviewsarray, so multiple wines map cleanly to multiple results) or one flat row per review for spreadsheets and CSV - Full review text — the complete tasting note as written, not a truncated preview
- Star ratings — Vivino's 1–5 rating for every review
- Reviewer profiles — display name, total ratings written and follower count, so you can weight credible reviewers
- Engagement metrics — like and comment counts per review
- Language filter — keep only reviews in the language you need
- Rating filter — keep only reviews at or above a star rating
- Accepts any Vivino link — wine URLs, vintage URLs and bare wine IDs all work
- Pagination support — walks through review pages until your limit is reached
- Repeat-run caching — name a cache project and scheduled runs return only reviews you have not collected before, so you never pay for the same data twice
- No browser required — runs on plain HTTP requests, which makes it fast and cheap
🚀 How to scrape Vivino reviews in 5 steps
- Sign up for a free Apify account — includes $5 monthly credit.
- Open the actor page and click Try for free.
- Paste one or more Vivino wine URLs into Wine URLs.
- Click Start and wait for the run to complete.
- Download results from the Output tab in JSON, CSV, or Excel format.
You can also run this actor via the Apify API or integrate it directly into your workflows using Zapier, Make, or n8n.
💰 Pricing
This actor uses pay-per-event billing: you pay per review saved, and the price depends on the Output format you choose.
| Output format | Event charged | Price per review |
|---|---|---|
One item per wine (PER_WINE) | Review (grouped per wine) | $0.0018 |
One row per review (PER_REVIEW) | Review (one row per review) | $0.002 |
- Grouped output is slightly cheaper per review, so it is the default.
- You are charged only for reviews actually saved. Reviews skipped by the cache, or removed by the language and rating filters, are free.
- New Apify accounts include $5 of free monthly credit.
- It runs on plain HTTP requests rather than a headless browser, so it costs significantly less to run than browser-based review scrapers.
- Residential proxies are used by default for reliable access. Switching to datacenter proxies or turning the proxy off in the input lowers run cost.
💸 Avoid paying for duplicate Vivino reviews with the cache
Scraping the same wines on a schedule normally returns the same reviews every time. Set Cache project name (cacheProjectName) to any name, for example my-wine-monitor, and the actor remembers every review it has already saved:
- First run — collects reviews as usual and stores their IDs under that project name.
- Every later run with the same name — skips reviews already collected, so the output holds only new reviews.
- Wines with nothing new — no result is saved for them, so a quiet week produces an empty dataset instead of a repeat of last week's data.
Use one project name per monitoring job and reuse it on every run. Use a different name to start fresh. Pair it with Apify Schedules to track how wines are received over time while paying only for new reviews.
Filters run before the cache, so a review excluded by language or minRating is not marked as seen. You can widen the filters later and still collect it.
🔧 Input configuration
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
startUrls | array | — | https://www.vivino.com/w/1122095 | Vivino wine URLs, vintage URLs or bare wine IDs. |
maxItems | integer | — | 50 | Maximum reviews per wine. Set to 0 for no limit. |
language | string | — | — | Two-letter code, e.g. en, fr, it. Empty keeps all languages. |
outputFormat | string | — | PER_WINE | PER_WINE saves one item per wine with all its reviews in a reviews array. PER_REVIEW saves one flat row per review. |
minRating | integer | — | — | Keep only reviews rated at least this highly (1–5). |
cacheProjectName | string | — | — | Name a project to remember scraped reviews across runs. |
proxyConfiguration | object | — | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} | Proxy settings. Residential proxies by default. |
Supported input types:
- Wine URL —
https://www.vivino.com/w/1122095 - Localised wine URL —
https://www.vivino.com/en/domaine-merlet-merlot/w/6980968 - Vintage URL —
https://www.vivino.com/wines/164943024(resolved to its wine automatically) - Bare wine ID —
1122095
📦 Vivino reviews scraper output data
The output depends on the Output format input.
One item per wine (PER_WINE, default) — one result per input URL with the keys wineId, wineUrl, wineName, reviewsCount and reviews. reviews is an array of objects with reviewId, vintageYear, rating, review, language, createdAt, likeCount, commentCount, userName, userId, userRatingsCount, userFollowersCount and userImage.
One row per review (PER_REVIEW) — every review is its own flat result with the same review keys plus wineId, wineUrl and wineName. Best for CSV and Excel export.
The dataset ships with two views: Overview, one row per wine, and Reviews (one row per review), a table of individual reviews.
Sample output (PER_WINE):
[{"wineId": 1122095,"wineUrl": "https://www.vivino.com/w/1122095","wineName": "Moët & Chandon Impérial Brut Champagne N.V.","reviewsCount": 2,"reviews": [{"reviewId": 84847781,"vintageYear": "N.V.","rating": 4.5,"review": "We needed some champagne for a recipe - and it’s a good job we did!","language": "en","createdAt": "2018-01-01T01:47:55.000Z","likeCount": 217,"commentCount": 12,"userName": "Steve and Declan Carroll","userId": 917135,"userRatingsCount": 1041,"userFollowersCount": 11131,"userImage": "https://images.vivino.com/avatars/GZyw78w4SSCef8FU7rrkOg.jpg"}]}]
🐍 How to scrape Vivino reviews with Python, JavaScript or the API
Run the actor programmatically with the official Apify clients. Replace <YOUR_API_TOKEN> with the token from your Apify Console.
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("<username>/vivino-reviews-scraper").call(run_input={"startUrls": [{"url": "https://www.vivino.com/w/1122095"}],"maxItems": 200,"language": "en",})for wine in client.dataset(run["defaultDatasetId"]).iterate_items():print(wine["wineName"], wine["reviewsCount"])for review in wine["reviews"]:print(review["rating"], review["userName"], review["review"])
JavaScript (npm install apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('<username>/vivino-reviews-scraper').call({startUrls: [{ url: 'https://www.vivino.com/w/1122095' }],maxItems: 200,language: 'en',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
cURL — start a run and wait for the dataset:
curl -X POST "https://api.apify.com/v2/acts/<username>~vivino-reviews-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.vivino.com/w/1122095"}], "maxItems": 200}'
💡 What you can use Vivino review data for
- Sentiment analysis — run NLP over thousands of tasting notes for one wine
- Tasting note mining — find the descriptors drinkers actually use for a style
- Product feedback — see what buyers say about a wine you sell or make
- Competitor benchmarking — compare review sentiment across similar wines
- Rating distribution analysis — look past the average to how ratings actually spread
- Influencer identification — find highly followed reviewers writing in your category
Wineries, importers, retailers, market researchers and data scientists use this data across wine, hospitality and consumer research.
⚠️ Limitations & known issues
- Reviews are user-generated content — they carry display names and opinions. Treat them as personal data and check your obligations before republishing.
- No vintage filter at source — Vivino's review endpoint accepts a year parameter but ignores it, so the actor does not offer one. Every review carries its own
vintageYear, so filter after the fact if you need a single vintage. - Very popular wines — a wine with tens of thousands of reviews takes many pages; set a realistic
maxItemsunless you want the lot. - Language detection is Vivino's — the
languagefield comes from Vivino and is occasionally wrong for very short notes. - Rate limiting — scraping many wines at high volume may be throttled; enable proxies if you hit limits.
❓ Frequently asked questions
Can I scrape Vivino reviews legally?
This actor only collects reviews that are already publicly visible on Vivino — no login, paywall, or private content is accessed. Scraping publicly available data is generally considered lawful (see hiQ Labs v. LinkedIn as precedent). Reviews are user-generated content containing display names and opinions, so they are personal data under the GDPR: you need a lawful basis to store them, and review text remains the author's. You are responsible for complying with Vivino's Terms of Service.
How many reviews can I scrape from one wine?
maxItems limits results per wine, so five wines with maxItems: 200 returns up to 1,000 reviews. Set it to 0 to take every review a wine has.
Can I scrape reviews for a specific vintage?
Not at source — Vivino's endpoint ignores its own year parameter, which is why this actor does not offer a vintage filter that would not work. Each review does carry a vintageYear, so filter the dataset afterwards.
What is the difference between a wine URL and a vintage URL?
/w/{id} identifies the wine across all its vintages; /wines/{id} identifies one vintage. They carry different IDs, and reviews are served per wine — so if you paste a vintage URL the actor resolves it to its wine automatically and logs which one it used.
Do I need a proxy to scrape vivino.com?
The actor uses Apify residential proxies by default, which gives the most reliable access, especially when scraping many wines in one run. Vivino also responds without a proxy, so you can switch to datacenter proxies or turn the proxy off in the input to lower cost.
How do I scrape Vivino reviews with Python?
Install apify-client, then call the actor with your wine URLs and iterate the dataset — see the Python example above. Each review comes back as flat JSON ready for pandas or an NLP pipeline.
Can I run this Vivino reviews scraper on a schedule?
Yes. Use Apify Schedules to re-run it, and set cacheProjectName so each run returns only reviews you have not collected before. That keeps scheduled runs from returning, and billing you for, the same reviews again.
How do I avoid paying for the same Vivino reviews twice?
Set cacheProjectName to the same value on every run. The actor stores the IDs of reviews it has saved and skips them next time, so repeat runs return only new reviews.
How is the Vivino review output structured?
One dataset item per wine you enter. Each item holds the wine's wineName, wineUrl and reviewsCount, plus a reviews array with every review. Enter five wine URLs and you get five items. If you need one row per review for a spreadsheet, flatten the reviews array after export.
Can I get one row per review instead of one item per wine?
Yes. Set Output format to PER_REVIEW and every review is saved as its own flat row. The default, PER_WINE, keeps each wine's reviews together in one JSON object.
What output formats are supported?
JSON, CSV, Excel, XML and RSS, either from the Output tab or through the Apify API.
🔗 Other actors you may find useful
- Vivino Wine Scraper — extract wines, ratings, prices, regions, grapes and taste profiles from Vivino.
- Church Finder Scraper — find and extract church listings and details.
- Gametime Events Scraper — scrape live event and ticket data from Gametime.
- INCIDecoder Scraper — extract cosmetic ingredient data from INCIDecoder.
- Whois.com Scraper — look up domain registration and ownership data.
- Cars & Bids Cheapest Listings Scraper — find the cheapest car auctions on Cars & Bids.
💬 Support & contact
If you encounter any issues or have questions, please open an issue.
You can also find more of our actors on the Actor Flow.