/ ← JSON-LD Fixes / Invalid Types
In this guide
  1. What an invalid type finding means
  2. The invalid types that turn up most
  3. Where invalid types come from
  4. Checking a type name properly
  5. Types inside nested objects
  6. The fix, step by step
  7. Edge cases: arrays, pending terms and extensions
  8. Stopping invalid types coming back
  9. Questions and answers

What an invalid type finding means

Every entity in JSON-LD carries an @type. The value is a name from the schema.org vocabulary, and it is the single most important word in the block: it tells a parser which properties to expect and which search features the entity could qualify for. schema.org type names are exact identifiers, not descriptions. Product is a type; Products, product and Product Page are not.

When a name does not match a defined term, a JSON-LD processor still builds a node, but the node has a type nobody recognises. Google's systems have no feature for it, other consumers have no definition for it, and the properties hanging off it lose their context. The practical effect is close to having no markup at all for that entity, with the added cost that the block still looks finished to anyone reading the source.

It helps to separate three situations that often get mixed up:

SituationExampleIs it an invalid type?
The name does not exist in schema.org"@type": "BlogPost"Yes. This guide covers it.
The name exists but describes the wrong thing"@type": "Article" on a product pageNo. The type is real but badly chosen; see choosing the right schema type.
The name exists but Google has no rich result for it"@type": "Bakery"No. It is valid and still helps machines understand the page, even without a special search display.

The JSON Checker checks each type against schema.org, so its finding is about the first row: a word that is not in the vocabulary at all.

The invalid types that turn up most

Most invalid types fall into a handful of patterns. Once you know them you can usually spot the problem by eye before looking anything up.

Written asWhy it failsUse instead
BlogPost, Blog PostInvented name; the real type ends in -ingBlogPosting
OrganisationBritish spelling; schema.org uses US spelling throughoutOrganization
LocalBussiness, Localbusiness, localBusinessTypo or wrong capitals; names are case-sensitiveLocalBusiness
Webpage, WebsiteMissing the capital in the middleWebPage, WebSite
FAQ, Faq, FAQsAbbreviation, not a typeFAQPage, with Question and Answer inside
Breadcrumb, BreadcrumbsNot a typeBreadcrumbList with ListItem entries
Company, BusinessEveryday words, not schema.org termsOrganization, Corporation or a LocalBusiness subtype
Hairdresser, ShopPlausible but absentHairSalon, Store or a more specific store type
Author, ReviewerThese are properties or roles, not typesPerson or Organization
AddressNot a typePostalAddress
Video, ImageMedia types end in -ObjectVideoObject, ImageObject
GeoCoordinate, OpeningHoursNear misses of real namesGeoCoordinates, OpeningHoursSpecification
Text, URL, NumberData types for values, not entity typesRemove the object and give the plain value
article, website (lower case)Copied from Open Graph og:type valuesArticle, WebSite
💡 UK sites hit the Organisation problem constantly because spellcheckers and house style both push towards it. Type names and property names are identifiers, so they keep the US spelling even on a British site. Only the values you write, such as your description, follow your own spelling.

Where invalid types come from

Plugins that offer a drop-down list of types almost never produce a misspelt type. The problem tends to come from places where a person typed the name or where a template builds it from other data:

The full address of a type, such as "@type": "https://schema.org/Product", is valid JSON-LD and resolves to the same term. It is unusual and harder to read, so most sites stick to the short name, but it is not an error.

Checking a type name properly

The authoritative list is schema.org itself. The full hierarchy page at schema.org/docs/full.html lists every current type in a tree starting from Thing, and each type has its own page at schema.org/ followed by the exact name. When you check a type, compare it character by character with the heading on that type's page. Capital letters in the middle of a name, such as the P in WebPage or the B in LocalBusiness, are part of the identifier.

A few habits make the check quicker and more reliable:

Types inside nested objects

Invalid types are not only a top-level problem. Every nested object that has its own @type needs a real name too, and it should be a type the parent property expects. These are the pairings the checker most often sees go wrong:

PropertyExpected type of the nested objectFrequent mistake
addressPostalAddressAddress, Place
geoGeoCoordinatesGeoCoordinate, Location
authorPerson or OrganizationAuthor, Writer
offersOffer or AggregateOfferPrice, Offers
aggregateRatingAggregateRatingRating, Ratings
openingHoursSpecificationOpeningHoursSpecificationOpeningHours
itemListElement in breadcrumbsListItemBreadcrumb, Link
brandBrand or OrganizationManufacturer

Here is a LocalBusiness block with four invalid types, followed by the corrected version.

{
  "@context": "https://schema.org",
  "@type": "Hairdresser",
  "name": "Larkspur Hair Studio",
  "address": {
    "@type": "Address",
    "streetAddress": "14 Mill Lane",
    "addressLocality": "Matlock",
    "postalCode": "DE4 3AA",
    "addressCountry": "GB"
  },
  "geo": { "@type": "GeoCoordinate", "latitude": 53.138, "longitude": -1.556 },
  "parentOrganization": { "@type": "Organisation", "name": "Larkspur Group" }
}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "HairSalon",
  "name": "Larkspur Hair Studio",
  "url": "https://www.example.co.uk/",
  "telephone": "+44 1629 000000",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "14 Mill Lane",
    "addressLocality": "Matlock",
    "postalCode": "DE4 3AA",
    "addressCountry": "GB"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": 53.138, "longitude": -1.556 },
  "parentOrganization": { "@type": "Organization", "name": "Larkspur Group" }
}
</script>

The first block parses without complaint, which is exactly why it survives unnoticed. Only a check against the vocabulary reveals that the business, its address, its coordinates and its parent company all have types that do not exist.

The fix, step by step

Step 1

List every @type value on the page

Run the page through the JSON Checker, or open the source and search for @type, and write down every value you find, including those inside nested objects such as addresses, offers, ratings and authors. Also search for a bare "type" without the at sign, and for any prefixed names such as schema:Product. Do this on one page from each template, because a type error in a template repeats on every page built from it.

Step 2

Check each name against schema.org

Open schema.org/docs/full.html or the individual type page for each value and compare the spelling exactly, including capital letters in the middle of the name. Mark each one as valid, misspelt, invented, superseded or pending. Pay particular attention to British spellings, plurals, lower-case versions copied from Open Graph tags, and data type names such as Text or URL that have been used where an entity type should be.

Step 3

Replace invented names with the nearest real type

For a typo, correct the spelling. For an invented name, browse the hierarchy from the closest real parent and choose the most specific existing type that is true of the thing, such as HairSalon rather than a made-up Hairdresser, or BlogPosting rather than BlogPost. If nothing specific fits, the parent type is a perfectly good answer. A real general type is always better than a precise-sounding name that does not exist.

Step 4

Correct the types of nested objects

Go through each property that holds an object and check that the nested @type is both real and one the property expects: PostalAddress under address, GeoCoordinates under geo, Offer under offers, Person or Organization under author. The expected types are listed on each property's schema.org page. Where a nested object only wraps a single plain value, such as a URL, replace the object with the value itself.

Step 5

Move extra meaning into properties or additionalType

If the invented name was carrying information you want to keep, such as "Vegan Bakery" or "Emergency Plumber", put that detail where schema.org has room for it. Use the real type, then describe the specialism in description, knowsAbout or servesCuisine, or add an additionalType holding the address of a matching concept in an external vocabulary. Never keep the invented name alongside the real one in a type array, because the fake term is still invalid.

Step 6

Fix the source and retest each template

Make the change where the markup is produced: the theme file, the plugin setting, the snippet manager or the component that builds the block. If a free-text field feeds the type, replace it with a fixed list of valid names. Clear any page cache, then re-run the JSON Checker on each template and confirm in the Schema Markup Validator that every entity now shows a recognised type with its properties attached.

Edge cases: arrays, pending terms and extensions

More than one type on an entity

JSON-LD allows @type to be an array, and schema.org permits an entity to belong to several types. A shop page for a printed book can reasonably be ["Book", "Product"], because it is both. Every name in the array must be valid, though, and adding a parent alongside its own child adds nothing: ["Organization", "LocalBusiness"] says the same as LocalBusiness alone, because every LocalBusiness is already an Organization.

Pending types

Terms in schema.org's pending area are real proposals with their own pages, so they are not invalid in the strict sense. They can change or be withdrawn, and search engines generally do not act on them unless their own documentation says they do. If you use one, pair it with a stable type where possible and check the term again when schema.org publishes a new release.

Custom or extension vocabularies

You can technically add terms from other vocabularies by defining them in @context. That is valid JSON-LD, but most consumers of schema.org markup will ignore anything outside schema.org, and a mistake in a custom context can break how the rest of the block is read. For ordinary websites, stay within schema.org and use additionalType for anything extra.

Types that sound too broad

Thing and CreativeWork are valid, so they will not trigger an invalid type finding. They are rarely the best choice, and a page marked up only as Thing tells a machine almost nothing. Treat them as a sign the type was never properly chosen rather than as an error.

Stopping invalid types coming back

For the other JSON-LD findings, start at JSON-LD Fixes. If the checker also reports missing fields once the types are corrected, that is normal: a real type brings its own requirements, which the JSON-LD Schema Guide explains.

Questions and answers

1. Is BlogPost a valid schema.org type?

No. There is no BlogPost type in schema.org. The correct name is BlogPosting, which is a subtype of SocialMediaPosting and ultimately of Article, so it inherits headline, author, datePublished and the other article properties. BlogPost appears in many older tutorials and hand-written templates, which is why it is one of the most common invalid types we see. Changing the name to BlogPosting is usually the only edit needed, as the properties are normally already correct.

2. Should a UK website write Organisation or Organization?

Always Organization, with a z. schema.org type and property names are fixed identifiers written in US English, and they are case-sensitive, so the British spelling produces a type that does not exist. The same applies to property names such as organizer rather than organiser. Your own values, such as the business description, can and should use UK spelling. It is only the vocabulary terms, the words on the left of each colon and the type names, that must match schema.org exactly.

3. Does capitalisation matter in @type?

Yes. schema.org names are case-sensitive, so LocalBusiness, Localbusiness and localbusiness are three different strings and only the first is a type. The same goes for WebPage and WebSite, where the capital in the middle is easy to miss. Some tools are forgiving and some are not, so do not assume a lower-case name will be understood. Copy the exact spelling from the type page on schema.org rather than typing it from memory.

4. Why does the Rich Results Test not show my invalid type as an error?

The Rich Results Test only reports on the structured data types Google uses for rich results. If a type name is not one of them, including names that do not exist at all, the test has nothing to report and the entity simply does not appear in its list. That silence is easy to misread as a pass. Use the JSON Checker or the Schema Markup Validator, which check markup against the whole vocabulary, to see invalid types.

5. What should I do if no schema.org type describes my business exactly?

Choose the most specific real type that is still true, even if it is quite general, and describe the specialism in properties. A pottery studio might use LocalBusiness, or Store if it mainly sells, with a description, knowsAbout and makesOffer covering the details. You can also add additionalType pointing to a concept in an external vocabulary. Do not invent a type name, because an unknown type is worth less than a correct general one.

6. Can I give an entity two types?

Yes. JSON-LD lets @type hold an array, such as Book and Product for a book sold in an online shop, and schema.org allows an entity to be several things at once. Every name in the array must be a valid type, and each should be genuinely true of the thing. Listing a parent with its own child, such as Organization with LocalBusiness, is harmless but redundant, because the child type already includes everything the parent means.

7. Will fixing an invalid type improve my rankings?

Google has said that structured data is not a general ranking factor, so correcting a type name will not move a page up on its own. What it does is make the entity understandable again, which is a precondition for any rich result the type supports and for other systems that read schema.org markup. For a local business or article, the correction can be the difference between markup that is used and markup that is quietly discarded.

Check every type on your page

The JSON Checker parses every JSON-LD block on your page, checks each type against schema.org, verifies required fields, detects conflicting types and tests the result against Google rich result criteria.

Open JSON-LD Fixes →
💬 Got a problem?
Related Guides: All JSON-LD Fixes  ·  JSON-LD Schema Guide  ·  Choosing the Right Schema Type  ·  Fixing Dangling References  ·  Learning Hub

About aiwebpageseo

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.