SEO Meta Tag Analyzer avatar

SEO Meta Tag Analyzer

Pricing

Pay per usage

Go to Apify Store
SEO Meta Tag Analyzer

SEO Meta Tag Analyzer

Audit any URL for SEO: title length, meta description, Open Graph tags, heading hierarchy, image alt texts, keyword density, mobile viewport, canonical URL, schema markup, and more.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

CQ

CQ

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

3

Monthly active users

a day ago

Last modified

Share

On-page SEO audit for any URL. Analyzes 15+ on-page SEO signals and generates both structured JSON and a visual HTML report. Scores are heuristic (based on widely used SEO best-practice thresholds), not official Google ranking signals.

What it checks

CheckDetails
Title tagLength (30–60 chars optimal), presence
Meta descriptionLength (70–160 chars optimal), presence
HeadingsH1 count, H1–H6 hierarchy validation
Open Graphog:title, og:description, og:image, all OG tags
Twitter Cardstwitter:card, twitter:title, twitter:image, etc.
ImagesAlt text audit, missing alt count/percent
Canonical URLPresence, self-referencing check
MobileViewport meta tag
Schema markupJSON-LD, Microdata, RDFa detection + type extraction
Keyword densityAuto-detect from title/description OR custom keywords. Placement in title/H1/description
Robotsnoindex/nofollow detection
Languagehtml lang attribute
LinksInternal vs external link count
ContentWord count
CharsetCharacter encoding declaration

Input

FieldTypeDefaultDescription
urlsstring[]requiredOne or more page URLs to analyze
targetKeywordsstring[][] (auto-detect)Keywords to check density for. If empty, the top 5 non-stopword terms from title+description are used.
checkCanonicalbooleantrueVerify canonical URL matches the page URL
checkSchemaMarkupbooleantrueScan for JSON-LD, Microdata, and RDFa
proxyConfigurationobjectnoneProxy settings (uses HTTPS proxy agent when provided)

Output

Dataset (one row per URL)

Each row includes:

FieldDescription
seoScore0–100 composite score
titleTag, titleLength, titleStatusTitle analysis (good / too_short / too_long / missing)
metaDescription, descriptionLength, descriptionStatusDescription analysis
metaRobots, isNoindexRobots directive
headingsFull H1–H6 breakdown with text (capped at 100 chars per heading)
h1Count, headingHierarchyValidH1 count and whether levels skip (e.g., H1→H3)
totalImages, imagesMissingAlt, imagesDetailImage audit (first 50 images with src/alt)
ogTags, ogTagCountEvery og:* property found
twitterTags, twitterCardTypeEvery twitter:* name found
canonicalUrl, hasCanonical, canonicalMatchCanonical check
viewport, hasViewportMobile viewport meta tag
charset, hasCharset, htmlLangEncoding + language
internalLinkCount, externalLinkCountLink tally
wordCountWhitespace-split word count of <body> text
keywordAnalysisPer-keyword: count, density %, in title, in H1, in description
schemaMarkup, schemaTypesFoundStructured data types found (JSON-LD/Microdata/RDFa)
issues, warnings, passedFindings grouped by severity
issueCount, warningCount, passedCountCounts for quick scanning
analyzedAtISO timestamp
errorOnly present on fetch failures

Key-Value Store

KeyContent typeDescription
OUTPUTapplication/jsonFull JSON array of all URL results — the same dataset items aggregated into one record for single-download access.
reporttext/htmlHuman-readable HTML audit report with tables, colored score badges (red/orange/green), issues/warnings/passed lists, and keyword tables. Open in browser.

Scoring

Score starts at 100 and deducts points:

IssueDeduction
Missing title tag−15
Missing meta description−10
Missing H1−10
Missing viewport−8
Noindex directive−5
Title too short−5
Title too long−3
Description too short−3
Description too long−2
Multiple H1 tags−3
Missing canonical−3
Heading hierarchy gaps−2
Missing OG tags (og:title/og:description/og:image)−2 each
Missing lang attribute−2
No schema markup found−3
Images without alt textup to −10 (scaled by count)

Final score is clamped to [0, 100].

Example input

{
"urls": [
"https://apify.com",
"https://example.com",
"https://github.com"
],
"targetKeywords": ["scraping", "automation"],
"checkCanonical": true,
"checkSchemaMarkup": true
}

Example output (dataset row, truncated)

{
"url": "https://apify.com",
"seoScore": 96,
"titleTag": "Apify: Full-stack web scraping and data extraction platform",
"titleLength": 59,
"titleStatus": "good",
"metaDescription": "Cloud platform for web scraping, browser automation...",
"descriptionLength": 154,
"descriptionStatus": "good",
"h1Count": 1,
"totalImages": 108,
"imagesMissingAlt": 0,
"hasCanonical": true,
"canonicalMatch": true,
"hasViewport": true,
"ogTagCount": 11,
"schemaTypesFound": "Organization, WebSite",
"wordCount": 1847,
"internalLinkCount": 81,
"externalLinkCount": 55,
"issues": [],
"warnings": ["Missing lang attribute on <html>", "Heading hierarchy has gaps (e.g., H1 → H3 skipping H2)"],
"passed": ["Title length is optimal", "Meta description length is optimal", "Single H1 tag present", "Schema markup found: Organization, WebSite", "..."],
"issueCount": 0,
"warningCount": 2,
"passedCount": 8
}

Error handling

  • Each URL is processed independently. A failure on one URL does not abort the run — it's recorded in the dataset with error set and seoScore: 0.
  • Transient network issues (timeouts, DNS failures, non-2xx status) are surfaced as the error field.
  • HTTP redirects are followed automatically.
  • Request timeout: 30 seconds per URL.
  • If the urls list is empty, the run exits successfully (logging a warning and pushing a single marker record — url: null, seoScore: 0, and an explanatory error field — so the dataset is never empty) instead of failing.

Use cases

  • Content teams: audit blog posts before publishing
  • SEO agencies: bulk-audit client pages in one run
  • Developers: CI/CD SEO checks on staging environments
  • Marketers: compare competitor page optimization
  • Migration QA: verify canonicals/meta tags after site redesigns

Notes

  • The actor uses native fetch() when no proxy is configured, and switches to https-proxy-agent when proxyConfiguration is provided.
  • User-Agent: Mozilla/5.0 (compatible; SEOAnalyzer/1.0).
  • Word count is approximate — counts whitespace-separated tokens from <body> text, so it overcounts navigation/footer text.
  • Image audit caps the detail array at 50 images to keep dataset rows manageable (the totalImages / imagesMissingAlt counts reflect all images).

Limitations

  • Single-page fetch, not a crawler. Each URL in urls is fetched and analyzed on its own. The actor does not follow internal links or discover additional pages — internal/external links are only counted, not visited.
  • Raw HTML only, no JavaScript rendering. Pages are fetched over plain HTTP (native fetch(), or Node's http/https module with a proxy). There is no headless browser, so meta tags, headings, or structured data injected by client-side JavaScript are not seen. Use a proxy for sites that need one; heavily JS-rendered SPAs may return sparse results.
  • Anti-bot / access blocking. Sites protected by Cloudflare, bot detection, logins, or IP rate limits may return 403/503 or a challenge page. These are recorded per URL as an error record rather than accurate SEO data. Configure proxyConfiguration (e.g. residential proxies) to reduce blocking.
  • Heuristic scoring, not Google-official. The 0–100 score and length thresholds (e.g. title 30–60, description 70–160) reflect common SEO best practices, not Google's actual ranking algorithm. Treat scores as directional guidance.
  • Approximate content metrics. Word count is a whitespace token count of all <body> text, so it includes navigation/footer boilerplate. Keyword density is a plain substring match (no stemming or lemmatization).
  • Truncation & caps. imagesDetail is capped at the first 50 images; heading texts are capped at 100 chars; OG/Twitter/schema values are truncated for storage. Aggregate counts (totalImages, imagesMissingAlt, etc.) still reflect the full page.
  • No off-page or performance checks. Backlinks, domain authority, Core Web Vitals, page speed, rendering, and accessibility beyond image alt text are out of scope.
  • Redirects. HTTP redirects are followed automatically; redirect chains are not explicitly hop-limited.

Pricing

This actor runs on the Apify platform, so cost depends on the platform resources it consumes — mainly compute-unit time (a function of how many URLs you analyze and how long each page takes to fetch) plus any proxy usage you enable. There is no per-result surcharge in the actor itself. See the actor's Apify Store page for current pricing.

Version history

  • v1.2 — Empty urls input now exits successfully instead of failing; added dataset field schema; README accuracy pass + Limitations section
  • v1.1 — KVS schema cleaned up (was listing wrong nested fields); README expanded with full output spec and edge-case notes
  • v1.0 — Initial release