Developer reference · Beta

ELID API

Wine identities, text matching, LWIN lookup and vintage facts.

Quick start

Base path: /api/v1. The API is public: no account, token or API key is required.

curl 'https://elid.wine/api/v1/wines?limit=1'

AI assistants can use the API through the elid-wine-mcp MCP server, e.g. claude mcp add elid -- npx -y elid-wine-mcp.

Endpoints

POST /api/v1/match

Match wine text against this site’s snapshot.

curl 'https://elid.wine/api/v1/match' \
  -H "Content-Type: application/json" \
  -d '{"raw":"Kanonkop Paul Sauer 2021","top_n":3}'
JSON fieldMeaning
rawRequired wine text, up to 500 characters.
top_n1–20 candidates. Default: 5.
country_codeOptional two-letter country code, e.g. ZA.
producer_idOptional ELID producer code, e.g. ZA-KNKP.
drink_typeOptional wine style as on wine lists: red, white, rosé, orange, sparkling, sweet or fortified. Colours separate otherwise identical names, e.g. a producer’s red and white of one cuvée.

Returns ranked data with elid, lwin, lwins, display_name, producer_name, wine, score, producer_score and name_score. Scores rank candidates; they are not probabilities. A top score of 0.75 or more is a confident match; 0.50 means the text names no single wine (a producer alone, or a tie such as red and white). No accepted match returns [].

snapshot identifies the data version; matcher_version identifies the scorer. Matching returns base wine identities. Retrieve vintage facts with the wine endpoint below.

GET /api/v1/wines

Active wine identities, ordered by ELID.

ParameterMeaning
limit1–200 results. Default: 50.
afterPrevious next_cursor. Keep other filters unchanged.
qSubstring search in name or ELID; case-insensitive, up to 200 characters. For free text, use matching.
lwinExact seven-digit LWIN. No known match returns an empty list.

Response structure · selected fields

{
  "data": [
    {
      "elid": "AR-MDZ-CTZP01",
      "display_name": "Nicolás Catena Zapata",
      "lwin": null
    }
  ],
  "next_cursor": "AR-MDZ-CTZP01"
}

next_cursor: null marks the last page.

GET /api/v1/wines/{elid}

One wine’s catalog fields and available vintage facts. Use the base ELID without a vintage suffix.

curl 'https://elid.wine/api/v1/wines/AR-MDZ-CTZP01'

The data object includes a facts array, ordered by vintage descending. No facts: []. Vintage is a year string or NVXX.

LWIN lookup

Query /api/v1/wines?lwin=1831339 to find its ELID. Wine records include lwins with all known seven-digit wine-level identifiers. lwin is the primary value, or the sole known alias when there is exactly one; it is null when none or multiple aliases are known. Reviewed historical aliases also resolve through the lookup.

Fields

Catalog entries are available with or without facts. Pricing, restaurant wine lists and critic reviews are excluded.

Catalog fields16 fields
FieldTypeUnit
elidstring—
display_namestring · nullable—
producer_namestring · nullable—
winestring · nullable—
countrystring · nullable—
regionstring · nullable—
sub_regionstring · nullable—
sitestring · nullable—
parcelstring · nullable—
colourstring · nullable—
typestring · nullable—
sub_typestring · nullable—
designationstring · nullable—
classificationstring · nullable—
lwinstring · nullable—
variety_codestring · nullable—

Fact-sheet fields

Unknown fields are omitted. Descriptive values are strings; some contain JSON-formatted text.

Composition10 fields
FieldTypeUnit
alcohol_percentnumber% ABV
residual_sugar_glnumberg/L
total_acidity_glnumberg/L
phnumber—
sulfites_ppmnumberppm
tartaric_acid_glnumberg/L
malic_acid_glnumberg/L
brix_at_harvestnumber°Brix
calories_per_100mlnumberkcal / 100 mL
variety_blendstring—
Vineyard & harvest11 fields
FieldTypeUnit
grape_clonestring—
soilstring—
elevation_metersnumbermetres
slope_degreesnumberdegrees
orientationstring—
estate_grownboolean—
vine_agestring—
grapes_picked_datestring—
harvest_datesstring—
yield_hectoliters_per_hectarenumberhL/ha
site_blendstring—
Winemaking14 fields
FieldTypeUnit
has_sulfitesboolean—
has_natural_yeastboolean—
has_indigenous_yeastboolean—
has_extended_macerationboolean—
has_malolactic_fermentationboolean—
malolactic_percentnumber%
has_carbonic_macerationboolean—
has_botrytisboolean—
pressing_methodstring—
fermentation_vesselsstring—
production_detailsstring—
fining_agentsstring—
unfinedboolean—
unfilteredboolean—
Aging & oak13 fields
FieldTypeUnit
aging_daysnumberdays
oak_aging_daysnumberdays
bottle_aging_daysnumberdays
lees_aging_daysnumberdays
maceration_daysnumberdays
has_lees_agingboolean—
first_fill_new_oaknumber%
second_fill_oaknumber%
third_fill_oaknumber%
has_used_oak_onlyboolean—
oak_kindsstring—
barrel_sizestring—
oak_toast_levelstring—
Sparkling wine5 fields
FieldTypeUnit
dosagenumberg/L
disgorgement_datestring—
tirage_datestring—
riddling_daysnumberdays
base_wine_yearsstring—
Bottling & certification6 fields
FieldTypeUnit
closure_typestring—
bottling_datestring—
certification_bodiesstring—
classificationsstring—
veganboolean—
vegetarianboolean—
Serving & tasting5 fields
FieldTypeUnit
drinking_windowstring—
serving_temp_cstring°C
serving_temp_fstring°F
tasting_notes_descriptorsstring—
food_pairingstring—

Errors

StatusMeaning
400Invalid, repeated or unknown parameter.
404Wine or endpoint not found.
405Wrong method for the endpoint.
413Request body exceeds 8 KiB.
415Use Content-Type: application/json.
503Temporarily unavailable; retry with backoff.
{
  "error": "Wine not found."
}