Restaurant & Cafe LocalBusiness Schema: A Copy-Paste Guide
For a restaurant or cafe to show up accurately in search and AI answers, you need Restaurant/LocalBusiness schema. A copy-paste JSON-LD example with hours, price range, cuisine, and ratings — plus a plain-English breakdown of every field.
TL;DR
For a restaurant or cafe to surface accurately in search and AI answers, you need LocalBusiness JSON-LD using the Restaurant type (or CafeOrCoffeeShop for cafes) on the page. Pack name, address, phone, hours, price range, cuisine, and coordinates into a single <script type="application/ld+json"> block and you're done. Copy the example below and swap in your own details.
1. Why restaurants need schema
Search engines and AI don't "read" a page the way a person does. Even if it says "Hours 09:00–21:00," whether that's the hours or a phone number is a guess. LocalBusiness schema removes the guesswork.
- Google rich results — your listing can show open/closed status, ratings, and price range as a card.
- Google Maps and the local pack — your business profile and site info get linked, which raises trust.
- AI search (ChatGPT, Perplexity, Gemini) — when answering "recommend a pasta place near Gangnam," it cites places that have schema. LocalBusiness is one of the types AI trusts most.
2. Choosing a type: Restaurant vs CafeOrCoffeeShop
| Business | @type to use |
|---|---|
| General restaurant / eatery | Restaurant |
| Cafe / coffee shop | CafeOrCoffeeShop |
| Bakery | Bakery |
| Bar / pub | BarOrPub |
| Delivery-only kitchen | FoodEstablishment or Restaurant |
All are subtypes of LocalBusiness, so they share common properties like address and hours. The more specific the type, the better — Restaurant beats LocalBusiness, and only then does Google pick up dedicated fields like servesCuisine.
3. The full copy-paste example
Below is a fictional pasta restaurant in Seoul. Drop it into <head> or right before </body>.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "Trattoria Sole",
"image": "https://example.com/photos/store.jpg",
"url": "https://example.com",
"telephone": "+82-2-555-1234",
"priceRange": "$$",
"servesCuisine": ["Italian", "Pasta", "Pizza"],
"menu": "https://example.com/menu",
"acceptsReservations": "True",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Teheran-ro, 2F",
"addressLocality": "Gangnam-gu",
"addressRegion": "Seoul",
"postalCode": "06234",
"addressCountry": "KR"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 37.4979,
"longitude": 127.0276
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "11:30",
"closes": "21:30"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday", "Sunday"],
"opens": "11:00",
"closes": "22:00"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128"
},
"sameAs": [
"https://www.instagram.com/trattoria_sole",
"https://place.map.kakao.com/000000000",
"https://m.place.naver.com/restaurant/0000000"
]
}
</script>
4. Field-by-field breakdown
name— your official business name. Drop slogans and branch tags; use the name on the sign.image— an absolute, externally reachable URL. A storefront or signature-dish photo here gets used in the rich-result card. Landscape and high-res preferred.telephone— international format (E.164). For Korean numbers, drop the leading0and prefix+82-.02-555-1234❌ →+82-2-555-1234✅.priceRange—$(cheap) to$$$$(high-end), or a text range like"10000-30000 KRW". AI uses it for "good value" type queries.servesCuisine— the cuisines you serve. List several in an array to match queries like "best Italian." For a cafe,["Coffee", "Dessert", "Brunch"].address— broken out asPostalAddress.addressCountrymust be the ISO codeKR(never "Korea");addressRegionis the wide region (Seoul),addressLocalitythe city/district (Gangnam-gu).geo— latitude/longitude. Decisive for map integration and "near me" queries. Grab the coordinates from Naver or Kakao Maps.openingHoursSpecification— hours grouped by day. 24-hour format, local time. Just omit closed days (e.g. Monday) from the array.aggregateRating— rating and review count. Add it only when based on reviews you actually display on your own site (see the caution below).acceptsReservations— whether you take reservations ("True"/"False").sameAs— official channels: Instagram, Naver Place, Kakao Map, and so on. For a Korean restaurant, include the Naver Place and Kakao Map links.
5. Common mistakes
! The mistakes we see most on restaurant schema
- Copying ratings from elsewhere — pasting Naver or Google Maps stars violates policy. If you don't run your own review system, omit
aggregateRating. - "Korea" in
addressCountry— it must beKR. - Leaving the leading
0in the phone number — use the+82-2-...format. - Writing hours as a single
openingHoursstring — if they vary by day, theopeningHoursSpecificationarray is the accurate choice. - Cramming multiple locations onto one page — one LocalBusiness per location, on that location's page.
6. Validation
Once you ship, check with the Rich Results Test and the Schema Markup Validator. If "Local business" is detected with no errors, you're good.
For deeper background, see Organization Schema for Korean Businesses.
Build it yourself
Paste your live store URL and we extract a LocalBusiness/Restaurant candidate from the page and turn it into JSON-LD. Copy and ship.
→ Auto-generate LocalBusiness from a URLPaste a URL and we show your current structured data plus the missing restaurant fields (hours, coordinates, price range) ranked by priority.
→ Diagnose whether your store site has schema