If you run a blog and you are not using Article schema, you are leaving structured data on the table. Article schema is a direct line to Google's understanding of your content — who wrote it, when it was published, and what it is about — and it is a prerequisite for certain rich result formats in search.
This guide covers the exact JSON-LD to use, where to put it, and the common mistakes that cause validation errors.
What Article schema does
Without structured data, Google infers the author, publish date, and content type from your HTML — which it does reasonably well, but imperfectly. With Article schema, you are giving Google an explicit, machine-readable declaration: "this page is an article, it was published on this date, it was written by this person, and it belongs to this publication."
The practical benefits:
- Eligible for Top Stories carousel in Google Search (requires AMP or valid Article schema)
- Publish date and author name appear in some organic search results
- Supports E-E-A-T signals — Google can associate authorship with a verifiable entity
- Cleaner crawl interpretation, especially on JavaScript-rendered pages
The minimal valid Article schema
Google requires only a handful of fields for Article schema to be valid. Here is the minimal implementation:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Your Article Title Here",
"datePublished": "2025-04-10",
"dateModified": "2025-04-10",
"author": {
"@type": "Person",
"name": "Jane Smith",
"url": "https://yoursite.com/authors/jane-smith"
},
"publisher": {
"@type": "Organization",
"name": "Your Site Name",
"url": "https://yoursite.com"
}
}
</script>Place this in the <head> of each blog post page. If you are using Next.js, you can inject it using the dangerouslySetInnerHTML pattern on a <script> tag or via the metadata API.
Recommended fields to add
Beyond the minimum, these fields improve how Google interprets and displays your content:
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Your Article Title Here",
"description": "A 160-character summary of the article.",
"image": "https://yoursite.com/images/article-og.jpg",
"datePublished": "2025-04-10",
"dateModified": "2025-04-10",
"author": {
"@type": "Person",
"name": "Jane Smith",
"url": "https://yoursite.com/authors/jane-smith",
"sameAs": [
"https://linkedin.com/in/janesmith",
"https://twitter.com/janesmith"
]
},
"publisher": {
"@type": "Organization",
"name": "Your Site Name",
"url": "https://yoursite.com",
"logo": {
"@type": "ImageObject",
"url": "https://yoursite.com/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://yoursite.com/blog/your-article-slug"
}
}The sameAs array on the author is particularly valuable for E-E-A-T. It lets Google connect the author name to a real, verifiable entity — which strengthens the authoritativeness signal for the entire domain over time.
Article vs BlogPosting vs NewsArticle
schema.org/Article has three common subtypes. Use the right one for your content type:
- Article — general editorial content. Safe default for most blogs.
- BlogPosting— a subtype of Article, specifically for blog posts. Functionally equivalent for Google's purposes; use this if you want to be precise.
- NewsArticle — for time-sensitive journalism. Required for Google News inclusion. Do not use this for evergreen content — it signals to Google that your content has a short relevance window.
Common validation errors
When we run Article schema through Google's Rich Results Test, these are the errors we see most often:
- Missing
headline. The field name isheadline, nottitle. This catches a lot of developers who copy the wrong field name. - Wrong date format. Dates must be ISO 8601:
2025-04-10or2025-04-10T09:00:00+00:00. A format like "April 10, 2025" is invalid. - Author
urlreturns 404. If you link to an author profile page that does not exist, the schema fails validation. Either create the page or omit theurlfield. - Image too small. Google recommends images be at least 1200px wide for rich result eligibility. A 400px thumbnail will pass validation but may not qualify for all rich result types.
How to validate your implementation
Use Google's Rich Results Test at search.google.com/test/rich-results. Enter your article URL and it will show you which schema it found, which fields are valid, and any warnings or errors. Fix all errors before the page goes live — Google ignores invalid schema entirely.
For ongoing monitoring, Google Search Console → Enhancements → Articles shows a property-level view of which pages have valid Article schema and which have issues.
Next.js implementation pattern
If your blog runs on Next.js, the cleanest approach is to generate the JSON-LD server-side per page and inject it into the document head:
export default async function BlogPostPage({ params }) {
const post = getPostBySlug(params.slug);
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'BlogPosting',
headline: post.title,
description: post.description,
datePublished: post.publishedAt,
dateModified: post.updatedAt ?? post.publishedAt,
author: {
'@type': 'Organization',
name: 'SEO Improvement',
url: 'https://seoimprove.net',
},
publisher: {
'@type': 'Organization',
name: 'SEO Improvement',
url: 'https://seoimprove.net',
},
mainEntityOfPage: {
'@type': 'WebPage',
'@id': `https://seoimprove.net/blog/${post.slug}`,
},
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
{/* page content */}
</>
);
}This is exactly the pattern this blog uses — every post page already emits valid Article schema, which you can verify with the Rich Results Test.