machinelayer.org/

reference

The schema block

One <script type="application/ld+json"> in the head, which says what type of thing the page is in a vocabulary other systems already know. You will meet it called structured data, schema markup and JSON-LD; they are the same thing.

The common mistake is declaring that a collection has members and then listing none of them.

{
  "@context": "https://schema.org",

  // Article, Product, Organization, Collection…
  "@type": "TechArticle",

  "headline": "Page — what it is",
  "description": "…",
  "url": "https://example.org/page",

  // optional, and useful once findings start to age
  "datePublished": "2026-08-10",
  "dateModified": "2026-08-10",

  "isPartOf": {
    "@type": "Collection",
    "name": "Site",
    "url": "https://example.org/"
  },

  // ENUMERATE. A count with no members tells a reader nothing exists.
  "hasPart": [
    {
      "@type": "VisualArtwork",
      "name": "Item one",
      "url": "https://example.org/items/1",
      "identifier": {
        "@type": "PropertyValue",
        "propertyID": "sku",
        "value": "0001"
      }
    }
  ]
}

It is not the same as publishing a data file of your own. That is a credence move — raw data a reader can recompute — and it carries a reach cost this block does not: a file at its own URL has to be found before it does anything, while this one rides along inside a page something has already fetched.

One optional field worth knowing: disambiguatingDescription, defined as distinguishing an item from similar ones. Useful if your name collides with a common noun or another product — but it is a plain description field with no conditional behaviour, so every clause must be worth saying in an answer where nobody was confused.