Outrank
Get traffic and outrank competitors with Backlinks & SEO-optimized content while you sleep! I've been keeping a close eye on this new tool and it seems to be gaining a lot of traction and delivering great results. Try it now!
Have you seen the new Next.js newsletter?
Next SEO is a plugin that makes managing your SEO easier in Next.js projects. It provides components for structured data (JSON-LD) that helps search engines understand your content better.
Looking for v6 documentation? View Here
Still using component in Pages? View docs here [/src/pages/README.md]
npm install next-seo
# or
yarn add next-seo
# or
pnpm add next-seo
# or
bun add next-seo
import { ArticleJsonLd } from "next-seo";
export default function BlogPost() {
return (
<>
<ArticleJsonLd
headline="Getting Started with Next SEO"
datePublished="2024-01-01T08:00:00+00:00"
author="John Doe"
image="https://example.com/article-image.jpg"
description="Learn how to improve your Next.js SEO"
/>
<article>
<h1>Getting Started with Next SEO</h1>
{/* Your content */}
</article>
</>
);
}
Note: For standard meta tags (
<meta>,<title>), use Next.js's built-ingenerateMetadatafunction.Pages Router Support: If you're using Next.js Pages Router, import components from
next-seo/pages. See the Pages Router documentation for details.
Feel like supporting this free plugin?
It takes a lot of time to maintain an open source project so any small contribution is greatly appreciated.
Coffee fuels coding ☕️
The ArticleJsonLd component helps you add structured data for articles, blog posts, and news articles to improve their appearance in search results.
import { ArticleJsonLd } from "next-seo";
export default function ArticlePage() {
return (
<>
<ArticleJsonLd
headline="My Amazing Article"
datePublished="2024-01-01T08:00:00+08:00"
author="John Doe"
image="https://example.com/article-image.jpg"
description="This article explains amazing things about Next.js SEO"
/>
<article>
<h1>My Amazing Article</h1>
{/* Article content */}
</article>
</>
);
}
<ArticleJsonLd
type="NewsArticle"
headline="Breaking: Next SEO v7 Released"
url="https://example.com/news/next-seo-v7"
datePublished="2024-01-01T08:00:00+08:00"
dateModified="2024-01-02T10:00:00+08:00"
author={[
{
"@type": "Person",
name: "Jane Smith",
url: "https://example.com/authors/jane",
},
"John Doe", // Can mix objects and strings
]}
image={[
"https://example.com/images/16x9.jpg",
"https://example.com/images/4x3.jpg",
"https://example.com/images/1x1.jpg",
]}
publisher={{
"@type": "Organization",
name: "Example News",
logo: "https://example.com/logo.png",
}}
isAccessibleForFree={true}
/>
<ArticleJsonLd
type="BlogPosting"
headline="10 Tips for Better SEO"
url="https://example.com/blog/seo-tips"
datePublished="2024-01-01T08:00:00+08:00"
author={{
"@type": "Organization",
name: "SEO Experts Inc.",
url: "https://example.com",
}}
image={{
"@type": "ImageObject",
url: "https://example.com/blog-hero.jpg",
width: 1200,
height: 630,
caption: "SEO Tips Illustration",
}}
description="Learn the top 10 tips to improve your website's SEO"
mainEntityOfPage={{
"@type": "WebPage",
"@id": "https://example.com/blog/seo-tips",
}}
/>
| Property | Type | Description |
|---|---|---|
type |
"Article" \| "NewsArticle" \| "BlogPosting" \| "Blog" |
The type of article. Defaults to "Article" |
headline |
string |
Required. The headline of the article |
url |
string |
The canonical URL of the article |
author |
string \| Person \| Organization \| Author[] |
The author(s) of the article |
datePublished |
string |
ISO 8601 date when the article was published |
dateModified |
string |
ISO 8601 date when the article was last modified |
image |
string \| ImageObject \| (string \| ImageObject)[] |
Article images. Google recommends multiple aspect ratios |
publisher |
Organization |
The publisher of the article |
description |
string |
A short description of the article |
isAccessibleForFree |
boolean |
Whether the article is accessible for free |
mainEntityOfPage |
string \| WebPage |
Indicates the article is the primary content of the page |
scriptId |
string |
Custom ID for the script tag |
scriptKey |
string |
Custom key prop for React |
The ClaimReviewJsonLd component helps you add structured data for fact-checking articles that review claims made by others. This enables a summarized version of your fact check to display in Google Search results.
import { ClaimReviewJsonLd } from "next-seo";
export default function FactCheckPage() {
return (
<>
<ClaimReviewJsonLd
claimReviewed="The world is flat"
reviewRating={{
ratingValue: 1,
bestRating: 5,
worstRating: 1,
alternateName: "False",
}}
url="https://example.com/fact-check/flat-earth"
author="Fact Check Team"
/>
<article>
<h1>Fact Check: The World is Flat</h1>
{/* Your fact check content */}
</article>
</>
);
}
| Property | Type | Description |
|---|---|---|
claimReviewed |
string |
Required. A short summary of the claim being evaluated (keep under 75 characters) |
reviewRating |
object |
Required. The assessment of the claim with rating value and textual rating |
url |
string |
Required. Link to the page hosting the full fact check article |
author |
string \| Organization \| Person |
The publisher of the fact check article |
itemReviewed |
Claim |
Detailed information about the claim being reviewed |
scriptId |
string |
Custom ID for the script tag |
scriptKey |
string |
Custom key for script identification |
| Property | Type | Description |
|---|---|---|
alternateName |
string |
Required. The truthfulness rating as human-readable text (e.g., "False", "Mostly true") |
ratingValue |
number |
Required. Numeric rating (closer to bestRating = more true) |
bestRating |
number |
Best value in the rating scale (must be greater than worstRating) |
worstRating |
number |
Worst value in the rating scale (minimum value of 1) |
name |
string |
Alternative to alternateName (use alternateName instead) |
<ClaimReviewJsonLd
claimReviewed="Climate change is not real"
reviewRating={{
ratingValue: 1,
bestRating: 5,
worstRating: 1,
alternateName: "Pants on Fire",
}}
url="https://example.com/fact-check/climate-denial"
author={{
name: "Climate Facts Organization",
url: "https://example.com",
logo: "https://example.com/logo.jpg",
}}
itemReviewed={{
author: {
name: "Climate Denial Institute",
sameAs: "https://climatedenial.example.com",
},
datePublished: "2024-06-20",
appearance: {
url: "https://example.com/original-claim",
headline: "The Great Climate Hoax",
datePublished: "2024-06-22",
author: "John Doe",
publisher: {
name: "Denial News",
logo: "https://example.com/denial-logo.jpg",
},
},
}}
/>
The CreativeWorkJsonLd component helps you add structured data for various types of creative content, with special support for marking paywalled or subscription-based content. This enables Google to differentiate paywalled content from cloaking practices.
import { CreativeWorkJsonLd } from "next-seo";
export default function ArticlePage() {
return (
<>
<CreativeWorkJsonLd
type="Article"
headline="Premium Article"
datePublished="2024-01-01T08:00:00+08:00"
author="John Doe"
description="This premium article requires a subscription"
isAccessibleForFree={false}
hasPart={{
isAccessibleForFree: false,
cssSelector: ".paywall",
}}
/>
<article>
<h1>Premium Article</h1>
Free preview content here...
Premium content that requires subscription...
</article>
</>
);
}
| Property | Type | Description |
|---|---|---|
type |
"CreativeWork" \| "Article" \| "NewsArticle" \| "Blog" \| "BlogPosting" \| "Comment" \| ... |
The type of creative work. Defaults to "CreativeWork" |
headline |
string |
The headline of the content (used for Article types) |
name |
string |
The name of the content (alternative to headline) |
url |
string |
URL of the content |
author |
$ claude mcp add next-seo \
-- python -m otcore.mcp_server <graph>