SEO Site Checker (Pay per Event) avatar

SEO Site Checker (Pay per Event)

Pricing

from $10.00 / 1,000 results

Go to Apify Store
SEO Site Checker (Pay per Event)

SEO Site Checker (Pay per Event)

Crawl any website and extract 70+ on-site SEO metrics — meta tags, Core Web Vitals, structured data, mobile-friendliness, security headers, and page speed. Get a complete SEO audit with per-check scores and actionable recommendations.

Pricing

from $10.00 / 1,000 results

Rating

0.0

(0)

Developer

Eimantas V

Eimantas V

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

SEO Site Checker

An advanced Apify Actor that performs comprehensive on-site SEO analysis for any website. Crawl one or hundreds of pages and receive a detailed, structured JSON report covering 70+ SEO metrics across meta tags, content quality, technical health, Core Web Vitals, security, and mobile-friendliness — plus an overall SEO score.


What It Checks

Meta & Social

CheckDescription
Meta Title TestPresence, length (50–60 chars), and duplicate words
Meta Description TestPresence and length (120–160 chars)
Google Search PreviewSimulated title/URL/description as shown in SERPs
Open Graph Tagsog:title, og:description, og:image, and all og: properties
Twitter Card Tagstwitter:card, twitter:title, twitter:description, and all twitter: properties
Hreflang TagsLanguage/region targeting links
Canonical TagPresence and validity of canonical URL
Noindex TagWhether the page blocks indexing
Nofollow TagWhether the page sets global nofollow
Meta RefreshDetects harmful meta refresh redirects
Charset DeclarationPresence of charset (UTF-8)
Language AttributeHTML lang attribute

Headings & Content

CheckDescription
Heading Tags Test (H1–H6)Extracts all headings, checks hierarchy, flags missing/multiple H1
Most Common KeywordsTop 20 keywords with frequency count and density %
Keywords CloudWeighted keyword cloud data
Related KeywordsSuggested semantic variations of top keywords
Word CountTotal word count on the page
Paragraph CountNumber of <p> tags
Lorem Ipsum TestDetects placeholder text
Strong TagsCount of <strong> and <b> elements
iFramesCount of embedded iframes
Spell CheckBasic spell-check error count
CheckDescription
Internal LinksList and count of internal links
External LinksList and count of external links
Nofollow LinksCount of rel="nofollow" links
Average Anchor Text LengthMean character length of link anchor texts
Unsafe Cross-Origin Linkstarget="_blank" links missing rel="noopener noreferrer"
Competitor DomainsExternal domains inferred as potential competitors

Images

CheckDescription
Image Alt TestImages missing alt attributes
Modern Image Format TestWebP/AVIF adoption rate
Responsive Image TestImages using srcset/sizes
Image Aspect Ratio TestImages with potentially incorrect width/height ratios
Image Caching TestHeuristic cache-buster detection on image URLs
Lazy LoadingCount of images with loading="lazy"

Technical SEO

CheckDescription
Robots.txt TestExistence, Disallow rules, sitemap references, and block-all detection
Sitemap TestAuto-discovery of sitemap.xml / sitemap_index.xml, page count
SEO Friendly URL TestLength, casing, underscores, parameters, special characters, depth
Doctype TestHTML5 DOCTYPE vs. legacy
Structured Data TestJSON-LD, Microdata, RDFa, Schema.org detection
Custom 404 Page TestWhether the server returns a proper 404 for missing pages
URL Redirects TestRedirect chain depth and type (301/302)
Noindex Tag Test<meta name="robots" content="noindex">
Canonical Tag Test<link rel="canonical"> presence and validity
Meta Refresh TestHarmful meta-refresh redirect detection
Deprecated HTML Tags Testmarquee, blink, font, center, frame, frameset, etc.
Nested Tables TestLayout tables nested inside tables
Frameset TestObsolete frameset element detection
Flash TestFlash object/embed detection
Inline CSS TestCount of elements with style="" attributes
AMP Link<link rel="amphtml"> presence

Performance & Speed

CheckDescription
Site Loading Speed TestTotal page load time (DOMContentLoaded, load event)
Largest Contentful Paint (LCP)Core Web Vital — Good ≤2.5s, Poor >4s
Cumulative Layout Shift (CLS)Core Web Vital — Good ≤0.1, Poor >0.25
First Contentful Paint (FCP)Time to first visible content
Time to First Byte (TTFB)Server response latency
JS Execution TimeEstimated JavaScript processing time
HTML Page Size TestTotal transfer size of all resources
DOM Size TestNumber of DOM elements (recommended ≤1,500)
HTML Compression/GZIP TestContent-Encoding header (gzip/brotli)
Render Blocking Resources TestScripts and stylesheets in <head> without async/defer
JavaScript Minification TestDetects unminified JS files
CSS Minification TestDetects unminified CSS files
JavaScript Caching TestCache indicator detection on JS resources
CSS Caching TestCache indicator detection on CSS resources
Image Caching TestCache indicator detection on image resources
Page Cache TestCache-Control / ETag / Expires headers
CDN Usage TestDetects Cloudflare, CloudFront, Fastly, Akamai, Azure CDN
Page ObjectsCounts JS, CSS, image, font, and total resource files

Security

CheckDescription
HTTPS TestWhether the page is served over HTTPS
SSL Certificate TestCertificate validity, issuer, and days until expiry
HSTS TestStrict-Transport-Security header configuration
Mixed Content TestHTTP resources loaded on an HTTPS page
HTTP/2 TestHTTP/2 protocol detection
Server Signature TestWhether the Server header exposes version info
Directory Browsing TestDetects open directory listings
Plaintext Emails TestEmail addresses exposed in page source
Unsafe Cross-Origin Links Testtarget="_blank" without rel="noopener"
Safe Browsing TestGoogle Safe Browsing malware/phishing check (requires API key)

Mobile & Responsive

CheckDescription
Meta Viewport TestPresence and content of <meta name="viewport">
Media Query Responsive TestCSS media query count
Mobile ResponsiveFlex/Grid layout and viewport combination heuristic
Apple Touch IconPresence of Apple home-screen icon
Mobile SnapshotOptional JPEG screenshot at 375×812 (iPhone) viewport

Analytics & Social Presence

CheckDescription
Google Analytics TestGA4 / UA tracking code detection
Google Tag ManagerGTM container detection
Facebook PixelMeta Pixel detection
HotjarHotjar tracking detection
Social Media LinksFacebook, Twitter/X, LinkedIn, Instagram, YouTube link extraction

Domain & DNS

CheckDescription
Favicon Test<link rel="icon"> detection
SPF Records TestDNS TXT record for email spoofing prevention
Ads.txt Validationads.txt existence and basic validity
Domain LengthCharacter count of the domain name

Input

FieldTypeRequiredDefaultDescription
startUrlsarrayOne or more URLs to analyse
maxDepthinteger1Link crawl depth from each start URL
maxPagesPerCrawlinteger10Maximum pages to analyse in total
waitForNetworkIdlebooleantrueWait for JS to settle before analysis
checkMobileViewbooleanfalseCapture mobile screenshot (slower)
safeBrowsingApiKeystringGoogle Safe Browsing API key
proxyConfigurationobjectApify proxy settings

Input Example

{
"startUrls": [
{ "url": "https://example.com" },
{ "url": "https://example.com/blog" }
],
"maxDepth": 1,
"maxPagesPerCrawl": 5,
"waitForNetworkIdle": true,
"checkMobileView": false
}

Output

Each analysed page produces one item in the dataset. Below is an annotated example.

{
"url": "https://example.com",
"finalUrl": "https://example.com/",
"statusCode": 200,
"crawledAt": "2024-06-01T12:00:00.000Z",
"title": "Example Domain",
"titleLength": 14,
"description": "This domain is for use in illustrative examples.",
"descriptionLength": 48,
"iframes": 0,
"language": "en",
"hasHreflang": false,
"domainLength": 11,
"viewportPresent": false,
"mobileResponsive": false,
"charsetPresent": true,
"hasFavicon": false,
"h1": ["Example Domain"],
"h1Count": 1,
"h2Count": 0,
"h3Count": 0,
"wordCount": 42,
"paragraphCount": 2,
"hasLoremIpsum": false,
"hasAppleTouchIcon": false,
"jsFileCount": 0,
"cssFileCount": 0,
"strongTagCount": 0,
"internalLinksCount": 0,
"externalLinksCount": 1,
"averageAnchorTextLength": 15,
"imagesWithoutAlt": 0,
"hasGoogleAnalytics": false,
"hasHTTPS": true,
"hasJSONLD": false,
"hasMicrodata": false,
"metaRobots": null,
"canonicalUrl": null,
"hasSitemap": false,
"hasOpenGraph": false,
"hasTwitterCards": false,
"hasAMP": false,
"hasSchema": false,
"meta": {
"title": "Example Domain",
"titleLength": 14,
"titleDuplicateWords": [],
"titleTest": { "passed": false, "score": 20, "message": "Meta title is too short (14 chars). Aim for 50–60 characters." },
"description": "This domain is for use in illustrative examples.",
"descriptionLength": 48,
"descriptionTest": { "passed": false, "score": 40, "message": "Meta description too short (48 chars). Aim for 120–160 characters." },
"viewport": null,
"viewportPresent": false,
"charset": "utf-8",
"charsetPresent": true,
"robots": null,
"noindex": false,
"nofollow": false,
"metaRefresh": null,
"canonical": null,
"canonicalTest": { "passed": false, "score": 40, "message": "No canonical tag found." },
"language": "en",
"hreflang": [],
"hasHreflang": false,
"openGraph": { "present": false, "tags": [] },
"twitterCard": { "present": false, "tags": [] },
"searchPreview": {
"title": "Example Domain",
"url": "example.com/",
"description": "This domain is for use in illustrative examples."
},
"allMetaTags": [
{ "name": "viewport", "content": "..." }
]
},
"headings": {
"h1": ["Example Domain"],
"h2": [], "h3": [], "h4": [], "h5": [], "h6": [],
"counts": { "h1": 1, "h2": 0, "h3": 0, "h4": 0, "h5": 0, "h6": 0 },
"test": { "passed": true, "score": 100, "message": "Heading structure is correct: one H1 with proper hierarchy." },
"issues": []
},
"content": {
"wordCount": 42,
"paragraphCount": 2,
"iframeCount": 0,
"strongTagCount": 0,
"hasLoremIpsum": false,
"keywords": {
"topKeywords": [
{ "word": "domain", "count": 4, "density": 9.52 },
{ "word": "example", "count": 3, "density": 7.14 }
],
"cloud": [
{ "word": "domain", "weight": 100 },
{ "word": "example", "weight": 75 }
],
"relatedKeywords": ["domains", "examples", "domaining"]
},
"spellCheck": { "errorCount": 0, "errors": [] }
},
"links": {
"internal": [],
"internalCount": 0,
"external": ["https://www.iana.org/domains/reserved"],
"externalCount": 1,
"nofollowCount": 0,
"averageAnchorLength": 15,
"unsafeCrossOriginLinks": [],
"unsafeCrossOriginCount": 0,
"competitorDomains": ["iana.org"]
},
"images": {
"total": 0,
"withAlt": 0,
"withoutAlt": 0,
"withoutAltList": [],
"altTest": { "passed": true, "score": 100, "message": "All images have alt attributes." },
"modernFormatCount": 0,
"hasModernFormats": false,
"responsiveCount": 0,
"lazyLoadCount": 0,
"aspectRatioIssues": []
},
"technical": {
"robotsTxt": {
"exists": true,
"url": "https://example.com/robots.txt",
"disallowedPaths": [],
"sitemapUrls": [],
"hasDisallowAll": false,
"test": { "passed": true, "score": 100, "message": "robots.txt is accessible and configured correctly." }
},
"sitemap": {
"exists": false,
"sitemapUrl": null,
"pageCount": 0,
"test": { "passed": false, "score": 0, "message": "No sitemap.xml found." }
},
"url": {
"seoFriendly": true,
"length": 19,
"issues": [],
"test": { "passed": true, "score": 100, "message": "URL is SEO-friendly." }
},
"doctype": { "present": true, "type": "HTML5", "test": { "passed": true, "score": 100, "message": "HTML5 DOCTYPE declared." } },
"structuredData": {
"hasJSONLD": false,
"hasMicrodata": false,
"hasRDFa": false,
"hasSchema": false,
"data": []
},
"hasAMP": false,
"custom404": { "exists": true, "test": { "passed": true, "score": 100, "message": "Custom 404 page configured." } },
"noindexTag": false,
"noindexHeader": false
},
"performance": {
"loadTime": 312,
"ttfb": 45,
"domContentLoaded": 180,
"pageSize": 1648,
"htmlSize": 1256,
"domSize": 14,
"compression": { "enabled": true, "type": "gzip", "test": { "passed": true, "score": 100, "message": "GZIP compression is enabled." } },
"serverCaching": { "enabled": true, "cacheControl": "max-age=86400", "etag": "\"abc123\"", "test": { "passed": true, "score": 100, "message": "Server-side caching headers configured." } },
"cdn": { "detected": false, "provider": null, "test": { "passed": false, "score": 40, "message": "No CDN detected." } },
"coreWebVitals": {
"lcp": 285,
"cls": 0,
"fcp": 210,
"ttfb": 45,
"lcpTest": { "passed": true, "score": 100, "message": "LCP is 285ms — Good (≤2.5s)." },
"clsTest": { "passed": true, "score": 100, "message": "CLS is 0.000 — Good (≤0.1)." }
},
"renderBlocking": { "jsCount": 0, "cssCount": 0, "resources": [], "test": { "passed": true, "score": 100, "message": "No render-blocking resources." } },
"resources": { "jsFiles": 0, "cssFiles": 0, "images": 0, "fonts": 0, "total": 0 },
"jsExecutionTime": 12
},
"security": {
"https": { "present": true, "test": { "passed": true, "score": 100, "message": "Site uses HTTPS." } },
"ssl": {
"valid": true,
"issuer": "DigiCert Inc",
"subject": "*.example.com",
"expiresIn": 120,
"validTo": "Oct 2 12:00:00 2024 GMT",
"test": { "passed": true, "score": 100, "message": "SSL certificate is valid (expires in 120 days)." }
},
"hsts": {
"present": true,
"maxAge": 31536000,
"includeSubdomains": true,
"preload": false,
"test": { "passed": true, "score": 100, "message": "HSTS is properly configured." }
},
"mixedContent": { "present": false, "items": [], "count": 0, "test": { "passed": true, "score": 100, "message": "No mixed content detected." } },
"http2": true,
"serverSignature": { "exposed": false, "value": null, "test": { "passed": true, "score": 100, "message": "Server signature not exposing version." } },
"directoryBrowsing": { "enabled": false, "test": { "passed": true, "score": 100, "message": "Directory browsing disabled." } },
"plaintextEmails": { "found": false, "emails": [], "test": { "passed": true, "score": 100, "message": "No plaintext emails found." } },
"safeBrowsing": { "checked": false, "safe": null, "test": { "passed": true, "score": 50, "message": "Safe Browsing check skipped (no API key)." } }
},
"mobile": {
"hasViewport": false,
"viewport": null,
"viewportTest": { "passed": false, "score": 0, "message": "Viewport meta tag is missing." },
"isResponsive": false,
"mediaQueryCount": 0,
"mediaQueryTest": { "passed": false, "score": 20, "message": "No CSS media queries found." },
"hasAppleTouch": false,
"mobileSnapshot": null
},
"analytics": {
"hasGoogleAnalytics": false,
"hasGoogleTagManager": false,
"hasFacebookPixel": false,
"hasHotjar": false,
"analyticsTest": { "passed": false, "score": 40, "message": "No analytics tracking detected." },
"socialLinks": {
"facebook": null,
"twitter": null,
"linkedin": null,
"instagram": null,
"youtube": null
}
},
"domain": {
"name": "example.com",
"length": 11,
"favicon": { "present": false, "url": null, "test": { "passed": false, "score": 40, "message": "No favicon found." } },
"spf": { "present": false, "record": null, "test": { "passed": false, "score": 40, "message": "No SPF DNS record found." } },
"adsTxt": { "exists": false, "valid": null, "test": { "passed": false, "score": 40, "message": "ads.txt not found." } }
},
"errors": {
"jsErrors": [],
"jsErrorTest": { "passed": true, "score": 100, "message": "No JavaScript errors detected." },
"consoleErrors": [],
"consoleErrorTest": { "passed": true, "score": 100, "message": "No console errors detected." },
"deprecatedTags": [],
"nestedTables": 0,
"hasFrameset": false,
"inlineCssCount": 3,
"flash": false
},
"seoScore": {
"total": 61,
"grade": "D",
"breakdown": {
"meta": 47,
"content": 72,
"technical": 65,
"performance": 88,
"security": 79,
"mobile": 23
},
"issues": [
{ "severity": "warning", "category": "meta", "message": "Meta title is too short (14 chars). Aim for 50–60 characters." },
{ "severity": "warning", "category": "meta", "message": "Meta description too short (48 chars). Aim for 120–160 characters." },
{ "severity": "warning", "category": "meta", "message": "No canonical tag found." },
{ "severity": "warning", "category": "meta", "message": "Open Graph meta tags are missing." },
{ "severity": "critical", "category": "mobile", "message": "Viewport meta tag is missing." },
{ "severity": "warning", "category": "technical", "message": "No sitemap.xml found." }
],
"passed": [
{ "category": "technical", "message": "robots.txt is accessible and configured correctly." },
{ "category": "security", "message": "Site uses HTTPS." },
{ "category": "security", "message": "SSL certificate is valid (expires in 120 days)." },
{ "category": "performance", "message": "LCP is 285ms — Good (≤2.5s)." },
{ "category": "performance", "message": "CLS is 0.000 — Good (≤0.1)." }
]
}
}

SEO Score

Each page receives an overall score from 0–100 with a grade (A–F), plus a breakdown across six categories:

CategoryWeightWhat it covers
Meta20%Title, description, canonical, OG, noindex, language
Content15%Headings, word count, image alt text, Lorem ipsum
Technical20%Robots, sitemap, doctype, structured data, 404, deprecated tags
Performance20%LCP, CLS, compression, caching, CDN, minification, render-blocking
Security15%HTTPS, SSL, HSTS, mixed content, server signature, emails
Mobile10%Viewport, media queries, Apple touch icon

Every check also produces a passed / failed status, a 0–100 sub-score, and a human-readable message explaining how to fix any detected issue.


Limits & Notes

  • JavaScript rendering is fully supported via headless Chromium.
  • Core Web Vitals (LCP, CLS, FCP) are measured live using the browser's PerformanceObserver API.
  • Safe Browsing check requires a Google Safe Browsing API key (optional).
  • Spell check currently returns placeholder counts; extend with a dictionary library for full coverage.
  • Backlinks are not checked — this requires a third-party SEO data provider (Ahrefs, Moz, SEMrush).
  • Maximum crawl depth and page count are configurable in the input.