SEO Meta Tag Analyzer
Pricing
Pay per usage
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
9
Total users
3
Monthly active users
a day ago
Last modified
Categories
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
| 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": 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
errorset andseoScore: 0. - Transient network issues (timeouts, DNS failures, non-2xx status) are surfaced as the
errorfield. - HTTP redirects are followed automatically.
- Request timeout: 30 seconds per URL.
- If the
urlslist is empty, the run exits successfully (logging a warning and pushing a single marker record —url: null,seoScore: 0, and an explanatoryerrorfield — 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 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).
Limitations
- Single-page fetch, not a crawler. Each URL in
urlsis 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'shttp/httpsmodule 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/503or a challenge page. These are recorded per URL as anerrorrecord rather than accurate SEO data. ConfigureproxyConfiguration(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.
imagesDetailis 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
urlsinput 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