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