Vivino Scraper avatar

Vivino Scraper

Pricing

from $1.80 / 1,000 results

Go to Apify Store
Vivino Scraper

Vivino Scraper

[πŸ’° $1.80 / 1K] Extract structured wine data from Vivino: name, winery, vintage, region, grapes, community ratings with counts, price, taste profile, food pairings, and optional reviews. Search by keyword or paste wine URLs. 23 countries, 15 currencies.

Pricing

from $1.80 / 1,000 results

Rating

0.0

(0)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

0

Monthly active users

15 days ago

Last modified

Categories

Share

Pull structured wine data from Vivino at scale β€” winery, vintage, region, grape varieties, community ratings with the rating counts behind them, market prices, taste-profile scores, food pairings, and opt-in reviews. Search by wine name or paste Vivino URLs directly, and localize prices across 23 countries and 15 currencies. Built for wine retailers, sommeliers, market researchers, and catalog teams who need clean, comparable wine data without copying it bottle by bottle from Vivino.

Why This Scraper?

  • Know whether a rating is really that vintage's own β€” the ratingIsWineLevel field separates three cases no other Vivino extractor exposes: the vintage's own score, the wine's overall score standing in, and a bottle rated too few times for Vivino to publish any score. About two rows in five carry the flag, so filtering on it changes your sample materially.
  • Invented vintages are filtered out β€” Vivino's index lists release years a producer never actually bottled, each wearing a copied rating. Removing them cut phantom rows on an all-vintages sweep from 82% to 0% and lifted price coverage on that same sweep from 18% to 70%.
  • Alcohol content on nearly nine bottles in ten β€” ABV lands on 88.9% of wines measured across 1,527 rows, alongside region and country on 100% and grape varieties on 95%.
  • Non-vintage wines are labelled, not left blank β€” a Champagne, Cava, or NV blend returns the literal "N.V." in vintage (58% of rows on a Champagne run), so "no year exists" is never confused with "the year failed to read".
  • Paste back any URL the scraper produced and get a full record β€” Vivino serves a wine page in three different shapes and all three resolve to a complete detail parse, taking the output-to-input round trip from 15% to 100% of URLs.
  • Up to 100 community reviews per wine β€” reviewer username, their own rating, the full comment text, and the review date, each emitted as its own row for easy analysis.
  • Localized pricing across 23 countries and 15 currencies β€” quote in USD, GBP, EUR, CHF, AUD, JPY, and more to match the market you actually sell into.
  • Sweep every vintage of a wine, or pin to one exact year β€” "Ignore vintage" returns all release years for price-over-time work; "Match exact vintage" locks to the year you typed and holds it on 100% of returned rows.
  • Taste-profile scores plus the community's dominant flavor notes β€” body, acidity, tannins, sweetness, and fizziness on the axes Vivino measures for that wine type, with flavor-note groups ranked by how strongly tasters called them.

Use Cases

Wine Retail & Pricing

  • Monitor competitor and market pricing on the same wine across countries
  • Track a vintage's price as it moves from current release to back-vintage
  • Spot under-rated, well-priced bottles by comparing rating to price
  • Validate landed costs against local market currency before importing

Restaurants & Sommeliers

  • Build a by-the-glass and bottle list ranked by community rating
  • Match wines to menu courses using the food-pairing fields
  • Surface crowd-pleasers with high ratings and high rating counts
  • Find structurally similar alternatives using body, acidity, and tannin scores

Market Research & Trends

  • Track how a region or grape variety is rated across thousands of wines
  • Benchmark a producer's portfolio against its peers
  • Analyze taste-profile trends by region, country, or vintage year
  • Quantify community sentiment from review text and ratings

App & Catalog Building

  • Enrich an e-commerce wine catalog with ratings, images, and tasting notes
  • Power a wine-recommendation engine with taste-profile vectors
  • Populate a wine app with structured pairings, grapes, and ABV
  • Fill gaps in a product database using direct Vivino URL lookups

Getting Started

Search by Wine Name

The simplest run β€” one query, full taste profile on by default:

{
"searchQueries": ["Barolo"],
"maxResults": 50
}

Track Every Vintage of a Wine

Strip the vintage to gather all release years of a single wine, priced in euros:

{
"searchQueries": ["Tignanello"],
"vintageHandling": "name_only",
"countryCode": "FR",
"currencyCode": "EUR",
"maxResults": 100
}

Pull a Wine With Community Reviews

Look up specific bottles by URL and collect up to 25 reviews each:

{
"startUrls": [
"https://www.vivino.com/en/tignanello/w/1652"
],
"includeReviews": true,
"maxReviewsPerWine": 25
}

Mix queries and URLs, exact vintage matching, reviews on, localized to the UK:

{
"searchQueries": ["Penfolds Grange 2017", "Napa Cabernet Sauvignon"],
"startUrls": [
"https://www.vivino.com/en/grange/w/1136930"
],
"vintageHandling": "name_and_vintage",
"includeTasteProfile": true,
"includeReviews": true,
"maxReviewsPerWine": 50,
"countryCode": "GB",
"currencyCode": "GBP",
"maxResults": 200
}

Input Reference

What to Scrape

ParameterTypeDefaultDescription
searchQueriesstring[]["Tignanello 2019"]Wine names or keywords to search on Vivino (e.g. "Barolo", "Penfolds Grange"). Include the vintage year or leave it out. Each query runs independently.
startUrlsstring[][]Paste Vivino wine URLs directly. Each URL is fetched as a single wine.

Results

ParameterTypeDefaultDescription
maxResultsinteger100Maximum number of wines to return across all queries and URLs. Set to 0 for unlimited. Start with 10–50 to test, then increase. This caps wines only β€” when reviews are on, each wine adds up to maxReviewsPerWine review rows on top of this number.
vintageHandlingselectSmart (detect year automatically)How vintage years are matched: detect a year in your query automatically, match the exact year you typed, or ignore the year and return every vintage of the wine.

Detail

ParameterTypeDefaultDescription
includeTasteProfilebooleantrueCollect the taste profile β€” body, acidity, tannins, sweetness, fizziness, dominant flavor notes, and food pairings.

Reviews

ParameterTypeDefaultDescription
includeReviewsbooleanfalseAlso collect user reviews. Each review is its own result row, added on top of the maxResults wine count, so total results grow with the number of reviews collected.
maxReviewsPerWineinteger10Maximum reviews to collect per wine (across all of its vintages) when reviews are on. Up to 100. Ignored when reviews are off.

Localization

ParameterTypeDefaultDescription
countryCodeselectUnited StatesCountry market used for pricing and availability. 23 countries supported.
currencyCodeselectUS DollarCurrency for wine prices (ISO 4217). 15 currencies supported.

Output

Every row carries a recordType field β€” wine or review β€” so you can filter cleanly downstream.

Wine (recordType: "wine")

{
"recordType": "wine",
"wineId": "1652",
"vintageId": "159365358",
"name": "Tignanello",
"url": "https://www.vivino.com/en/tignanello/w/1652",
"winery": "Antinori",
"vintage": "2019",
"wineType": "Red",
"region": "Toscana",
"country": "Italy",
"grapes": ["Sangiovese", "Cabernet Sauvignon", "Cabernet Franc"],
"averageRating": 4.6,
"ratingsCount": 8567,
"ratingIsWineLevel": false,
"price": 159.99,
"currency": "USD",
"imageUrl": "https://images.vivino.com/thumbs/example.png",
"foodPairings": ["Beef", "Lamb", "Game (deer, venison)"],
"description": "A Tuscan icon blending Sangiovese with Bordeaux varieties.",
"alcoholContent": 13.5,
"body": 4.2,
"acidity": 3.1,
"tannins": 3.8,
"sweetness": 1.4,
"fizziness": null,
"flavorNotes": [
{ "group": "oak", "score": 34699, "count": 240 },
{ "group": "red_fruit", "score": 29551, "count": 209 }
],
"inputSource": "search",
"searchQuery": "Tignanello 2019",
"scrapedAt": "2026-08-25T14:30:00Z"
}

Core Fields

FieldTypeDescription
recordTypestringAlways "wine"
wineIdstringVivino wine identifier
vintageIdstringVivino vintage identifier β€” the rated, priced bottle
namestringWine name
urlstringCanonical Vivino wine URL. Paste it straight back into startUrls for a full re-fetch
winerystringWinery / producer name
vintagestringVintage year, or the literal "N.V." for non-vintage wines. Always filled
wineTypestringRed, White, RosΓ©, Sparkling, Dessert, or Fortified
regionstringWine region
countrystringCountry of origin
grapesstring[]Grape varieties in the blend
imageUrlstringBottle / label image
descriptionstringWine description and tasting note, when Vivino has one β€” roughly half of wines carry one
alcoholContentnumberAlcohol by volume (ABV %), filled on about nine wines in ten
inputSourcestringsearch or url β€” how this row was found
searchQuerystringThe query or URL that produced this row
scrapedAtstringISO timestamp of extraction

Ratings & Pricing

FieldTypeDescription
averageRatingnumberCommunity average rating, 1–5. Empty when Vivino has too few ratings on the bottle to publish a score β€” never 0, because 0 is not a rating anyone gave
ratingsCountintegerNumber of community ratings behind the average. Always filled, including when averageRating is empty β€” that is the "rated 20 times, no score published yet" case
ratingIsWineLevelbooleanfalse when the score belongs to this exact vintage. true when it does not β€” either the wine's overall score is standing in, or Vivino has published no score at either level yet, in which case averageRating is empty while ratingsCount still shows how many people rated the bottle
pricenumberPrice in the selected currency, when Vivino lists a merchant offer. Back-vintages and rare bottles frequently have none
currencystringCurrency code (ISO 4217)
foodPairingsstring[]Vivino's suggested food pairings

Taste Profile

Populated when includeTasteProfile is on. Vivino measures different axes for different wine types β€” tannins on reds, fizziness on sparkling β€” so a still wine returns no fizziness score and a sparkling wine returns no tannin score.

FieldTypeDescription
bodynumberLight-to-full body score
aciditynumberSoft-to-acidic score
tanninsnumberSmooth-to-tannic score (red wines)
sweetnessnumberDry-to-sweet score
fizzinessnumberStill-to-fizzy score (sparkling wines)
flavorNotesobject[]Dominant flavor-note groups, each with a group name, a score (how strongly the community tasted it), and a count (mentions behind it)

Review (recordType: "review")

Emitted only when includeReviews: true. Capped at maxReviewsPerWine per wine.

{
"recordType": "review",
"wineId": "1652",
"vintageId": "159365358",
"wineUrl": "https://www.vivino.com/en/tignanello/w/1652",
"username": "winelover_42",
"rating": 4.5,
"comment": "Silky tannins, dark cherry, and a long finish. Worth the splurge.",
"date": "2026-03-18T09:12:00Z"
}
FieldTypeDescription
recordTypestringAlways "review"
wineIdstringParent wine identifier
vintageIdstringParent vintage identifier
wineUrlstringParent wine URL
usernamestringReviewer's Vivino username
ratingnumberReviewer's own rating (0–5)
commentstringFull review text
datestringReview date

Tips for Best Results

  • Strip the vintage to track a wine across release years. Set vintageHandling to "Ignore vintage" and you get every year of a wine β€” ideal for charting how a label's price moves from current release to back vintage. Release years the producer never actually bottled are removed for you, so the price curve you plot is built from bottles that exist.
  • "Match exact vintage" returns fewer wines by design. Pinning a query to one year narrows the pool hard: "Sassicaia 2019" returns 44 wines on that year versus 396 across all years. If you set maxResults to 100 and get 44, that's the full set for that vintage, and the run tells you so when it finishes. Use "Ignore vintage" when you want volume rather than precision.
  • Weight ratings by their count, and treat an empty rating as "no score yet". A 4.6 from 50,000 tasters is a far stronger signal than a 4.6 from 8, so sort on ratingsCount alongside averageRating. Vivino withholds an average entirely until a bottle clears its threshold, so newer and rarer releases arrive with averageRating empty and ratingsCount still filled β€” filter on averageRating being present before you rank, or you will bury bottles that simply have not been scored.
  • Filter on ratingIsWineLevel when the vintage year matters. About two rows in five (39.7%, measured over 1,527 rows) carry true, meaning the score is not that exact vintage's own β€” far more than a spot check suggests, and it runs from 15% on a Champagne search to 64% on a single-winery catalog sweep. Roughly a third of those flagged rows have no published score at all rather than a substituted one. Keep ratingIsWineLevel: false for a strict vintage-by-vintage comparison; if you keep the flagged rows too, check averageRating is present before you rank on it.
  • Expect thinner detail on rare back-vintages. Tasting notes, food pairings, taste scores, and prices all come from Vivino's community and merchant network, so a flagship current release is richly described while an obscure single-barrel bottling from decades ago may carry only name, winery, region, and vintage. Food pairings land on 96.5% of wines across broad varietal searches but nearer three in four on a deep single-winery sweep. Plan for it rather than treating an empty field as an error.
  • Reviews add on top of your maxResults cap. maxResults limits the number of wines; it does not bound reviews. Each review is a separate billable row added on top, capped at maxReviewsPerWine per wine (across its vintages). So a 50-wine run with maxReviewsPerWine: 100 can return up to 50 wines + 5,000 reviews. Reviews are off by default β€” turn them on deliberately and set maxReviewsPerWine to keep result counts predictable.
  • Set currency and country to your real market. currencyCode controls the price currency and countryCode localizes availability β€” match both to the market you sell into so the prices you see are the prices your customers see.
  • Mix names and URLs in one run, and start small. Combine a list of search terms with a list of specific Vivino URLs to cover broad discovery and exact lookups in a single pass. Run 10–50 results first to confirm the wines and fields match what you expect, then raise maxResults (or set it to 0 for unlimited).

Pricing

From $1.80 per 1,000 results β€” and it gets cheaper as your Apify discount tier goes up.

ResultsNo discountBronzeSilverGold
100$0.21$0.20$0.19$0.18
1,000$2.15$2.05$1.90$1.80
10,000$21.50$20.50$19.00$18.00
100,000$215.00$205.00$190.00$180.00

Tiered pricing takes effect on 9 September 2026. Until that date every result is billed at a flat $1.80 per 1,000, the rate shown in the Gold column.

A "result" is any row in the output dataset β€” a wine or a single review. No compute charges β€” you only pay per result returned. Reviews are off by default; turning them on adds one billable row per review collected.

Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

  • Zapier / Make / n8n β€” Workflow automation
  • Google Sheets β€” Direct spreadsheet export
  • Slack / Email β€” Notifications on new results
  • Webhooks β€” Trigger custom APIs on run completion
  • Apify API β€” Full programmatic access

This actor is designed for legitimate wine retail research, market analysis, catalog enrichment, and product discovery. Users are responsible for complying with applicable laws and Vivino's terms of service, including making reasonable-rate requests and respecting content usage rules. Review text and usernames are user-generated content β€” handle any personal data responsibly and in line with applicable privacy regulations. Do not use extracted data for spam, harassment, or any illegal purpose.