{
  "openapi": "3.0.1",
  "info": {
    "title": "Vivino data scraper: wine rating and wine reviews",
    "description": "Extract wine ratings, prices, taste profiles, wine reviews and grape varieties from Vivino, by wine name or by URL. Vivino has no public API, so this scraper returns the same data as JSON, CSV or Excel, with an HTTP-only engine that needs no browser. Run it via API or schedule it. By MrBridge",
    "version": "0.5",
    "x-build-id": "OBsi9SZxxpxrlCgcv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/mrbridge~vivino-wine-data-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-mrbridge-vivino-wine-data-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/mrbridge~vivino-wine-data-scraper/runs": {
      "post": {
        "operationId": "runs-sync-mrbridge-vivino-wine-data-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/mrbridge~vivino-wine-data-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-mrbridge-vivino-wine-data-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": {
          "wines": {
            "title": "Wines or Vivino URLs or mix of both",
            "maxItems": 250,
            "type": "array",
            "description": "Add the wines to extract, one per line (max 250 per run). Each entry is auto-detected: paste a Vivino URL (e.g., 'https://www.vivino.com/wines/12345') to scrape directly, or type a wine name (e.g., 'Opus One 2019') to search. Mix both freely. Include vintage years in names for precise matching. For larger lists, split into batches of ≤250 (this keeps Advanced matching well under the run timeout).",
            "items": {
              "type": "string"
            }
          },
          "searchMode": {
            "title": "Search Mode",
            "enum": [
              "auto",
              "name_and_vintage",
              "name_only"
            ],
            "type": "string",
            "description": "How to handle vintage years in wine names:\n- auto: Automatically detect and use vintages when present\n- name_and_vintage: Always try to extract and filter by vintage\n- name_only: Ignore vintages, search by name only",
            "default": "auto"
          },
          "matchingMode": {
            "title": "Matching mode",
            "enum": [
              "basic",
              "advanced"
            ],
            "type": "string",
            "description": "How hard to work to match your wine NAMES to Vivino (ignored for direct Vivino URLs).\n\n- Basic (default, fast, ~6 s/wine): use when your names read like Vivino - full producer name, correct spelling. Examples: 'Domaine Leflaive Puligny-Montrachet 2022', 'Opus One 2019'.\n\n- Advanced (~15-25 s/wine): full fallback cascade for names that differ from Vivino - last-name/first-name order, '& Fils' omitted, abbreviations, or a cuvée without its appellation. Examples: 'Bachelet Jean Claude Chassagne Encegnieres', 'Comtes Lafon Meursault Boucheres'. Use it when a Basic run leaves too many not-found rows.\n\nBoth modes use the same matching gates, so neither returns a wrong (billed) match - an unresolved name becomes an unbilled error row. Runs are capped at 250 wines; for larger lists, split into batches of 250 or fewer and run them in parallel. The 1024 MB default memory covers both modes (peak ~350-390 MB regardless of list size).",
            "default": "basic"
          },
          "includeTasteProfile": {
            "title": "Include Taste Profile",
            "type": "boolean",
            "description": "Fetch the taste profile (body, acidity, tannins, sweetness, fizziness, flavor notes, food pairings) for each wine.",
            "default": false
          },
          "includeReviews": {
            "title": "Include Reviews",
            "type": "boolean",
            "description": "Fetch user reviews for each wine. Enabling this increases run time.",
            "default": false
          },
          "maxReviewsPerWine": {
            "title": "Max Reviews per Wine",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Set the maximum number of reviews to fetch per wine (only used when Include Reviews is enabled).",
            "default": 10
          },
          "shipTo": {
            "title": "Ship To Country",
            "enum": [
              "",
              "AR",
              "AT",
              "AU",
              "BE",
              "BR",
              "CA",
              "CH",
              "CL",
              "CN",
              "CZ",
              "DE",
              "DK",
              "ES",
              "FI",
              "FR",
              "GB",
              "GR",
              "HK",
              "HR",
              "HU",
              "IE",
              "IL",
              "IT",
              "JP",
              "KR",
              "LU",
              "MX",
              "NL",
              "NO",
              "NZ",
              "PL",
              "PT",
              "RO",
              "SE",
              "SG",
              "SK",
              "US",
              "ZA"
            ],
            "type": "string",
            "description": "Choose the shipping destination country. Controls which wines are visible; some wines are only available in specific markets. Leave empty to use Vivino's default (based on server location).",
            "default": ""
          },
          "countryCode": {
            "title": "Country Code",
            "enum": [
              "AR",
              "AT",
              "AU",
              "BE",
              "BR",
              "CA",
              "CH",
              "CL",
              "CN",
              "CZ",
              "DE",
              "DK",
              "ES",
              "FI",
              "FR",
              "GB",
              "GR",
              "HR",
              "HU",
              "IE",
              "IL",
              "IT",
              "JP",
              "KR",
              "LU",
              "MX",
              "NL",
              "NO",
              "NZ",
              "PL",
              "PT",
              "RO",
              "SE",
              "SG",
              "SK",
              "US",
              "ZA"
            ],
            "type": "string",
            "description": "Select the country of origin for wine search results. Also affects pricing. Leave default (France) or pick the country whose wines you want to find.",
            "default": "FR"
          },
          "currencyCode": {
            "title": "Currency Code",
            "enum": [
              "EUR",
              "USD",
              "GBP",
              "CHF",
              "AUD",
              "CAD",
              "NZD",
              "ZAR",
              "BRL",
              "ARS",
              "CLP",
              "MXN",
              "CNY",
              "JPY",
              "KRW",
              "HKD",
              "SGD",
              "ILS",
              "CZK",
              "DKK",
              "HUF",
              "NOK",
              "PLN",
              "RON",
              "SEK",
              "HRK"
            ],
            "type": "string",
            "description": "Choose the currency used to display wine prices.",
            "default": "EUR"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Off by default - the Actor's own IP works for light, solo runs. Enable IP rotation only when running several runs in parallel, to avoid a shared 429 wall on Vivino. Vivino rejects the default datacenter pool, so a bare proxy toggle (no group) simply runs on the direct IP. For real IP rotation, choose the residential pool explicitly via apifyProxyGroups: [\"RESIDENTIAL\"]. Residential proxy uses premium paid bandwidth and can make large runs costly, so reserve it for genuinely parallel or heavy runs.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}