Schema
Article Schema Markup API and JSON-LD Examples
On this page
Implementation overview
Use defineArticle() to describe articles with valid JSON-LD. This reference explains headline, image, author, publisher, dates, article subtypes, route metadata defaults, and complete TypeScript examples.
Article structured data identifies written content such as blog posts, news articles, and technical documentation. It can help Google understand authorship, publication dates, representative images, and content type.
JSON-LD Example
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to Build a REST API with Node.js",
"image": "https://example.com/photos/api-guide.jpg",
"datePublished": "2026-01-15T08:00:00+00:00",
"dateModified": "2026-02-20T10:30:00+00:00",
"author": {
"@type": "Person",
"name": "Jane Smith",
"url": "https://example.com/authors/jane"
},
"publisher": {
"@type": "Organization",
"name": "Dev Blog",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
}
}
Use the Schema.org Generator to build your structured data visually.
Schema.org Article
- Type:
defineArticle<T extends Record<string, any>>(input?: Article & T)
Describes anArticleon aWebPage.
Useful Links
Recommended properties for Google
- headline
string
Name of the article
Route metadata on thetitlekey can provide this value; see Defaults. - image
Arrayable<string|ImageObject>
Link a primary image or a collection of images to the article.
Route metadata on theimagekey can provide a single image URL; see Defaults.
For Google Search, use crawlable images that represent the article. Google recommends several high-resolution images with 16:9, 4:3, and 1:1 aspect ratios; see the current Article image guidelines. - author
NodeRelations<Identity>
If the article's author is not your site identity, provide the author explicitly. See Choosing an identity.
The registered author is moved to a root Schema node, resolving the field as an@idreference to a Person. - @type sub-types
Select the Article subtype that best matches the content.
Defaults
- @type:
Article - @id:
${canonicalUrl}#article - headline:
titlefrom resolved page metadata (see: Schema.org Params) - image:
imagefrom resolved page metadata - description:
descriptionfrom resolved page metadata - inLanguage:
inLanguagefrom resolved page metadata - datePublished:
datePublishedfrom resolved page metadata - dateModified:
dateModifiedfrom resolved page metadata - publisher: Identity Reference
- author: Identity Reference
- isPartOf: WebPage Reference
- mainEntityOfPage: WebPage Reference
Sub-Types
AdvertiserContentArticleNewsArticleBlogPostingReportSatiricalArticleScholarlyArticleSocialMediaPostingTechArticle
Relation Transforms
- sets default
potentialActiontoReadAction - sets the default
dateModifiedto the Article'sdateModified - sets the default
datePublishedto the Article'sdatePublished
Resolves
See Global Resolves for full context.
headlineis cut to a maximum of 110 characters at the last complete word that fits.thumbnailUrlwill be set to the first imagedateModifiedordatePublishedcan be resolved from Date objects
defineArticle({
// will resolve to ISO 8601 format
datePublished: new Date(2024, 0o5, 29)
})
- providing a single
@typeother thanArticleconverts it to an array:TechArticlebecomes['Article', 'TechArticle']
defineArticle({
// will be resolved as ['Article', 'TechArticle']
'@type': 'TechArticle',
})
Examples
See the blog recipe for more examples.
Minimal
defineArticle({
headline: 'Article Title',
image: '/articles/article-title-image.jpg',
// using identity as the author
})
Route Meta
Add type support for route metadata.
defineArticle()
Detailed example
defineArticle({
headline: 'Article Title',
description: 'Article description',
image: '/articles/article-title-image.jpg',
datePublished: new Date(2024, 0o5, 29),
dateModified: new Date(2024, 0o5, 29),
// attaching an author when the identity is an organization
author: {
name: 'Harlan Wilton',
url: 'https://harlanzw.com',
}
})
Types
type ValidArticleSubTypes = 'Article' | 'BlogPosting' | 'AdvertiserContentArticle' | 'NewsArticle' | 'Report' | 'SatiricalArticle' | 'ScholarlyArticle' | 'SocialMediaPosting' | 'TechArticle'
export interface ArticleSimple extends Thing {
['@type']?: Arrayable<ValidArticleSubTypes>
/**
* The headline of the article (falling back to the title of the WebPage).
* Headlines should not exceed 110 characters.
*/
headline?: string
/**
* A summary of the article (falling back to the page's meta description content).
*/
description?: string
/**
* A reference-by-ID to the WebPage node.
*/
isPartOf?: IdReference
/**
* The time at which the article was originally published, in ISO 8601 format; e.g., 2015-10-31T16:10:29+00:00.
*/
datePublished?: ResolvableDate
/**
* The time at which the article was last modified, in ISO 8601 format; e.g., 2015-10-31T16:10:29+00:00.
*/
dateModified?: ResolvableDate
/**
* A reference-by-ID to the author of the article.
*/
author?: NodeRelations<Identity>
/**
* A reference-by-ID to the publisher of the article.
*/
publisher?: NodeRelations<Identity>
/**
* An array of all videos in the article content, referenced by ID.
*/
video?: NodeRelations<VideoObject>
/**
* An image object or referenced by ID.
* Google eligibility has additional image requirements; see the Article guide above.
*/
image?: NodeRelations<ImageObject | string>
/**
* An array of references by ID to comment pieces.
*/
comment?: NodeRelations<Comment>
/**
* A thumbnail image relevant to the Article.
*/
thumbnailUrl?: string
/**
* An integer value of the number of comments associated with the article.
*/
commentCount?: number
/**
* An integer value of the number of words in the article.
*/
wordCount?: number
/**
* An array of keywords which the article has (e.g., ["cats","dogs","cake"]).
*/
keywords?: string[]
/**
* An array of category names which the article belongs to (e.g., ["cats","dogs","cake"]).
*/
articleSection?: string[]
/**
* The language code for the article; e.g., en-GB.
*/
inLanguage?: string
/**
* A SpeakableSpecification object which identifies any content elements suitable for spoken results.
*/
speakable?: unknown
/**
* The year from which the article holds copyright status.
*/
copyrightYear?: string
/**
* A reference-by-ID to the Organization or Person who holds the copyright.
*/
copyrightHolder?: NodeRelations<Identity>
/**
* The body text of the article.
*/
articleBody?: string
/**
* The subject matter of the article.
*/
about?: string
}
Related Schemas
- Person: Article author
- Organization: Publisher
- Breadcrumb: Article navigation
Did this page help you?