Docs
Metadata Validator

Metadata Validator

validateMetadata() analyzes scraped metadata against 14 SEO rules and returns a score from 0 to 100, along with categorized issues.

Basic Usage

import { scrape, validateMetadata } from 'web-meta-scraper';
 
const result = await scrape('https://example.com');
const validation = validateMetadata(result);
 
console.log(validation.score);    // 85
console.log(validation.summary);  // { errors: 0, warnings: 2, info: 1 }
console.log(validation.issues);   // [{ severity: 'warning', field: 'og:image', ... }, ...]

Result Structure

interface ValidationResult {
  score: number;       // 0–100, starts at 100 and deducts per issue
  issues: ValidationIssue[];
  summary: { errors: number; warnings: number; info: number };
  metadata: ResolvedMetadata;
}
 
interface ValidationIssue {
  severity: 'error' | 'warning' | 'info';
  category: 'essential' | 'opengraph' | 'twitter' | 'structured-data' | 'security';
  field: string;
  message: string;
}

Validation Rules

Essential

FieldSeverityPenaltyCondition
titleerror-15Missing page title
descriptionerror-15Missing meta description
descriptionwarning-5Too short (<50 chars) or too long (>160 chars)
faviconwarning-3Missing favicon
canonicalwarning-5Missing canonical URL

Open Graph

FieldSeverityPenaltyCondition
og:titlewarning-8Missing og:title tag
og:descriptionwarning-8Missing og:description tag
og:imagewarning-8Missing og:image tag
og:urlinfo-3Missing og:url tag
og:typeinfo-2Missing og:type tag

Twitter

FieldSeverityPenaltyCondition
twitter:cardwarning-5Missing twitter:card tag
twitter:titleinfo-3Missing twitter:title tag
twitter:descriptioninfo-3Missing twitter:description tag

Structured Data

FieldSeverityPenaltyCondition
json-ldwarning-7Missing JSON-LD structured data

Security

FieldSeverityPenaltyCondition
imagewarning-5Image URL uses insecure HTTP protocol

Use with createScraper

import { createScraper, metaTags, openGraph, twitter, jsonLd, validateMetadata } from 'web-meta-scraper';
 
const scraper = createScraper({
  plugins: [metaTags, openGraph, twitter, jsonLd],
});
 
const result = await scraper.scrapeUrl('https://example.com');
const { score, issues } = validateMetadata(result);
 
// Filter by severity
const errors = issues.filter(i => i.severity === 'error');
const warnings = issues.filter(i => i.severity === 'warning');