Healthcare schema markup is structured data, usually written in JSON-LD, that tells search engines and AI systems exactly what your page describes: a dental practice, a physician, a clinic department or a reviewed medical article. Use the most specific schema.org type that fits (Dentist, MedicalClinic, Physician), fill in the name, address, phone, hours and specialty, and make sure every value matches what patients can see on the page.
Schema will not lift a weak page to the top on its own. What it does is remove guesswork: Google, ChatGPT and other systems read your practice's facts in a structured form, and some markup makes you eligible for rich results in Google.
Which schema type fits each page
| Page | schema.org type | Key properties | Google rich result |
|---|---|---|---|
| Dental practice location | Dentist | name, address, telephone, openingHoursSpecification, geo, url | Supports local business data |
| Multi-specialty or primary care clinic | MedicalClinic | as above, plus medicalSpecialty, department | Supports local business data |
| Single-doctor practice | Physician | as above, plus medicalSpecialty, usNPI, hospitalAffiliation | Supports local business data |
| Hospital | Hospital | as above, plus department, availableService | Supports local business data |
| Specialty practice (dermatology, optometry, psychiatry) | The matching MedicalBusiness subtype, e.g. Optician, Psychiatric | as above | Supports local business data |
| Condition or treatment article | MedicalWebPage | about, reviewedBy, lastReviewed, author | None specific |
| Provider bio | Physician (or Person for non-physicians) | name, medicalSpecialty, hospitalAffiliation, image | None specific |
| FAQ section | FAQPage | mainEntity of Question and Answer | Only for authoritative government and health sites |
| Every page | BreadcrumbList | itemListElement | Breadcrumb trail in results |
schema.org places Physician, Dentist and MedicalClinic under both MedicalBusiness (a kind of LocalBusiness) and MedicalOrganization (schema.org). That means they can use local business properties such as openingHoursSpecification and medical properties such as medicalSpecialty and isAcceptingNewPatients.
Mark up a dental practice
This example is a template: replace every bracketed value with your real details, exactly as shown on the page.
{
"@context": "https://schema.org",
"@type": "Dentist",
"@id": "https://www.[your-domain].com/locations/[city]/#practice",
"name": "[Practice name as on your signage]",
"url": "https://www.[your-domain].com/locations/[city]/",
"telephone": "+1-[555-555-5555]",
"image": "https://www.[your-domain].com/images/[front-entrance].jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "[123 Main St, Suite 200]",
"addressLocality": "[City]",
"addressRegion": "[State]",
"postalCode": "[ZIP]",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": "[latitude]",
"longitude": "[longitude]"
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "08:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "08:00",
"closes": "13:00"
}
],
"medicalSpecialty": "https://schema.org/Dentistry",
"isAcceptingNewPatients": true,
"sameAs": [
"[Your Google Business Profile URL]",
"[Your Healthgrades or Zocdoc profile URL]"
]
}
Notes:
- Put this on the location page, one block per location. Group practices repeat it on each location page with that location's details.
- Use
sameAsto link the profiles that describe the same practice. This helps systems connect your website to your directory listings. medicalSpecialtytakes a value from schema.org's MedicalSpecialty list, such as Dentistry, Pediatric or Dermatology.- Keep hours in sync with your Google Business Profile. Mismatched hours across sources confuse both patients and search engines.
Mark up a clinic with departments
Google lists department as a recommended property for local businesses (Google Search Central). Use it when a location has distinct units with their own hours or phone numbers, the same test Google uses for separate Business Profiles.
{
"@context": "https://schema.org",
"@type": "MedicalClinic",
"name": "[Clinic name]",
"url": "https://www.[your-domain].com/",
"telephone": "+1-[555-555-0100]",
"address": {
"@type": "PostalAddress",
"streetAddress": "[456 Health Pkwy]",
"addressLocality": "[City]",
"addressRegion": "[State]",
"postalCode": "[ZIP]",
"addressCountry": "US"
},
"medicalSpecialty": [
"https://schema.org/PrimaryCare",
"https://schema.org/Pediatric"
],
"department": [
{
"@type": "MedicalClinic",
"name": "[Clinic name] Urgent Care",
"telephone": "+1-[555-555-0101]",
"openingHours": "Mo-Su 08:00-20:00"
},
{
"@type": "DiagnosticLab",
"name": "[Clinic name] Lab Services",
"telephone": "+1-[555-555-0102]",
"openingHours": "Mo-Fr 07:00-15:00"
}
]
}
Mark up a doctor's bio page
For a provider bio, use Physician with the doctor's details. schema.org also has IndividualPhysician with a practicesAt property linking the doctor to a clinic; it currently sits in schema.org's development version (schema.org), so check validator support before relying on it.
{
"@context": "https://schema.org",
"@type": "Physician",
"name": "[Dr. First Last, MD]",
"url": "https://www.[your-domain].com/providers/[first-last]/",
"image": "https://www.[your-domain].com/images/providers/[first-last].jpg",
"medicalSpecialty": "https://schema.org/Dermatology",
"usNPI": "[10-digit NPI]",
"hospitalAffiliation": {
"@type": "Hospital",
"name": "[Hospital name]"
},
"telephone": "+1-[555-555-5555]",
"address": {
"@type": "PostalAddress",
"streetAddress": "[123 Main St]",
"addressLocality": "[City]",
"addressRegion": "[State]",
"postalCode": "[ZIP]",
"addressCountry": "US"
}
}
The usNPI property takes the 10-digit National Provider Identifier, which is public in the NPI registry. Only include facts that also appear in the visible bio.
Mark up medical articles with MedicalWebPage
For condition and treatment pages, MedicalWebPage states what the page is about and who reviewed it. schema.org defines reviewedBy as the person or organization that reviewed the content for accuracy or completeness, and lastReviewed as the date of that review (schema.org).
{
"@context": "https://schema.org",
"@type": "MedicalWebPage",
"name": "Plantar fasciitis: causes, treatment and recovery",
"url": "https://www.[your-domain].com/conditions/plantar-fasciitis/",
"about": {
"@type": "MedicalCondition",
"name": "Plantar fasciitis"
},
"medicalAudience": {
"@type": "MedicalAudience",
"audienceType": "Patient"
},
"author": {
"@type": "Person",
"name": "[Author name]"
},
"reviewedBy": {
"@type": "Physician",
"name": "[Dr. Reviewer Name, DPM]"
},
"lastReviewed": "2026-09-15",
"publisher": {
"@type": "MedicalClinic",
"name": "[Clinic name]"
}
}
Google offers no MedicalWebPage rich result. The value is consistency: the reviewer and date in the markup match the "medically reviewed by" line on the page, which is the trust signal described in healthcare SEO best practices.
FAQ and review markup: what changed
FAQ rich results
In August 2023 Google announced that FAQ "rich results will only be shown for well-known, authoritative government and health websites" (Google Search Central). Its FAQPage documentation carries the same restriction. A large hospital system might still qualify; a single clinic rarely will.
FAQPage markup remains valid schema.org and does no harm. Keep FAQ sections on service pages for patients and for AI answers, and add the markup if it is easy, without expecting the expandable result in Google.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do you accept new patients?",
"acceptedAnswer": {
"@type": "Answer",
"text": "[Your answer, matching the visible text on the page.]"
}
}
]
}
Review stars
Google's review snippet guidelines say that when "the entity that's being reviewed controls the reviews about itself," its pages using LocalBusiness or Organization markup "are ineligible for star review feature" (Google Search Central). Testimonials on your own site won't produce stars. For a clinic, stars show on the Google Business Profile, which depends on Google reviews: see healthcare reputation management.
Rules that keep markup valid
Google's structured data policies apply to every type:
- Mark up only what patients can see. "Don't mark up content that is not visible to readers of the page."
- Be accurate. Hours, address and phone must match the page and your Google Business Profile.
- Use JSON-LD. Google recommends it, and it sits in one script block that's easy to maintain.
- Don't expect a guarantee. Google says it "does not guarantee that your structured data will show up in search results."
- One entity per thing. Give each practice and location a stable
@idand reuse it, so the same clinic isn't described three different ways.
On WordPress, plugins such as Yoast SEO and Rank Math generate basic Organization and Article markup; medical types usually need a custom block or a schema plugin. See WordPress SEO plugins for medical sites.
Connect practice, providers and pages into one picture
Separate blocks on separate pages work, but they are stronger when they point at each other. The @id property gives each entity a permanent identifier (usually its URL plus a fragment such as #practice), and other blocks can reference it.
A practical pattern for a group practice:
| Entity | Lives on | @id | References |
|---|---|---|---|
| The organisation | Homepage | https://www.[your-domain].com/#org | sameAs to social and directory profiles |
| Each location | Location page | .../locations/[city]/#practice | parentOrganization pointing to #org |
| Each provider | Bio page | .../providers/[first-last]/#physician | Address of the location where they practise |
| Each article | Article page | Page URL | publisher pointing to #org, reviewedBy pointing to a #physician |
Rolling this out in order:
- Location pages first. They support Google Maps and "near me" searches, where many new-patient searches start. See Google Maps for healthcare.
- Provider bios next. They back up the "reviewed by" lines on your clinical content.
- Medical articles last, as a template change that applies to every condition and treatment page at once.
Clear, connected facts also help AI assistants that recommend local providers, because the same name, address, specialty and reviewer appear consistently. More in AI and medical SEO.
Test your markup
| Tool | What it checks | Link |
|---|---|---|
| Rank.ai schema validator | Parses JSON-LD and flags missing or invalid properties | /free-tools/schema-validator |
| Google Rich Results Test | Whether a page is eligible for Google rich results | search.google.com/test/rich-results |
| Schema Markup Validator | Validates any schema.org type, including MedicalWebPage | validator.schema.org |
| Search Console enhancements | Errors across the whole site after Google crawls it | Search Console, Enhancements section |
Run the schema validator on each template (location, provider, article) after any site change, then watch Search Console for errors. For the full technical checklist, use the technical SEO audit template.
FAQ
What is schema markup in healthcare SEO?
Schema markup is code, usually JSON-LD, that describes a page's content using the schema.org vocabulary. For healthcare it identifies practices (Dentist, MedicalClinic, Physician), providers and medical content, with details such as address, hours, specialty and medical reviewer. It helps search engines and AI systems read your facts accurately.
What schema type should a medical practice use?
Use the most specific type that fits. A dental office uses Dentist, a primary care or multi-specialty clinic uses MedicalClinic, a single-physician practice can use Physician, and specialties such as optometry or psychiatry have their own MedicalBusiness subtypes. Google's guidance is to use the most specific LocalBusiness subtype possible.
Do FAQ rich results still work for medical websites?
Only for well-known, authoritative government and health websites, under Google's August 2023 change. Most individual practices will not see FAQ rich results. FAQ markup is still valid and the content still helps patients and AI answers.
Does schema markup improve rankings?
Google does not describe structured data as a ranking factor, and it does not guarantee rich results. Schema helps Google understand your page and makes you eligible for features such as breadcrumbs and local business details. Its main value for clinics is accurate, machine-readable facts across search and AI systems.
Is MedicalWebPage schema worth adding?
It produces no Google rich result, but it states what the page is about, who reviewed it and when, in a form machines can read. If your pages already show a medical reviewer and review date, the markup takes a few minutes per template. Keep the markup and the visible byline in sync.



