Article schema: markup for blog posts and news
·4 min read
Article schema is a JSON-LD block that tells search engines a page's headline, images, publish and update dates, and authors. Use BlogPosting for blog posts, NewsArticle for news, and plain Article for everything else. Google requires no property, but it recommends headline, image, datePublished, dateModified and author, and fills in better titles, images and dates in results when you give them.
What article structured data does
Article structured data helps Google show the right title text, image and date for a page in Search, Google News and Google Assistant. That is the whole claim in Google's Article markup guide. Google also says the markup is not required to appear in Top Stories.
Treat it as labeling. You tell Google which date is the publish date, which image is the hero and who wrote the piece. If you are new to the format, start with what JSON-LD is and the schema markup guide, then come back.
Article vs BlogPosting vs NewsArticle schema
All three types work the same way in Google's eyes. The guide lists them together and gives them the same recommended properties. BlogPosting and NewsArticle are both subtypes of Article on schema.org, so picking the narrower one costs nothing and is more accurate.
| Type | Use it for | Example |
|---|---|---|
BlogPosting |
Posts in a blog, opinion pieces, tutorials | A how-to on your company blog |
NewsArticle |
Reporting on current events by a news publisher | A story on a local news site |
Article |
Long-form content that is neither | A documentation page, a guide, a white paper |
If the URL lives under /blog, use BlogPosting. Reserve NewsArticle for actual journalism. Marking a product announcement as news only misdescribes the page.
Which properties Google recommends
Google lists no required properties. These are the recommended ones, with the details its guide adds.
| Property | What to put there |
|---|---|
headline |
The article title. Keep it short, because long titles may be cut off on some devices |
image |
Several high-resolution images of at least 50,000 pixels (width times height), in 16x9, 4x3 and 1x1 aspect ratios. Crawlable, indexable URLs. Not your logo |
datePublished |
ISO 8601 date and time with a time zone |
dateModified |
Same format, the last real update |
author |
A Person or Organization with name and url |
The time zone matters more than it looks. Without one, Google assumes the time zone Googlebot uses, so a post published late in the evening in Sydney can show yesterday's date. Write 2026-10-10T08:00:00+10:00, not 2026-10-10.
For images, one well-cropped photo exported in three ratios is enough. A 1200x675 version covers 16x9, 1200x900 covers 4x3, and 1200x1200 covers 1x1.
Author markup best practices
Google's guide spends more words on authors than on any other property. Its rules come down to five habits.
- Mark up every author shown on the page.
- Give each author a separate entry in an array. Never put "Jane Doe and Sam Lee" in one
name. - Set
@typetoPersonorOrganizationand add aurlorsameAsthat points to a page about that author, such as a bio page or a profile. - Put only the name in
name. Job titles go injobTitle, the company goes inpublisher, and "Dr." goes inhonorificPrefix. Drop phrases like "Written by". - Use
Organizationonly when a company is genuinely the author, such as an unsigned staff post.
The url is the part people skip. A name alone is ambiguous, and a link to a bio page gives Google something to match. If you want to see how your bylines and author pages hold up, the author and E-E-A-T checker reviews them on a page.
Article schema JSON-LD example
This is a complete BlogPosting block with two authors. Put it in a <script type="application/ld+json"> tag in the page's HTML. The steps for each CMS are in how to add schema markup.
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "How we cut our page weight in half",
"image": [
"https://example.com/img/page-weight-16x9.jpg",
"https://example.com/img/page-weight-4x3.jpg",
"https://example.com/img/page-weight-1x1.jpg"
],
"datePublished": "2026-10-10T08:00:00+01:00",
"dateModified": "2026-10-10T08:00:00+01:00",
"author": [
{
"@type": "Person",
"name": "Jane Doe",
"url": "https://example.com/authors/jane-doe"
},
{
"@type": "Person",
"name": "Sam Lee",
"url": "https://example.com/authors/sam-lee"
}
],
"publisher": {
"@type": "Organization",
"name": "Example Co",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
}
}publisher is not on Google's recommended list, but it is valid schema.org and a good home for your logo, since the guide tells you to keep logos out of image.
Common article schema mistakes
Most broken Article markup comes from templates that fill fields automatically.
Every author in one string. "author": "Jane Doe, Sam Lee" reads as one person with a strange name. Use an array of Person objects.
dateModified bumped on every deploy. Some themes set dateModified to the build time, so every post looks updated today. Google's guidance on byline dates asks that the markup date match the date readers see on the page. Change dateModified when you change the content in a way a reader would notice, and show the same date in the byline.
The logo as the article image. Google says not to. Use a photo or illustration from the post.
Markup that disagrees with the page. A headline in the JSON-LD that differs from the H1, or an author who appears nowhere on the page, makes the markup look unreliable. Keep both from the same source fields.
After you publish, run the page through Google's tool as described in the Rich Results Test guide. It will confirm Google can parse the block.
Generate Article JSON-LD for your posts
The Schema Markup Generator builds Article, BlogPosting or NewsArticle JSON-LD from your headline, URL, description, image, author, publisher, logo and dates. It puts the logo on the publisher, where it belongs, and checks the result against the same validator rules as our Schema Markup Checker. A run costs 3 credits, and nothing is fetched.
The generator writes one author as a Person with a name. For a second author or an author url, add them to the output by hand following the example above.