# Vivino Reviews & Taste Profile Scraper (`ahmed_jasarevic/vivino-reviews-taste-profile-scraper`) Actor

Professional tool to extract wine reviews, ratings, and detailed taste profiles (tannin, acidity, etc.) directly from Vivino's API
High-performance Vivino scraper. Get customer reviews, regional statistics, and flavor profiles (sweetness, tannins) with residential proxy support.

- **URL**: https://apify.com/ahmed\_jasarevic/vivino-reviews-taste-profile-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Developer tools, E-commerce, Other
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Vivino Scraper: Reviews & Taste Profile Extractor

This Apify Actor is a high-performance SEO-optimized tool designed to extract comprehensive wine data directly from Vivino. It bypasses complex anti-scraping measures by utilizing the internal Vivino API, providing you with structured data including user reviews, ratings, and detailed taste profiles.

---

### 🚀 Features

* **Review Extraction:** Get thousands of user reviews including ratings, notes, and dates.
* **Taste Profile Analysis:** Extract flavor notes (tannin, acidity, alcohol levels) if available.
* **User Insights:** Scrape reviewer details like alias, follower count, and total ratings.
* **SEO Data:** Collect regional info, winery statistics, and vintage details.
* **High Performance:** Built with `CheerioCrawler` and optimized for residential proxies to avoid blocks.

---

### 📥 Input Example

The scraper requires specific wine URLs and a proxy configuration. For the best results, **Residential Proxies** are highly recommended.

```json
{
  "wineUrls": [
    "https://www.vivino.com/w/1168128?year=2019"
  ],
  "totalReviewsToGet": 150,
  "includeTasteProfile": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "groups": [
      "RESIDENTIAL"
    ]
  }
}
````

***

### 📤 Output Example

The data is delivered in a clean JSON format. Each item represents a single review tied to the specific wine and vintage.

```json
{
	"wineId": "1168128",
	"year": "2019",
	"originalUrl": "https://www.vivino.com/w/1168128?year=2019",
	"id": 69996090,
	"rating": 3.5,
	"note": "Apple, pear, butter, notes of citrus and white pepper, with hints of minerals. Harmonic and refreshing. It doesn't bring some interesting or unique experience, however, it's definitely enjoyable.",
	"language": "en",
	"created_at": "2017-06-05T15:55:21.000Z",
	"user": {
		"id": 10302787,
		"seo_name": "chizzanoua",
		"alias": "Vasil B",
		"is_featured": false,
		"is_premium": false,
		"visibility": "all",
		"image": {
			"location": "//images.vivino.com/avatars/pm9O4S2YTbm0H5kVHd345Q.jpg",
			"variations": {
				"large": "//thumbs.vivino.com/avatars/pm9O4S2YTbm0H5kVHd345Q_300x300.jpg",
				"small_square": "//thumbs.vivino.com/avatars/pm9O4S2YTbm0H5kVHd345Q_50x50.jpg"
			}
		},
		"background_image": {
			"location": "//images.vivino.com/users/backgrounds/0-NOqxRrTBSRWSomT63ABw.jpg",
			"variations": {
				"large": "//thumbs.vivino.com/backgrounds/0-NOqxRrTBSRWSomT63ABw_1200x400.jpg",
				"medium": "//thumbs.vivino.com/backgrounds/0-NOqxRrTBSRWSomT63ABw_600x200.jpg",
				"small": "//thumbs.vivino.com/backgrounds/0-NOqxRrTBSRWSomT63ABw_140x60.jpg"
			}
		},
		"language": "uk",
		"relationship": {
			"is_followed_by_me": false,
			"is_following_me": false,
			"follow_requested": false,
			"ignored_my_follow_request": false,
			"requested_to_follow_me": false,
			"follow_ignored_by_me": false,
			"is_blocked_by_me": false,
			"is_blocking_me": false
		},
		"statistics": {
			"followers_count": 2373,
			"followings_count": 953,
			"ratings_count": 3264,
			"ratings_sum": 12863.8,
			"reviews_count": 3029,
			"purchase_order_count": 4
		}
	},
	"vintage": {
		"id": 20124383,
		"seo_name": "j-l-quinson-les-ribelottes-bourgogne-chardonnay-2014",
		"name": "J. L. Quinson Les Ribelottes Bourgogne Chardonnay 2014",
		"statistics": {
			"status": "Normal",
			"ratings_count": 46,
			"ratings_average": 3.4,
			"labels_count": 616,
			"reviews_count": 18
		},
		"organic_certification_id": null,
		"certified_biodynamic": null,
		"image": {
			"location": "//images.vivino.com/labels/s-yJaJhhTfy5Wr9Adbc3TA.jpg",
			"variations": {
				"large": "//images.vivino.com/thumbs/s-yJaJhhTfy5Wr9Adbc3TA_375x500.jpg",
				"medium": "//images.vivino.com/thumbs/s-yJaJhhTfy5Wr9Adbc3TA_150x200.jpg",
				"medium_square": "//images.vivino.com/thumbs/s-yJaJhhTfy5Wr9Adbc3TA_150x150.jpg",
				"small_square": "//images.vivino.com/thumbs/s-yJaJhhTfy5Wr9Adbc3TA_80x80.jpg"
			}
		},
		"wine": {
			"id": 1168128,
			"name": "Les Ribelottes Bourgogne Chardonnay",
			"seo_name": "les-ribelottes-bourgogne-chardonnay",
			"type_id": 2,
			"vintage_type": 0,
			"is_natural": false,
			"region": {
				"id": 385,
				"name": "Bourgogne",
				"name_en": "Burgundy",
				"seo_name": "bourgogne",
				"country": {
					"code": "fr",
					"name": "France",
					"native_name": "France",
					"seo_name": "france",
					"currency": {
						"code": "EUR",
						"name": "Euros",
						"prefix": "€",
						"suffix": null
					},
					"regions_count": 1309,
					"users_count": 7459943,
					"wines_count": 459303,
					"wineries_count": 69220,
					"most_used_grapes": [
						{
							"id": 14,
							"name": "Pinot Noir",
							"seo_name": "pinot-noir",
							"has_detailed_info": true,
							"wines_count": 572334,
							"parent_grape_id": null
						},
						{
							"id": 5,
							"name": "Chardonnay",
							"seo_name": "chardonnay",
							"has_detailed_info": true,
							"wines_count": 604208,
							"parent_grape_id": null
						},
						{
							"id": 10,
							"name": "Merlot",
							"seo_name": "merlot",
							"has_detailed_info": true,
							"wines_count": 566719,
							"parent_grape_id": null
						}
					]
				},
				"parent_id": null,
				"background_image": {
					"location": "//images.vivino.com/regions/backgrounds/B_R9c4eLQCuo7Nqjbii6WQ.jpg",
					"variations": {
						"large": "//thumbs.vivino.com/region_backgrounds/B_R9c4eLQCuo7Nqjbii6WQ_1280x760.jpg",
						"medium": "//thumbs.vivino.com/region_backgrounds/B_R9c4eLQCuo7Nqjbii6WQ_600x356.jpg"
					}
				},
				"class": "VivinoAPI::Region",
				"statistics": {
					"wineries_count": 5548,
					"wines_count": 23392,
					"sub_regions_count": 0,
					"parent_regions_count": 0
				}
			},
			"vintage_mask": [
				"2026"
			],
			"review_status": 2,
			"winery": {
				"id": 13491,
				"name": "J. L. Quinson",
				"seo_name": "j-l-quinson",
				"status": 0,
				"review_status": "Completed",
				"background_image": null,
				"statistics": {
					"ratings_count": 14966,
					"ratings_average": 3.6,
					"labels_count": 193172,
					"wines_count": 93
				}
			},
			"style": null,
			"has_valid_ratings": false
		},
		"year": 2014,
		"grapes": null,
		"has_valid_ratings": true
	},
	"activity": {
		"id": 186272927,
		"statistics": {
			"likes_count": 16,
			"comments_count": 1
		}
	},
	"flavor_word_matches": [
		{
			"id": 276,
			"match": "minerals"
		},
		{
			"id": 449,
			"match": "white pepper"
		},
		{
			"id": 70,
			"match": "butter"
		},
		{
			"id": 106,
			"match": "citrus"
		},
		{
			"id": 315,
			"match": "pear"
		},
		{
			"id": 9,
			"match": "apple"
		}
	],
	"tagged_note": "Apple, pear, butter, notes of citrus and white pepper, with hints of minerals. Harmonic and refreshing. It doesn&#39;t bring some interesting or unique experience, however, it&#39;s definitely enjoyable."
}
```

***

### 🛠️ How to Use

1. **Direct URLs:** Copy and paste the full Vivino wine link into the `wineUrls` list.
2. **Set Limits:** Define how many reviews you need via `totalReviewsToGet`.
3. **Proxy:** Ensure you select a Proxy (Residential) in the settings to ensure the scraper isn't challenged by AWS WAF.
4. **Run:** Click "Start" and watch the data populate in your dataset in real-time.

### 📈 Use Cases

- **Market Research:** Analyze consumer sentiment for specific vintages or regions.
- **E-commerce:** Enrich your own wine shop with authentic ratings and flavor profiles.
- **Competitor Analysis:** Track winery performance and regional trends.

***

**Developed for high-reliability and speed. Happy Scraping!** 🍷

# Actor input Schema

## `wineUrls` (type: `array`):

Lista direktnih Vivino linkova (npr. https://www.vivino.com/w/1168128?year=2019).

## `totalReviewsToGet` (type: `integer`):

Maksimalan broj recenzija koje želiš po jednom vinu.

## `includeTasteProfile` (type: `boolean`):

Da li želiš podatke o ukusu (tannin, acidity, itd.).

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

Odaberi proxy (Residential je obavezan za Vivino).

## Actor input object example

```json
{
  "totalReviewsToGet": 10,
  "includeTasteProfile": true
}
```

# 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("ahmed_jasarevic/vivino-reviews-taste-profile-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("ahmed_jasarevic/vivino-reviews-taste-profile-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 ahmed_jasarevic/vivino-reviews-taste-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ahmed_jasarevic/vivino-reviews-taste-profile-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vivino Reviews & Taste Profile Scraper",
        "description": "Professional tool to extract wine reviews, ratings, and detailed taste profiles (tannin, acidity, etc.) directly from Vivino's API\nHigh-performance Vivino scraper. Get customer reviews, regional statistics, and flavor profiles (sweetness, tannins) with residential proxy support.",
        "version": "0.0",
        "x-build-id": "5VuFcObEFrFUpKaq4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ahmed_jasarevic~vivino-reviews-taste-profile-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ahmed_jasarevic-vivino-reviews-taste-profile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ahmed_jasarevic~vivino-reviews-taste-profile-scraper/runs": {
            "post": {
                "operationId": "runs-sync-ahmed_jasarevic-vivino-reviews-taste-profile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ahmed_jasarevic~vivino-reviews-taste-profile-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-ahmed_jasarevic-vivino-reviews-taste-profile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "wineUrls",
                    "proxyConfiguration"
                ],
                "properties": {
                    "wineUrls": {
                        "title": "Wine URLs",
                        "type": "array",
                        "description": "Lista direktnih Vivino linkova (npr. https://www.vivino.com/w/1168128?year=2019).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "totalReviewsToGet": {
                        "title": "Total reviews per wine",
                        "type": "integer",
                        "description": "Maksimalan broj recenzija koje želiš po jednom vinu.",
                        "default": 10
                    },
                    "includeTasteProfile": {
                        "title": "Include Taste Profile",
                        "type": "boolean",
                        "description": "Da li želiš podatke o ukusu (tannin, acidity, itd.).",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Odaberi proxy (Residential je obavezan za Vivino)."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
