Schema markup for AI search: which types matter
Which schema types are worth deploying for a hospitality business, what to put in each, and the honest limit: a matched study found no lift in AI citations.
Short answer
For a local hospitality business, the schema types that carry the most weight in AI retrieval are LocalBusiness (or its subtypes Restaurant, CafeOrCoffeeShop, Hotel), Organization, FAQPage, and Menu or OfferCatalog where relevant. The value comes from stating filterable attributes as data rather than prose: hours, price range, location, capacity and services.
Most of the argument about whether structured data helps AI search misses a simpler point. A model reading a page has to work out what your business is. Prose makes it guess. Schema tells it.
That is the whole case. Everything below is about doing it properly.
Use the most specific type available
Schema.org is a hierarchy. LocalBusiness has children, and the children carry more meaning.
| Business | Type to use |
|---|---|
| Restaurant | Restaurant |
| Specialty coffee shop | CafeOrCoffeeShop |
| Bar or wine bar | BarOrPub |
| Boutique hotel | Hotel |
| Guesthouse or B&B | BedAndBreakfast |
| Tour operator | TravelAgency or TouristAttraction for a specific site |
Using LocalBusiness when CafeOrCoffeeShop exists throws away information for no reason.
The core block
Here is a Restaurant entity with the fields that carry the most weight. Every field here is something a query might filter on.
{
"@context": "https://schema.org",
"@type": "Restaurant",
"@id": "https://example.com/#restaurant",
"name": "The Corner Room",
"description": "A twenty-four cover neighbourhood restaurant in Fitzroy, Melbourne, serving a daily-changing seasonal menu.",
"url": "https://example.com/",
"priceRange": "₹₹₹",
"servesCuisine": ["Modern Australian"],
"acceptsReservations": "https://example.com/book",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Gertrude Street, Fitzroy",
"addressLocality": "Fitzroy",
"addressRegion": "Victoria",
"postalCode": "403001"
},
"geo": { "@type": "GeoCoordinates", "latitude": 15.4989, "longitude": 73.8278 },
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Wednesday","Thursday","Friday","Saturday","Sunday"],
"opens": "19:00", "closes": "23:00"
}],
"hasMenu": "https://example.com/menu",
"sameAs": [
"https://www.google.com/maps/place/...",
"https://www.instagram.com/..."
]
}
The fields that do the most work
@id. A stable identifier for the entity. It lets you reference the same business from multiple pages without a model treating them as different businesses. Skipping this is the most common structural mistake.
sameAs. Links to your listings elsewhere: Google Maps, Instagram, review platforms, directories. This is how you tell a model that these scattered records describe one entity. For corroboration it is the highest-value field on the page.
openingHoursSpecification. Real hours as data, including seasonal exceptions with validFrom and validThrough. Queries constrain on time constantly.
priceRange. Coarse, and still used, because "affordable" and "upmarket" are extremely common query modifiers.
servesCuisine, amenityFeature, petsAllowed, smokingAllowed, publicAccess. The filterable attributes. Each one you omit is a query family you drop out of.
geo. Coordinates remove ambiguity for anything phrased as "near."
FAQPage is worth more than it looks
If a page has genuine questions and answers on it, mark them up.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Do you take walk-ins?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Bar seats are walk-in only and tables are by reservation. We hold six bar seats back each evening."
}
}]
}
The reason this performs is that the format matches the shape of the task. A model answering a question is looking for a question-answer pair, and you have handed it one, pre-extracted, unambiguous, with no surrounding prose to misinterpret.
Mistakes that make markup worthless
Marking up content that is not on the page. Against the guidelines, and it creates the contradictions that damage entity trust.
Different facts in schema and in the visible page. Hours in the markup that disagree with hours in the footer is worse than having neither.
Copying a competitor's block and missing a field. Leftover name or address values from a template are common and catastrophic.
One-off deployment. Hours change, prices change, menus change. Markup that is not maintained turns into a confidently wrong source.
Skipping validation. Run every block through Google's Rich Results Test and the Schema Markup Validator before it ships. Both are free.
A sensible deployment order
OrganizationorLocalBusinesssubtype on the homepage, with@idandsameAs.PostalAddress,geoandopeningHoursSpecificationinside it.FAQPageon any page that genuinely answers questions.MenuorOfferCatalogif you sell a list of defined things.BreadcrumbListacross the site for structure.ArticleorBlogPostingon editorial content, withauthoranddateModified.
That order front-loads the fields that answer "what is this business," which is the question every retrieval step depends on.
Frequently asked questions
Do AI models read JSON-LD?
Systems that retrieve web pages parse the HTML, and structured data is part of that HTML. Google's AI Overviews are built on an index that has consumed schema for years. For other assistants there is less public documentation, but structured data is the least ambiguous statement of fact on a page, which makes it the cheapest thing for any parser to use.
Which schema type should a restaurant use?
Restaurant, which is a subtype of FoodEstablishment and therefore of LocalBusiness. Use the most specific type that fits: CafeOrCoffeeShop for a café, BarOrPub for a bar, Hotel for a hotel. The more specific type carries more meaning than the generic parent.
Will invalid schema hurt me?
Invalid markup is generally ignored rather than penalised, so the direct cost is that you get nothing for the work. Markup that is valid but inaccurate is the genuine risk, because it introduces exactly the contradictions between sources that cause a model to route around you.
How much schema is too much?
Markup should describe what is on the page. Adding schema for things the page does not contain, or marking up content hidden from users, is against Google's structured data guidelines and can trigger manual action. Describe reality and there is no ceiling worth worrying about.
Want to know how AI models currently describe your business?
We run a free visibility check across ChatGPT, Perplexity, Claude and Google AI Overviews, then show you exactly which signals are missing.
Book a visibility check