E:LAB
← All guides
8 min read

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 / eateryRestaurant
Cafe / coffee shopCafeOrCoffeeShop
BakeryBakery
Bar / pubBarOrPub
Delivery-only kitchenFoodEstablishment or Restaurant

All are subtypes of LocalBusiness, so they share common properties like address and hours. The more specific the type, the betterRestaurant 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 leading 0 and 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 as PostalAddress. addressCountry must be the ISO code KR (never "Korea"); addressRegion is the wide region (Seoul), addressLocality the 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 be KR.
  • Leaving the leading 0 in the phone number — use the +82-2-... format.
  • Writing hours as a single openingHours string — if they vary by day, the openingHoursSpecification array 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 URL

Paste 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