Dataspryva

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.

FieldTypeRequiredDescription
modestringrequiredWhat 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.
searchQueriesarrayoptionalOne or more free-text wine searches (mode=search). Searches match wine, winery, region and grape names. Example: `barolo`, `chateau petrus`, `napa valley cabernet`.
wineIdsarrayoptionalVivino 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
FieldTypeRequiredDescription
modestringrequiredWhat 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.
searchQueriesarrayoptionalOne or more free-text wine searches (mode=search). Searches match wine, winery, region and grape names. Example: `barolo`, `chateau petrus`, `napa valley cabernet`.
wineIdsarrayoptionalVivino wine/vintage IDs or URLs (mode=byWineId). Accepts 171525306, https://www.vivino.com/w/1167880?year=2022, /vintages/171525306 and /wines/171525306.
winerystringoptionalWinery to scrape (mode=winery). Accepts 1945, michele-chiarlo, or a Vivino winery URL.
wineTypestringoptionalFilter by wine type. Applies to search, explore and winery.
countrystringoptionalFilter wines by country of origin (ISO 2-letter code). Leave empty for all countries.
regionstringoptionalOptional region filter, e.g. `Barolo`, `napa-valley`, or a Vivino region URL. Combine with Country when a name is ambiguous.
grapestringoptionalOptional grape filter, e.g. `Nebbiolo`, `pinot-noir`, or a Vivino grape URL.
minRatingnumberoptionalOnly wines whose displayed rating is at or above this value (0-5).
maxRatingnumberoptionalOnly wines whose displayed rating is at or below this value (0-5). Applied after fetching.
minPricenumberoptionalOnly wines with a current offer at or above this price.
maxPricenumberoptionalOnly wines with a current offer at or below this price. Leave empty for no cap.
orderBystringoptionalHow Vivino orders search and explore results.
orderstringoptionalDescending (highest first) or ascending (lowest first).
includeReviewsbooleanoptionalAttach the latest wine-level Vivino reviews to each record. Reviews span all vintages; each review keeps its own year.
maxReviewsPerWineintegeroptionalHow many latest reviews to attach when Include reviews is on (1-50).
maxItemsintegeroptionalMaximum 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.

FieldTypeRequiredDescription
winesstringoptionalDataset 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 vintage
  • name, fullName — wine name and the full vintage name with winery and year
  • vintage — harvest year; omitted for non-vintage wines, with isNonVintage: true
  • winery, wineryId, wineryUrl
  • type, typeId, isNatural
  • region, regionId, regionUrl, country, countryCode
  • style, styleId, styleDescription, styleBlurb, interestingFacts

Taste and pairing

  • grapes, grapeComposition
  • foodPairing
  • tasteAcidity, tasteTannin, tasteSweetness, tasteIntensity, tasteFizziness — Vivino's 1–5 taste scores, present only for the traits it scores for that wine
  • tastingNotes — flattened flavour keywords
  • flavorGroups — flavour groups with counts and keyword mentions
  • body, bodyDescription, acidity, acidityDescription

Ratings and reviews

  • rating, ratingsCount, ratingStatus — the vintage's own rating, count and status; rating is present only when Vivino publishes a vintage average
  • displayRating, displayRatingScope — the vintage rating, or the wine's all-vintage rating when the vintage is below Vivino's publication threshold
  • wineRating, wineRatingsCount — the wine's all-vintage rating
  • reviewsCount, labelsCount, ratingsDistribution
  • reviews — optional latest community reviews, with rating, text, language, date, reviewer and the review's vintage year; reviewsScope is wine because Vivino exposes reviews at wine level

Description and chemistry

  • description — wine-specific description
  • alcohol — ABV percentage
  • closure, winemaker

Market

  • price — best current merchant offer
  • averagePrice — Vivino's market median
  • currency, priceStatus
  • offerCount, offers — up to five offers with merchant, price, currency, URL, bottle type, volume and stock
  • bottleType, bottleVolumeMl, discountPercent

Critics and standing

  • criticReviews — critic name, score, score scale and date
  • awards — competition, edition, medal, trophy, score and link
  • rankings — global, country, region and winery rank with totals
  • topListRankings, drinkingWindow

Media and metadata

  • imageUrl, labelImageUrl, bottleImageUrl
  • wineUrl, vintageUrl, sourceUrl — canonical Vivino URLs
  • recordType (wine) and scrapedAt

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.

Open the step-by-step Python guide →

Source build EKzBGehbk29hlDAtj. Documentation is regenerated from the default published build; private drafts are not included.