XooCode(){

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.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/Restaurant
<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.

schema.org/Restaurant (minimal)
<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.

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.

  1. 01

    Missing servesCuisine

    Wrong
    Restaurant with address and hours but no servesCuisine
    Right
    "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."

  2. 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.

  3. 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.

  4. 04

    Using Restaurant for takeaway-only businesses

    Wrong
    "@type": "Restaurant" for a food truck or delivery-only kitchen
    Right
    "@type": "FoodEstablishment" for general food businesses; Restaurant specifically implies dine-in service

    Restaurant 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.

  5. 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 MenuSections

    hasMenu 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.

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...

Leave a comment