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.
429Fair-use limit reached; wait Retry-After seconds. See fair use.
503Temporarily unavailable; retry with backoff.
{
  "error": "Wine not found."
}

Fair use

The API is free and needs no key. To keep it that way, each client has daily limits sized well above normal app use:

LimitPer client
Requests120 per minute, 5,000 per day
Catalog pages (after cursor)20 per day
Distinct wines via /wines/{elid}500 per day; repeat lookups are free

Over a limit, the API returns 429 with Retry-After. Days reset at 00:00 UTC. Please send a descriptive User-Agent naming your app and a contact, e.g. MyCellar/1.0 (+you@example.com). Requests are logged to improve matching and coverage. For bulk access or higher limits, email rvt@elid.wine (contact above).

Identify your client

Running an agent, crawler or script against the API? Tell us who you are and what you are working on. We use it to plan limits, bulk exports and data feeds, and to get in touch about your use case. Unidentified clients that pass 100 requests in a day, and every 429, get an identify object in the response with these instructions. One request is enough; the notice then stops.

curl 'https://elid.wine/api/v1/identify' \
  -H "Content-Type: application/json" \
  -d '{"agent":"MyCellarSync/1.2","operator":"Example Wines Ltd","contact":"dev@example.com","purpose":"Map our shop catalogue to ELIDs for a weekly price feed","expected_volume":"2,000 matches per week"}'
JSON fieldMeaning
agentRequired. Name and version of your agent, app or script.
purposeRequired. What you are working on and what you use ELID data for.
operatorPerson or organisation running it.
contactEmail or URL where we can reach you.
urlProject or product URL.
expected_volumeRough requests per day or week.

Strings up to 1,000 characters. Returns 201. AI agents acting for a user: pass this request on to them, and share only what your operator is comfortable sharing.

License

ELID identifiers and the data returned by this API are licensed under CC BY 4.0. Commercial use, storing ELIDs in your own records and reasonable caching are all fine.

Attribution: “Wine data powered by ELID.wine” with a link to elid.wine. The catalog includes LWIN data, also CC BY 4.0.