# Vivino Product Search Scraper (`stealth_mode/vivino-product-search-scraper`) Actor

Extract wine product details from Vivino.com search results. Collect over 18 data fields per wine including ratings, prices, vintage, region, grapes, tasting notes, and winery info — perfect for wine retailers, researchers, and data analysts.

- **URL**: https://apify.com/stealth\_mode/vivino-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Developer tools, Automation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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/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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Product Search Scraper: Scrape Wine Data & Prices Fast

---

### What Is Vivino.com?

Vivino.com is the world's largest wine community and marketplace, featuring millions of wine products with user ratings, pricing data across markets, and detailed tasting profiles. Wine professionals, retailers, and enthusiasts rely on Vivino for discovery, comparison, and purchasing decisions. However, extracting structured product data from search results — prices, ratings, vintage information, and regional details — requires significant manual effort. The **Vivino Product Search Scraper** automates this entirely, turning search results into clean, analyzable datasets.

---

### Overview

The **Vivino Product Search Scraper** extracts detailed wine product information from Vivino search result pages, organizing data into structured records with 18+ fields. It serves:

- **Wine retailers** tracking competitor pricing and catalog updates
- **Data analysts** building wine market intelligence datasets
- **Researchers** studying wine trends, pricing patterns, and regional production
- **E-commerce platforms** aggregating wine product feeds
- **Sommeliers & enthusiasts** building personal wine databases

This scraper handles search result pagination seamlessly, configurable item limits, and robust error handling to ensure reliable large-scale collection.

---

### Input Format

The scraper accepts a JSON configuration specifying which search result pages to scrape:

```json
{
  "urls": [
    "https://www.vivino.com/en/explore?e=eJzLLbI11rNQy83MszU0MDBQy02ssDUDMZIrbbMK1JJtvQIi1QpsjdXS02zLEosyU0sSc9Tyi1JsU1KLk9Xykyptk1KLS-ILMpOziwF5GxkI"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
````

| Parameter | Type | Purpose |
|---|---|---|
| `urls` | Array | Direct links to Vivino search result pages (explore pages with filters applied) |
| `max_items_per_url` | Integer | Maximum wines to collect per URL (e.g., `200` for full-page collection) |
| `ignore_url_failures` | Boolean | If `true`, skips problematic URLs and continues the run; if `false`, stops on errors |

> **Tip:** Use filtered Vivino.com/en/explore URLs to target specific regions, vintages, or price ranges — the scraper preserves all filters.

***

### Output Format

**Example Output Record:**

```json
{
  "id": 1340906,
  "seo_name": "salentein-primus-malbec-primum-2003",
  "name": "Salentein Primus Malbec (Primum) 2003",
  "statistics": {
    "status": "Normal",
    "ratings_count": 192,
    "ratings_average": 4.3,
    "labels_count": 360,
    "is_wine_rating": false,
    "wine_ratings_count": 14117,
    "wine_ratings_average": 4.4,
    "wine_status": ""
  },
  "image": {
    "location": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_480x640.png",
    "variations": {
      "bottle_large": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pb_x960.png",
      "bottle_medium": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pb_x600.png",
      "bottle_medium_square": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pb_600x600.png",
      "bottle_small": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pb_x300.png",
      "bottle_small_square": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pb_300x300.png",
      "label": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_480x640.png",
      "label_large": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_375x500.png",
      "label_medium": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_150x200.png",
      "label_medium_square": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_150x150.png",
      "label_small_square": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_80x80.png",
      "large": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_375x500.png",
      "medium": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_150x200.png",
      "medium_square": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_150x150.png",
      "small_square": "//images.vivino.com/thumbs/KyB8bahIRmW0SjBNHCE0Rg_pl_80x80.png"
    }
  },
  "wine": null,
  "year": 2003,
  "grapes": null,
  "has_valid_ratings": true,
  "type_id": 1,
  "vintage_type": 0,
  "is_natural": false,
  "region": {
    "id": 1609,
    "name": "Tunuyán",
    "name_en": "",
    "seo_name": "tunuyan",
    "country": {
      "code": "ar",
      "name": "Argentina",
      "native_name": "Argentina",
      "seo_name": "argentina",
      "currency": {
        "code": "ARS",
        "name": "Argentinean Peso",
        "prefix": "$",
        "suffix": null
      },
      "regions_count": 47,
      "users_count": 744430,
      "wines_count": 41440,
      "wineries_count": 5678,
      "most_used_grapes": [
        {
          "id": 9,
          "name": "Malbec",
          "seo_name": "malbec",
          "has_detailed_info": true,
          "wines_count": 219735,
          "parent_grape_id": null,
          "color": 5
        },
        {
          "id": 2,
          "name": "Cabernet Sauvignon",
          "seo_name": "cabernet-sauvignon",
          "has_detailed_info": true,
          "wines_count": 801751,
          "parent_grape_id": null,
          "color": 5
        },
        {
          "id": 5,
          "name": "Chardonnay",
          "seo_name": "chardonnay",
          "has_detailed_info": true,
          "wines_count": 604208,
          "parent_grape_id": null,
          "color": 1
        }
      ]
    },
    "class": "VivinoAPI::Region",
    "background_image": null
  },
  "winery": {
    "id": 3754,
    "name": "Salentein",
    "seo_name": "salentein",
    "status": 0,
    "background_image": null
  },
  "taste": {
    "structure": {
      "acidity": 2.73,
      "fizziness": null,
      "intensity": 3.98,
      "sweetness": 2.21,
      "tannin": 2.83,
      "user_structure_count": 1945,
      "calculated_structure_count": 264
    },
    "flavor": [
      {
        "group": "oak",
        "stats": {
          "count": 210,
          "score": 32157
        },
        "primary_keywords": [
          {
            "id": 292,
            "name": "oak",
            "count": 119
          },
          {
            "id": 434,
            "name": "vanilla",
            "count": 96
          },
          {
            "id": 422,
            "name": "tobacco",
            "count": 59
          },
          {
            "id": 101,
            "name": "chocolate",
            "count": 29
          },
          {
            "id": 112,
            "name": "clove",
            "count": 15
          },
          {
            "id": 117,
            "name": "coffee",
            "count": 8
          },
          {
            "id": 79,
            "name": "caramel",
            "count": 5
          },
          {
            "id": 83,
            "name": "cedar",
            "count": 5
          },
          {
            "id": 134,
            "name": "dark chocolate",
            "count": 5
          },
          {
            "id": 21,
            "name": "baking spice",
            "count": 2
          },
          {
            "id": 275,
            "name": "milk chocolate",
            "count": 2
          },
          {
            "id": 20,
            "name": "baking chocolate",
            "count": 1
          },
          {
            "id": 70,
            "name": "butter",
            "count": 1
          },
          {
            "id": 74,
            "name": "camphor",
            "count": 1
          },
          {
            "id": 103,
            "name": "cigar",
            "count": 1
          },
          {
            "id": 104,
            "name": "cigar box",
            "count": 1
          },
          {
            "id": 158,
            "name": "espresso",
            "count": 1
          },
          {
            "id": 280,
            "name": "mocha",
            "count": 1
          },
          {
            "id": 424,
            "name": "toffee",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 242,
            "name": "leather",
            "count": 38
          },
          {
            "id": 105,
            "name": "cinnamon",
            "count": 18
          },
          {
            "id": 384,
            "name": "smoke",
            "count": 15
          },
          {
            "id": 113,
            "name": "cocoa",
            "count": 4
          },
          {
            "id": 6,
            "name": "almond",
            "count": 1
          }
        ]
      },
      {
        "group": "black_fruit",
        "stats": {
          "count": 182,
          "score": 28770
        },
        "primary_keywords": [
          {
            "id": 334,
            "name": "plum",
            "count": 87
          },
          {
            "id": 49,
            "name": "blackberry",
            "count": 86
          },
          {
            "id": 39,
            "name": "black fruit",
            "count": 25
          },
          {
            "id": 52,
            "name": "blackcurrant",
            "count": 23
          },
          {
            "id": 470,
            "name": "cassis",
            "count": 16
          },
          {
            "id": 55,
            "name": "blueberry",
            "count": 15
          },
          {
            "id": 135,
            "name": "dark fruit",
            "count": 15
          },
          {
            "id": 38,
            "name": "black cherry",
            "count": 12
          },
          {
            "id": 229,
            "name": "jam",
            "count": 3
          },
          {
            "id": 43,
            "name": "black plum",
            "count": 2
          },
          {
            "id": 57,
            "name": "bramble",
            "count": 2
          },
          {
            "id": 41,
            "name": "black olive",
            "count": 1
          },
          {
            "id": 50,
            "name": "blackberry jam",
            "count": 1
          },
          {
            "id": 56,
            "name": "boysenberry",
            "count": 1
          },
          {
            "id": 283,
            "name": "mulberry",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 341,
            "name": "prune",
            "count": 2
          }
        ]
      },
      {
        "group": "non_oak",
        "stats": {
          "count": 163,
          "score": 3395
        },
        "primary_keywords": [
          {
            "id": 417,
            "name": "toast",
            "count": 4
          },
          {
            "id": 98,
            "name": "chestnut",
            "count": 2
          },
          {
            "id": 6,
            "name": "almond",
            "count": 1
          },
          {
            "id": 35,
            "name": "biscuit",
            "count": 1
          },
          {
            "id": 145,
            "name": "dried fig",
            "count": 1
          },
          {
            "id": 438,
            "name": "walnut",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 434,
            "name": "vanilla",
            "count": 96
          },
          {
            "id": 422,
            "name": "tobacco",
            "count": 59
          },
          {
            "id": 105,
            "name": "cinnamon",
            "count": 18
          },
          {
            "id": 112,
            "name": "clove",
            "count": 15
          },
          {
            "id": 384,
            "name": "smoke",
            "count": 15
          },
          {
            "id": 117,
            "name": "coffee",
            "count": 8
          },
          {
            "id": 163,
            "name": "fig",
            "count": 6
          },
          {
            "id": 79,
            "name": "caramel",
            "count": 5
          },
          {
            "id": 83,
            "name": "cedar",
            "count": 5
          },
          {
            "id": 158,
            "name": "espresso",
            "count": 1
          },
          {
            "id": 280,
            "name": "mocha",
            "count": 1
          }
        ]
      },
      {
        "group": "spices",
        "stats": {
          "count": 145,
          "score": 9289
        },
        "primary_keywords": [
          {
            "id": 320,
            "name": "pepper",
            "count": 46
          },
          {
            "id": 105,
            "name": "cinnamon",
            "count": 18
          },
          {
            "id": 249,
            "name": "licorice",
            "count": 14
          },
          {
            "id": 277,
            "name": "mint",
            "count": 5
          },
          {
            "id": 273,
            "name": "menthol",
            "count": 2
          },
          {
            "id": 7,
            "name": "anise",
            "count": 1
          },
          {
            "id": 8,
            "name": "aniseed",
            "count": 1
          },
          {
            "id": 121,
            "name": "cracked pepper",
            "count": 1
          },
          {
            "id": 200,
            "name": "green herbs",
            "count": 1
          },
          {
            "id": 233,
            "name": "juniper berry",
            "count": 1
          },
          {
            "id": 286,
            "name": "musk",
            "count": 1
          },
          {
            "id": 381,
            "name": "savory",
            "count": 1
          },
          {
            "id": 416,
            "name": "thyme",
            "count": 1
          },
          {
            "id": 449,
            "name": "white pepper",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 434,
            "name": "vanilla",
            "count": 96
          },
          {
            "id": 112,
            "name": "clove",
            "count": 15
          }
        ]
      },
      {
        "group": "earth",
        "stats": {
          "count": 113,
          "score": 9562
        },
        "primary_keywords": [
          {
            "id": 242,
            "name": "leather",
            "count": 38
          },
          {
            "id": 156,
            "name": "earthy",
            "count": 15
          },
          {
            "id": 384,
            "name": "smoke",
            "count": 15
          },
          {
            "id": 192,
            "name": "graphite",
            "count": 5
          },
          {
            "id": 113,
            "name": "cocoa",
            "count": 4
          },
          {
            "id": 284,
            "name": "mushroom",
            "count": 4
          },
          {
            "id": 276,
            "name": "minerals",
            "count": 3
          },
          {
            "id": 165,
            "name": "forest floor",
            "count": 2
          },
          {
            "id": 178,
            "name": "game",
            "count": 2
          },
          {
            "id": 85,
            "name": "chalk",
            "count": 1
          },
          {
            "id": 218,
            "name": "honey",
            "count": 1
          },
          {
            "id": 377,
            "name": "salt",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 422,
            "name": "tobacco",
            "count": 59
          },
          {
            "id": 134,
            "name": "dark chocolate",
            "count": 5
          },
          {
            "id": 6,
            "name": "almond",
            "count": 1
          },
          {
            "id": 280,
            "name": "mocha",
            "count": 1
          },
          {
            "id": 381,
            "name": "savory",
            "count": 1
          }
        ]
      },
      {
        "group": "red_fruit",
        "stats": {
          "count": 72,
          "score": 7104
        },
        "primary_keywords": [
          {
            "id": 93,
            "name": "cherry",
            "count": 35
          },
          {
            "id": 348,
            "name": "raspberry",
            "count": 10
          },
          {
            "id": 354,
            "name": "red fruit",
            "count": 10
          },
          {
            "id": 122,
            "name": "cranberry",
            "count": 6
          },
          {
            "id": 352,
            "name": "red cherry",
            "count": 5
          },
          {
            "id": 400,
            "name": "strawberry",
            "count": 3
          }
        ],
        "secondary_keywords": [
          {
            "id": 38,
            "name": "black cherry",
            "count": 12
          },
          {
            "id": 229,
            "name": "jam",
            "count": 3
          }
        ]
      },
      {
        "group": "microbio",
        "stats": {
          "count": 21,
          "score": 1425
        },
        "primary_keywords": [
          {
            "id": 123,
            "name": "cream",
            "count": 5
          },
          {
            "id": 91,
            "name": "cheese",
            "count": 3
          },
          {
            "id": 23,
            "name": "banana",
            "count": 2
          },
          {
            "id": 295,
            "name": "oil",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 284,
            "name": "mushroom",
            "count": 4
          },
          {
            "id": 417,
            "name": "toast",
            "count": 4
          },
          {
            "id": 6,
            "name": "almond",
            "count": 1
          },
          {
            "id": 70,
            "name": "butter",
            "count": 1
          },
          {
            "id": 424,
            "name": "toffee",
            "count": 1
          }
        ]
      },
      {
        "group": "floral",
        "stats": {
          "count": 16,
          "score": 1525
        },
        "primary_keywords": [
          {
            "id": 436,
            "name": "violet",
            "count": 15
          }
        ],
        "secondary_keywords": [
          {
            "id": 381,
            "name": "savory",
            "count": 1
          }
        ]
      },
      {
        "group": "dried_fruit",
        "stats": {
          "count": 11,
          "score": 872
        },
        "primary_keywords": [
          {
            "id": 163,
            "name": "fig",
            "count": 6
          },
          {
            "id": 341,
            "name": "prune",
            "count": 2
          },
          {
            "id": 347,
            "name": "raisin",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 229,
            "name": "jam",
            "count": 3
          }
        ]
      },
      {
        "group": "vegetal",
        "stats": {
          "count": 4,
          "score": 235
        },
        "primary_keywords": [
          {
            "id": 403,
            "name": "sun-dried tomato",
            "count": 1
          },
          {
            "id": 425,
            "name": "tomato",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 6,
            "name": "almond",
            "count": 1
          },
          {
            "id": 381,
            "name": "savory",
            "count": 1
          }
        ]
      },
      {
        "group": "tree_fruit",
        "stats": {
          "count": 3,
          "score": 300
        },
        "primary_keywords": [
          {
            "id": 9,
            "name": "apple",
            "count": 2
          },
          {
            "id": 11,
            "name": "apricot",
            "count": 1
          }
        ]
      },
      {
        "group": "tropical_fruit",
        "stats": {
          "count": 3,
          "score": 166
        },
        "primary_keywords": [
          {
            "id": 428,
            "name": "tropical",
            "count": 1
          }
        ],
        "secondary_keywords": [
          {
            "id": 23,
            "name": "banana",
            "count": 2
          }
        ]
      },
      {
        "group": "citrus_fruit",
        "stats": {
          "count": 2,
          "score": 200
        },
        "primary_keywords": [
          {
            "id": 298,
            "name": "orange",
            "count": 2
          }
        ]
      }
    ]
  },
  "style": {
    "id": 891,
    "seo_name": "argentinian-uco-valley-malbec-red",
    "regional_name": "Argentinian Uco Valley",
    "varietal_name": "Malbec",
    "name": "Argentinian Uco Valley Malbec Red",
    "background_image": null,
    "image": null,
    "description": null,
    "blurb": null,
    "interesting_facts": null,
    "body": 4,
    "body_description": "Full-bodied",
    "acidity": 2,
    "acidity_description": "Medium",
    "country": {
      "code": "ar",
      "name": "Argentina",
      "native_name": "Argentina",
      "seo_name": "argentina",
      "currency": {
        "code": "ARS",
        "name": "Argentinean Peso",
        "prefix": "$",
        "suffix": null
      },
      "regions_count": 47,
      "users_count": 744430,
      "wines_count": 41440,
      "wineries_count": 5678,
      "most_used_grapes": [
        {
          "id": 9,
          "name": "Malbec",
          "seo_name": "malbec",
          "has_detailed_info": true,
          "wines_count": 219735,
          "parent_grape_id": null,
          "color": 5
        },
        {
          "id": 2,
          "name": "Cabernet Sauvignon",
          "seo_name": "cabernet-sauvignon",
          "has_detailed_info": true,
          "wines_count": 801751,
          "parent_grape_id": null,
          "color": 5
        },
        {
          "id": 5,
          "name": "Chardonnay",
          "seo_name": "chardonnay",
          "has_detailed_info": true,
          "wines_count": 604208,
          "parent_grape_id": null,
          "color": 1
        }
      ]
    },
    "wine_type_id": 1,
    "food": [
      {
        "id": 4,
        "name": "Beef",
        "weight": 0.5,
        "background_image": {
          "location": "//images.vivino.com/backgrounds/foods/4_beef.png",
          "variations": {
            "small": "//images.vivino.com/backgrounds/foods/thumbs/4_beef_932x810.png"
          }
        },
        "seo_name": "beef"
      },
      {
        "id": 8,
        "name": "Lamb",
        "weight": 0.5,
        "background_image": {
          "location": "//images.vivino.com/backgrounds/foods/8_lamb.png",
          "variations": {
            "small": "//images.vivino.com/backgrounds/foods/thumbs/8_lamb_932x810.png"
          }
        },
        "seo_name": "lamb"
      }
    ],
    "grapes": [
      {
        "id": 9,
        "name": "Malbec",
        "seo_name": "malbec",
        "has_detailed_info": true,
        "wines_count": 219735,
        "parent_grape_id": null,
        "color": 5
      }
    ],
    "region": {
      "id": 713,
      "name": "Uco Valley",
      "name_en": "Valle de Uco",
      "seo_name": "valle-de-uco",
      "country": {
        "code": "ar",
        "name": "Argentina",
        "native_name": "Argentina",
        "seo_name": "argentina",
        "currency": {
          "code": "ARS",
          "name": "Argentinean Peso",
          "prefix": "$",
          "suffix": null
        },
        "regions_count": 47,
        "users_count": 744430,
        "wines_count": 41440,
        "wineries_count": 5678,
        "most_used_grapes": [
          {
            "id": 9,
            "name": "Malbec",
            "seo_name": "malbec",
            "has_detailed_info": true,
            "wines_count": 219735,
            "parent_grape_id": null,
            "color": 5
          },
          {
            "id": 2,
            "name": "Cabernet Sauvignon",
            "seo_name": "cabernet-sauvignon",
            "has_detailed_info": true,
            "wines_count": 801751,
            "parent_grape_id": null,
            "color": 5
          },
          {
            "id": 5,
            "name": "Chardonnay",
            "seo_name": "chardonnay",
            "has_detailed_info": true,
            "wines_count": 604208,
            "parent_grape_id": null,
            "color": 1
          }
        ]
      },
      "parent_id": 454,
      "background_image": {
        "location": "//images.vivino.com/regions/backgrounds/HiAacuq2SW-KcY5mT1Rqgg.jpg",
        "variations": {
          "large": "//thumbs.vivino.com/region_backgrounds/HiAacuq2SW-KcY5mT1Rqgg_1280x760.jpg",
          "medium": "//thumbs.vivino.com/region_backgrounds/HiAacuq2SW-KcY5mT1Rqgg_600x356.jpg"
        }
      },
      "statistics": {
        "wineries_count": 493,
        "wines_count": 5893,
        "sub_regions_count": 6,
        "parent_regions_count": 1
      }
    },
    "parent_style_id": 895,
    "hidden": false,
    "statistics": {
      "wines_count": 1529,
      "aggregated_wines_count": 1852
    },
    "vintage_mask": null,
    "baseline_structure": {
      "acidity": 3.5,
      "fizziness": null,
      "intensity": 4.0,
      "sweetness": 1.5,
      "tannin": 3.0
    }
  },
  "price": {
    "id": 2895285,
    "merchant_id": 1127,
    "amount": 22.62,
    "unit_amount": 0,
    "discounted_from": 0,
    "discount_percent": null,
    "type": "ppc",
    "sku": "681",
    "url": "http://www.p9.com.tw/Wine/ProductDetail.aspx?id=681",
    "visibility": 1,
    "bottle_type_id": 1,
    "currency": {
      "code": "USD",
      "name": "US Dollars",
      "prefix": "$",
      "suffix": null
    },
    "bottle_quantity": 1,
    "minimum_unit_quantity": null,
    "xms": 0,
    "xmphs": false,
    "price_group_id": null,
    "vfm_score": 0,
    "vfm_category": 0,
    "cmp_score": 0,
    "cmp_tier": 0,
    "bottle_type": {
      "id": 1,
      "name": "Bottle (0.75l)",
      "short_name": "bottle",
      "short_name_plural": "bottles",
      "volume_ml": 750
    }
  },
  "prices": [
    {
      "id": 2895285,
      "merchant_id": 1127,
      "amount": 22.62,
      "unit_amount": 0,
      "discounted_from": 0,
      "discount_percent": null,
      "type": "ppc",
      "sku": "681",
      "url": "http://www.p9.com.tw/Wine/ProductDetail.aspx?id=681",
      "visibility": 1,
      "bottle_type_id": 1,
      "currency": {
        "code": "USD",
        "name": "US Dollars",
        "prefix": "$",
        "suffix": null
      },
      "bottle_quantity": 1,
      "minimum_unit_quantity": null,
      "xms": 0,
      "xmphs": false,
      "price_group_id": null,
      "vfm_score": 0,
      "vfm_category": 0,
      "cmp_score": 0,
      "cmp_tier": 0,
      "bottle_type": {
        "id": 1,
        "name": "Bottle (0.75l)",
        "short_name": "bottle",
        "short_name_plural": "bottles",
        "volume_ml": 750
      }
    }
  ],
  "from_url": "https://www.vivino.com/en/explore?e=eJwrsDUCAAH_AOA%3D"
}
```

Each scraped wine product returns a comprehensive record with 18+ fields:

#### Product Identification

| Field | Meaning |
|---|---|
| `ID` | Unique Vivino product identifier |
| `Name` | Full wine name (e.g., "Château Lafite Rothschild 2018") |
| `SEO Name` | URL-friendly version of the wine name |

#### Wine Classification

| Field | Meaning |
|---|---|
| `Year` | Vintage year (e.g., `2018`, `2020`) |
| `Type ID` | Wine type category ID (red, white, rosé, sparkling, etc.) |
| `Vintage Type` | Classification of the vintage (standard, old vintage, prestige) |
| `Grapes` | Grape varieties used (e.g., Cabernet Sauvignon, Chardonnay) |
| `Region` | Geographical origin (e.g., Bordeaux, Napa Valley) |
| `Winery` | Producer/winery name and details |
| `Is Natural` | Boolean flag indicating if the wine is natural/organic |

#### Ratings & Reviews

| Field | Meaning |
|---|---|
| `Statistics` | Aggregated user ratings, review counts, and average score on Vivino |
| `Has Valid Ratings` | Boolean — whether the product has sufficient user reviews for credibility |
| `Taste` | Community taste profile tags (e.g., "fruity," "oaky," "dry") |
| `Style` | Wine style descriptors (body, acidity, tannins characteristics) |

#### Pricing Data

| Field | Meaning |
|---|---|
| `Price` | Base or average price in detected currency |
| `Prices` | Array of prices across different markets/retailers (if available) |

#### Media

| Field | Meaning |
|---|---|
| `Image` | URL to the wine bottle image for display or download |

***

### How to Use

1. **Find search URLs** — Navigate to Vivino.com/en/explore and apply filters (region, price, rating, vintage). Copy the resulting URL.
2. **Input configuration** — Paste the search URL(s) into the `urls` array. Increase `max_items_per_url` for complete result sets.
3. **Run the scraper** — Execute with configured settings. Monitor the run log for progress.
4. **Download results** — Export as JSON, CSV, or Excel once the run completes.

**Best practices:**

- Use specific filtered URLs to avoid extremely large datasets (Vivino has millions of products).
- Set `max_items_per_url: 200` or `500` for balanced collection versus speed.
- Enable `ignore_url_failures: true` for batch runs across multiple search URLs.
- Refresh scraped data monthly to capture price updates and new reviews.

***

### Use Cases & Business Value

- **Price monitoring:** Track competitor pricing and margin trends across wine categories
- **Market research:** Analyze which vintages, regions, and grape varieties dominate different price segments
- **Inventory sync:** Automatically update e-commerce catalogs with Vivino ratings and product metadata
- **Recommendation engines:** Build datasets for wine pairing and personalization algorithms
- **Academic analysis:** Study wine production and consumer preference trends globally

By automating data extraction, you eliminate manual copy-paste work and access fresh, structured wine market data for competitive advantage.

***

### Conclusion

The **Vivino Product Search Scraper** is an essential tool for anyone in the wine industry or building wine-related applications. It transforms unstructured search results into actionable, analyzable datasets across pricing, ratings, vineyard data, and more. Start collecting wine market intelligence today.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.vivino.com/en/explore?e=eJzLLbI11rNQy83MszU0MDBQy02ssDUDMZIrbbMK1JJtvQIi1QpsjdXS02zLEosyU0sSc9Tyi1JsU1KLk9Xykyptk1KLS-ILMpOziwF5GxkI"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.vivino.com/en/explore?e=eJzLLbI11rNQy83MszU0MDBQy02ssDUDMZIrbbMK1JJtvQIi1QpsjdXS02zLEosyU0sSc9Tyi1JsU1KLk9Xykyptk1KLS-ILMpOziwF5GxkI"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/vivino-product-search-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 = {
    "urls": ["https://www.vivino.com/en/explore?e=eJzLLbI11rNQy83MszU0MDBQy02ssDUDMZIrbbMK1JJtvQIi1QpsjdXS02zLEosyU0sSc9Tyi1JsU1KLk9Xykyptk1KLS-ILMpOziwF5GxkI"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/vivino-product-search-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 '{
  "urls": [
    "https://www.vivino.com/en/explore?e=eJzLLbI11rNQy83MszU0MDBQy02ssDUDMZIrbbMK1JJtvQIi1QpsjdXS02zLEosyU0sSc9Tyi1JsU1KLk9Xykyptk1KLS-ILMpOziwF5GxkI"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/vivino-product-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vivino Product Search Scraper",
        "description": "Extract wine product details from Vivino.com search results. Collect over 18 data fields per wine including ratings, prices, vintage, region, grapes, tasting notes, and winery info — perfect for wine retailers, researchers, and data analysts.",
        "version": "0.0",
        "x-build-id": "oY6TUJWyHydt8YI1G"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~vivino-product-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-vivino-product-search-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/stealth_mode~vivino-product-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-vivino-product-search-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/stealth_mode~vivino-product-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-vivino-product-search-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",
                "properties": {
                    "urls": {
                        "title": "URLs of the product search list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
