Blog

How to create JSON-LD structured data for SEO (Schema.org)

What structured data is, why Google prefers JSON-LD, ready-to-adapt examples of the common Schema.org types, and how to test your markup before it goes live.

February 10, 2026

You search for a lasagne recipe and the top result shows a photo, a 4.8-star rating and “1 hr 15 min”, right there on the results page. Your own pages show a blue link and two lines of text. The difference is usually a small block of JSON the recipe site added and you didn’t.

What is structured data

Structured data is a description of your page written for machines. Search engines such as Google and Bing read your text and make educated guesses about it. Structured data removes the guessing: “this is a product, it costs $149.99, it’s in stock.”

Some of it can show up as rich results, the fancier search listings with ratings, prices, dates or images.

The shared vocabulary comes from Schema.org, a project started by Google, Microsoft, Yahoo and Yandex. It defines hundreds of types, such as Article, Product, Organization, Event and Recipe, and the properties each one can have.

Why JSON-LD

There are three ways to add structured data: JSON-LD, Microdata and RDFa. Google reads all three and recommends JSON-LD. Once you’ve tried the other two, you’ll see why.

  • It stays out of your markup. JSON-LD sits in its own <script> tag in the head or body. You don’t sprinkle attributes over your existing HTML.
  • It’s easy to maintain. One self-contained object is easy to read, edit and validate. Microdata and RDFa are spread across your templates, so changing them means hunting through markup.
  • It suits component frameworks. In React, Remix, Next.js or Vue you build the object from data you already have and render it, without touching the page structure.

The JSON-LD format

JSON-LD (JSON for Linked Data) is plain JSON inside a script tag whose type is application/ld+json. The browser ignores it. Search engines read it. Every block has two special keys: @context, which says the words come from Schema.org, and @type, which says what kind of thing you’re describing.

HTML
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "PulpMiner",
  "url": "https://www.pulpminer.com",
  "description": "Turn any webpage into structured JSON data."
}
</script>

The remaining properties depend on the type. If a page describes several things, say an article and the company that published it, it can have several blocks.

Common schema types

Each example below is ready to adapt: swap in your own values and wrap it in the script tag shown above.

Article

Use Article, or its more specific cousins BlogPosting and NewsArticle, for editorial content. It tells Google the headline, author, dates and image:

JSON
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "How to Create JSON-LD Structured Data",
  "description": "A complete guide to implementing structured data.",
  "image": "https://example.com/images/jsonld-guide.png",
  "author": {
    "@type": "Organization",
    "name": "PulpMiner",
    "url": "https://www.pulpminer.com"
  },
  "publisher": {
    "@type": "Organization",
    "name": "PulpMiner",
    "logo": {
      "@type": "ImageObject",
      "url": "https://www.pulpminer.com/logo.png"
    }
  },
  "datePublished": "2026-02-10",
  "dateModified": "2026-02-10"
}

Product

Product can put price, availability and star ratings in the search listing, which is a big deal if you sell things online:

JSON
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Northwind Trail Running Shoes",
  "image": "https://example.com/trail-shoes.jpg",
  "description": "Lightweight trail shoes with a grippy, mud-friendly sole.",
  "brand": {
    "@type": "Brand",
    "name": "Northwind"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/trail-shoes",
    "priceCurrency": "USD",
    "price": "149.99",
    "availability": "https://schema.org/InStock",
    "seller": {
      "@type": "Organization",
      "name": "Ridgeline Outdoor Co."
    }
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "1247"
  }
}

FAQPage

FAQPage marks up a list of questions and answers. It used to add expandable questions under your listing, which is why every SEO guide from 2021 tells you to use it. Since 2023, though, Google only shows FAQ rich results for well-known government and health sites. For everyone else it still helps search engines understand the page, but the dropdowns won’t appear.

JSON
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is JSON-LD?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "JSON-LD is a way of encoding structured data as JSON, recommended by Google for adding Schema.org markup to web pages."
      }
    },
    {
      "@type": "Question",
      "name": "Does structured data improve SEO?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Structured data is not a direct ranking factor, but it makes pages eligible for rich results, which can improve click-through rates."
      }
    }
  ]
}

Organization

Organization describes your company: name, logo, contact details and social profiles (the sameAs list). Google can use it for the logo and details in its knowledge panel, the info box that appears beside results when someone searches for your brand:

JSON
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "PulpMiner",
  "url": "https://www.pulpminer.com",
  "logo": "https://www.pulpminer.com/logo.png",
  "description": "Turn any webpage into structured JSON data.",
  "sameAs": [
    "https://twitter.com/pulpminer",
    "https://github.com/pulpminer"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "contactType": "customer support",
    "email": "support@pulpminer.com"
  }
}

Other useful types

  • BreadcrumbList shows a trail like Home › Shoes › Trail in place of the raw URL.
  • SoftwareApplication (and its subtype WebApplication) describes an app and can show its rating and price.
  • LocalBusiness gives your address, opening hours, phone number and price range.
  • Event shows dates, venue and ticket details.
  • Recipe shows cooking time, rating and a photo. Hello again, lasagne.
  • HowTo still describes step-by-step instructions, but Google stopped showing HowTo rich results in 2023.

Google rich results

Rich results take up more room on the results page and tend to get more clicks than a plain link. That’s the reward. The rules are worth knowing before you chase it.

Only the types in Google’s search gallery can produce rich results. Markup for other types still helps search engines understand the page, but it won’t change how your listing looks. Also:

  • Valid markup makes you eligible, not guaranteed. Google decides based on page quality, the search and the device.
  • The markup has to match what people can see on the page. If your JSON-LD claims five stars and the page shows three, Google can take a manual action, a penalty applied by a human reviewer.
  • Some rich result types only appear in certain countries and languages.

Testing your markup

A single missing comma can make the whole block invisible to Google, and nothing on your page will tell you. So test. Google’s Rich Results Test takes a URL or a pasted snippet and:

  1. Finds all the structured data on the page (JSON-LD, Microdata and RDFa).
  2. Checks each item against Google’s requirements and lists errors and warnings.
  3. Previews how the rich result could look.

Once you’re live, the rich result reports in Google Search Console show structured data problems across your whole site. Glance at them now and then.

The Schema Markup Validator checks against the full Schema.org vocabulary, not just the parts Google cares about. It’s handy for types that have no rich result.

Implementation tips

  • Start with the types that fit your site. Article, Product, BreadcrumbList and Organization cover most of the web.
  • Use absolute URLs. Write https://example.com/shoes.jpg, not /shoes.jpg.
  • Match the visible content. No invented reviews, inflated ratings or prices that differ from the page.
  • Give each page one main type. Extra blocks are fine, but the main one should describe what the page is mostly about: Article for a blog post, Product for a product page.
  • Keep it current. When the price, rating or update date changes, change the markup in the same commit.
  • Nest related things. Put author, publisher and offers inside the main object, as in the examples above, so the whole picture is in one block.
  • Test before you deploy. A syntax error or a missing required property fails silently.

Using the PulpMiner JSON-LD generator

Writing JSON-LD by hand is mostly an exercise in counting braces. The JSON-LD generator builds it from a form instead:

  1. Pick a schema type: Article, Product, Organization, Person, FAQ, BreadcrumbList, WebSite or LocalBusiness. Article produces a BlogPosting.
  2. Fill in the fields. Add or remove rows for FAQ questions, breadcrumb items and sameAs profile links.
  3. Select Validate to check that the required fields are filled, or Generate to check them and build the markup.
  4. Copy the result. It comes wrapped in a <script type="application/ld+json"> tag, ready to paste into your page.

The tool only checks that required fields are filled in, so still run the result through the Rich Results Test before you ship it.

Need data from a webpage as JSON?

PulpMiner turns any public page into structured JSON and can save it as a live API. See it work on a demo page, no sign-up.

Try it on a demo page