Restaurant
Restaurant is the LocalBusiness subtype for sit-down restaurants, diners, and food-service businesses where people eat on premises. Google uses it for the local business knowledge panel, the local pack (map results), and Google Maps listings. The markup also feeds reservation platforms and AI assistants that recommend restaurants.
Restaurant inherits everything from LocalBusiness (address, hours, phone, ratings) and adds food-specific properties: servesCuisine, menu/hasMenu, acceptsReservations, and priceRange. For takeaway-only or delivery-only businesses, consider FoodEstablishment as the parent type instead.
Full example of schema.org/Restaurant json-ld markup
The markup is verified as valid with Rich Results Test from Google.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@id": "https://dunmoregrill.com#restaurant",
"@type": "Restaurant",
"name": "The Dunmore Grill",
"description": "Casual American grill in downtown Dunmore, two blocks from Xoo Code Shop. Known for the smash burger and all-day breakfast.",
"url": "https://dunmoregrill.com",
"image": [
"https://dunmoregrill.com/images/exterior-1x1.jpg",
"https://dunmoregrill.com/images/exterior-4x3.jpg",
"https://dunmoregrill.com/images/exterior-16x9.jpg"
],
"telephone": "+1-570-555-0142",
"address": {
"@type": "PostalAddress",
"streetAddress": "308 Main Street",
"addressLocality": "Dunmore",
"addressRegion": "PA",
"postalCode": "18512",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 41.4198,
"longitude": -75.6327
},
"servesCuisine": ["American", "Breakfast"],
"hasMenu": {
"@type": "Menu",
"name": "Main Menu",
"url": "https://dunmoregrill.com/menu",
"hasMenuSection": [
{
"@type": "MenuSection",
"name": "Burgers",
"hasMenuItem": [
{
"@type": "MenuItem",
"name": "Dunmore Smash Burger",
"description": "Double smashed patties, American cheese, pickles, special sauce, brioche bun.",
"offers": {
"@type": "Offer",
"price": "14.50",
"priceCurrency": "USD"
}
},
{
"@type": "MenuItem",
"name": "Mushroom Swiss Burger",
"description": "Single patty, sautéed mushrooms, Swiss cheese, garlic aioli.",
"offers": {
"@type": "Offer",
"price": "13.00",
"priceCurrency": "USD"
}
}
]
}
]
},
"acceptsReservations": "https://dunmoregrill.com/reservations",
"priceRange": "$$",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "07:00",
"closes": "21:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Friday", "Saturday"],
"opens": "07:00",
"closes": "22:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Sunday",
"opens": "08:00",
"closes": "15:00"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.3",
"reviewCount": "186",
"bestRating": "5"
}
}
</script>servesCuisine
servesCuisine is a text string or array of strings describing the cuisine: "American", "Italian", "Sushi", "Vegan". Google reads this for cuisine-filtered local searches ("Italian restaurants near me"). Use the same terms people search for, not internal menu categories. You can list multiple cuisines as an array.
hasMenu with Menu, MenuSection, and MenuItem
The hasMenu property (which supersedes the older menu property) takes a Menu object with hasMenuSection entries. Each MenuSection (like "Burgers" or "Breakfast") contains hasMenuItem entries. Each MenuItem has a name, description, and offers with a price. This is a deep structure. Google does not currently render it as a rich result, but AI systems and reservation platforms read it to answer "what's on the menu" queries. You can also pass hasMenu a plain URL string instead of a full Menu object if you just want to link to the menu page.
acceptsReservations
acceptsReservations takes a Boolean (true/false) or a URL to the reservation page. Google displays reservation links in the knowledge panel when this is a URL. If you use a third-party booking system (OpenTable, Resy), point to your listing there. If you handle reservations by phone, set it to true and rely on the telephone property.
priceRange
priceRange is a short string indicating the cost level. The convention is dollar signs: "$" for budget, "$$" for moderate, "$$$" for upscale, "$$$$" for fine dining. Google displays this in the knowledge panel. You can also use a range like "$10-25" but dollar signs are more widely recognized.
Minimal valid version
The smallest markup that still produces a valid Restaurant entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "The Dunmore Grill",
"address": {
"@type": "PostalAddress",
"streetAddress": "308 Main Street",
"addressLocality": "Dunmore",
"addressRegion": "PA"
},
"servesCuisine": "American"
}
</script>Google rich results this unlocks
Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.
- Google docsLocal business rich resultprimary
Common Restaurant mistakes
Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.
- 01
Missing servesCuisine
WrongRestaurant with address and hours but no servesCuisineRight"servesCuisine": ["American", "Breakfast"]servesCuisine is the property that makes Restaurant markup more useful than generic LocalBusiness. Google uses it for cuisine-filtered local searches. Without it, your restaurant will not appear for queries like "Italian restaurants near me."
- 02
acceptsReservations as a string "yes"
Wrong"acceptsReservations": "yes"Right"acceptsReservations": true or "acceptsReservations": "https://example.com/reservations"acceptsReservations takes a Boolean (true/false) or a URL to the reservation page. The string "yes" is not a valid Boolean in JSON. Use true (no quotes) for a simple yes, or a URL string to link directly to your booking system.
- 03
priceRange with actual prices
Wrong"priceRange": "$14.50 - $32.00"Right"priceRange": "$$"priceRange is a relative cost indicator, not a price range. The convention is dollar signs: $ (budget), $$ (moderate), $$$ (upscale), $$$$ (fine dining). Google displays this in the knowledge panel and uses it for price-filtered searches. Actual dollar amounts are not standardized and display poorly.
- 04
Using Restaurant for takeaway-only businesses
Wrong"@type": "Restaurant" for a food truck or delivery-only kitchenRight"@type": "FoodEstablishment" for general food businesses; Restaurant specifically implies dine-in serviceRestaurant implies sit-down dining. For takeaway-only, delivery-only, food trucks, or mixed-format food businesses, use the parent type FoodEstablishment. For coffee shops, use CafeOrCoffeeShop. For bakeries, use Bakery. Using the wrong subtype misrepresents the business in local search.
- 05
hasMenu as a plain text description
Wrong"hasMenu": "Burgers, salads, breakfast items"Right"hasMenu": "https://example.com/menu" (URL) or a full Menu object with MenuSectionshasMenu accepts either a URL string pointing to the menu page or a structured Menu object with MenuSection and MenuItem entries. A plain text description of the menu is not useful. The older menu property is superseded by hasMenu.
Schema properties in this example
About the example data
The Dunmore Grill is a fictional casual restaurant two blocks from Xoo Code Shop Dunmore. The NewsArticle about the shop opening mentions Dunmore's downtown. The menu includes a simplified MenuSection to demonstrate the hierarchy without overwhelming the example.
Comments
Loading comments...