Skip to content
Open standardv0.10.0

The WineGraph Open Data Model

One canonical model for the wine trade. Producer → wine → vintage → SKU, joined to who imports, distributes, and pours it, with the source behind every field.

Building a wine site, or moving data between layers of the trade? Adopt this model, publish to it, and plug into the graph. It is the same model WineGraph runs in production: open, versioned, and machine-readable. The spec is free to use. Entity resolution and the resolved corpus are the hosted product.

Machine-readable

Artifacts

The wall

Data classification

Every entity, edge, and field carries a visibility tier. Most of the graph is public; some data is walled off by design, and the standard says so explicitly.

Public

Free, anonymous, crawlable. Identities, relationships, and public web presence: the neutral moat.

Gated gated · paid

Paid account required. Publicly-sourced but sensitive in aggregate: license-holder names/addresses/permit dossiers, precise geo, contacts.

Private private · tenant-authorized

The publishing tenant’s authorization, per recipient. Pricing (always), inventory, sales, customer/CRM. Never public.

The model

Entities

Supply: producers & wines

producerProducer

A winery / estate / négociant that makes wine.

founded · sizeHa · farming · philosophy · production · org.legal [gated] · org.contact [gated] · geo.precise [gated]

skuWine (SKU)

A specific bottling — the canonical wine unit. Producer + cuvée + vintage + format.

wine.color · wine.sparkling · wine.grapes · wine.farming · wine.abv · wine.appellation · facets

vintageVintage

A vintage-level grouping (optional intermediate between wine and SKU).

brandBrand

A commercial brand spanning bottlings.

vineyardVineyard

A named vineyard / parcel / cru site (distinct from a region). Rich parcel detail is optional + provenance-stamped.

vineyard.hectares · vineyard.soil · vineyard.elevation · vineyard.aspect · vineyard.planted

vineVine

A planting/block of vines within a vineyard (a finer grain than the parcel). A vineyard grows vines; the vines yield a grape variety. Carries the living-material detail — age, density, rootstock, training.

vine.plantedYear · vine.density · vine.rootstock · vine.trainingSystem · vine.area

cellarCellar

The physical chai / winery facility where wine is vinified and aged — distinct from the producer (the org) and the vineyard (the land). Modeled separately so contract, shared, and neighbor cellars resolve cleanly: a wine or producer is vinified_in a cellar it need not own.

cellar.vessels · cellar.capacityHl · cellar.elevage · cellar.gravityFlow

Trade: importers & distributors

export_agentExport Agent

An export agent / courtier (e.g. Becky Wasserman & Co) that represents grower domaines for export — the layer between producer and importer.

org.role · org.seat · web

importerImporter

A US importer of record (TTB permit holder).

org.permit · org.dba · org.legal [gated] · org.contact [gated]

distributorDistributor

A wholesaler / distributor (state-licensed).

org.legal [gated] · org.contact [gated]

territoryTerritorygated · paid

A representation grant: the market an importer (or export agent) holds for a producer — national exclusive, regional, or a state-by-state patchwork. Reifies the represents relationship with scope + exclusivity (importer -[holds]→ territory -[covers]→ producer). GATED — competitive trade detail.

scope · exclusive · states · country · since

Demand: shops & restaurants

retailerWine Shop

An off-premise retailer.

geo · web

restaurantRestaurant

An on-premise venue with a wine list.

geo · web · facets

People: the individuals across the trade

personPerson

An individual anywhere in the trade — winemaker, owner, principal, importer/distributor staff, wine buyer, beverage director, sommelier. Their role + employer are carried on the affiliation edge (person_of for public org roles, buys_for for the gated buyer graph), not the type. Name + headline title are public; direct channels are gated.

person.bio · person.title · web · person.channels [gated]

Reference: regions, grapes, places, terms

regionRegion

A wine region / appellation with content + hierarchy.

reference.slug* · reference.content · reference.parentSlug

grapeGrape

A grape variety with content.

reference.slug* · reference.content

placePlace

A town / site / landmark.

reference.slug*

termTerm

A glossary concept / technique / classification.

reference.slug*

Accolades: critics, awards, publications

awardAward

A discrete honor (Michelin star, Wine Spectator Grand Award, …).

accolade.issuer* · accolade.scale

criticCritic

A wine/restaurant critic or critic-outlet.

accolade.issuer

publicationPublication

An editorial outlet (reviews, lists).

accolade.issuer

Prospect: ownership groups & buyer contacts (gated)

restaurant_groupRestaurant Groupgated · paid

A multi-unit hospitality group / ownership parent (USHG, Major Food Group, …). The graph resolves which venues a group operates and how it buys — sell-the-parent, deploy-to-all-units. Curated + derived; GATED subscription tier.

hq · beverageModel · unitCount

Commerce: pricing, inventory, accounts (private / gated)

pricePriceprivate · tenant-authorized

A tenant's price for a wine — by tier, jurisdiction, and volume. Default-private, tenant-elected visibility: defaults to private and is shared only with accounts the publishing tenant authorizes (the price-feed model), but the tenant MAY widen visibility at its own election. The hard antitrust fence is on cross-tenant Ring-3 aggregates, not on a tenant publishing its own list.

skuRef* · tenantRef* · tier · jurisdiction · amountCents · currency · unit · minQty · validFrom · validTo · authorizedFor

inventoryInventoryprivate · tenant-authorized

On-hand + allocated stock for a wine, per tenant. PRIVATE.

skuRef* · tenantRef* · onHand · allocated · asOf

accountAccountprivate · tenant-authorized

A tenant's commercial relationship with a buyer (a retailer/restaurant/distributor). Sales + CRM are PRIVATE; contact + detailed profile are GATED; the buyer's existence/type is public via its retailer/restaurant entity.

buyerRef · type · customer_type · profile [gated] · contact [gated] · metrics [private] · crm [private]

The graph

Relationships

producesproducerskuA producer makes a wine.
representsexport_agent|importerproducerAn export agent or US importer represents a producer/domaine (for export, or for the US market). Importer→producer representation is inferred when all of a producer’s imported wines come through one importer. The market detail (scope, exclusivity, states) is the gated territory entity.
sources_viaimporterexport_agentAn importer sources producers through an export agent / courtier (the layer between importer and grower).
person_ofpersonproducer|importer|distributor|export_agentA person’s PUBLIC affiliation with a trade org — winemaker, owner, principal, staff. Role + tenure on the edge. (Buyer/venue affiliations are the gated buys_for edge.)
farmsproducervineyardA producer farms a vineyard.
sourced_fromskuvineyardA bottling's fruit comes from a vineyard.
farmed_assku|producer|vineyardtermA farming practice (term.kind=farming).
uses_techniquesku|producertermA winemaking technique (term.kind=technique).
growsvineyardvineA vineyard grows a block of vines.
yieldsvinegrapeA vine block yields a grape variety (the living-material → variety link; the wine-level varietal composition stays on has_grape).
vinified_insku|producercellarA wine (or producer) is vinified in a cellar — including contract, shared, or neighbor cellars the producer does not own.
importsimporterskuAn importer brings a wine into the US.
distributesdistributorskuA distributor carries a wine.
distributed_byimporterdistributorAn importer’s book is carried to market by a distributor (its distribution partner), per state. The importer↔distributor relationship, distinct from the wine-level distributes edge.
suppliesimporter|distributorretailer|restaurant|distributorA seller supplies a trade customer — the tenant-ELECTED public customer relationship (who sells to whom, and which wines). Price and quantity never ride this edge: they are Ring-2, exposed only through typed grants (diwine-sharing-policy). Minted only for tenants with contributes_public_edges elected.
listed_byretailer|restaurantskuA venue lists/pours a wine.
in_regionproducer|skuregionLocated in / from a region.
has_grapeskugrapeMade from a grape variety.
subregion_ofregionregionRegion hierarchy.
related_toreferencereferenceCross-link between reference entries.
awardedawardrestaurant|retailer|sku|producerAn award held by an entity.
rated_bycritic|publicationsku|restaurantA rating from a critic/outlet.
reviewed_bypublicationrestaurant|skuAn editorial review.
listed_inaward|publicationrestaurant|retailerMembership in a curated list (Resy/OpenTable/50 Best).
holdsimporter|export_agentterritoryAn importer/agent holds a representation territory (the grant detail).
coversterritoryproducerA territory grant covers a producer.
operated_byrestaurant|retailerrestaurant_groupA venue is operated by a hospitality group (the ownership/prospect graph — sell-the-parent, deploy-to-all-units).
buys_forpersonrestaurant_group|restaurant|retailer|distributorA person is the wine/beverage buyer for a group, venue, or trade account — the gated buyer graph (replaces the former contact→leads_beverage_for). Role on the edge.

The trust layer

Provenance envelope

Every enriched field carries provenance (value, source, confidence, and when it was observed), so merges are highest-confidence-wins and never silently overwrite. This is what makes the model trustworthy across many publishers.

value*objectThe asserted value.
source*stringSource identifier (connector / publisher).
confidence*number0–1 confidence.
observedAt*dateWhen observed (ISO date).
refstringSource URL / reference.

Cross-system

Identifiers

ttb_permit

US TTB importer/wholesaler permit number.

osm

OpenStreetMap `<type>/<id>`.

slug

WineGraph URL slug.

learned

A learned match key from the resolver corpus.

importer_site

Importer/distributor portfolio site-local id.

producer_name

Normalized producer name.

accolade_slug

Award/critic/publication slug.

Controlled

Vocabularies

Colours

red · white · rose · orange

Reference types

region · grape · place · term

Entity types (25)

producer · sku · vintage · brand · vineyard · vine · cellar · export_agent · importer · distributor · territory · retailer · restaurant · person · region · grape · place · term · award · critic · publication · restaurant_group · price · inventory · account

Versioned history

Changelog

The standard is semantically versioned: patch for wording, minor for additive types/fields, major for breaking changes. Every model change bumps the version and lands here. Machine-readable at .well-known/winegraph.json.

v0.10.0minor2026-07-08

Typed grant flow (diwine-sharing-policy steps 1+4): account gains customer_type (distributor|retailer|restaurant|trade_other) — the normative trade class grant eligibility keys off (distinct from the tenant-CRM `type` label). Grant rule: price grants → any trade member; quantity grants → distributor accounts ONLY (venues structurally ineligible, even on request). Storage: Ring-2 data_grant (RLS), migration 0062.

v0.9.0minor2026-07-08

Customer-relationship publishing (diwine-sharing-policy step 2/3): new PUBLIC `supplies` edge (importer|distributor → retailer|restaurant|distributor) — the tenant-ELECTED customer relationship (who sells to whom, which wines as skuIds/wineCount on the edge). Price and quantity NEVER ride this edge (Ring-2, grant-only). Minted by the tenant_supplies job strictly behind the contributes_public_edges gate.

v0.8.1patch2026-07-03

Wall hardening (no schema change): the public_entity view now strips the already-gated person.channels sub-key at the boundary (migration 0055), instead of relying on no writer ever populating it; and the assertClassified CI gate now also checks EDGES (an edge touching a gated/private entity type, or a PII-shaped edge metadata field, must be non-public) and uses a broadened identity/PII field-name pattern. Closes Fable5 C1/C3/M6 and the latent person.channels leak.

v0.8.0minor2026-06-20

Terroir depth (supply group, additive + public): two new entities and three edges fill in the vine-to-cellar chain. `vine` — a planting/block within a vineyard (plantedYear, density, rootstock, trainingSystem, area) — sits below `vineyard` via the new `grows` edge (vineyard→vine) and links to variety via `yields` (vine→grape). `cellar` — the physical chai where wine is vinified/aged, distinct from producer and vineyard — links via `vinified_in` (sku|producer→cellar), modeled to resolve contract/shared/neighbor cellars. Ships unpopulated (no connector yet); the public views + standard expose them so data can land cleanly. API is type-agnostic (no route change).

v0.7.0minor2026-06-20

Distribution partners: new GATED `distributed_by` edge (importer→distributor, with per-state coverage) — the importer↔distributor partnership distinct from the wine-level distributes edge. Captured by the custom importer-portfolio adapters (producers + people + distribution partners). See docs/plan/importer-registry.md.

v0.6.0minor2026-06-20

Trade-relationship + people expansion. (1) Territory: a first-class GATED `territory` entity (scope national|regional|state, exclusive, states[]) reifying the importer↔producer grant via holds/covers edges; `represents` gains role + exclusive metadata; new public `sources_via` (importer→export_agent) models the courtier chain. (2) People unified: `person` is now the universal people entity across the whole trade (moved to a `people` group, gated person.channels); the former gated `contact` entity folds into it. Public org roles use the generalized `person_of` (now → producer|importer|distributor|export_agent, expanded roles); the buyer graph is the new GATED `buys_for` edge (person→group/venue/account), replacing contact→leads_beverage_for. The wall holds: a person enters the public tier only via a public person_of edge, so buyers (buys_for only) + channels stay gated.

v0.5.0minor2026-06-20

Edge resolution: the `represents` edge now spans export_agent OR importer → producer (was export_agent only). The propagate_importer connector infers importer→producer representation where all of a producer’s imported wines come through one importer (418 candidates vs. 3 prior), resolving the producer-view import link. See docs/plan/edge-resolution.md.

v0.4.0minor2026-06-20

Prospect-intelligence layer (the L2 moat from the D-I adoption proposal): new GATED `prospect` entity group — restaurant_group (ownership parent: who-operates-what, beverage-buying model, unit count) + contact (trade buyer / beverage decision-maker, name+title public, channels gated) — and gated edges operated_by (venue → group) + leads_beverage_for (contact → group/venue). Demand venues gain public Places triage signals (web.rating/reviewCount/category, facets.category) that power the prospect fit score. Served via the gated GET /v1/prospects endpoint. Sell-the-parent, deploy-to-all-units.

v0.3.1patch2026-06-17

Classification governance (tenant #1 redline §11): assertClassified() CI invariant (no tenant/PII field may default public); price reframed default-private + tenant-elected visibility (hard fence = Ring-3 cross-tenant aggregates only); gated reframed as a redaction marker (paid-serving deferred + counsel-gated, not a dossier product).

v0.3.0minor2026-06-17

Data classification (the wall): every entity/edge/field carries a sensitivity tier (public/gated/private). Adds gated license-holder/legal/contact blocks on producer/importer/distributor + the private commerce group (price [tier×jurisdiction×volume], inventory, account [sales/CRM]). Pricing is always private + per-recipient. See data-classification-and-diwine-coverage.md.

v0.2.0minor2026-06-17

People + vineyards + export agents: person/vineyard entities and person_of/farms/sourced_from/farmed_as/uses_technique/represents edges (additive). Roadmap: deep vineyard terroir + winemaking cellar models.

v0.1.0minor2026-06-14

Initial published standard — supply/trade/demand entities, edges, provenance, identifiers, vocab.

Get involved

Build on the commons

The model is open and versioned, and it grows with the trade. However you fit in, there is a way to use it and to give back.

  • Read the data. The /v1 API and the dataset both speak this model.
  • Publish your data. Expose a /.well-known/winegraph.json and a conformant feed, and anyone can ingest it, us included.
  • Build on it. Type definitions, a connector SDK, a validator CLI, and a one-click site starter are on the way, all open source.

Spec licensed Apache-2.0 · open graph data ODbL · v0.10.0, semantically versioned.