Vivino Wines Scraper: Ratings, Prices & Wine Data
Pricing
Pay per event
Vivino Wines Scraper: Ratings, Prices & Wine Data
Vivino scraper for wine data: ratings, rating counts, merchant prices, regions, wineries, vintages and taste structure. Filter by wine type, country market, price band and minimum rating. One clean row per wine vintage, ready for price comparison and recommenders.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
Wine retailers, price-comparison builders, recommender apps and market analysts all want Vivino's catalogue, and Vivino offers no public data API. This Actor reads the same explore feed the Vivino site uses and returns structured rows: vintage and wine ids, winery, region and country, average rating and rating count, the featured merchant price with currency and merchant link, bottle size, taste structure (acidity, intensity, sweetness, tannin) and the bottle image. Pick wine types, a market country, a price band and a minimum rating, and page through as many wines as you need.
🔥 What we handle for you
- 🛡️ We send real-browser TLS fingerprints so Vivino sees a browser, not Python.
- 🔁 We retry with exponential backoff on
408 / 429 / 503and honourRetry-After, up to 5 attempts per page. - 🌐 We pin and rotate Apify proxy sessions when you enable the proxy: your market country stays fixed, the session changes on every block.
- 🧱 We recompute the page limit from every response, so shifting match counts never cut a run short or loop it past the end.
- 🧊 We keep the dataset clean - Pydantic-validated rows, deduped by vintage id, ISO-8601 timestamps.
- 💰 You pay only for results that land. No data, no charge - only the small actor-start warm-up fee.
💡 Use cases
- Price comparison - track the featured merchant price and any discount for the same vintage over time.
- Recommender and sommelier apps - seed a catalogue with ratings, rating counts, style and taste structure.
- Retail assortment research - find highly rated wines inside a price band for a given market.
- Market analysis - compare regions, wineries and wine types by rating volume and price.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
wineTypes | array | no | ['red'] | Wine styles to include. Leave empty for all types. |
countryCode | string | no | 'US' | Two-letter Vivino market, e.g. US, FR, GB. Steers merchants and prices. |
currencyCode | string | no | 'USD' | Three-letter price currency, e.g. USD, EUR, GBP. |
minRating | number | no | 1.0 | Minimum average rating, 1.0 to 5.0. |
priceMin | number | no | 0 | Lower price bound in the chosen currency. |
priceMax | number | no | 500 | Upper price bound in the chosen currency. Must be at least the minimum price. |
orderBy | string | no | 'ratings_count' | Sort field: most-rated wines (default) or highest Vivino average rating. |
order | string | no | 'desc' | Ascending or descending. |
maxItems | integer | no | 100 | Hard cap on dataset rows for the whole run (24 wines per page). |
proxyConfiguration | object | no | {'useApifyProxy': False} | Optional Apify Proxy. When enabled, the exit country is pinned to the market country code unless you set one. |
Example input
{"wineTypes": ["red","white"],"countryCode": "US","currencyCode": "USD","minRating": 1.0,"priceMin": 0,"priceMax": 500,"orderBy": "ratings_count","order": "desc","maxItems": 60}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
vintageId | integer | Vivino vintage id. |
wineId | ['integer', 'null'] | Vivino wine id. |
name | ['string', 'null'] | Full vintage name. |
wineName | ['string', 'null'] | Wine name without winery. |
year | ['string', 'null'] | Vintage year, or N.V. for non-vintage. |
wineryId | ['integer', 'null'] | Winery id. |
wineryName | ['string', 'null'] | Winery name. |
wineTypeId | ['integer', 'null'] | Vivino wine type id. |
wineType | ['string', 'null'] | Wine type label (red, white, ...). |
regionName | ['string', 'null'] | Wine region. |
countryCode | ['string', 'null'] | Wine origin country code, upper-case. |
countryName | ['string', 'null'] | Wine origin country name. |
styleName | ['string', 'null'] | Wine style name. |
ratingAverage | ['number', 'null'] | Average rating, 1 to 5. |
ratingsCount | ['integer', 'null'] | Number of ratings. |
price | ['number', 'null'] | Featured merchant price. |
currency | ['string', 'null'] | Price currency code. |
discountedFrom | ['number', 'null'] | Original price when discounted. |
merchantId | ['integer', 'null'] | Merchant id. |
merchantUrl | ['string', 'null'] | Merchant product URL. |
bottleVolumeMl | ['integer', 'null'] | Bottle volume in millilitres. |
acidity | ['number', 'null'] | Taste structure: acidity. |
intensity | ['number', 'null'] | Taste structure: intensity. |
sweetness | ['number', 'null'] | Taste structure: sweetness. |
tannin | ['number', 'null'] | Taste structure: tannin. |
imageUrl | ['string', 'null'] | Bottle image URL. |
marketCountry | ['string', 'null'] | Market country Vivino served (follows exit IP). |
url | string | Vivino vintage page URL. |
scrapedAt | string | Run time, ISO 8601 UTC. |
Example output
{"vintageId": 1469676,"wineId": 21646,"name": "Fantini Edizione Cinque Autoctoni","wineName": "Edizione Cinque Autoctoni","year": "N.V.","wineryId": 7892,"wineryName": "Fantini","wineTypeId": 1,"wineType": "red","regionName": "Abruzzo","countryCode": "IT","countryName": "Italy","styleName": "Central Italy Red","ratingAverage": 4.3,"ratingsCount": 78709,"price": 33.49,"currency": "USD","discountedFrom": null,"merchantId": 2863,"merchantUrl": "https://www.vynomeka.lt/vynas-farnese-edizione-cinque-autoctoni-vdt-075-l","bottleVolumeMl": 750,"acidity": 2.56,"intensity": 4.13,"sweetness": 2.55,"tannin": 2.85,"imageUrl": "https://images.vivino.com/thumbs/MDrZtUCHR4eQ3L8xFS0scA_pl_480x640.png","marketCountry": "LT","url": "https://www.vivino.com/wines/1469676","scrapedAt": "2026-10-08T09:00:00Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run |
result | $0.003 | Per dataset item |
Example: 1 000 results at the rates above ≈ $3.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
v1 is filter-driven: wine type, market, price band, minimum rating and sort order. Keyword search, wine detail pages, reviews, winery pages and grape or region filters are not included. Each row carries the featured merchant offer only, not the full merchant list. Rows are large, so maxItems defaults to 100. Merchants and prices follow the market Vivino serves; use the proxy option to pin the exit country to your countryCode.
❓ FAQ
How much does a run cost?
$3.00 per 1 000 results ($0.003 per wine row) plus a one-off $0.20 start fee per run. If nothing matches your filters you pay only the start fee.
Do I need a Vivino account or API key?
No. Choose your filters and we do the rest.
Why does marketCountry sometimes differ from my countryCode?
Vivino reports the country it served, which follows the network exit the request came from. Turn on the proxy option and we pin the exit country to your countryCode so the merchants and prices match the market you asked for. Every row carries marketCountry so you can verify it.
What happens when no wines match?
The run finishes successfully with zero rows and a status message naming your filters.
Which sort orders are supported?
Number of ratings and average rating. Further orders are added once verified.
How many wines can I fetch?
Up to 10 000 per run, 24 wines per page. The default is 100. Vivino's match counts drift between calls, so we recompute the page limit from every response.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.