BlogFindings

Structured data: 313 of 615 home pages gave no schema node an @id, and 14 reused one for two things

Lantad asked all 1,419 hostnames in this repository's committed corpus for robots.txt on 26 September 2026, then read the home page of every host that allowed it with no JavaScript executed. 1,081 answered HTTP 200 with HTML and 615 of them carried at least one JSON-LD block that parsed. 313 of those 615 put an @id on no node at all, 545 described more than one typed thing, and 193 of the 545 joined two of those things with an @id reference that resolved on the page.

23 min read Lantad

This run counted what sites do with it. Lantad requested /robots.txt from all 1,419 hostnames in this repository's two committed corpus seed files on 26 September 2026, evaluated the site root against its own crawler token before asking for anything else, then requested the home page of every host that allowed it and parsed the raw bytes with no JavaScript executed. 1,081 answered HTTP 200 with an HTML content type. The question is not how many sites have markup. It is whether the markup on one page describes one connected set of things or a pile of unconnected fragments, because a non-rendering AI crawler reading that page once gets whatever the identifiers say and nothing else.

In short

  • Lantad read 1,081 home pages on 26 September 2026 and found 622 carrying at least one JSON-LD script block, 615 of them holding at least one block that parsed as JSON. 313 of those 615 carried no @id on any node and 302 carried at least one, across 2,767 @id values of which 1,562 were distinct.
  • Structured data on 545 of those 615 home pages described more than one typed thing. 193 of the 545 joined two of those things with an @id reference that resolved on the same page, 311 stated the relation only by nesting one node inside another node's property, and 41 carried typed nodes with nothing joining them at all.
  • Google's structured data general guidelines, carrying Last updated 2026-07-10 UTC, tell publishers to use @id in both items when two blocks on one page belong together, and state that if you did not link the items together Google Search may not know that it can show the video as a Recipe rich result.
  • 14 of the 615 pages gave one @id to two or more node objects that disagree. On visitbritain.org the single URL https://www.visitbritain.org/ is the @id of a GovernmentOrganization, a WebPage, a WebSite and two Organization nodes; on confluent.io one Wikidata URL is the @id of a Thing named Apache Kafka and a Thing named Stream processing.
  • The pattern follows the publishing platform rather than the size of the organisation. All 34 WordPress home pages carrying parseable JSON-LD on 26 September 2026 declared an @id and 33 of them used @graph, against 4 of 53 Wix and Squarespace pages and 5 of 23 Shopify pages carrying any @id at all.
StageCountWhat happened
Hostnames asked1,419The committed corpus, an editorial frame rather than a random draw
robots.txt never returned a status30No home page was requested for these in this run
Disallowed LantadBot at the root6412 by an explicit rule, 52 because robots.txt answered 5xx, which this parser treats as disallow
Home pages requested1,325Every host whose robots.txt allowed the root
Did not answer 200 with HTML244217 answered 403, 7 answered 429, 4 answered 404, 4 answered 503, 3 failed before a status arrived, 9 returned another status and 1 returned a non-HTML body
Home pages read1,081The denominator for the two presence figures below
Carried at least one JSON-LD block622459 carried none at all
At least one block parsed as JSON615The denominator for every identifier figure in this post
Carried an @id on any node302313 of the 615 carried none
One GET of https://<host>/robots.txt, then one GET of https://<host>/, each sent as LantadBot/1.0 with redirects followed, a twenty second timeout on each request, no JavaScript executed and from one network location. robots.txt was parsed with parseRobotsTxt and evaluated for LantadBot at the site root with evaluateRobots, both imported directly from core/src/robots.ts, before any home page was requested. Measured by Lantad on 26 September 2026 across the 1,419 hostnames in worker/seeds/corpus-seeds-platform.json and worker/seeds/corpus-seeds-industry.json.

What does structured data use @id for, and what do its specifications say?

Two published documents govern this and they answer different questions. The JSON-LD 1.1 specification, a W3C Recommendation carrying the date 16 July 2020, defines the keyword: @id is "used to uniquely identify node objects that are being described in the document with IRIs or blank node identifiers". It then defines the thing that points at one: "A node reference is a node object containing only the @id property, which may represent a reference to a node object found elsewhere in the document." Those two sentences are the whole mechanism. One node says what something is, another says this is that same thing, and the identifier is the only string joining them.

The same specification is explicit that the identifier is optional. It states that "JSON-LD does not require all nodes to be identified using @id", and a node without one is a blank node, which is a valid way to describe something you never need to refer to twice. A page carrying no @id anywhere is therefore not malformed. It has given up two abilities: saying that two statements are about one thing, and letting anything outside the page refer to what it described. The vocabulary at schema.org supplies the types and the property names, and says nothing about identifiers, because identity belongs to the syntax layer rather than to the vocabulary.

Google's structured data general guidelines, carrying Last updated 2026-07-10 UTC, answer the second question, which is what happens when you skip it. That page sets out two ways to mark up multiple items on one page: nesting, "when there is one main item, and additional items are grouped under the main item", and individual items, "when each item is a separate block on the same page". For the second case the instruction is direct: "use @id in both the recipe and the video items to specify that the video is about the recipe on the page". Then the consequence: "If you didn't link the items together, Google Search may not know that it can show the video as a Recipe rich result."

That is documented behaviour from the largest consumer of this markup, not an inference. Two things in it matter for what follows. Nesting and identifiers are presented as alternatives that both work, so a page using either one is doing something the documentation sanctions. And the failure mode named for doing neither is not a validation error. It is a feature quietly not firing, which is the same shape as the case where a valid BreadcrumbList scored zero because of its syntax: markup that passes every checker and does not do the job. What follows is a count of which of those two shapes 615 real home pages shipped.

W3C, the syntax

  • @id: used to uniquely identify node
  • objects that are being described in the
  • document with IRIs or blank node
  • identifiers.
  • JSON-LD does not require all nodes to be
  • identified using @id.
  • Says: what an identifier is. Optional.

Google, the consumer

  • Use @id in both the recipe and the video
  • items to specify that the video is about
  • the recipe on the page.
  • If you didn't link the items together,
  • Google Search may not know that it can
  • show the video as a Recipe rich result.
  • Says: what skipping it costs.
The two documents that govern identifiers in JSON-LD, quoted exactly as read at source on 26 September 2026. The W3C page carries the date 16 July 2020; the Google page carries Last updated 2026-07-10 UTC.

How many home pages carried an @id at all

Of the 1,081 home pages read, 622 carried at least one script element with type application/ld+json and 459 carried none. That is the same split this corpus produced on a smaller run when it counted home pages carrying no structured data in the raw HTML, and the same population that a run in mid September read when it counted microdata against JSON-LD.

Carrying a block is not the same as carrying usable JSON. 17 of the 622 served at least one block that did not parse, and on 7 of those every block failed, so those 7 pages published markup no consumer can read at all: trinityschoolofmedicine.org, unrivaledsportsco.com, bokksu.com, agoda.com, langhamhotels.com, ns.nl and danskebank.dk. That is the defect class counted when this corpus found 117 of 612 home pages with JSON-LD carrying a defect, and it leaves 615 pages with at least one parseable block as the denominator for every figure below.

Those 615 pages held 1,157 parseable blocks and 8,540 typed nodes between them. The median page declared 6 typed nodes. eltiempo.com declared 1,069 across three blocks and theglobeandmail.com spread 113 across 41 separate script elements. 247 pages carried more than one parseable block, and 142 of those 247 defined no @id anywhere. That last figure matters more than it looks, because separate script elements are separate JSON documents: without an identifier there is no syntax available to say that the Organization in the second block is the publisher named in the first.

313 of the 615 carried no @id on any node. The 302 that did held 2,767 @id values between them, of which 1,562 were distinct. Six of those values identify nothing. Three are empty strings, on distefanolandscaping.com, roberthalltaxes.com and villagedentaldtc.com, emitted by a template that wrote the key with no value behind it. Three are bare hostnames with no scheme: oist.jp wrote oist.jp, thuisarts.nl wrote www.thuisarts.nl and theglobeandmail.com wrote theglobeandmail.com. A relative reference resolves against the address the document was served from, so each of those three names a path on the site rather than the site.

This scanner does read the property, in one place. Its entity confidence diagnostic weights an absolute @id on the identity node at 15 points of 100, and the reason recorded beside that number in core/src/config.ts is structural rather than measured: an absolute @id is what makes the webflow-platform fixture's four nodes one linked graph instead of four islands. That weight is a decision somebody made. Nothing published by any answer engine says what an identifier is worth, and this post does not claim otherwise.

  • At least one JSON-LD script block 622 of 1,081 459 pages carried none at all
  • At least one block that parsed as JSON 615 of 1,081 17 pages served a block that failed to parse, 7 of them every block
  • More than one typed node 545 of 1,081 The population where an identifier has any work to do
  • An @id on any node 302 of 1,081 313 of the 615 parseable pages carried none
  • Used @graph 213 of 1,081 The flat container that a joined graph is usually written in
  • An @id reference that resolved on the page 193 of 1,081 One node actually pointing at another node defined on the same page
What the 1,081 home pages read on 26 September 2026 carried, counted from the raw bytes of one request per host with no JavaScript executed. Each figure is a count of what the markup declares, not a measure of what any engine does with it.

545 pages described more than one thing, and 193 linked them by identifier

545 of the 615 pages declared more than one typed node, and that is the population where the question has any force: a page describing exactly one thing needs no identifier to relate it to anything. Sorting those 545 by how the relation is expressed gives three groups, and the split is the main result of this run.

193 pages carried at least one node reference whose @id resolved to a node defined on the same page. That is what Google's guidelines describe as individual items linked by @id, and it is the only one of the three shapes that survives being read out of order, or out of one block rather than another.

311 pages expressed every relation by nesting alone: a typed node sitting inside another typed node's property, with no identifier on either. That is the other pattern Google's page presents as working, so it is not a defect, and it is worth being exact about what it costs rather than overstating it. A nested Organization under a WebPage's publisher property does state the relation, and Google says it reads that. What it does not do is give the organisation a name anything can reuse. The same company nested on forty pages of a site is forty descriptions of possibly forty things, and a consumer merging those pages cannot know it is one company unless the strings happen to match.

41 pages had neither: two or more typed nodes as flat siblings, no identifier and no nesting, so the markup states no relation between them at all. 26 of the 41 are Wix or Squarespace sites, which is the platform pattern a later section returns to. The rest include usa.gov, japan.go.jp, unesco.org, medlineplus.gov, rakuten.co.jp, bankofamerica.com and barclays.co.uk.

Two caveats keep the 352 honest. The first is that 352 pages resolving no reference is not 352 broken pages, because 311 of them are using a documented pattern and the finding is about what that pattern gives up rather than about validity. The second is that this measurement reads one page. The specification requires a consumer to treat every application/ld+json element on an HTML page as one dataset, which is why the blocks on a page are merged here before anything is resolved, but it says nothing about merging across pages, and the site-wide graph a publisher pictures is not something a single fetch can see. A crawler that reads your home page once gets exactly the identifiers that page carried. The practical version for one engine is in the notes on getting cited in Google AI Overviews.

How a consumer reading one page arrives at a relation between two typed nodes, and the three outcomes counted across the 545 home pages that declared more than one typed node. Measured by Lantad on 26 September 2026.

18 pages pointed at an identifier nothing on the page defined

Separate from whether a page links its nodes is the case where it tries and misses. 18 of the 615 carried at least one node reference, an object whose only keys are @id and possibly @type, pointing at an identifier that no node on that page defines. 30 distinct references in all.

14 of the 18 point at the page itself or at a bare fragment of it, so the target could only ever have been defined locally and was not. harvard.edu is the clearest. Its single block is a WebPage carrying a headline, a url, an author, a publisher and three dates, and that node has no @id at all. Its mainEntityOfPage property holds a reference to a WebPage with the @id https://www.harvard.edu/, which nothing on the page defines. The page therefore describes itself twice: once as an unidentified node holding all the properties, once as an identifier holding none, with nothing stating that the two are the same page.

nbcnews.com ships three blocks. One defines a WebPage with the @id https://www.nbcnews.com. Two others are NewsMediaOrganization references pointing at https://www.nbcnews.com/#publisher, which nothing defines, so the publisher of the page is named by a pointer to nothing. sendbird.com carries six references using the bare fragments #identity and #creator, two of them typed Organization, and defines neither. truist.com carries one untyped reference to https://www.truist.com/#Organization and nothing that answers it. cnbc.com, hollywoodreporter.com, aalto.fi, spectator.co.uk, sonarsource.com, citi.com, hdfcbank.com, trueform.agency, grandstreetdental.com and estesvalleyvoice.com make up the rest.

The other 5 are a different case and should not be read as errors. hubspot.com, mistral.ai, acponline.org, smileisleorthodontics.com and citi.com reference identifiers that are the URLs of other pages on the same site. The mistral.ai home page defines its Organization and its WebSite, then references three product-page identifiers of the form https://mistral.ai/products/vibe/#webpage. Under the specification an @id is a global identifier and the node may legitimately be described at that address, so this is linked data working as designed. What remains true is narrower: a consumer reading only the home page receives three identifiers and no properties for any of them. That is the same one-fetch limit behind the finding that 412 of 1,080 home pages named their site in neither source Google reads first, and the same asymmetry as the sameAs measurement, where 85 of 317 organizations named a reference entry and one of those entries had been deleted. A reference is a promise that something is described elsewhere, and whether it is depends on a fetch nobody has made. You can see which identifiers your own page actually delivers with what GPTBot sees.

  • harvard.edu Points at the page itself mainEntityOfPage references a WebPage with the @id https://www.harvard.edu/. The node holding every property on that page carries no @id at all.
  • nbcnews.com Publisher points at nothing Two NewsMediaOrganization references name https://www.nbcnews.com/#publisher across three blocks. Nothing defines it. The WebPage that is defined uses a different identifier.
  • sendbird.com Two bare fragments Six references to #identity and #creator, two of them typed Organization. Neither fragment is defined anywhere in the document.
  • truist.com One reference, no graph A single untyped node reference to https://www.truist.com/#Organization and nothing on the page that answers it.
  • 11 further same-page cases Points at the page or a fragment cnbc.com, hollywoodreporter.com, aalto.fi, spectator.co.uk, sonarsource.com, citi.com, hdfcbank.com, trueform.agency, grandstreetdental.com and estesvalleyvoice.com.
  • 5 cross-page cases Legal under the specification hubspot.com, mistral.ai, acponline.org, smileisleorthodontics.com and citi.com name identifiers at other URLs on their own site. Described there, perhaps, but not here.
The 18 home pages of 615 that carried a node reference pointing at an @id no node on the same page defines, grouped by what the reference named. Identifiers quoted exactly as returned. Measured by Lantad on 26 September 2026.

14 pages gave one @id to two things that disagree

The inverse defect is rarer and harder to defend. 14 of the 615 pages define the same @id on two or more nodes that carry a shared property with different values. It matters because of one sentence in the specification's node object grammar: "The properties of a node in a graph may be spread among different node objects within a document. When that happens, the keys of the different node objects need to be merged to create the properties of the resulting node." Two nodes with one identifier are not two things. They are one thing whose description is the union of both.

visitbritain.org is the fullest example. The single URL https://www.visitbritain.org/ is the @id of five node objects on that home page: a GovernmentOrganization with a legal name, a telephone number and a postal address, a WebPage with a description, a WebSite with a name and a publisher, an Organization carrying only a url, and one bare Organization reference. Merged as the specification says, that is one resource which is at once a government body, a web page and a website.

rivm.nl does the same with https://www.rivm.nl/, the @id of an Organization with an address and a parent organisation, of a GovernmentOrganization, and of a WebSite. tec.mx uses https://tec.mx/es for both its Organization and its WebSite. broadinstitute.org uses https://www.broadinstitute.org for a ResearchOrganization with an address and a telephone number, and for a WebPage whose author and publisher are both references to that same identifier, so the page is its own author and publisher. cbsnews.com uses https://www.cbsnews.com/ for a NewsMediaOrganization named CBS News and for a WebPage whose name is written under the key @name, which is not a JSON-LD keyword. The specification's own note covers that case: terms starting with an @ character that are not JSON-LD 1.1 keywords "are ignored unless mapped to an IRI", so the name is discarded and that WebPage contributes only a type to the merge.

Four of the fourteen conflict on a value a reader would notice rather than only on a type. principal.com defines https://www.principal.com/ twice as a Corporation, once with a logo marked representativeOfPage True and once with the same property marked False. therightaccompany.com gives https://therightaccompany.com/#organization two names, which decode from the markup's HTML entities as A&L Heating & Plumbing and A & L Heating and Air, and two different type declarations. roberthalltaxes.com gives its website identifier two publishers, one an organization fragment and one an accountingservice fragment, so the site has two publishers depending on which node you read. confluent.io is the one that reaches outside the site: https://www.wikidata.org/wiki/Q16235208 is the @id of a Thing named Apache Kafka and of a Thing named Stream processing, so a public identifier for one concept is asserted on that page to be two.

The widest case is seota.com, where seventeen nodes claim the identifier https://seota.com/#organization and two of them define it with conflicting url, logo and sameAs values, including one that names a Wikidata item and one that does not. A merge of those two produces an organisation with two logos and two lists of external identities, from a page whose markup validates.

None of this is a validation error and every one of these documents parses, which is why the number is 14 rather than zero. Counting whether a page declares an organisation at all, which is how this corpus found 103 of 385 pages with JSON-LD naming no organization, is the presence question. Whether the declarations on one page agree with each other is the coherence question, and coherence is the part of AI visibility that no validator reports on.

Home pageThe reused identifierNodes claiming itWhat they disagree about
seota.comhttps://seota.com/#organization17Two Organization nodes with different url, logo and sameAs values
therightaccompany.comhttps://therightaccompany.com/#organization7Two names, A&L Heating & Plumbing and A & L Heating and Air, and two type declarations
visitbritain.orghttps://www.visitbritain.org/5GovernmentOrganization, WebPage, WebSite and an Organization carrying only a url
broadinstitute.orghttps://www.broadinstitute.org5ResearchOrganization and a WebPage whose author and publisher are that same identifier
cbsnews.comhttps://www.cbsnews.com/5NewsMediaOrganization and a WebPage whose name sits under the ignored key @name
roberthalltaxes.comhttps://roberthalltaxes.com/#website4Two publishers, an organization fragment and an accountingservice fragment
kidzandteendental.comhttps://kidzandteendental.com/#organization4Organization against Dentist, and two different logo images
rivm.nlhttps://www.rivm.nl/3Organization, GovernmentOrganization and WebSite
wur.nlhttps://www.wur.nl#organization3Two CollegeOrUniversity nodes with different logo images
tec.mxhttps://tec.mx/es2Organization and WebSite
confluent.iohttps://www.wikidata.org/wiki/Q162352082A Thing named Apache Kafka and a Thing named Stream processing
principal.comhttps://www.principal.com/2Two Corporation nodes, one logo representativeOfPage True and one False
yo.directoryhttps://yo.directory/2Two names, Discover Tools and AI Tools Directory
trustmrr.comTwo startup organization fragments2Each identifier defined twice with different additionalProperty values
The 14 home pages of 615 that used one @id for two or more node objects disagreeing on a shared property, with what the identifier was asserted to be. Values quoted exactly as returned. Measured by Lantad on 26 September 2026.

The platform decided the answer more than the publisher did

Sorting the 615 pages by the corpus stratum each hostname is filed under makes the mechanism plain, and it is not effort. All 34 WordPress home pages that carried parseable JSON-LD declared an @id, 33 of the 34 used @graph, and not one of them left its multiple nodes unjoined. That is Yoast and RankMath output, and the pattern is already documented inside this repository: a comment in core/src/entity.ts records that those two plugins emit a flat @graph whose members are joined by @id stubs rather than by nesting, verified against a live page whose four nodes were wired by five such stubs.

At the other end, 53 Wix and Squarespace pages produced 4 with any @id and 2 using @graph, and 36 of their 40 multi-node pages joined nothing. 23 Shopify pages produced 5 with an @id and 1 using @graph. Neither figure says anything about those businesses. It says the template they bought writes a separate block per feature and never assigns identifiers, so a plumber on WordPress ships a joined graph and a plumber on Wix does not, for a reason neither of them chose and neither can see from the front of the site.

The industry strata sit between the two because they mix platforms. SaaS was the strongest, with 57 of its 89 pages carrying an @id and 40 using @graph. Ecommerce was the weakest at 11 of 40 and 2. Government produced 10 of 28, news 30 of 52, and education 21 of 31.

This is the shape this blog keeps reaching from different directions, and the honest reading is not that one platform is better at markup. It is that the largest single input to what a crawler receives is a decision made by a vendor, which is why a per-page score is in large part a score of a template. Lantad's own two readings of one page can disagree for a related reason, which a perfect schema score and a zero measured on the same page sets out in detail.

Corpus stratumPages with parseable JSON-LDUsed @graphCarried any @idMulti-node pages joining nothing
saas (industry)89405723 of 78
wix-squarespace532436 of 40
finance53132225 of 45
news52153019 of 48
healthcare44121921 of 39
ecommerce4021126 of 37
travel36101617 of 33
wordpress-smb3433340 of 34
education3120216 of 26
spa-startups287169 of 24
media-local2817188 of 26
government28101015 of 24
saas-marketing26131412 of 26
shopify-dtc231516 of 21
webflow187116 of 17
Pages with parseable JSON-LD, and what their markup did with identifiers, by the corpus stratum each hostname is filed under in the two committed seed files. Strata contributing fewer than 12 pages with parseable JSON-LD are omitted. Measured by Lantad on 26 September 2026.

What this measurement does not show

No AI crawler fetched anything in this run. Every request came from LantadBot, so nothing here is evidence about what GPTBot, ClaudeBot or PerplexityBot does with an identifier, and none of the vendors behind those tokens documents it. Google's guidelines document a Search consequence for unlinked items, which is a statement about rich results and not about generative answers. Anyone saying that adding an @id produces a citation is making a claim nobody outside those engines can currently test.

This scanner does not grade what this post measured, and that is worth stating plainly rather than leaving a reader to find out. The composite score's schema sub-score is 10 points of 100, set in core/src/config.ts, and the function behind it parses each block, flattens arrays and @graph, and checks that nodes carry a type and the properties their type requires. It never reads an @id. So it cannot see a reference that resolves nowhere, and it cannot see one identifier asserted of two things. The Entity Confidence diagnostic does read the property, at 15 points of its own 100, but that diagnostic never feeds the composite. All 14 conflicting-identifier pages and all 18 broken-reference pages therefore score exactly as they would without the defect, and the rules that are enforced are set out in the methodology. The measurement exists because it was worth taking, not because the product acts on it today.

Only the home page was read on each host, once, from one network location, on one date. A site that assigns identifiers on its article template and not on its home page counts here as carrying none, so every count of an absence is a ceiling on what that site publishes rather than proof of what it does not. No JavaScript was executed, which is the point rather than a shortcut, because the question is what a crawler reading delivered bytes is handed. A page that injects its graph from a script counts here as having none, and this run cannot say how many of the 459 pages with no JSON-LD have some once their bundle has run.

The corpus is an editorial sampling frame assembled for platform and industry coverage rather than a random draw of the web, so every rate supports a statement about these 1,419 hostnames and nothing wider, a constraint set out at length in the crawlability study. The 244 hosts whose home page did not answer 200 with HTML are not missing at random, since a server that refuses an unknown crawler is likelier to refuse other automation, so the 1,081 read here lean towards sites that are open to being read. A further 30 hosts never returned a robots.txt status and were not asked for a home page in this run at all, and 64 disallowed LantadBot at the root. Platform-specific citation notes for one engine are in the guide to getting cited by Perplexity.

  • 313 of 615 carried no @id Measured Read from the raw bytes of one request per host, with every ld+json block on a page merged before resolving anything.
  • 193 of 545 resolved a reference Measured A node object whose only keys are @id and possibly @type, pointing at an identifier another node on the same page defines with properties.
  • 14 pages reused one @id Measured Two or more nodes sharing an identifier and disagreeing on a property they both carry. Quoted from the markup as served.
  • Nesting is a valid alternative Documented Google's general guidelines, Last updated 2026-07-10 UTC, present nesting and @id linking as two ways that both work. Not a Lantad finding.
  • Nodes with one @id are merged Documented Quoted from the JSON-LD 1.1 node object grammar, W3C Recommendation carrying the date 16 July 2020. Not a Lantad finding.
  • Schema is 10 points of 100 here A decision A constant in core/src/config.ts. A weighting this company chose, not a measured effect, and it reads no identifiers.
  • Whether an @id moves a citation Not measured No engine publishes it, no AI crawler was run here, and nothing in this post claims it.
What each claim in this post is, and what it is not. Written against the same run, Lantad, 26 September 2026.

Written by

Lantad

Published .

A home page that carries structured data is usually making statements about several things at once: the organisation, the website, the page itself, a logo, a person, a breadcrumb trail. Whether a machine reading those bytes can tell which of those statements are about the same thing comes down to one keyword. JSON-LD calls it a node identifier and writes it @id, and it is the only part of the syntax whose job is identity rather than description.

Common questions

What does @id do in structured data?

It is the JSON-LD keyword that gives a node an identity. The JSON-LD 1.1 specification, a W3C Recommendation carrying the date 16 July 2020, defines it as used to uniquely identify node objects that are being described in the document, and defines a node reference as a node object containing only the @id property. One node says what a thing is, another says this is that same thing, and the identifier is the only string joining them. It is optional: the same specification states that JSON-LD does not require all nodes to be identified using @id.

Do I need @id if my structured data is nested?

Not for Google to read the relation. Its structured data general guidelines, Last updated 2026-07-10 UTC, present nesting and linking by @id as two ways of marking up multiple items that both work, and only say that failing to link separate blocks may stop a feature firing. What nesting does not give you is a name anything can reuse: the same organisation nested on forty pages is forty descriptions of possibly forty things. In this corpus 311 of 545 multi-node home pages relied on nesting alone.

How many sites actually use @id?

In this corpus, 302 of the 615 home pages that carried parseable JSON-LD on 26 September 2026, so 313 carried none. The stronger figure is what the identifiers do: only 193 of the 545 pages describing more than one typed thing carried a reference that resolved to another node on the same page. The single biggest predictor was the publishing platform, with 34 of 34 WordPress pages carrying an @id against 4 of 53 Wix and Squarespace pages.

What breaks if two nodes share an @id?

Nothing visibly, which is the problem. The document still parses and still validates. The JSON-LD 1.1 node object grammar states that the keys of different node objects need to be merged to create the properties of the resulting node, so the two descriptions become one resource carrying both. On visitbritain.org that merge produces a single thing that is a government body, a web page and a website at once. This run found 14 such pages of 615, and this scanner's own schema sub-score does not detect any of them.

See what AI can read on your site

Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.