Schemas / coffee-places
Open Coffee places dataset v0.5.0 latest
This page always shows the newest version. Link to v0.5.0 for a stable reference.
One file per city listing cafés, coffee bars and other places that serve coffee. Part of Roastbook Open Coffee.
- $id
https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.5.0.json- Latest alias
https://schema.roastbook.coffee/coffee-places/coffee-places.schema.latest.json- JSON-LD context
https://schema.roastbook.coffee/coffee-places/coffee-places.context.v0.1.0.jsonldhttps://schema.roastbook.coffee/coffee-places/coffee-places.context.v0.3.0.jsonldhttps://schema.roastbook.coffee/coffee-places/coffee-places.context.v0.4.0.jsonld- Records
- Listed under
places. Field links such as#field-…are relative to one record. - Check a file
- Open in the Playground
Coffee place record
One place that serves coffee. In JSON-LD it is a schema.org CafeOrCoffeeShop whose IRI is https://data.roastbook.coffee/places/<id>.
Permanent, opaque identifier. Never reused, never derived from a name, never deleted. Lowercase letters, digits, dots, dashes and underscores; starts and ends with a letter or digit.
Defined in
common.schema.v0.4.0.json#/$defs/idKind of place, as a schema.org type. Every place is a CafeOrCoffeeShop for now; JSON-LD processors read it as the record's @type.
The name the place uses on its sign or website.
open; temporarily_closed (renovation, holiday longer than a month); closed (permanently); unverified (found but not yet confirmed to exist).
merged_intotextSet when this record turned out to be a duplicate: the id of the record that is kept. The record stays as a tombstone so its id is never reused or lost; its status must not be open.
Only allowed when status is one of "temporarily_closed", "closed", "unverified".
Defined in
common.schema.v0.4.0.json#/$defs/idopened_ondateCalendar date, YYYY-MM-DD.
Defined in
common.schema.v0.4.0.json#/$defs/dateclosed_ondateCalendar date, YYYY-MM-DD.
Only allowed when status is "closed".
Defined in
common.schema.v0.4.0.json#/$defs/datelast_verified_attimestampWhen a primary source last confirmed that the place exists with this status.
Defined in
common.schema.v0.4.0.json#/$defs/datetimeWhen the record as a whole was last reviewed or enriched.
Defined in
common.schema.v0.4.0.json#/$defs/datetimePostal address
Defined in
common.schema.v0.4.0.json#/$defs/address5 fields in
addressStreet and house number.
Postal code as used locally, for example 80331.
City or town.
State or region.
ISO 3166-1 alpha-2 code in upper case.
Defined in
common.schema.v0.4.0.json#/$defs/country_code
WGS 84 coordinates of the entrance or building.
Defined in
common.schema.v0.4.0.json#/$defs/locationopening_hourstextOpening hours in OpenStreetMap opening_hours syntax (used as a format only; no OSM data), for example "Mo-Fr 08:00-18:00; Sa,Su 09:00-17:00".
descriptiontextShort English description written only from the facts stored in this record. Never copied from the place's own texts.
A: coffee is the core product; the place roasts its own beans or serves named specialty roasters and usually offers filter coffee. B: food or something else leads, but the place serves a specialty roaster. none: no specialty evidence: the place does not roast its own beans and names no specialty roaster (kept in the dataset). Every place is assessed.
Defined in
coffee-places.schema.v0.5.0.json#/$defs/tierroasts_own_beansyes/noWhether the place roasts coffee itself. true: roasts its own beans; false: confirmed not roasting; absent: unknown.
roasters_servedlist of objectRoaster served
Defined in
coffee-places.schema.v0.5.0.json#/$defs/roaster_ref4 fields in
roasters_servedName of the roastery whose coffee is served.
Reserved for the future Open Coffee roasters dataset.
Defined in
common.schema.v0.4.0.json#/$defs/idAbsolute http or https address. Letters outside ASCII, such as umlauts in the host or path, may be written as they are (an IRI, for example https://kaffee-münchen.de/über-uns). The scheme is not case-sensitive.
Defined in
common.schema.v0.4.0.json#/$defs/urlThe place roasts this coffee itself.
servingobjectCoffee preparation offered. true: offered; false: confirmed not offered; absent: unknown.
Defined in
coffee-places.schema.v0.5.0.json#/$defs/serving7 fields in
servingEspresso and espresso-based drinks.
Any filter coffee.
Must be true when pour_over is true.
Hand-brewed filter (V60, Kalita, Chemex and similar).
Filter coffee from a batch brewer.
Coffee brewed with cold water over many hours. true: offered; false: confirmed not offered; absent: unknown.
Decaffeinated coffee. true: offered; false: confirmed not offered; absent: unknown.
At least one plant-based milk.
amenitiesobjecttrue: available; false: confirmed not available; absent: unknown.
Defined in
coffee-places.schema.v0.5.0.json#/$defs/amenities9 fields in
amenitiesWi-Fi for guests. true: available; false: confirmed not available; absent: unknown.
Laptops are welcome (no laptop ban, seats with sockets or tables).
Suitable for children, for example with high chairs, space for prams or a kids' menu. true: yes; false: confirmed not suitable; absent: unknown.
Vegan food beyond plant milk.
Dogs may come inside. true: allowed; false: confirmed not allowed; absent: unknown.
Seats outside, such as a terrace or tables on the pavement. true: available; false: confirmed none; absent: unknown.
Payment by debit or credit card. true: accepted; false: confirmed not accepted; absent: unknown.
Must be false when cash_only is true.
Only cash is accepted. true: cash only; false: other payment methods are accepted; absent: unknown.
Step-free entrance.
foodobjectFood
Defined in
coffee-places.schema.v0.5.0.json#/$defs/food4 fields in
foodcoffee_led: coffee is the main product; food_led: food or a restaurant concept leads; balanced: both matter equally.
Breakfast is served. true: served; false: confirmed not served; absent: unknown.
Lunch dishes are served. true: served; false: confirmed not served; absent: unknown.
Cakes or pastries are baked by the place itself. true: baked in house; false: confirmed bought in; absent: unknown.
sells_beansyes/noWhether whole beans or ground coffee are sold to take home. true: sold; false: confirmed not sold; absent: unknown.
sells_equipmentyes/noWhether brewing equipment such as grinders, drippers or kettles is sold. true: sold; false: confirmed not sold; absent: unknown.
offers_coursesyes/noBarista courses, brewing classes or public cuppings.
reusable_cup_systemslist of textDeposit or reusable cup schemes accepted, for example recup, vytal, own_cup.
good_forlist of one of a fixed setGood for
Defined in
coffee-places.schema.v0.5.0.json#/$defs/good_forawardslist of objectAward
Defined in
coffee-places.schema.v0.5.0.json#/$defs/award3 fields in
awardsName of the award or ranking, for example a national barista championship or a city guide's list.
Year the award was given, for example 2025.
Absolute http or https address. Letters outside ASCII, such as umlauts in the host or path, may be written as they are (an IRI, for example https://kaffee-münchen.de/über-uns). The scheme is not case-sensitive.
Defined in
common.schema.v0.4.0.json#/$defs/url
pricesobjectPrices we observed, each with the date and page where we saw it. Currently only the cappuccino price, as a comparable reference.
1 fields in
pricesObserved price
Defined in
coffee-places.schema.v0.5.0.json#/$defs/price4 fields in
cappuccinoPrice paid for one standard drink, in the currency given by currency, for example 3.9.
ISO 4217 currency code.
Defined in
common.schema.v0.4.0.json#/$defs/currencyCalendar date, YYYY-MM-DD.
Defined in
common.schema.v0.4.0.json#/$defs/dateAbsolute http or https address. Letters outside ASCII, such as umlauts in the host or path, may be written as they are (an IRI, for example https://kaffee-münchen.de/über-uns). The scheme is not case-sensitive.
Defined in
common.schema.v0.4.0.json#/$defs/url
operatorobjectThe legal entity running the place, taken from its Impressum or legal notice. Only companies and other legal entities; never the name of a natural person (sole traders are omitted).
Defined in
coffee-places.schema.v0.5.0.json#/$defs/operator3 fields in
operatorRegistered name of the company that runs the place, as written in its legal notice.
For example GmbH, UG (haftungsbeschränkt), KG, e.K.
Commercial register number, for example HRB 123456 (Amtsgericht München).
linksobjectLinks
Defined in
coffee-places.schema.v0.5.0.json#/$defs/links3 fields in
linksAbsolute http or https address. Letters outside ASCII, such as umlauts in the host or path, may be written as they are (an IRI, for example https://kaffee-münchen.de/über-uns). The scheme is not case-sensitive.
Defined in
common.schema.v0.4.0.json#/$defs/urlAddress of the place's own Instagram profile. Write it as https://www.instagram.com/<handle>/ with the handle in lower case and no query string, for example https://www.instagram.com/example.coffee/. Posts, reels, stories and other non-profile pages are rejected.
Address of the place's own Facebook page.
imageobjectAn openly licensed image. Each image carries its own licence, author and source.
Defined in
common.schema.v0.4.0.json#/$defs/image7 fields in
imageWhere the file is served from (our assets folder or the original host).
Defined in
common.schema.v0.4.0.json#/$defs/urlSPDX identifier, for example CC-BY-4.0, CC-BY-SA-4.0 or CC0-1.0.
Name of the photographer or creator, as the licence requires it to be credited.
Page describing the original file and its licence.
Defined in
common.schema.v0.4.0.json#/$defs/urlShort caption describing what the image shows.
Width of the image file in pixels.
Height of the image file in pixels.
xrefobjectCrosswalk to other datasets. google_place_id is the only Google data we may store.
Defined in
coffee-places.schema.v0.5.0.json#/$defs/xref4 fields in
xrefOverture Maps place GERS id.
Foursquare Open Source Places fsq_place_id.
Wikidata item id of the place, for example Q42.
Google Maps place id, stored only so a known place can be matched. No other Google data is stored.
external_ratingslist of objectReferences to rating pages elsewhere. Rating values are never stored.
Defined in
common.schema.v0.4.0.json#/$defs/external_ref3 fields in
external_ratingsShort name of the other service, for example tripadvisor or untappd. Lowercase letters, digits, dots, dashes and underscores.
The record's identifier in the other service.
Absolute http or https address. Letters outside ASCII, such as umlauts in the host or path, may be written as they are (an IRI, for example https://kaffee-münchen.de/über-uns). The scheme is not case-sensitive.
Defined in
common.schema.v0.4.0.json#/$defs/url
File structure
Canonical URL of the schema version this file follows.
File-level facts that are not records. The schema version is the $schema URL; the data version is the release tag.
Defined in
coffee-places.schema.v0.5.0.json#/$defs/meta4 fields in
metaLicence of the file as an SPDX licence expression, for example MIT, CC0-1.0, CC-BY-4.0, ODbL-1.0 or "MIT OR Apache-2.0". Use identifiers from the SPDX licence list (https://spdx.org/licenses/) or LicenseRef-<name> for others.
ISO 3166-1 alpha-2 code in upper case.
Defined in
common.schema.v0.4.0.json#/$defs/country_codeCity slug, matching the file name.
City name in the local language.
One place that serves coffee. In JSON-LD it is a schema.org CafeOrCoffeeShop whose IRI is https://data.roastbook.coffee/places/<id>.
Defined in
coffee-places.schema.v0.5.0.json#/$defs/place
Examples
examples/coffee-places/valid/full-record.json
Open this example in Playground
{
"$schema": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.5.0.json",
"meta": {
"licence": "MIT",
"country_code": "DE",
"city": "example-city",
"city_name": "Example City"
},
"places": [
{
"id": "cp-example0001",
"type": "CafeOrCoffeeShop",
"name": "Example Coffee Bar",
"status": "open",
"opened_on": "2019-04-01",
"last_verified_at": "2026-11-01T09:00:00Z",
"checked_at": "2026-11-01T09:00:00Z",
"address": {
"street_address": "Beispielstraße 1",
"postal_code": "80331",
"locality": "Example City",
"country_code": "DE"
},
"location": {
"lat": 48.1371,
"lon": 11.5754
},
"opening_hours": "Mo-Fr 08:00-18:00; Sa,Su 09:00-17:00",
"description": "Coffee-led espresso bar that roasts its own beans and serves pour-over and batch brew. Sells beans and brewing gear, and runs public cuppings.",
"specialty_tier": "A",
"roasts_own_beans": true,
"roasters_served": [
{
"name": "Example Coffee Bar",
"own": true
}
],
"serving": {
"espresso": true,
"filter": true,
"pour_over": true,
"batch_brew": true,
"cold_brew": false,
"decaf": true,
"plant_milk": true
},
"amenities": {
"wifi": true,
"laptop_friendly": false,
"card_payment": true,
"outdoor_seating": true,
"wheelchair_accessible": true
},
"food": {
"focus": "coffee_led",
"cakes_baked_in_house": true
},
"sells_beans": true,
"sells_equipment": true,
"offers_courses": true,
"reusable_cup_systems": [
"recup"
],
"good_for": [
"coffee_nerds",
"quick_espresso"
],
"prices": {
"cappuccino": {
"amount": 3.9,
"currency": "EUR",
"observed_on": "2026-10-20",
"source_url": "https://example.com/menu"
}
},
"operator": {
"name": "Example Coffee GmbH",
"legal_form": "GmbH",
"register_id": "HRB 000000"
},
"links": {
"website": "https://kaffee-münchen.example/über-uns",
"instagram": "https://www.instagram.com/example.coffee/"
},
"image": {
"url": "https://upload.wikimedia.org/wikipedia/commons/example.jpg",
"licence": "CC-BY-SA-4.0",
"author": "Jane Doe",
"source_url": "https://commons.wikimedia.org/wiki/File:Example.jpg"
},
"xref": {
"overture": "08f1f8a1b2c3d4e5",
"wikidata": "Q42"
},
"external_ratings": [
{
"source": "example-reviews",
"id": "abc123",
"url": "https://reviews.example.org/place/abc123"
}
]
}
]
}
examples/coffee-places/valid/minimal-record.json
Open this example in Playground
{
"$schema": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.5.0.json",
"meta": {
"country_code": "DE",
"city": "example-city",
"licence": "CC-BY-4.0"
},
"places": [
{
"id": "cp-example0002",
"type": "CafeOrCoffeeShop",
"name": "Corner Café",
"status": "unverified",
"checked_at": "2026-11-05T12:00:00Z",
"address": {
"country_code": "DE"
},
"location": {
"lat": 48.14,
"lon": 11.58
},
"specialty_tier": "none"
},
{
"id": "cp-example0003",
"type": "CafeOrCoffeeShop",
"name": "Former Roastery",
"status": "closed",
"closed_on": "2025-12-31",
"checked_at": "2026-11-05T12:00:00Z",
"address": {
"country_code": "DE",
"locality": "Example City"
},
"location": {
"lat": 48.15,
"lon": 11.59
},
"specialty_tier": "A",
"merged_into": "cp-example0001"
}
]
}
Raw JSON
Show coffee-places.schema.v0.5.0.json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.5.0.json",
"title": "Open Coffee places dataset",
"description": "One file per city listing cafés, coffee bars and other places that serve coffee. Part of Roastbook Open Coffee.",
"type": "object",
"required": [
"$schema",
"meta",
"places"
],
"additionalProperties": false,
"properties": {
"$schema": {
"description": "Canonical URL of the schema version this file follows.",
"type": "string",
"pattern": "^https://schema\\.roastbook\\.coffee/coffee-places/coffee-places\\.schema\\.v[0-9]+\\.[0-9]+\\.[0-9]+\\.json$"
},
"meta": {
"$ref": "#/$defs/meta"
},
"places": {
"type": "array",
"items": {
"$ref": "#/$defs/place"
}
}
},
"$defs": {
"meta": {
"title": "File metadata",
"type": "object",
"allOf": [
{
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/dataset_meta"
}
],
"required": [
"country_code",
"city"
],
"properties": {
"country_code": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/country_code"
},
"city": {
"description": "City slug, matching the file name.",
"type": "string",
"pattern": "^[a-z0-9-]+$"
},
"city_name": {
"type": "string",
"description": "City name in the local language."
},
"licence": true
},
"unevaluatedProperties": false
},
"tier": {
"title": "Specialty tier",
"description": "A: coffee is the core product; the place roasts its own beans or serves named specialty roasters and usually offers filter coffee. B: food or something else leads, but the place serves a specialty roaster. none: no specialty evidence: the place does not roast its own beans and names no specialty roaster (kept in the dataset). Every place is assessed.",
"enum": [
"A",
"B",
"none"
]
},
"serving": {
"title": "Serving",
"description": "Coffee preparation offered. true: offered; false: confirmed not offered; absent: unknown.",
"type": "object",
"additionalProperties": false,
"properties": {
"espresso": {
"type": "boolean",
"description": "Espresso and espresso-based drinks."
},
"filter": {
"type": "boolean",
"description": "Any filter coffee."
},
"pour_over": {
"type": "boolean",
"description": "Hand-brewed filter (V60, Kalita, Chemex and similar)."
},
"batch_brew": {
"type": "boolean",
"description": "Filter coffee from a batch brewer."
},
"cold_brew": {
"type": "boolean",
"description": "Coffee brewed with cold water over many hours. true: offered; false: confirmed not offered; absent: unknown."
},
"decaf": {
"type": "boolean",
"description": "Decaffeinated coffee. true: offered; false: confirmed not offered; absent: unknown."
},
"plant_milk": {
"type": "boolean",
"description": "At least one plant-based milk."
}
},
"allOf": [
{
"if": {
"properties": {
"pour_over": {
"const": true
}
},
"required": [
"pour_over"
]
},
"then": {
"properties": {
"filter": {
"const": true
}
}
}
}
]
},
"amenities": {
"title": "Amenities",
"description": "true: available; false: confirmed not available; absent: unknown.",
"type": "object",
"additionalProperties": false,
"properties": {
"wifi": {
"type": "boolean",
"description": "Wi-Fi for guests. true: available; false: confirmed not available; absent: unknown."
},
"laptop_friendly": {
"type": "boolean",
"description": "Laptops are welcome (no laptop ban, seats with sockets or tables)."
},
"kids_friendly": {
"type": "boolean",
"description": "Suitable for children, for example with high chairs, space for prams or a kids' menu. true: yes; false: confirmed not suitable; absent: unknown."
},
"vegan_options": {
"type": "boolean",
"description": "Vegan food beyond plant milk."
},
"dogs_allowed": {
"type": "boolean",
"description": "Dogs may come inside. true: allowed; false: confirmed not allowed; absent: unknown."
},
"outdoor_seating": {
"type": "boolean",
"description": "Seats outside, such as a terrace or tables on the pavement. true: available; false: confirmed none; absent: unknown."
},
"card_payment": {
"type": "boolean",
"description": "Payment by debit or credit card. true: accepted; false: confirmed not accepted; absent: unknown."
},
"cash_only": {
"type": "boolean",
"description": "Only cash is accepted. true: cash only; false: other payment methods are accepted; absent: unknown."
},
"wheelchair_accessible": {
"type": "boolean",
"description": "Step-free entrance."
}
},
"allOf": [
{
"if": {
"properties": {
"cash_only": {
"const": true
}
},
"required": [
"cash_only"
]
},
"then": {
"properties": {
"card_payment": {
"const": false
}
}
}
}
]
},
"food": {
"title": "Food",
"type": "object",
"additionalProperties": false,
"properties": {
"focus": {
"description": "coffee_led: coffee is the main product; food_led: food or a restaurant concept leads; balanced: both matter equally.",
"enum": [
"coffee_led",
"food_led",
"balanced"
]
},
"breakfast": {
"type": "boolean",
"description": "Breakfast is served. true: served; false: confirmed not served; absent: unknown."
},
"lunch": {
"type": "boolean",
"description": "Lunch dishes are served. true: served; false: confirmed not served; absent: unknown."
},
"cakes_baked_in_house": {
"type": "boolean",
"description": "Cakes or pastries are baked by the place itself. true: baked in house; false: confirmed bought in; absent: unknown."
}
}
},
"links": {
"title": "Links",
"type": "object",
"additionalProperties": false,
"properties": {
"website": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/url"
},
"instagram": {
"type": "string",
"pattern": "^https://(www\\.)?instagram\\.com/(?!(?:p|reel|reels|explore|stories|tv|accounts)(?:[/?]|$))[A-Za-z0-9_.]+/?(\\?[^#\\s]*)?$",
"description": "Address of the place's own Instagram profile. Write it as https://www.instagram.com/<handle>/ with the handle in lower case and no query string, for example https://www.instagram.com/example.coffee/. Posts, reels, stories and other non-profile pages are rejected."
},
"facebook": {
"type": "string",
"pattern": "^https://(www\\.|m\\.)?facebook\\.com/.+",
"description": "Address of the place's own Facebook page."
}
}
},
"xref": {
"title": "Identifiers in other datasets",
"description": "Crosswalk to other datasets. google_place_id is the only Google data we may store.",
"type": "object",
"additionalProperties": false,
"properties": {
"overture": {
"type": "string",
"minLength": 1,
"description": "Overture Maps place GERS id."
},
"foursquare": {
"type": "string",
"minLength": 1,
"description": "Foursquare Open Source Places fsq_place_id."
},
"wikidata": {
"type": "string",
"pattern": "^Q[1-9][0-9]*$",
"description": "Wikidata item id of the place, for example Q42."
},
"google_place_id": {
"type": "string",
"minLength": 1,
"description": "Google Maps place id, stored only so a known place can be matched. No other Google data is stored."
}
}
},
"roaster_ref": {
"title": "Roaster served",
"type": "object",
"required": [
"name"
],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Name of the roastery whose coffee is served."
},
"roaster_id": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/id",
"description": "Reserved for the future Open Coffee roasters dataset."
},
"url": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/url"
},
"own": {
"type": "boolean",
"description": "The place roasts this coffee itself."
}
}
},
"award": {
"title": "Award",
"type": "object",
"required": [
"name"
],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Name of the award or ranking, for example a national barista championship or a city guide's list."
},
"year": {
"type": "integer",
"minimum": 1900,
"maximum": 2100,
"description": "Year the award was given, for example 2025."
},
"url": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/url"
}
}
},
"price": {
"title": "Observed price",
"type": "object",
"required": [
"amount",
"currency",
"observed_on"
],
"additionalProperties": false,
"properties": {
"amount": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Price paid for one standard drink, in the currency given by currency, for example 3.9."
},
"currency": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/currency"
},
"observed_on": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/date"
},
"source_url": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/url"
}
}
},
"operator": {
"title": "Operator",
"description": "The legal entity running the place, taken from its Impressum or legal notice. Only companies and other legal entities; never the name of a natural person (sole traders are omitted).",
"type": "object",
"required": [
"name"
],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Registered name of the company that runs the place, as written in its legal notice."
},
"legal_form": {
"type": "string",
"description": "For example GmbH, UG (haftungsbeschränkt), KG, e.K."
},
"register_id": {
"type": "string",
"description": "Commercial register number, for example HRB 123456 (Amtsgericht München)."
}
}
},
"good_for": {
"title": "Good for",
"enum": [
"working",
"meetings",
"quick_espresso",
"takeaway",
"brunch",
"groups",
"reading",
"date",
"coffee_nerds",
"families"
]
},
"place": {
"title": "Coffee place",
"type": "object",
"required": [
"id",
"type",
"name",
"status",
"location",
"address",
"specialty_tier",
"checked_at"
],
"additionalProperties": false,
"properties": {
"id": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/id"
},
"type": {
"description": "Kind of place, as a schema.org type. Every place is a CafeOrCoffeeShop for now; JSON-LD processors read it as the record's @type.",
"enum": [
"CafeOrCoffeeShop"
]
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The name the place uses on its sign or website."
},
"status": {
"description": "open; temporarily_closed (renovation, holiday longer than a month); closed (permanently); unverified (found but not yet confirmed to exist).",
"enum": [
"open",
"temporarily_closed",
"closed",
"unverified"
]
},
"merged_into": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/id",
"description": "Set when this record turned out to be a duplicate: the id of the record that is kept. The record stays as a tombstone so its id is never reused or lost; its status must not be open."
},
"opened_on": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/date"
},
"closed_on": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/date"
},
"last_verified_at": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/datetime",
"description": "When a primary source last confirmed that the place exists with this status."
},
"checked_at": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/datetime",
"description": "When the record as a whole was last reviewed or enriched."
},
"address": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/address"
},
"location": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/location"
},
"opening_hours": {
"description": "Opening hours in OpenStreetMap opening_hours syntax (used as a format only; no OSM data), for example \"Mo-Fr 08:00-18:00; Sa,Su 09:00-17:00\".",
"type": "string",
"minLength": 2,
"maxLength": 255
},
"description": {
"description": "Short English description written only from the facts stored in this record. Never copied from the place's own texts.",
"type": "string",
"minLength": 20,
"maxLength": 600
},
"specialty_tier": {
"$ref": "#/$defs/tier"
},
"roasts_own_beans": {
"type": "boolean",
"description": "Whether the place roasts coffee itself. true: roasts its own beans; false: confirmed not roasting; absent: unknown."
},
"roasters_served": {
"type": "array",
"items": {
"$ref": "#/$defs/roaster_ref"
}
},
"serving": {
"$ref": "#/$defs/serving"
},
"amenities": {
"$ref": "#/$defs/amenities"
},
"food": {
"$ref": "#/$defs/food"
},
"sells_beans": {
"type": "boolean",
"description": "Whether whole beans or ground coffee are sold to take home. true: sold; false: confirmed not sold; absent: unknown."
},
"sells_equipment": {
"type": "boolean",
"description": "Whether brewing equipment such as grinders, drippers or kettles is sold. true: sold; false: confirmed not sold; absent: unknown."
},
"offers_courses": {
"type": "boolean",
"description": "Barista courses, brewing classes or public cuppings."
},
"reusable_cup_systems": {
"description": "Deposit or reusable cup schemes accepted, for example recup, vytal, own_cup.",
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-z0-9_-]+$"
}
},
"good_for": {
"type": "array",
"uniqueItems": true,
"items": {
"$ref": "#/$defs/good_for"
}
},
"awards": {
"type": "array",
"items": {
"$ref": "#/$defs/award"
}
},
"prices": {
"type": "object",
"additionalProperties": false,
"properties": {
"cappuccino": {
"$ref": "#/$defs/price"
}
},
"description": "Prices we observed, each with the date and page where we saw it. Currently only the cappuccino price, as a comparable reference."
},
"operator": {
"$ref": "#/$defs/operator"
},
"links": {
"$ref": "#/$defs/links"
},
"image": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/image"
},
"xref": {
"$ref": "#/$defs/xref"
},
"external_ratings": {
"description": "References to rating pages elsewhere. Rating values are never stored.",
"type": "array",
"items": {
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json#/$defs/external_ref"
}
}
},
"allOf": [
{
"if": {
"properties": {
"status": {
"const": "closed"
}
},
"required": [
"status"
]
},
"else": {
"properties": {
"closed_on": false
}
}
}
],
"dependentSchemas": {
"merged_into": {
"properties": {
"status": {
"enum": [
"temporarily_closed",
"closed",
"unverified"
]
}
}
}
},
"description": "One place that serves coffee. In JSON-LD it is a schema.org CafeOrCoffeeShop whose IRI is https://data.roastbook.coffee/places/<id>."
}
}
}