# Nearly a third of the type names on the web are not real The Web Almanac's 2025 crawl found 682 distinct Schema.org type strings in the wild. 209 of them, 30.65%, are not real types at all, and where the real markup sits, home page or secondary page, differs by type. > Source: https://eduarddziak.com/structured-data/broken-markup/ > Crawl snapshot: 1 July 2025 > Built: 19 August 2026 > Data: /data/schema-stats.json and /data/schema-stats.csv > Licence: Apache 2.0, credit requested ## Summary | Measure | Value | | --- | --- | | Distinct type strings in the crawl | 682 | | Real Schema.org types | 473 | | Broken markup | 209 | | Share broken | 30.65% | | Crawl snapshot | 1 July 2025 | ## Why the type names are broken I grouped the 209 broken strings into five reasons, and one dominates the rest. 98 of them start with a lower-case letter, such as localBusiness instead of LocalBusiness. Schema.org always capitalises a type name, so a lower-case initial is never a real one. It usually comes from a field name or a code sample copied straight into the markup. 63 more use words that sound plausible but do not exist in the vocabulary at all. 29 are URL-encoded text that should never have reached the page as a type name. Sixteen distinct types account for a further 17 broken strings between them, a single letter out of place in each. BreadCrumbList written for BreadcrumbList is one of them. The last two are the literal placeholder -UnknownType-, written by whatever software produced the markup rather than by a person. If you are checking your own markup, start with capitalisation. A type name that begins with a lower-case letter is wrong every time, and a validator catches it in seconds. None of this means Schema.org's vocabulary is fragile or hard to use correctly. Every one of the 473 real types parses exactly as Schema.org defines it, and the mistakes above come from how markup gets written, not from anything ambiguous in the vocabulary itself. | Reason | Count | | --- | --- | | Lower-case initial, so not a type name | 98 | | Not a Schema.org type | 63 | | URL-encoded text | 29 | | Casing errors, 16 distinct types | 17 | | Placeholder such as -UnknownType- | 2 | ## Every reason, ungrouped The five reasons above, grouped from this same field. Every one of the sixteen casing errors is its own row here. | Reason | Count | | --- | --- | | Lower-case initial, so not a type name | 98 | | Not a Schema.org type | 63 | | URL-encoded text | 29 | | Casing error for BreadcrumbList | 2 | | Placeholder such as -UnknownType- | 2 | | Casing error for AutoDealer | 1 | | Casing error for BlogPosting | 1 | | Casing error for BookStore | 1 | | Casing error for Campground | 1 | | Casing error for ContactPoint | 1 | | Casing error for CreativeWork | 1 | | Casing error for FAQPage | 1 | | Casing error for ItemList | 1 | | Casing error for ListItem | 1 | | Casing error for LocalBusiness | 1 | | Casing error for PostalAddress | 1 | | Casing error for ProfessionalService | 1 | | Casing error for WebPage | 1 | | Casing error for WebSite | 1 | | Casing error for WPSideBar | 1 | ## The most common types on mobile home pages On the mobile home page, WebSite leads every other type, written into the markup of over five million origins the Almanac crawled. SearchAction and Organization follow close behind, both past four million. Most of the top twelve are the machinery search engines use to read a page, ListItem, BreadcrumbList and ImageObject among them, rather than content types such as Recipe or Product. Not every real type reaches this chart. 41 of the 473 real types have no mobile home page figure in the crawl at all, and 81 in total are missing at least one of the four slices, usually because a type shows up on other kinds of page and never on a home page in this particular crawl. A type missing this slice is left out of the chart rather than drawn as a bar with nothing in it, because a missing measurement is not the same thing as a measured zero. Only 392 of the 473 types carry a figure for all four slices, and today's top twelve all happen to be among them, which will not always stay true. | Type | Mobile home page sites | Slices with a figure | | --- | --- | --- | | WebSite | 5,555,415 | 4 of 4 | | SearchAction | 4,254,491 | 4 of 4 | | Organization | 4,037,905 | 4 of 4 | | WebPage | 3,932,047 | 4 of 4 | | ListItem | 3,238,336 | 4 of 4 | | BreadcrumbList | 3,199,010 | 4 of 4 | | ImageObject | 3,196,580 | 4 of 4 | | EntryPoint | 2,547,096 | 4 of 4 | | ReadAction | 2,117,788 | 4 of 4 | | PropertyValueSpecification | 1,735,971 | 4 of 4 | | PostalAddress | 1,318,695 | 4 of 4 | | SiteNavigationElement | 1,056,258 | 4 of 4 | ## Where markup belongs, home page or secondary page The Web Almanac splits every count four ways, by device, mobile or desktop, and by page position, a home page or a secondary page you click through to. Comparing across those four slices in one chart would mean a bar for every type on every slice, and 81 of the 473 real types are missing at least one slice entirely. A bar chart has no way to draw an unknown value, so I built this comparison as a table instead. A blank cell below means the Almanac has no figure for that slice. It never means the count is zero. BlogPosting is the one type here that runs the other way. It appears 3.40 times more often on a secondary page than on a home page, which fits a blog, because most posts live on their own page rather than on the front one. LocalBusiness, PostalAddress, OpeningHoursSpecification and ContactPoint all skew towards the home page instead, and together they describe the same thing, a business's address, its hours and how to contact it, published where a visitor lands first. Together they form the profile of a local business, and that is exactly why this finding feeds the industry pages rather than duplicating them. | Type | Mobile home page | Desktop home page | Mobile secondary page | Desktop secondary page | Secondary / home, mobile | | --- | --- | --- | --- | --- | --- | | BlogPosting | 149,392 | 141,010 | 508,509 | 338,042 | 3.40 | | LocalBusiness | 768,451 | 617,024 | 407,852 | 348,935 | 0.53 | | PostalAddress | 1,318,695 | 1,041,266 | 790,502 | 667,999 | 0.60 | | OpeningHoursSpecification | 286,042 | 230,140 | 172,743 | 149,077 | 0.60 | | ContactPoint | 429,492 | 366,903 | 242,855 | 219,428 | 0.57 | ## Markup that is not Schema.org at all Not everything the crawl found as a type name comes from Schema.org at all. 282 rows across the crawl's four slices name a host from an entirely different vocabulary, most of them ones search engines stopped reading years ago. This number is not part of the 682 type strings above, and I never add it to them, because it counts something different, a row in the crawl rather than a distinct name. no-context.com/ accounts for 135 of the 282 rows on its own, more than any other host, usually markup a plugin generated without ever naming a real vocabulary. data-vocabulary.org/ follows with 61, a format Google stopped supporting years ago, and schema.googleapis.com/, an address that was never meant to appear in a page's own markup at all, accounts for a further 38. The rest is a long tail of single-figure hosts, typos and mirrors of the real Schema.org address. 282 rows in total, across the fifteen hosts below. | Host | Rows across the four crawl slices | | --- | --- | | no-context.com/ | 135 | | data-vocabulary.org/ | 61 | | schema.googleapis.com/ | 38 | | adplogger.no/ | 10 | | schema.contao.org/ | 10 | | cewe.de/ | 4 | | microformats.org/ | 4 | | schemas.org/ | 4 | | scheme.org/ | 4 | | ziyuan.baidu.com/ | 4 | | ma.org/ | 2 | | shema.org/ | 2 | | zhanzhang.baidu.com/ | 2 | | obrnadzor.gov.ru/ | 1 | | rdf.data-vocabulary.org/ | 1 | ## How this is measured I read the Web Almanac's 2025 SEO chapter results, a crawl of about 15.4 million mobile origins and 12.2 million desktop ones, each with its home page and one secondary page. Every type string it recorded came from the @type or itemtype attribute on that page's own structured data, whatever the site actually shipped. I filtered every one of those strings against a pinned copy of the real Schema.org vocabulary before counting anything, which is what tells a real type from a broken one. I never combine the four crawl slices into one total anywhere on this page. A type that appears on both a mobile home page and a desktop home page is a real thing happening on two different visits, not the same visit counted twice, but adding the slices together would blur that difference into a single misleading number. Each figure stays inside the one slice it was measured on. Every count on this page is exact for the Almanac's own crawl, not an estimate. What it cannot tell you is how many websites exist outside that crawl, or what any of these type strings looked like a year earlier or a year later. The Web Almanac measures a large sample once a year, and you are reading the July 2025 sample rather than a running total. Analysis © Eduard Dziak, licensed under the Apache License 2.0. Please credit eduarddziak.com with a link. Source data: Google and the Schema.org community, Schema.org usage statistics dataset. Rich result requirements: Google Search Central, licensed CC BY 4.0. Term descriptions: Schema.org, licensed CC BY-SA 3.0, each term linking to its own page. Crawl counts: HTTP Archive Web Almanac, licensed Apache License 2.0.