Skip to content
SectionSchema and entity data
Reviewed2026-08-01
Words1,351
Sources5
Schema and entity data

JSON-LD for clinics: a working reference

Complete, valid JSON-LD blocks for the page types a clinic website actually has, with notes on what each property asserts.

Short answer

A clinic site needs six structured data blocks: an organisation block with a stable identifier, a location block per site, a MedicalWebPage block per clinical page, a Physician block per practitioner, FAQPage where questions are visible, and BreadcrumbList for hierarchy. Every property must match the visible page, and every URL must be one you stand behind.

This is a reference page rather than an argument. Each block below is valid JSON-LD, uses types defined at Schema.org, and is written the way it should appear on a clinic site. Replace the example values, delete any property you cannot state truthfully, and check the result against the visible page before publishing.

One rule governs everything here: the markup describes the page. Google's general structured data guidelines require it, and beyond compliance it is the only version that is useful, because markup that disagrees with the page is a contradiction you published about yourself.

The organisation block

Publish this once, ideally on the homepage, with a stable @id that every other block references. This prevents forty independent copies of your organisation details drifting apart.

Organisation, published once with a stable identifierValid JSON-LD
{
  "@context": "https://schema.org",
  "@type": "MedicalClinic",
  "@id": "https://example.co.uk/#clinic",
  "name": "Example Clinic",
  "legalName": "Example Clinic Limited",
  "url": "https://example.co.uk/",
  "logo": "https://example.co.uk/logo.png",
  "telephone": "+44 20 7946 0000",
  "email": "hello@example.co.uk",
  "foundingDate": "2014",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "12 Example Street",
    "addressLocality": "London",
    "postalCode": "W1A 1AA",
    "addressCountry": "GB"
  },
  "medicalSpecialty": "Dermatology",
  "sameAs": [
    "https://www.cqc.org.uk/location/REPLACE_ID",
    "https://www.linkedin.com/company/example-clinic"
  ]
}

Notes. legalName should match Companies House if you use one. Every sameAs URL should be a record you maintain and that agrees with these details. Delete medicalSpecialty if it does not describe the clinic accurately.

A location block per site

Each physical site gets its own block on its own location page, connected to the parent organisation. Google documents the local business properties it reads.

A single location, connected to its parent organisationValid JSON-LD
{
  "@context": "https://schema.org",
  "@type": "MedicalClinic",
  "@id": "https://example.co.uk/locations/manchester#clinic",
  "name": "Example Clinic, Manchester",
  "parentOrganization": {
    "@id": "https://example.co.uk/#clinic"
  },
  "url": "https://example.co.uk/locations/manchester",
  "telephone": "+44 161 496 0000",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "4 Sample Road",
    "addressLocality": "Manchester",
    "postalCode": "M1 1AA",
    "addressCountry": "GB"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 53.4795,
    "longitude": -2.2452
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday"
      ],
      "opens": "09:00",
      "closes": "18:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "09:00",
      "closes": "13:00"
    }
  ],
  "hasMap": "https://www.google.com/maps/place/?q=place_id:REPLACE_PLACE_ID",
  "isAcceptingNewPatients": true
}

Notes. Coordinates disambiguate a location in dense areas. parentOrganization states the group relationship explicitly. The branchCode is optional and useful only if you use internal site codes consistently elsewhere.

A clinical page block

Treatment and condition pages are clinical content, and MedicalWebPage is the accurate type.

A clinical pageValid JSON-LD
{
  "@context": "https://schema.org",
  "@type": "MedicalWebPage",
  "@id": "https://example.co.uk/treatments/rosacea#page",
  "url": "https://example.co.uk/treatments/rosacea",
  "name": "Rosacea treatment: assessment, options and what to expect",
  "description": "How rosacea is assessed, the treatment options available and what recovery involves.",
  "inLanguage": "en-GB",
  "datePublished": "2026-01-18",
  "dateModified": "2026-07-22",
  "lastReviewed": "2026-07-22",
  "about": {
    "@type": "MedicalCondition",
    "name": "Rosacea"
  },
  "medicalAudience": {
    "@type": "MedicalAudience",
    "audienceType": "Patient"
  },
  "specialty": "https://schema.org/Dermatologic",
  "publisher": {
    "@id": "https://example.co.uk/#clinic"
  },
  "reviewedBy": {
    "@id": "https://example.co.uk/team/dr-example#person"
  }
}

Notes. lastReviewed and reviewedBy should only be present if a named clinician genuinely reviewed the page on that date. Both are verifiable claims about a real person.

A practitioner block

Practitioners are separate entities. Publish only what appears on a public register or that you can otherwise evidence.

A practitionerValid JSON-LD
{
  "@context": "https://schema.org",
  "@type": "Physician",
  "@id": "https://example.co.uk/team/dr-example#person",
  "name": "Dr Example Surname",
  "url": "https://example.co.uk/team/dr-example",
  "jobTitle": "Consultant Dermatologist",
  "medicalSpecialty": "https://schema.org/Dermatologic",
  "worksFor": {
    "@id": "https://example.co.uk/#clinic"
  },
  "identifier": {
    "@type": "PropertyValue",
    "propertyID": "GMC reference number",
    "value": "0000000"
  },
  "alumniOf": {
    "@type": "CollegeOrUniversity",
    "name": "University of Example"
  },
  "sameAs": [
    "https://www.gmc-uk.org/doctors/REPLACE_REFERENCE"
  ]
}

Notes. Link sameAs to the register entry where the register publishes stable URLs. Registration numbers are already public on the relevant register, and publishing them makes your claims checkable.

FAQ markup, where questions are visible

FAQPage markup is only permitted where the questions and answers appear on the page for users. Google's FAQ documentation sets the conditions, and eligibility for display has been narrowed over time, so treat this as clarification of page structure rather than as a display technique.

FAQPage, only where the questions are visible on the pageValid JSON-LD
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How long does a consultation take?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A first consultation is 30 minutes and includes an assessment, a discussion of options and a written treatment plan."
      }
    },
    {
      "@type": "Question",
      "name": "Do I need a referral?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No referral is required for a private consultation. If a GP letter exists, bringing it helps but is not necessary."
      }
    }
  ]
}

Breadcrumbs

Cheap, useful and often missing. It states hierarchy explicitly and can change how the URL is presented in results.

BreadcrumbListValid JSON-LD
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://example.co.uk/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Treatments",
      "item": "https://example.co.uk/treatments"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Rosacea",
      "item": "https://example.co.uk/treatments/rosacea"
    }
  ]
}
SURFACE 08

Your own website

HIGH CONTROL
What controls it
  • Every byte a crawler receives, and the speed it arrives at
  • The entity claims: name, address, identifiers, sameAs, service list
  • Canonical URLs, hreflang if used, and the internal link graph
  • Whether the page answers the question it was built to answer
What does not
  • How the answer is displayed once it leaves your server
  • Whether a third party republishes an outdated version of your facts
How to test it
  • Crawl the whole site and compare the URL list against the sitemap
  • Validate every JSON-LD block against the Rich Results Test
  • Measure field data, not only lab scores, for Core Web Vitals

Assembling the graph

Rather than publishing several disconnected script blocks, put related items in a single @graph and reference shared entities by @id. The JSON-LD specification defines the mechanics, and the practical benefit is that your organisation is declared once and referenced everywhere, which is exactly the entity consolidation you are trying to express.

Properties to leave out

  • aggregateRating unless the reviews are genuinely about the entity and shown on the page in a way the guidelines permit.
  • priceRange if you would not commit to it in writing to a patient.
  • award for anything self-declared or bought.
  • Any sameAs URL you do not control or actively maintain.
  • Any property whose value you cannot check today.

Checking before publishing

  1. Parse the JSON. A trailing comma removes the entire block silently.
  2. Run the page through the Rich Results Test and the Schema Markup Validator.
  3. Read the block as a set of sentences and confirm each is true.
  4. Compare each value against the Business Profile and the canonical facts document.
  5. Recheck after any theme or plugin update, since these frequently inject a second, conflicting block.

Two blocks describing the same page differently is a common and avoidable state, and it is invisible unless someone looks at the source.

No commercial links on this page

This article contains no affiliate links, no sponsored placements and no links to any agency, supplier, clinic or commercial brand. Nobody paid for it, nobody previewed it and no directory advertiser had sight of it. This publication does not rank or recommend agencies anywhere on the site.

Nothing here is medical or legal advice. Regulatory material summarises published guidance. Read the source before relying on it. Our full position is in the editorial standards.

Sources

Primary documentation and regulators only. We do not cite opinion surveys as though they were measurements of a system.

Frequently asked questions

Where should the JSON-LD go on the page?

Inside a script tag with type application/ld+json, anywhere in the document. Placement does not affect parsing. What matters is that it is present in the server response rather than injected later by JavaScript.

Can I use LocalBusiness instead of MedicalClinic?

MedicalClinic is a more specific subtype and is more accurate for a clinic providing medical services. Use the most specific type that is true. If the business is not providing medical services, do not claim a medical type.

Does FAQ markup still produce rich results?

Eligibility for display has been narrowed over time and varies. Use it because it accurately describes a page that genuinely contains questions and answers, not because of an expected display treatment.

Should every page repeat the organisation block?

No. Publish it once with a stable identifier and reference that identifier from other blocks. Repeating it invites drift between copies.

What breaks structured data most often?

A syntax error that removes the block silently, a plugin injecting a second conflicting block, and values that were true when written and are no longer true. Check all three after any site change.

The surfaces move. We write when they do.

A short briefing on documented changes to the surfaces clinics are discovered on. One labelled sponsor slot per issue, no rankings, no invented numbers.