Vivino Wine Ratings & Tasting Profile Scraper
Search Vivino wines by name, browse by type and country, look up specific vintages by ID, or pull a winery's full catalogue. Get ratings, prices, grapes, tasting notes, and food pairings for each wine.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to fetch. `search` runs one or more free-text queries; `explore` browses with filters; `byWineId` resolves wine/vintage URLs or IDs; `winery` pages through a producer's catalogue. |
searchQueries | array | optional | One or more free-text wine searches (mode=search). Searches match wine, winery, region and grape names. Example: `barolo`, `chateau petrus`, `napa valley cabernet`. |
wineIds | array | optional | Vivino wine/vintage IDs or URLs (mode=byWineId). Accepts 171525306, https://www.vivino.com/w/1167880?year=2022, /vintages/171525306 and /wines/171525306. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to fetch. `search` runs one or more free-text queries; `explore` browses with filters; `byWineId` resolves wine/vintage URLs or IDs; `winery` pages through a producer's catalogue. |
searchQueries | array | optional | One or more free-text wine searches (mode=search). Searches match wine, winery, region and grape names. Example: `barolo`, `chateau petrus`, `napa valley cabernet`. |
wineIds | array | optional | Vivino wine/vintage IDs or URLs (mode=byWineId). Accepts 171525306, https://www.vivino.com/w/1167880?year=2022, /vintages/171525306 and /wines/171525306. |
winery | string | optional | Winery to scrape (mode=winery). Accepts 1945, michele-chiarlo, or a Vivino winery URL. |
wineType | string | optional | Filter by wine type. Applies to search, explore and winery. |
country | string | optional | Filter wines by country of origin (ISO 2-letter code). Leave empty for all countries. |
region | string | optional | Optional region filter, e.g. `Barolo`, `napa-valley`, or a Vivino region URL. Combine with Country when a name is ambiguous. |
grape | string | optional | Optional grape filter, e.g. `Nebbiolo`, `pinot-noir`, or a Vivino grape URL. |
minRating | number | optional | Only wines whose displayed rating is at or above this value (0-5). |
maxRating | number | optional | Only wines whose displayed rating is at or below this value (0-5). Applied after fetching. |
minPrice | number | optional | Only wines with a current offer at or above this price. |
maxPrice | number | optional | Only wines with a current offer at or below this price. Leave empty for no cap. |
orderBy | string | optional | How Vivino orders search and explore results. |
order | string | optional | Descending (highest first) or ascending (lowest first). |
includeReviews | boolean | optional | Attach the latest wine-level Vivino reviews to each record. Reviews span all vintages; each review keeps its own year. |
maxReviewsPerWine | integer | optional | How many latest reviews to attach when Include reviews is on (1-50). |
maxItems | integer | optional | Maximum wine records to emit. Vivino exposes at most 2,500 rows per search/explore query; split broad queries into narrower filters for more. |
Download the published input schema
View complete JSON
{
"description": "Search Vivino wines, explore by type, country, region or grape, look up wines by URL or ID, or pull a winery catalogue. Optional reviews.",
"properties": {
"country": {
"default": "",
"description": "Filter wines by country of origin (ISO 2-letter code). Leave empty for all countries.",
"editor": "select",
"enum": [
"",
"fr",
"it",
"us",
"de",
"es",
"au",
"at",
"pt",
"cl",
"ar",
"ch",
"za",
"cz",
"ca",
"hu",
"nz",
"br",
"ge",
"gr",
"jp",
"ru",
"ro",
"sk",
"hr",
"si",
"mx",
"il",
"bg",
"md",
"ua",
"gb",
"uy",
"pl",
"tr",
"rs",
"lu",
"cn",
"nl",
"be",
"am",
"mk",
"dk",
"cy",
"lb",
"az",
"pe",
"in",
"se",
"ba",
"bo",
"al",
"mt",
"ma",
"tn",
"me",
"xk",
"th",
"uz",
"kz",
"by",
"lt",
"vn",
"lv",
"jo",
"tw",
"li",
"co",
"kr",
"sm",
"fi",
"eg",
"ec",
"mu",
"dz",
"id",
"na",
"et",
"ee",
"ps",
"tz",
"no",
"mm",
"ve",
"mg",
"pr",
"ie",
"hk",
"kg",
"ad",
"cr",
"cv",
"af",
"py",
"zm",
"kp",
"np",
"cu",
"gt",
"ph",
"we",
"zw",
"do",
"ke",
"pf",
"bs",
"nf",
"sy",
"vi",
"tj",
"aw",
"bt",
"im",
"re",
"ir",
"my",
"pa",
"cw",
"mn",
"sn",
"an",
"ao",
"hn",
"is",
"kh",
"rw",
"tt",
"ls",
"ae",
"bb",
"gh",
"iq",
"lk",
"sg",
"sr",
"tm",
"ug",
"bz",
"fk",
"ga",
"jm",
"la",
"lr",
"mw",
"ng",
"pg",
"sz"
],
"enumTitles": [
"Any country",
"France",
"Italy",
"United States",
"Germany",
"Spain",
"Australia",
"Austria",
"Portugal",
"Chile",
"Argentina",
"Switzerland",
"South Africa",
"Czech Republic",
"Canada",
"Hungary",
"New Zealand",
"Brazil",
"Georgia",
"Greece",
"Japan",
"Russia",
"Romania",
"Slovakia",
"Croatia",
"Slovenia",
"Mexico",
"Israel",
"Bulgaria",
"Moldova",
"Ukraine",
"United Kingdom",
"Uruguay",
"Poland",
"Turkey",
"Serbia",
"Luxembourg",
"China",
"Netherlands",
"Belgium",
"Armenia",
"North Macedonia",
"Denmark",
"Cyprus",
"Lebanon",
"Azerbaijan",
"Peru",
"India",
"Sweden",
"Bosnia and Herzegovina",
"Bolivia",
"Albania",
"Malta",
"Morocco",
"Tunisia",
"Montenegro",
"Kosovo",
"Thailand",
"Uzbekistan",
"Kazakhstan",
"Belarus",
"Lithuania",
"Viet Nam",
"Latvia",
"Jordan",
"Taiwan",
"Liechtenstein",
"Colombia",
"Korea (South)",
"San Marino",
"Finland",
"Egypt",
"Ecuador",
"Mauritius",
"Algeria",
"Indonesia",
"Namibia",
"Ethiopia",
"Estonia",
"State of Palestine",
"Tanzania",
"Norway",
"Myanmar",
"Venezuela",
"Madagascar",
"Puerto Rico",
"Ireland",
"Hong Kong",
"Kyrgyzstan",
"Andorra",
"Costa Rica",
"Cape Verde",
"Afghanistan",
"Paraguay",
"Zambia",
"Korea (North)",
"Nepal",
"Cuba",
"Guatemala",
"Philippines",
"Westeros",
"Zimbabwe",
"Dominican Republic",
"Kenya",
"French Polynesia",
"Bahamas",
"Norfolk Island",
"Syria",
"Virgin Islands (U.S.)",
"Tajikistan",
"Aruba",
"Bhutan",
"Isle of Man",
"Réunion",
"Iran",
"Malaysia",
"Panama",
"Curaçao",
"Mongolia",
"Senegal",
"Netherlands Antilles",
"Angola",
"Honduras",
"Iceland",
"Cambodia",
"Rwanda",
"Trinidad and Tobago",
"Lesotho",
"United Arab Emirates",
"Barbados",
"Ghana",
"Iraq",
"Sri Lanka",
"Singapore",
"Suriname",
"Turkmenistan",
"Uganda",
"Belize",
"Falkland Islands (Malvinas)",
"Gabon",
"Jamaica",
"Laos",
"Liberia",
"Malawi",
"Nigeria",
"Papua New Guinea",
"Swaziland"
],
"prefill": "",
"title": "Country of origin",
"type": "string"
},
"grape": {
"description": "Optional grape filter, e.g. `Nebbiolo`, `pinot-noir`, or a Vivino grape URL.",
"editor": "textfield",
"title": "Grape variety",
"type": "string"
},
"includeReviews": {
"default": false,
"description": "Attach the latest wine-level Vivino reviews to each record. Reviews span all vintages; each review keeps its own year.",
"prefill": false,
"title": "Include reviews",
"type": "boolean"
},
"maxItems": {
"default": 50,
"description": "Maximum wine records to emit. Vivino exposes at most 2,500 rows per search/explore query; split broad queries into narrower filters for more.",
"maximum": 2500,
"minimum": 1,
"prefill": 2,
"title": "Max items",
"type": "integer"
},
"maxPrice": {
"description": "Only wines with a current offer at or below this price. Leave empty for no cap.",
"maximum": 100000,
"minimum": 0,
"title": "Maximum price (USD)",
"type": "number"
},
"maxRating": {
"description": "Only wines whose displayed rating is at or below this value (0-5). Applied after fetching.",
"maximum": 5,
"minimum": 0,
"title": "Maximum rating",
"type": "number"
},
"maxReviewsPerWine": {
"default": 10,
"description": "How many latest reviews to attach when Include reviews is on (1-50).",
"maximum": 50,
"minimum": 1,
"prefill": 10,
"title": "Max reviews per wine",
"type": "integer"
},
"minPrice": {
"description": "Only wines with a current offer at or above this price.",
"maximum": 100000,
"minimum": 0,
"title": "Minimum price (USD)",
"type": "number"
},
"minRating": {
"description": "Only wines whose displayed rating is at or above this value (0-5).",
"maximum": 5,
"minimum": 0,
"title": "Minimum rating",
"type": "number"
},
"mode": {
"default": "search",
"description": "What to fetch. `search` runs one or more free-text queries; `explore` browses with filters; `byWineId` resolves wine/vintage URLs or IDs; `winery` pages through a producer's catalogue.",
"editor": "select",
"enum": [
"search",
"explore",
"byWineId",
"winery"
],
"enumTitles": [
"Search wines (free-text queries)",
"Explore wines (filter browse)",
"Look up wines by URL or ID",
"All wines from a winery"
],
"prefill": "search",
"title": "Mode",
"type": "string"
},
"order": {
"default": "desc",
"description": "Descending (highest first) or ascending (lowest first).",
"editor": "select",
"enum": [
"desc",
"asc"
],
"enumTitles": [
"Descending",
"Ascending"
],
"prefill": "desc",
"title": "Sort order",
"type": "string"
},
"orderBy": {
"default": "ratings_count",
"description": "How Vivino orders search and explore results.",
"editor": "select",
"enum": [
"ratings_count",
"ratings_average",
"price",
"relevance"
],
"enumTitles": [
"Most reviewed",
"Highest rated",
"Price",
"Most relevant"
],
"prefill": "ratings_count",
"title": "Sort by",
"type": "string"
},
"region": {
"description": "Optional region filter, e.g. `Barolo`, `napa-valley`, or a Vivino region URL. Combine with Country when a name is ambiguous.",
"editor": "textfield",
"title": "Region or appellation",
"type": "string"
},
"searchQueries": {
"default": [
"barolo"
],
"description": "One or more free-text wine searches (mode=search). Searches match wine, winery, region and grape names. Example: `barolo`, `chateau petrus`, `napa valley cabernet`.",
"editor": "stringList",
"prefill": [
"barolo"
],
"title": "Search queries",
"type": "array"
},
"wineIds": {
"default": [
"171525306"
],
"description": "Vivino wine/vintage IDs or URLs (mode=byWineId). Accepts 171525306, https://www.vivino.com/w/1167880?year=2022, /vintages/171525306 and /wines/171525306.",
"editor": "stringList",
"prefill": [
"171525306"
],
"title": "Wine IDs or URLs",
"type": "array"
},
"wineType": {
"default": "",
"description": "Filter by wine type. Applies to search, explore and winery.",
"editor": "select",
"enum": [
"",
"1",
"2",
"3",
"4",
"7",
"24"
],
"enumTitles": [
"Any type",
"Red",
"White",
"Sparkling",
"Rose",
"Dessert",
"Fortified"
],
"prefill": "",
"title": "Wine type",
"type": "string"
},
"winery": {
"description": "Winery to scrape (mode=winery). Accepts 1945, michele-chiarlo, or a Vivino winery URL.",
"editor": "textfield",
"title": "Winery ID, slug or URL",
"type": "string"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "Vivino Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
wines | string | optional | Dataset containing all scraped Vivino wine records. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Vivino wine records with ratings, taste profiles, alcohol, descriptions, critic scores, awards, rankings, prices, merchant offers and optional reviews.",
"properties": {
"wines": {
"description": "Dataset containing all scraped Vivino wine records.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Vivino wines",
"type": "string"
}
},
"title": "Vivino Wine Ratings & Tasting Profile Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Wines",
"transformation": {
"fields": [
"name",
"winery",
"vintage",
"country",
"displayRating",
"ratingsCount",
"price",
"wineUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Vivino Wine Ratings & Tasting Profile Scraper
Vivino is the world's largest wine community, with ratings, reviews and tasting notes for millions of bottles. This actor turns that catalogue into clean, structured records: search by name, browse by type, country, region or grape, look up exact wines by URL or ID, or page through a producer's full range.
What this actor does
- Runs one or more free-text searches across wines, wineries, regions and grape varieties.
- Browses the catalogue with filters for wine type, country of origin, region/appellation, grape, rating range and price range.
- Accepts Vivino wine and vintage URLs as well as numeric IDs.
- Pulls a winery's catalogue, one record per wine (up to 5,000 wines per winery).
- Returns one enriched record per wine vintage in search, explore and by-ID modes, and one record per wine in winery mode, with ratings, taste profile, alcohol, description, critic scores, awards, rankings, market prices and merchant offers.
- Optionally attaches the latest community reviews.
- Omits fields Vivino does not have for a wine instead of sending empty values.
Output per wine
Identity and place
wineId,vintageId— Vivino identifiers for the wine and this vintagename,fullName— wine name and the full vintage name with winery and yearvintage— harvest year; omitted for non-vintage wines, withisNonVintage: truewinery,wineryId,wineryUrltype,typeId,isNaturalregion,regionId,regionUrl,country,countryCodestyle,styleId,styleDescription,styleBlurb,interestingFacts
Taste and pairing
grapes,grapeCompositionfoodPairingtasteAcidity,tasteTannin,tasteSweetness,tasteIntensity,tasteFizziness— Vivino's 1–5 taste scores, present only for the traits it scores for that winetastingNotes— flattened flavour keywordsflavorGroups— flavour groups with counts and keyword mentionsbody,bodyDescription,acidity,acidityDescription
Ratings and reviews
rating,ratingsCount,ratingStatus— the vintage's own rating, count and status;ratingis present only when Vivino publishes a vintage averagedisplayRating,displayRatingScope— the vintage rating, or the wine's all-vintage rating when the vintage is below Vivino's publication thresholdwineRating,wineRatingsCount— the wine's all-vintage ratingreviewsCount,labelsCount,ratingsDistributionreviews— optional latest community reviews, with rating, text, language, date, reviewer and the review's vintage year;reviewsScopeiswinebecause Vivino exposes reviews at wine level
Description and chemistry
description— wine-specific descriptionalcohol— ABV percentageclosure,winemaker
Market
price— best current merchant offeraveragePrice— Vivino's market mediancurrency,priceStatusofferCount,offers— up to five offers with merchant, price, currency, URL, bottle type, volume and stockbottleType,bottleVolumeMl,discountPercent
Critics and standing
criticReviews— critic name, score, score scale and dateawards— competition, edition, medal, trophy, score and linkrankings— global, country, region and winery rank with totalstopListRankings,drinkingWindow
Media and metadata
imageUrl,labelImageUrl,bottleImageUrlwineUrl,vintageUrl,sourceUrl— canonical Vivino URLsrecordType(wine) andscrapedAt
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
select | search |
search, explore, byWineId or winery |
searchQueries |
array | ["barolo"] |
One or more wine searches for search mode |
wineIds |
array | ["171525306"] |
Wine/vintage IDs or Vivino URLs for byWineId; accepts plain IDs, /w/<id>, /wines/<id>, /vintages/<id> and full Vivino URLs |
winery |
string | – | Winery ID, slug or URL for winery mode |
wineType |
select | (any) | Red, White, Sparkling, Rose, Dessert or Fortified |
country |
select | (any) | Country of origin; 146 wine-producing countries |
region |
string | – | Region/appellation name, slug or Vivino region URL |
grape |
string | – | Grape name, slug or Vivino grape URL |
minRating / maxRating |
number | – | Rating range on Vivino's 0–5 scale |
minPrice / maxPrice |
number | – | Price range in USD |
orderBy |
select | ratings_count |
ratings_count, ratings_average, price or relevance |
order |
select | desc |
desc or asc |
includeReviews |
boolean | false |
Attach latest community reviews |
maxReviewsPerWine |
integer | 10 |
Reviews per wine when enabled (1–50) |
maxItems |
integer | 50 |
Maximum wine records to return (1–2,500) |
Example: search for a wine
{
"mode": "search",
"searchQueries": ["barolo", "chablis"],
"maxItems": 20
}
Example: top-rated Italian reds under $100
{
"mode": "explore",
"wineType": "1",
"country": "it",
"minRating": 4.2,
"maxPrice": 100,
"orderBy": "ratings_average",
"maxItems": 100
}
Example: a region and a grape
{
"mode": "explore",
"region": "napa-valley",
"grape": "cabernet-sauvignon",
"minRating": 4.0,
"maxItems": 50
}
Example: exact wines by URL or ID
{
"mode": "byWineId",
"wineIds": [
"https://www.vivino.com/en/barolo-monprivato/w/1274818?year=2021",
"171525306"
],
"includeReviews": true,
"maxReviewsPerWine": 5
}
Example: a winery catalogue
{
"mode": "winery",
"winery": "michele-chiarlo",
"maxItems": 50
}
Use cases
- Build a wine list with ratings, taste profiles and food pairings.
- Compare prices and merchant offers for a shortlist or a region.
- Track a winery's range and its vintage ratings over time.
- Enrich an e-commerce catalogue with grapes, alcohol, descriptions and images.
- Analyse critic scores, awards and value across a region or grape.
- Power a recommendation engine with structured taste and flavour data.
FAQ
Is this affiliated with Vivino? No. This actor reads Vivino's public wine pages and is not operated by or connected to Vivino.
Do I need a Vivino account, cookie or API key? No. Every mode works without logging in.
How many wines can I get in one run?
Up to 2,500 records per run (maxItems is capped at 2,500). Vivino exposes at most 50 pages of 50 results per search or explore query, so split broad queries by country, region, type or price across runs to reach more wines. Winery mode follows the producer's catalogue page by page, up to 5,000 wines.
How do I find a wine's ID or URL?
Open the wine on Vivino and copy its URL, or run search/explore first — each result includes wineUrl and vintageId. wineIds accepts full URLs, /w/<id>, /vintages/<id> and plain numeric IDs. A plain numeric ID is treated as a vintage ID first (the original behaviour); use a /w/<id> URL to look up a wine ID unambiguously.
Why is rating missing for some wines?
Vivino does not publish a vintage average until it has enough ratings. Use displayRating for a ready-to-use score and read displayRatingScope: vintage means it is this bottle's score; wine means it is the wine's all-vintage score. ratingStatus shows BelowThreshold when the vintage average is not published.
Are prices always available?
Prices and offers are for the US market and require a merchant listing. When no offer exists, price is omitted and priceStatus is no_offer. averagePrice is Vivino's market median and may be present even when no single offer is.
Are the reviews for the vintage I selected?
Vivino exposes reviews at wine level, not vintage level. The optional reviews list contains the latest reviews across the wine's vintages; each review includes its own vintageYear, and reviewsScope is wine.
Why do some wines have no description, alcohol, critic score or award? Vivino does not have that data for every wine. Those fields are left out rather than sent as empty values. Taste traits are also conditional: for example, tannin is scored for reds and fizziness for sparkling wines.
Can I search by grape or region instead of wine name?
Yes. Use the grape and region filters, or put a grape/region name in searchQueries. Filters resolve names, slugs and Vivino URLs. A region filter matches the region you pass; to cover a broad area, run its appellations or sub-regions separately.
How fresh is the data? Each run reads the current Vivino catalogue, including live ratings, prices and offers.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build EKzBGehbk29hlDAtj. Documentation is regenerated from the default published build; private drafts are not included.