EnglishEN EspañolES FrançaisFR DeutschDE ItalianoIT PortuguêsPT 中文ZH 日本語JA 한국어KO РусскийRU NederlandsNL
← Back to all articles

Local Business Schema for AI Search: A Complete JSON-LD Guide for 2026

When someone asks an AI assistant "who can fix a leaking roof in Jupiter, Florida?", the assistant has to work out which businesses exist, what they do, where they work and when they are open. Most of that comes from search indexes, business profiles and the websites themselves. Structured data is the part of your website written specifically to be read by machines, and for a local business it is the most direct way to state the facts you want repeated. This guide covers the properties that matter, a complete example, the review-markup rules most sites get wrong, and how to test it.

Key facts

  • JSON-LD — The structured-data format Google recommends
  • Subtype — Use the most specific LocalBusiness type, e.g. RoofingContractor
  • sameAs — Links your site to your profiles so systems join the dots
  • Self-serving — Reviews of your own business on your own site are not eligible for review stars

Why structured data matters more with AI

Classic search used structured data mainly for rich results: stars, prices, FAQs under a listing. AI systems use it for something more basic: entity understanding. A JSON-LD block that says this is a RoofingContractor named Peak Roofing at this address, open these hours, serving these towns, with these profiles, gives any system that reads it an unambiguous record. Search engines build their knowledge of businesses from records like that, and AI search features built on those engines inherit it.

No one can promise that a given assistant reads your JSON-LD directly. What is certain is that Google and Bing do, and that they are the foundation most AI search features stand on.

Pick the most specific type

schema.org has dozens of LocalBusiness subtypes: Dentist, Plumber, RoofingContractor, Restaurant, LegalService, AutoRepair and many more. Use the most specific one that is true. If none fits, use LocalBusiness or ProfessionalService. Specific types help a system match you to specific questions.

A complete example

{
  "@context": "https://schema.org",
  "@type": "RoofingContractor",
  "@id": "https://example.com/#business",
  "name": "Peak Roofing",
  "url": "https://example.com/",
  "logo": "https://example.com/logo.png",
  "image": "https://example.com/team.jpg",
  "telephone": "+1-561-555-0101",
  "email": "[email protected]",
  "priceRange": "$$",
  "foundingDate": "2009",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "100 Example Road",
    "addressLocality": "Jupiter",
    "addressRegion": "FL",
    "postalCode": "33458",
    "addressCountry": "US"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": 26.934, "longitude": -80.094 },
  "areaServed": [
    { "@type": "City", "name": "Jupiter" },
    { "@type": "City", "name": "Tequesta" },
    { "@type": "AdministrativeArea", "name": "Palm Beach County" }
  ],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "07:00", "closes": "17:00" },
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday", "opens": "08:00", "closes": "12:00" }
  ],
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Roofing services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Roof repair" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Roof replacement" } }
    ]
  },
  "sameAs": [
    "https://www.facebook.com/example",
    "https://www.linkedin.com/company/example"
  ]
}

Every value must match what is visible on the page and on your Google Business Profile. Structured data that contradicts the page is ignored at best.

The properties that do the most work

  • @id: a stable identifier so other blocks (pages, services, reviews) can refer to the same business.
  • address, telephone, geo: the NAP facts. Keep them identical everywhere.
  • openingHoursSpecification: one of the most-asked questions. Add specialOpeningHoursSpecification for holidays.
  • areaServed: essential for service-area businesses without a storefront.
  • sameAs: links to your profiles (Google Business Profile share link, Facebook, LinkedIn, Yelp, industry directories). This is how systems connect the website to the rest of your footprint.
  • hasOfferCatalog or Service markup: what you actually do.

Review markup: the rule most sites break

Google’s policy since 2019: reviews that a business publishes about itself on its own site ("self-serving" reviews) are not eligible for review star rich results when the item is a LocalBusiness or Organization. You can still mark them up and the markup can be valid, but it will not produce stars in search. Review stars remain eligible for things like products, recipes, books and software applications, with reviews that are genuine and visible on the page.

Two practical rules: never mark up reviews that are not visible on the page, and never invent ratings. Both can lead to manual actions. We validate our own pages this way; Search Console shows the review snippets as valid, and we do not expect stars for our own services.

Breadcrumbs: the easy win

BreadcrumbList markup tells search engines and AI systems where a page sits in your site, and in Google it can replace the raw URL in results. Each ListItem needs position, name and item (the URL), except the last, where item is optional. The trail must match the visible breadcrumb on the page. Search Console’s Breadcrumbs report shows valid and invalid items; ours currently shows zero invalid. Note that pruning pages reduces the valid count, which is not an error.

Testing it

  1. Google’s Rich Results Test for eligibility.
  2. The Schema Markup Validator for general correctness.
  3. Search Console’s enhancement reports (Breadcrumbs, Review snippets, and others) for sitewide status.
  4. WebAgentScan for structured data as part of a wider AI-readiness score.
  5. Ask an assistant: "What are the opening hours of [business] in [town]?" and compare the answer to your markup.

Done for you

Every site on AIWebBuilding generates LocalBusiness markup with the most specific type for its industry, from the owner’s own details, plus breadcrumbs, an llms.txt and Markdown pages. For a site elsewhere, our schema markup guide covers the hand-written route, and the AI Indexing Pack adds the AI-specific layers on top.

Related reading

Frequently asked questions

What is LocalBusiness schema?

Structured data from schema.org, usually written in JSON-LD, that describes a local business: its type, name, address, phone, hours, service area, services and profiles.

Does schema markup help with AI search?

It gives search engines an unambiguous record of your business. Google and Bing read it, and AI search features built on those engines inherit that understanding. No assistant guarantees it reads your markup directly.

Can I show review stars for my own business?

Not from reviews you publish about yourself on your own site. Google treats those as self-serving and does not show stars for LocalBusiness or Organization items, although the markup itself can still be valid.

Which LocalBusiness type should I use?

The most specific schema.org subtype that is true, such as Dentist, Plumber or RoofingContractor. Fall back to LocalBusiness or ProfessionalService if nothing fits.

What does sameAs do?

It lists URLs of your other official profiles, helping search engines and AI systems connect your website to your business listings and social accounts.

How do I test my structured data?

Use Google's Rich Results Test, the Schema Markup Validator and Search Console's enhancement reports, and run a WebAgentScan check.

Want this done for your site?

Score your site on WebAgentScan, or ask us to set up the AI Indexing Pack for you.

Get a free quote