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
producerProducerA 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
vintageVintageA vintage-level grouping (optional intermediate between wine and SKU).
brandBrandA commercial brand spanning bottlings.
vineyardVineyardA 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
vineVineA 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
cellarCellarThe 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 AgentAn 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
importerImporterA US importer of record (TTB permit holder).
org.permit · org.dba · org.legal [gated] · org.contact [gated]
distributorDistributorA wholesaler / distributor (state-licensed).
org.legal [gated] · org.contact [gated]
territoryTerritorygated · paidA 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 ShopAn off-premise retailer.
geo · web
restaurantRestaurantAn on-premise venue with a wine list.
geo · web · facets
People: the individuals across the trade
personPersonAn 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
regionRegionA wine region / appellation with content + hierarchy.
reference.slug* · reference.content · reference.parentSlug
grapeGrapeA grape variety with content.
reference.slug* · reference.content
placePlaceA town / site / landmark.
reference.slug*
termTermA glossary concept / technique / classification.
reference.slug*
Accolades: critics, awards, publications
awardAwardA discrete honor (Michelin star, Wine Spectator Grand Award, …).
accolade.issuer* · accolade.scale
criticCriticA wine/restaurant critic or critic-outlet.
accolade.issuer
publicationPublicationAn editorial outlet (reviews, lists).
accolade.issuer
Prospect: ownership groups & buyer contacts (gated)
restaurant_groupRestaurant Groupgated · paidA 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-authorizedA 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-authorizedOn-hand + allocated stock for a wine, per tenant. PRIVATE.
skuRef* · tenantRef* · onHand · allocated · asOf
accountAccountprivate · tenant-authorizedA 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
producesproducer → skuA producer makes a wine.representsexport_agent|importer → producerAn 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_viaimporter → export_agentAn importer sources producers through an export agent / courtier (the layer between importer and grower).person_ofperson → producer|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.)farmsproducer → vineyardA producer farms a vineyard.sourced_fromsku → vineyardA bottling's fruit comes from a vineyard.farmed_assku|producer|vineyard → termA farming practice (term.kind=farming).uses_techniquesku|producer → termA winemaking technique (term.kind=technique).growsvineyard → vineA vineyard grows a block of vines.yieldsvine → grapeA vine block yields a grape variety (the living-material → variety link; the wine-level varietal composition stays on has_grape).vinified_insku|producer → cellarA wine (or producer) is vinified in a cellar — including contract, shared, or neighbor cellars the producer does not own.importsimporter → skuAn importer brings a wine into the US.distributesdistributor → skuA distributor carries a wine.distributed_byimporter → distributorAn 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|distributor → retailer|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|restaurant → skuA venue lists/pours a wine.in_regionproducer|sku → regionLocated in / from a region.has_grapesku → grapeMade from a grape variety.subregion_ofregion → regionRegion hierarchy.related_toreference → referenceCross-link between reference entries.awardedaward → restaurant|retailer|sku|producerAn award held by an entity.rated_bycritic|publication → sku|restaurantA rating from a critic/outlet.reviewed_bypublication → restaurant|skuAn editorial review.listed_inaward|publication → restaurant|retailerMembership in a curated list (Resy/OpenTable/50 Best).holdsimporter|export_agent → territoryAn importer/agent holds a representation territory (the grant detail).coversterritory → producerA territory grant covers a producer.operated_byrestaurant|retailer → restaurant_groupA venue is operated by a hospitality group (the ownership/prospect graph — sell-the-parent, deploy-to-all-units).buys_forperson → restaurant_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_permitUS TTB importer/wholesaler permit number.
osmOpenStreetMap `<type>/<id>`.
slugWineGraph URL slug.
learnedA learned match key from the resolver corpus.
importer_siteImporter/distributor portfolio site-local id.
producer_nameNormalized producer name.
accolade_slugAward/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-08Typed 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-08Customer-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-03Wall 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-20Terroir 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-20Distribution 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-20Trade-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-20Edge 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-20Prospect-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-17Classification 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-17Data 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-17People + 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-14Initial 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.jsonand 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.