SEOX
API Reference

SEOX Class

API documentation for the SEOX class

SEOX Class

The SEOX class is the main entry point for generating metadata in your Next.js application.

Import

import { SEOX } from 'seox/next';

Constructor

new SEOX(config: SEOXConfig)

Parameters

ParameterTypeDescription
configSEOXConfigYour site-wide SEO configuration

Example

import { SEOX } from 'seox/next';
import type { SEOXConfig } from 'seox';

const config: SEOXConfig = {
  siteName: 'My Site',
  siteUrl: 'https://example.com',
  defaultTitle: 'My Site',
  titleTemplate: '%s | My Site',
  defaultDescription: 'Welcome to my site',
};

const seo = new SEOX(config);

Methods

metadata()

Generates a Next.js Metadata object for use in generateMetadata.

metadata(options?: MetadataOptions): Metadata

Parameters

OptionTypeDescription
titlestringPage title (uses defaultTitle if omitted)
descriptionstringPage description
keywordsstring[]Page-specific keywords
openGraphobjectOpen Graph overrides
twitterobjectTwitter card overrides

Returns

Returns a Metadata object compatible with Next.js App Router.

Basic Example

app/page.tsx
import { SEOX } from 'seox/next';
import { config } from '@/seox.config';

export async function generateMetadata() {
  return new SEOX(config).metadata({
    title: 'Home',
    description: 'Welcome to our homepage',
  });
}

With All Options

app/blog/[slug]/page.tsx
import { SEOX } from 'seox/next';
import { config } from '@/seox.config';

export async function generateMetadata({ params }) {
  const post = await getPost(params.slug);

  return new SEOX(config).metadata({
    title: post.title,
    description: post.excerpt,
    keywords: post.tags,
    openGraph: {
      type: 'article',
      publishedTime: post.publishedAt,
      authors: [post.author],
      images: [{ url: post.coverImage }],
    },
    twitter: {
      card: 'summary_large_image',
    },
  });
}

Metadata Merging

SEOX merges your site-wide configuration with page-specific options:

FieldBehavior
titleUses page title with titleTemplate
descriptionPage overrides site default
keywordsMerged arrays
openGraphDeep merge, page overrides site
twitterDeep merge, page overrides site

Type Definitions

interface MetadataOptions {
  title?: string;
  description?: string;
  keywords?: string[];
  openGraph?: {
    type?: string;
    locale?: string;
    images?: Array<{
      url: string;
      width?: number;
      height?: number;
      alt?: string;
    }>;
    publishedTime?: string;
    authors?: string[];
  };
  twitter?: {
    card?: 'summary' | 'summary_large_image' | 'app' | 'player';
    site?: string;
    creator?: string;
  };
}

Full Page Example

app/products/[id]/page.tsx
import { SEOX, JsonLd } from 'seox/next';
import { config } from '@/seox.config';

export async function generateMetadata({ params }) {
  const product = await getProduct(params.id);

  return new SEOX(config).metadata({
    title: product.name,
    description: product.description,
    keywords: ['product', ...product.categories],
    openGraph: {
      type: 'product',
      images: [{ url: product.image }],
    },
  });
}

export default async function ProductPage({ params }) {
  const product = await getProduct(params.id);

  return (
    <>
      <JsonLd
        data={{
          '@context': 'https://schema.org',
          '@type': 'Product',
          name: product.name,
          description: product.description,
          image: product.image,
          offers: {
            '@type': 'Offer',
            price: product.price,
            priceCurrency: 'USD',
          },
        }}
      />
      <main>
        <h1>{product.name}</h1>
        {/* Product content */}
      </main>
    </>
  );
}

Next Steps

On this page