Invalid Schema Types: Fixing schema.org Types in JSON-LD
An invalid type finding means a JSON-LD block uses an @type value that schema.org does not define. It might be a misspelling such as LocalBussiness, a name that sounds plausible but does not exist such as BlogPost, the British spelling Organisation, the wrong capitalisation, or a data type like Text where an entity belongs.
The JSON parses perfectly, so nothing looks broken, yet search engines cannot map the unknown name to anything and the entity is largely ignored. This guide shows how to spot each bad type, find the real term, and correct it where it is generated.
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:
| Situation | Example | Is 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
page | No. 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 as | Why it fails | Use instead |
|---|---|---|
BlogPost, Blog Post | Invented name; the real type ends in -ing | BlogPosting |
Organisation | British spelling; schema.org uses US spelling throughout | Organization |
LocalBussiness, Localbusiness, localBusiness | Typo or wrong capitals; names are case-sensitive | LocalBusiness |
Webpage, Website | Missing the capital in the middle | WebPage,
WebSite |
FAQ, Faq, FAQs | Abbreviation, not a type | FAQPage,
with Question and Answer inside |
Breadcrumb, Breadcrumbs | Not a type | BreadcrumbList
with ListItem entries |
Company, Business | Everyday words, not schema.org terms | Organization,
Corporation or a LocalBusiness subtype |
Hairdresser, Shop | Plausible but absent | HairSalon,
Store or a more specific store type |
Author, Reviewer | These are properties or roles, not types | Person
or Organization |
Address | Not a type | PostalAddress |
Video, Image | Media types end in -Object | VideoObject,
ImageObject |
GeoCoordinate, OpeningHours | Near misses of real names | GeoCoordinates,
OpeningHoursSpecification |
Text, URL, Number | Data types for values, not entity types | Remove the object and give the plain value |
article, website (lower case) | Copied from Open Graph og:type
values | Article, WebSite |
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:
- Hand-written blocks pasted into a page builder, a header snippet or a Custom HTML block. One typo is enough, and nobody re-reads the block after it goes live.
- Old tutorials and forum answers. Some examples online have always been wrong, and
some use terms that schema.org has since marked as superseded, such as the
reviewsproperty that was replaced byreview. - Free-text fields fed into
@type. A theme option labelled "Business type" lets the site owner write "Dental Practice", and the template drops that straight into the markup.Dentistis the real type; "Dental Practice" is not. - Translation and localisation. Multilingual plugins sometimes translate every string
in a template, including the type names.
Organizaciónis not a schema.org type in any language. - Prefixes that need a context.
"@type": "schema:Product"only works if the@contextdefines theschemaprefix. With the usual"@context": "https://schema.org"it produces an unknown type. - A missing at sign. Writing
"type": "Product"creates an ordinary property calledtypethat schema.org does not define, and the entity ends up with no type at all.
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:
- Look at the breadcrumb on the type's page. It shows where the type sits, for example Thing, Organization, LocalBusiness, FoodEstablishment, Bakery. That tells you which properties it inherits and whether a more specific type exists below it.
- Watch for pending and retired terms. schema.org marks some types as pending, meaning they are proposals still under discussion, and some as superseded. Pending types are valid in the vocabulary but widely ignored by consumers; superseded ones should be replaced with the term the page points you to.
- Test in the Schema Markup Validator. It reads any schema.org markup, not just Google features, and shows each detected entity with its type. An entity that comes up with a strange type or no recognised properties usually has a bad name.
- Do not rely on the Rich Results Test alone. It lists only the types Google has rich results for. An invalid type simply does not appear, which is easy to mistake for "no problem found".
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:
| Property | Expected type of the nested object | Frequent mistake |
|---|---|---|
address | PostalAddress | Address, Place |
geo | GeoCoordinates | GeoCoordinate, Location |
author | Person or Organization | Author,
Writer |
offers | Offer or AggregateOffer | Price,
Offers |
aggregateRating | AggregateRating | Rating, Ratings |
openingHoursSpecification | OpeningHoursSpecification | OpeningHours |
itemListElement in breadcrumbs | ListItem | Breadcrumb,
Link |
brand | Brand or Organization | Manufacturer |
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
- Never let free text become a type. Any CMS field, theme option or spreadsheet column
that feeds
@typeshould be a fixed list of valid schema.org names. - Keep a short allow-list. Most sites use fewer than twenty types. Write them down with the exact spelling and have developers copy from that list rather than typing names from memory.
- Exclude markup from translation. In multilingual plugins, mark JSON-LD templates or type strings as not translatable, so only the human-readable values change between languages.
- Add a build check. A small script in your deployment can parse each JSON-LD block
and compare every
@typeagainst the allow-list, failing the build on anything unknown. - Recheck after schema.org releases. Terms are occasionally superseded. A quick look at the release notes a couple of times a year catches anything your site still uses.
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.
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.
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 →