Skip to content
Docs

Structured data

Each article comes with its schema.org structured data as JSON-LD, ready to put on the page. It is worked out from the version that is live, so it always says what the page shows.

structuredData is one object with an @graph of up to three things:

Type When What it says
BlogPosting Always The headline, description, address, language, both dates, the word count, the author (a Person, or the site as an Organization), the publisher, the cover image and the pages the article cites.
FAQPage When the article has an FAQ Each question and its answer, as plain text.
BreadcrumbList Always The trail from your home page, through your blog, to the article.
article.structuredData
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "BlogPosting",
"@id": "https://example.com/blog/how-to-brew-green-tea#article",
"headline": "How to brew green tea",
"description": "Brew green tea at 80°C for two minutes. Here is why the temperature matters and how to get it right without a thermometer.",
"url": "https://example.com/blog/how-to-brew-green-tea",
"mainEntityOfPage": "https://example.com/blog/how-to-brew-green-tea",
"inLanguage": "en",
"datePublished": "2026-10-09T02:05:00.000Z",
"dateModified": "2026-10-11T02:05:00.000Z",
"wordCount": 69,
"author": {
"@type": "Person",
"name": "Sam Lee",
"url": "https://example.com/authors/sam-lee"
},
"publisher": {
"@type": "Organization",
"name": "Example Tea",
"url": "https://example.com"
},
"image": "https://example.com/images/green-tea.webp",
"citation": [
"https://example.org/brewing"
]
},
{
"@type": "FAQPage",
"@id": "https://example.com/blog/how-to-brew-green-tea#faq",
"mainEntity": [
{
"@type": "Question",
"name": "Can I use boiling water?",
"acceptedAnswer": {
"@type": "Answer",
"text": "You can, but the tea will taste bitter."
}
}
]
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Example Tea",
"item": "https://example.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://example.com/blog"
},
{
"@type": "ListItem",
"position": 3,
"name": "How to brew green tea",
"item": "https://example.com/blog/how-to-brew-green-tea"
}
]
}
]
}

Write it into a script tag of type application/ld+json in the page’s head or body. Escape < so nothing in an article can end the script early:

const jsonLd = JSON.stringify(article.structuredData).replaceAll('<', '\\u003c');
<script type="application/ld+json">{jsonLd}</script>

Each framework guide shows where this goes.

The addresses in the data are the article’s url and your site’s own address. If you show the article at a different address than url, the data no longer matches the page. Keep your route and the article’s url the same; the SEO guide covers how.