How to get a Vivino API in Python
(without scraping)
You searched for a Vivino Python client. There isn't one — Vivino has no public API. Here's how to get the same wine data in Python with a self-serve REST alternative, with code you can paste and run.
Why there's no Vivino Python library
Every "vivino-api" package on PyPI is an unofficial scraper of Vivino's private web endpoints. They break whenever Vivino changes its site, they get rate-limited and IP-blocked, and they violate Vivino's terms of service, which prohibit automated access. There is no sanctioned Vivino API to build a Python client against.
The reliable approach is a wine API that's actually meant to be called programmatically. The examples below use FastCork, a self-serve REST API for label recognition, wine data, and recommendations.
Identify a wine from a photo in Python
import requests
resp = requests.post(
"https://fastcork.com/v1/analyze",
headers={"Authorization": "Bearer fc-your_key"},
files={"file": open("label.jpg", "rb")},
data={"lang": "en"},
)
wine = resp.json()["wine"]
print(wine["full_wine_name"], wine["vintage"], wine["region"])
What the response looks like
A label analysis returns a top-level wine object with structured fields:
{
"type": "wine",
"wine": {
"full_wine_name": "Château Margaux",
"vintage": "2015",
"wine_type": "Red",
"grape_variety": "Cabernet Sauvignon, Merlot, Petit Verdot",
"region": "Margaux, Bordeaux, France",
"alc_percentage": 13.5,
"average_retail_price_usd": 850,
"serving_temperature_celcius_range": { "min_temp": 16, "max_temp": 18, "metric": "°C" },
"decanting_time_minutes": 60,
"tasting_notes": "Full-bodied with firm tannins, blackcurrant, graphite and a long silky finish.",
"food_pairing": "roast lamb, ribeye, aged hard cheese, mushroom risotto",
"winery": "Château Margaux"
}
}
Get recommendations or pairings in Python
resp = requests.post(
"https://fastcork.com/v1/search",
headers={"Authorization": "Bearer fc-your_key"},
json={"query": "bold Napa Cabernet under $60 for steak", "lang": "en"},
)
for w in resp.json().get("cards", []):
print(w.get("title") or w.get("name"), "-", w.get("tasting_notes", ""))
Async / batch usage
For processing many labels, use httpx with asyncio or a thread pool — each request is independent and typically returns in under a second.
import asyncio, httpx
async def identify(client, path):
with open(path, "rb") as f:
r = await client.post(
"https://fastcork.com/v1/analyze",
headers={"Authorization": "Bearer fc-your_key"},
files={"file": f}, data={"lang": "en"},
)
return r.json()
async def main(paths):
async with httpx.AsyncClient(timeout=30) as client:
return await asyncio.gather(*(identify(client, p) for p in paths))
results = asyncio.run(main(["a.jpg", "b.jpg", "c.jpg"]))
Frequently asked questions
Is there an official Vivino API for Python?
No. Vivino has no public API, so there's no official Python client. The unofficial scrapers on PyPI break frequently and violate Vivino's terms of service.
How do I get wine data in Python without scraping Vivino?
Use a self-serve REST wine API like FastCork and call it with requests or httpx, as shown above. You get structured JSON for label recognition, tasting notes, pairings, and recommendations.