SEO Meta Tag Analyzer
Pricing
Pay per usage
Go to Apify Store
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
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
2
Monthly active users
17 days ago
Last modified
Categories
Share
Comprehensive on-page SEO audit for any URL. Analyzes 15+ ranking factors and generates both structured JSON and a visual HTML report.
What it checks
| Check | Details |
|---|---|
| Title tag | Length (30–60 chars optimal), presence |
| Meta description | Length (70–160 chars optimal), presence |
| Headings | H1 count, H1–H6 hierarchy validation |
| Open Graph | og:title, og:description, og:image, all OG tags |
| Twitter Cards | twitter:card, twitter:title, twitter:image, etc. |
| Images | Alt text audit, missing alt count/percent |
| Canonical URL | Presence, self-referencing check |
| Mobile | Viewport meta tag |
| Schema markup | JSON-LD, Microdata, RDFa detection + type extraction |
| Keyword density | Auto-detect from title/description OR custom keywords. Placement in title/H1/description |
| Robots | noindex/nofollow detection |
| Language | html lang attribute |
| Links | Internal vs external link count |
| Content | Word count |
| Charset | Character encoding declaration |
Input
| Field | Type | Default | Description |
|---|---|---|---|
urls | string[] | required | One or more page URLs to analyze |
targetKeywords | string[] | [] (auto-detect) | Keywords to check density for. If empty, the top 5 non-stopword terms from title+description are used. |
checkCanonical | boolean | true | Verify canonical URL matches the page URL |
checkSchemaMarkup | boolean | true | Scan for JSON-LD, Microdata, and RDFa |
proxyConfiguration | object | none | Proxy settings (uses HTTPS proxy agent when provided) |
Output
Dataset (one row per URL)
Each row includes:
| Field | Description |
|---|---|
seoScore | 0–100 composite score |
titleTag, titleLength, titleStatus | Title analysis (good / too_short / too_long / missing) |
metaDescription, descriptionLength, descriptionStatus | Description analysis |
metaRobots, isNoindex | Robots directive |
headings | Full H1–H6 breakdown with text (capped at 100 chars per heading) |
h1Count, headingHierarchyValid | H1 count and whether levels skip (e.g., H1→H3) |
totalImages, imagesMissingAlt, imagesDetail | Image audit (first 50 images with src/alt) |
ogTags, ogTagCount | Every og:* property found |
twitterTags, twitterCardType | Every twitter:* name found |
canonicalUrl, hasCanonical, canonicalMatch | Canonical check |
viewport, hasViewport | Mobile viewport meta tag |
charset, hasCharset, htmlLang | Encoding + language |
internalLinkCount, externalLinkCount | Link tally |
wordCount | Whitespace-split word count of <body> text |
keywordAnalysis | Per-keyword: count, density %, in title, in H1, in description |
schemaMarkup, schemaTypesFound | Structured data types found (JSON-LD/Microdata/RDFa) |
issues, warnings, passed | Findings grouped by severity |
issueCount, warningCount, passedCount | Counts for quick scanning |
analyzedAt | ISO timestamp |
error | Only present on fetch failures |
Key-Value Store
| Key | Content type | Description |
|---|---|---|
OUTPUT | application/json | Full JSON array of all URL results — the same dataset items aggregated into one record for single-download access. |
report | text/html | Human-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:
| Issue | Deduction |
|---|---|
| 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 text | up 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": 95,"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": ["No structured data (schema markup) found", "..."],"passed": ["Title length is optimal", "Meta description length is optimal", "..."],"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
errorset andseoScore: 0. - Transient network issues (timeouts, DNS failures, non-2xx status) are surfaced as the
errorfield. - HTTP redirects are followed automatically (max 3 hops).
- Request timeout: 30 seconds per URL.
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 tohttps-proxy-agentwhenproxyConfigurationis 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/imagesMissingAltcounts reflect all images).
Version history
- 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