Schema markup for restaurants is one of the cleaner use cases for local structured data because schema.org has a dedicated type hierarchy that maps directly to what customers search for: location, hours, cuisine, price range, and menu. The challenge is that most restaurant sites either skip structured data entirely or use a generic LocalBusiness block without the restaurant-specific properties that actually matter to Google. This guide covers the right types, the required and recommended properties, and how to test what you have.

Worth stating clearly: schema markup is not a direct ranking factor. What it does is give Google the precise entity data it needs to populate Knowledge Panels, Maps carousels, and local rich results. For restaurants, that translates to visible payoffs — your hours showing up correctly, your cuisine type appearing in the panel, your menu surfacing in search. That is the real value here, and it is real enough to be worth implementing correctly.

What Is Schema Markup for Restaurants?

Schema markup for restaurants is JSON-LD structured data embedded in your site that declares your restaurant as a typed entity in Google’s knowledge graph. The correct @type is Restaurant, which inherits from FoodEstablishment and then from LocalBusiness. Use the most specific type — Restaurant — rather than the parent types. That specificity is how Google understands exactly what kind of business you are and which rich result templates apply to your listing.

The entities at play for a restaurant site: Restaurant as the primary business entity, Menu and MenuItem for food data, OpeningHoursSpecification for hours, AggregateRating and Review if you host your own reviews, and BreadcrumbList for site structure. Getting the right type hierarchy is step one. Getting the properties populated accurately is what makes it useful.

The Restaurant Entity: Required and Recommended Properties

The minimum viable Restaurant block includes name, address (with a nested PostalAddress), and telephone. From there, add the properties that actually drive local results: servesCuisine, priceRange (expressed as dollar signs — $ through $$$$), openingHoursSpecification, geo with GeoCoordinates, hasMap, and url. If you take reservations online, acceptsReservations with a booking URL is worth adding. The sameAs property should point to your Google Business Profile, Yelp listing, and any other established directory entries — this reinforces entity identity across sources and helps Google reconcile your listing across platforms.

<script type='application/ld+json'>
{
  '@context': 'https://schema.org',
  '@type': 'Restaurant',
  'name': 'Casa Verde',
  'url': 'https://casaverde-tempe.com',
  'servesCuisine': 'Mexican',
  'priceRange': '$$',
  'telephone': '+1-480-555-0199',
  'address': {
    '@type': 'PostalAddress',
    'streetAddress': '142 W Main St',
    'addressLocality': 'Tempe',
    'addressRegion': 'AZ',
    'postalCode': '85281',
    'addressCountry': 'US'
  },
  'geo': {
    '@type': 'GeoCoordinates',
    'latitude': '33.4255',
    'longitude': '-111.9400'
  },
  'hasMap': 'https://maps.google.com/?cid=123456789',
  'acceptsReservations': 'https://casaverde-tempe.com/reservations',
  'openingHoursSpecification': [
    {
      '@type': 'OpeningHoursSpecification',
      'dayOfWeek': ['Monday', 'Tuesday', 'Wednesday', 'Thursday'],
      'opens': '11:00',
      'closes': '21:00'
    },
    {
      '@type': 'OpeningHoursSpecification',
      'dayOfWeek': ['Friday', 'Saturday'],
      'opens': '11:00',
      'closes': '23:00'
    },
    {
      '@type': 'OpeningHoursSpecification',
      'dayOfWeek': ['Sunday'],
      'opens': '10:00',
      'closes': '20:00'
    }
  ],
  'sameAs': [
    'https://www.yelp.com/biz/casa-verde-tempe',
    'https://g.co/kgs/casaverde'
  ]
}
</script>

Menu Markup: hasMenu, MenuSection, and MenuItem

The hasMenu property accepts either a URL to your menu page or a full Menu entity. If your menu lives on a separate page, link to it with a URL string — that alone improves Knowledge Panel completeness. If you want to go deeper, nest MenuSection and MenuItem objects with name, description, and offers for pricing. This level of detail is more maintenance work because menus change frequently, but it can surface specific dishes directly in local search results and the Knowledge Panel food carousel.

A practical compromise: use hasMenu with a URL for daily menus, and add structured MenuItem data only for your most stable, high-margin items — signature dishes, set menus, prix fixe options. Those are unlikely to change weekly and the structured data stays accurate without constant updates. Stale MenuItem markup with wrong prices or discontinued dishes is worse than no markup, because it can generate a Rich Results Test warning and erode trust with searchers who see incorrect data in their results.

Review Schema: What You Can and Cannot Include

If your site hosts its own reviews or testimonials, you can include Review objects or an AggregateRating nested under your Restaurant entity. The aggregate rating must come from reviews you collected yourself and have the right to display. You cannot pull ratings from Yelp, Google Maps, or TripAdvisor and embed them in your schema claiming them as your own — Google’s policies are explicit on this and have been for years. Using third-party ratings in self-serving schema will get the markup ignored or penalized.

If you want star ratings in organic search results, the path is to build a first-party review system on your site, or to focus on FAQPage schema for menu or dining FAQ pages as an alternative rich result target. Both are achievable without running afoul of Google’s review schema policies.

How to Add Restaurant Schema Markup

For most restaurant sites, the implementation path depends on the platform. On WordPress, use a plugin like Yoast SEO or Rank Math for basic local business schema, then supplement with a custom JSON-LD block (via a function in your theme or a Code Snippets plugin) for the restaurant-specific properties those plugins do not expose. Rank Math has a more detailed local business module than Yoast and is worth looking at if you need openingHoursSpecification and geo support without custom code. On Squarespace or Wix, use their custom code injection areas to paste your JSON-LD block into the <head>.

For multi-location restaurant groups, create a separate Restaurant entity for each physical location with its own accurate address, telephone, geo, and openingHoursSpecification. A single block covering all locations is a common mistake — each address needs its own entity to be eligible for its own local pack appearance. If your restaurant group has a parent brand page, link each location entity to it via parentOrganization to establish the relationship in the knowledge graph.

Testing and Validating Restaurant Structured Data

Run two checks every time you add or modify restaurant schema. The Google Rich Results Test shows which types are detected and whether your markup qualifies for rich results. The Schema Markup Validator catches property-level errors and vocabulary mismatches the Rich Results Test does not surface. Common issues on restaurant sites: missing addressCountry in the PostalAddress block, hours that do not account for seasonal closures or holiday schedules, and servesCuisine left blank when it is one of the first properties Google uses to classify the entity type.

Also check Google Search Console under Enhancements once the markup is live — it will flag errors on indexed pages that the test tool may not catch on a development URL. If you see warnings about missing recommended fields, address those after fixing any errors flagged as critical.

Restaurant Schema and AI Search

AI Overviews and LLMs increasingly use structured data as a trusted entity layer. When a user asks an AI assistant for restaurant recommendations in a specific city and cuisine, the systems that have clean, complete structured data with consistent sameAs references across schema and directory profiles are the ones most likely to be surfaced with accurate information. The structured data does not just help with rich results — it feeds the entity graph that AI systems draw from when generating recommendations. For restaurants competing on local intent searches, that is a meaningful and growing advantage.

For related implementation context, see local business schema markup, how to add schema markup, and schema markup best practices. You may also find structured data for SEO and rich snippets useful for understanding how these types surface in organic results. If you want to see how your restaurant’s structured data compares against best practices, a schema markup audit will identify what is missing and what is misconfigured. I also work with restaurant groups and multi-location brands through schema markup consulting.