Endpoint Index
All available API endpoints at a glance. Every endpoint requires authentication via Bearer token.
Base URL: https://grapeminds.eu/api/public/v1
We maintain ready-to-use code examples for popular languages on GitHub: github.com/grapeminds/api-examples
Test Endpoint
/ping
Verify your API key is valid and your connection is working
Use this as your first call when setting up your integration. It confirms your API key works correctly without consuming any budget on real data.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://grapeminds.eu/api/public/v1/ping"
Example Response:
{
"message": "API authentication successful",
"authenticated_as": {
"user_id": 1,
"user_name": "Jane Doe",
"user_email": "jane@example.com"
},
"api_key": {
"name": "My Integration Key",
"prefix": "gm_abc1",
"abilities": ["*"],
"rate_limit_per_minute": 60
},
"timestamp": "2026-03-05T12:00:00+00:00"
}
Wines Endpoints
/wines
List all wines with pagination and filters
Query Parameters:
page— Page number (default: 1)per_page— Items per page (default: 15, max: 100)color— Filter by color (red, white, rose)sub_type— Filter by type (still, sparkling)producer_id— Filter by producer IDregion_id— Filter by region ID
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://grapeminds.eu/api/public/v1/wines?color=red&per_page=20"
Example Response:
{
"data": [
{
"id": 106636,
"display_name": "Weingut Braunewell, Teufelspfad Spätburgunder",
"color": "red",
"type": "wine",
"sub_type": "still",
"residual_sugar": "dry",
"producer": { "id": 24860, "name": "Braunewell", "title": "Weingut", "display_name": "Weingut Braunewell" },
"region": { "id": 187, "name": "Rheinhessen", "country": "DE", "language": "en" }
}
],
"meta": { "current_page": 1, "last_page": 10, "per_page": 20, "total": 195, "from": 1, "to": 20 },
"links": { "first": "...?page=1", "last": "...?page=10", "prev": null, "next": "...?page=2" }
}
/wines/search
Search wines by name or producer
Query Parameters:
q— Search query (min 3 characters, required)limit— Max results (default: 20, max: 100)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://grapeminds.eu/api/public/v1/wines/search?q=Braunewell"
Example Response:
{
"data": [
{
"id": 106636,
"display_name": "Weingut Braunewell, Teufelspfad Spätburgunder",
"color": "red",
"residual_sugar": "dry",
"producer_name": "Braunewell",
"producer_title": "Weingut",
"producer_display_name": "Weingut Braunewell"
}
],
"meta": { "query": "Braunewell", "count": 5 }
}
/wines/{id}
Get detailed wine information
Headers:
Accept-Language— Language code (de, en, fr, it)
curl -H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept-Language: de" \
"https://grapeminds.eu/api/public/v1/wines/106636"
Example Response:
{
"id": 106636,
"display_name": "Weingut Braunewell, Teufelspfad Spätburgunder",
"color": "red",
"type": "wine",
"sub_type": "still",
"producer": { "id": 24860, "name": "Braunewell", "title": "Weingut", "display_name": "Weingut Braunewell" },
"region": { "id": 187, "name": "Rheinhessen", "country": "de" },
"residual_sugar": "trocken",
"grapes": [
{ "id": 12345, "name": "Spätburgunder" }
],
"description": { "text": "...", "language": "de" },
"tasting_notes": { "text": "...", "language": "de" },
"pairing": { "text": "...", "language": "de" },
"flavor_profile": {
"sweetness": 2, "acidity": 5, "tannins": 6,
"alcohol": 6, "body": 6, "finish": 6
}
}
Producers Endpoints
/producers
List all producers with pagination
Query Parameters:
search— Search by name (min 2 characters)per_page— Items per page (default: 15, max: 100)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://grapeminds.eu/api/public/v1/producers?search=Braunewell"
Example Response:
{
"data": [
{ "id": 24860, "name": "Braunewell", "title": "Weingut" }
],
"meta": { "current_page": 1, "last_page": 1, "per_page": 15, "total": 1, "from": 1, "to": 1 },
"links": { "first": "...?page=1", "last": "...?page=1", "prev": null, "next": null }
}
/producers/{id}
Get producer details with optional wines
Response Fields:
title— Producer prefix (e.g. "Weingut", "Château", "Domaine"), may be nulldisplay_name— Full computed name (title + name)
Query Parameters:
include_wines— Include wines (boolean, default: false)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://grapeminds.eu/api/public/v1/producers/24860?include_wines=true"
Example Response:
{
"data": {
"id": 24860,
"name": "Braunewell",
"title": "Weingut",
"display_name": "Weingut Braunewell",
"wines": [
{ "id": 45686, "display_name": "Teufelspfad Riesling", "vintage": null, "color": "white", "producer_id": 24860, "residual_sugar": null },
{ "id": 106636, "display_name": "Teufelspfad Spätburgunder", "vintage": null, "color": "red", "producer_id": 24860, "residual_sugar": "dry" }
],
"wines_count": 5
}
}
Regions Endpoints
/regions
List all regions with pagination
Query Parameters:
country— Filter by country codesearch— Search by name
Headers:
Accept-Language— Language code (de, en, fr, it)
curl -H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept-Language: en" \
"https://grapeminds.eu/api/public/v1/regions?country=DE"
Example Response:
{
"data": [
{ "id": 187, "name": "Rheinhessen", "country": "DE", "language": "en" },
{ "id": 188, "name": "Pfalz", "country": "DE", "language": "en" },
{ "id": 189, "name": "Mosel", "country": "DE", "language": "en" }
],
"meta": { "current_page": 1, "last_page": 2, "per_page": 15, "total": 25, "from": 1, "to": 15, "language": "en" },
"links": { "first": "...?page=1", "last": "...?page=2", "prev": null, "next": "...?page=2" }
}
/regions/{id}
Get region details with optional wines
Query Parameters:
include_wines— Include wines (boolean, default: false)
curl -H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept-Language: en" \
"https://grapeminds.eu/api/public/v1/regions/187?include_wines=true"
Example Response:
{
"data": {
"id": 187,
"name": "Rheinhessen",
"country": "DE",
"language": "en",
"wines": [
{
"id": 106636,
"display_name": "Weingut Braunewell, Teufelspfad Spätburgunder",
"color": "red",
"producer_id": 24860,
"region_id": 187,
"residual_sugar": "dry",
"producer": { "id": 24860, "name": "Braunewell", "title": "Weingut" }
}
],
"wines_count": 42
}
}
/region-insights/{regionId}
Get detailed insights for a wine region
Query Parameters:
lang— Language code (de, en, fr, it)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://grapeminds.eu/api/public/v1/region-insights/187?lang=en"
Example Response:
{
"id": 5,
"region_id": 187,
"lang": "en",
"summary": "Rheinhessen is Germany's largest wine region...",
"climate_and_terroir": "Moderate continental climate with mild winters...",
"signature_styles": "Elegant Rieslings and aromatic Silvaner...",
"key_grapes": "Riesling, Silvaner, Müller-Thurgau, Scheurebe"
}
404 – generating flag: If the resource exists but no content is available in the requested language, the API triggers AI generation in the background and returns 404 with generating: true. Retry after ~30 seconds.
404 Response (generating: false – resource does not exist):
{ "error": "Region insight not found for the specified language.", "generating": false }
404 Response (generating: true – AI generation triggered):
{ "error": "Region insight not found for the specified language.", "generating": true }
Drinking Periods Endpoint
/drinking-periods/{wineId}
Get optimal drinking window for a wine
Query Parameters:
lang— Language code (de, en, fr, it)
Understanding the drinking window: The 'from' and 'to' values indicate years after vintage. For a 2020 vintage with from=5 and to=20: optimal drinking is 2025-2040.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://grapeminds.eu/api/public/v1/drinking-periods/106636?lang=en"
Example Response:
{
"id": 42,
"wine_id": 106636,
"lang": "en",
"from": 2020,
"to": 2035,
"statement": "This wine can be enjoyed now but will continue to improve over the next decade.",
"young": "Vibrant dark fruit, firm tannins and a long finish.",
"ripe": "Complex aromas of leather, tobacco and dried fruit with silky tannins.",
"storage": "Store at 12-14°C in a dark place, bottles horizontal."
}
404 – generating flag: If the resource exists but no content is available in the requested language, the API triggers AI generation in the background and returns 404 with generating: true. Retry after ~30 seconds.
404 Response (generating: false – resource does not exist):
{ "error": "Drinking period not found for the specified language.", "generating": false }
404 Response (generating: true – AI generation triggered):
{ "error": "Drinking period not found for the specified language.", "generating": true }
Photo Analysis (Enterprise)
*Only available for Enterprise customers.
/photo/analyze
Analyze a wine label photo and find matching wines
Request Body (JSON):
photo* — Base64 encoded image (with or without data:image prefix)max_results— Max candidates per label (default: 10, max: 50)
curl -X POST \
-H "Authorization: Bearer YOUR_ENTERPRISE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"photo": "data:image/jpeg;base64,/9j/4AAQ...", "max_results": 5}' \
"https://grapeminds.eu/api/public/v1/photo/analyze"
Example Response:
{
"message": "ok",
"detected_labels": [
{
"producer_name": "Braunewell",
"wine_name": "Teufelspfad Spätburgunder",
"vintage": null,
"color": "red",
"region_name": "Rheinhessen",
"country": "DE"
}
],
"candidates": [
{
"id": 106636,
"display_name": "Weingut Braunewell, Teufelspfad Spätburgunder",
"color": "red",
"type": "wine",
"sub_type": "still",
"residual_sugar": "dry",
"producer": { "id": 24860, "name": "Braunewell", "title": "Weingut" },
"region": { "id": 187, "name": "Rheinhessen", "country": "DE" }
}
]
}
Developer Tools
Ready to get started?
Try the grapeminds Wine API free for 14 days.
Register as API customer