# Vivino Wine Scraper (`confidential_gnat/vivino-wine-scraper`) Actor

Scrapes wine data from Vivino (vivino.com), including wine name, winery, vintage, region, country, grapes, average rating, number of ratings, price, taste profile, food pairings and label image.

- **URL**: https://apify.com/confidential\_gnat/vivino-wine-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Vivino Wine Scraper

**Scrape wine data from Vivino (vivino.com)** — the world's largest wine community and marketplace. This **Vivino wine scraper** extracts wine name, winery, vintage year, region, country, wine type, **average rating and number of ratings**, bottle price, grapes, style, food pairings, taste structure and label image. Filter by wine type, rating and price, or paste a Vivino explore URL directly. Export to **JSON, CSV or Excel**, or call it as an **API**.

**Target website:** [vivino.com](https://www.vivino.com)

### ✨ Features of this Vivino wine scraper

- **Wine data extraction** — name, winery, vintage year, region, country and wine type for every matching wine
- **Ratings** — the vintage's average rating and rating count, plus the wine's rating across all vintages
- **Prices** — bottle price in your chosen currency and market, with the bottle format
- **Taste structure** — acidity, sweetness, tannin, intensity and fizziness where Vivino scores them
- **Tasting notes** — the flavour keywords reviewers actually used, most mentioned first
- **Food pairings** — the dishes Vivino recommends for the wine's style
- **Filters** — wine type, minimum rating and price range, or a pasted Vivino explore URL
- **Market selection** — prices and availability for a chosen country and currency
- **Repeat-run caching** — name a cache project and later runs return only wines you have not seen before, so scheduled runs never re-download the same bottles
- **Proxy support** — configurable, so you stay in control of run cost
- **No browser required** — runs on plain HTTP requests, which makes it fast and cheap

### 🚀 How to scrape Vivino wines in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Choose your filters (wine type, minimum rating, price range) or paste a Vivino explore URL.
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing

This actor uses **pay-per-result** billing based on the compute units a run consumes.

- 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 wine scrapers.

### 🔧 Input configuration

| Field                | Type    | Required | Default    | Description                                                                                          |
| --------------------- | ------- | -------- | ---------- | ----------------------------------------------------------------------------------------------------- |
| `startUrl`            | string  | —        | —          | A `vivino.com/explore` URL to use instead of the filter fields below.                                  |
| `wineTypes`           | array   | —        | all        | `RED`, `WHITE`, `SPARKLING`, `ROSE`, `DESSERT`, `FORTIFIED`.                                            |
| `minRating`           | integer | —        | —          | Only wines rated at least this highly (1–5).                                                            |
| `priceMin`            | integer | —        | —          | Lowest bottle price to include.                                                                        |
| `priceMax`            | integer | —        | —          | Highest bottle price to include.                                                                       |
| `sortBy`              | string  | —        | `RATING`   | `RATING`, `POPULARITY` or `PRICE`.                                                                      |
| `maxItems`            | integer | —        | `5`        | Maximum wines to scrape. `0` collects every wine the search returns.                                    |
| `country`             | string  | —        | `US`       | Market country code for prices and availability.                                                        |
| `currency`            | string  | —        | `USD`      | Currency code for prices.                                                                               |
| `cacheProjectName`    | string  | —        | —          | Name a project to remember scraped wines across runs, so repeated runs return only new ones.            |
| `proxyConfiguration`  | object  | —        | —          | Proxy settings, configurable per run.                                                                   |

**Supported URL types:**
`startUrl` accepts a `vivino.com/explore?...` URL — for example one you copy from your browser after setting filters on the Vivino site. Its wine type, rating and price filters are read directly from the URL.

### 📦 Vivino scraper output data

Each result is a JSON object with the keys `vintageId`, `wineId`, `url`, `name`, `wineName`, `winery`, `wineryId`, `year`, `wineType`, `wineTypeId`, `isNatural`, `region`, `country`, `countryCode`, `rating`, `ratingCount`, `wineRating`, `wineRatingCount`, `labelsCount`, `price`, `currency`, `bottleType`, `grapes`, `style`, `styleDescription`, `foodPairings`, `tasteProfile`, `flavorKeywords`, `tasteStructure`, `image` and `exploreUrl`. The dataset ships with two views: **Overview**, a compact table of name, winery, type, rating and price; and **Full wine details**, which adds region, country, grapes, style, food pairings, taste structure and the label image.

**Sample output:**

```json
{
	"vintageId": 164942645,
	"wineId": 1122095,
	"url": "https://www.vivino.com/wines/164942645",
	"name": "Moët & Chandon Impérial Brut Champagne",
	"wineName": "Impérial Brut Champagne",
	"winery": "Moët & Chandon",
	"wineryId": 7799,
	"year": "N.V.",
	"wineType": "Sparkling",
	"wineTypeId": 3,
	"isNatural": false,
	"region": "Champagne",
	"country": "France",
	"countryCode": "fr",
	"rating": 4.1,
	"ratingCount": 143362,
	"wineRating": 4.1,
	"wineRatingCount": 143362,
	"labelsCount": 1578330,
	"price": 117.02,
	"currency": "USD",
	"bottleType": "Bottle (0.75l)",
	"grapes": [],
	"style": "French Champagne",
	"styleDescription": "While there are many sparkling wine regions around the globe, only Champagne from the Champagne appellation in France can be labeled as such...",
	"foodPairings": [
		"Pork",
		"Rich fish (salmon, tuna etc)",
		"Shellfish",
		"Mild and soft cheese"
	],
	"tasteProfile": {
		"tree_fruit": { "score": 575900, "mentions": 4022 },
		"citrus_fruit": { "score": 385100, "mentions": 3136 }
	},
	"flavorKeywords": [
		{ "name": "citrus", "mentions": 2229 },
		{ "name": "green apple", "mentions": 1963 }
	],
	"tasteStructure": {
		"acidity": 4.2,
		"fizziness": 4.28,
		"intensity": 3.75,
		"sweetness": 0,
		"tannin": 0
	},
	"image": "https://images.vivino.com/thumbs/LP_B9yqMQHSuMyd4SLgUSw_pl_480x640.png",
	"exploreUrl": "https://www.vivino.com/explore?min_rating=1"
}
```

### 🐍 How to scrape Vivino 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](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("<username>/vivino-wine-scraper").call(run_input={
    "wineTypes": ["RED"],
    "minRating": 4,
    "maxItems": 20,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('<username>/vivino-wine-scraper').call({
    wineTypes: ['RED'],
    minRating: 4,
    maxItems: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~vivino-wine-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"wineTypes": ["RED"], "minRating": 4, "maxItems": 20}'
```

### 💡 What you can use Vivino wine data for

- Price monitoring for wine retailers and marketplaces
- Building or enriching a wine catalog with ratings, tasting notes and food pairings
- Market research on wine trends by region, grape or style
- Feeding a recommendation engine with structured taste profiles
- Comparing bottle prices across countries and currencies

Sommeliers, wine retailers, e-commerce teams, data analysts and hospitality businesses use this data to track pricing, benchmark inventory against Vivino's community ratings, and power wine recommendation features.

### ❓ Frequently asked questions

#### Can I scrape Vivino legally?

Yes. This actor only collects wine data that is already publicly visible on Vivino's pages — no login, paywall, or private account content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn* as precedent). You're responsible for complying with Vivino's Terms of Service and any applicable laws, such as GDPR or CCPA, if you scrape or store personal data.

#### Does this scraper get every wine matching my filters?

Vivino's own search endpoint caps each result set at roughly 35 wines per filter combination, regardless of `maxItems`. To build a larger dataset, run the actor with different filter combinations (wine type, price range, rating) and use `cacheProjectName` so repeat runs skip wines you've already collected.

#### Can I search Vivino by wine name or keyword?

Not directly — Vivino's public search doesn't support keyword search from server-side requests. Instead, filter by wine type, rating and price range, or paste a `vivino.com/explore` URL with the filters already applied.

#### Do I need a proxy to scrape Vivino?

No. Vivino's explore endpoint is reachable without a proxy, which keeps runs cheap. Proxy configuration is available if you want to use one.

#### How do I scrape Vivino wine data with Python?

Install `apify-client`, call this actor with your filters as `run_input`, and iterate over `client.dataset(run["defaultDatasetId"]).iterate_items()`. See the Python example above for a complete script.

#### Can I run this Vivino scraper on a schedule?

Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run it daily, weekly, or on any cron interval. Set `cacheProjectName` so scheduled runs only return wines added since the last run.

#### 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

- [Church Finder Scraper](https://apify.com/confidential_gnat/churchfinder-scraper) — find and extract church listings and details.
- [Gametime Events Scraper](https://apify.com/confidential_gnat/gametime-events-scraper) — scrape live event and ticket data from Gametime.
- [INCIDecoder Scraper](https://apify.com/confidential_gnat/incidecoder-scraper) — extract cosmetic ingredient data from INCIDecoder.
- [Whois.com Scraper](https://apify.com/confidential_gnat/whois-com) — look up domain registration and ownership data.
- [Cars & Bids Cheapest Listings Scraper](https://apify.com/confidential_gnat/cheapest-carsandbids-scraper) — find the cheapest car auctions on Cars & Bids.

### 💬 Support & Contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/vivino-wine-scraper/issues/open)

You can also find more of our actors on the [Actor Flow ](https://apify.com/confidential_gnat).

# Actor input Schema

## `startUrl` (type: `string`):

Optional. Paste a vivino.com/explore URL (e.g. copied from your browser after setting filters there) and its filters are used instead of the fields below.

## `wineTypes` (type: `array`):

Which wine types to include. Leave empty for all types.

## `minRating` (type: `integer`):

Only return wines rated at least this highly on Vivino's 1–5 scale.

## `priceMin` (type: `integer`):

Lowest bottle price to include, in the selected currency.

## `priceMax` (type: `integer`):

Highest bottle price to include, in the selected currency.

## `sortBy` (type: `string`):

Which wines to return first.

## `maxItems` (type: `integer`):

Maximum number of wines to scrape. Set to 0 for every wine matching your filters.

## `country` (type: `string`):

Two-letter country code for the market whose prices and availability to use, for example US, GB, DE.

## `currency` (type: `string`):

Currency code for prices, for example USD, EUR, GBP.

## `cacheProjectName` (type: `string`):

Optional. Name a project to remember which wines have already been scraped across runs, so repeated runs only return new ones.

## `proxyConfiguration` (type: `object`):

Proxy settings. Vivino is reachable without a proxy, so proxies are disabled by default to keep runs cheap.

## Actor input object example

```json
{
  "wineTypes": [],
  "sortBy": "RATING",
  "maxItems": 5,
  "country": "US",
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/vivino-wine-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/vivino-wine-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call confidential_gnat/vivino-wine-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/vivino-wine-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hwsnJVv0kWov9fCHq/builds/v1Cc8LwHmJglpehPD/openapi.json
