SEO Audit Crawler: On-Page Issues, Broken Links & Score
Pricing
from $5.00 / 1,000 page auditeds
SEO Audit Crawler: On-Page Issues, Broken Links & Score
Crawl any website and audit every page for SEO: title, meta description, H1, canonical, noindex, hreflang, Open Graph, schema, word count, missing alt, broken links, plus issues and a 0-100 score. Fast HTTP, no browser. Pay only per page audited.
Pricing
from $5.00 / 1,000 page auditeds
Rating
0.0
(0)
Developer
Mogul Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
SEO Audit Crawler: On-Page Issues, Broken Links & Score per Page
Crawl any website and get a full on-page SEO audit for every page: title and meta description (with lengths), H1/H2 headings, canonical, noindex (meta robots and X-Robots-Tag), hreflang, Open Graph and Twitter cards, JSON-LD schema types, word count, images missing alt text, internal/external links, broken links, redirect chains, response time and page size. Each page gets a ready-to-use issues list with severity and a simple 0-100 score. You also get a free site summary row with average score, issue totals, duplicate titles and descriptions, and every broken link with the page it was found on.
It uses fast HTTP requests instead of a headless browser, so it's quick and cheap. In our tests, 60 pages from 3 sites were audited in 8 seconds without link checks, or about 4 minutes when it also checked 1,550 unique links.
You only pay for pages that were actually audited. 404s, timeouts, anti-bot pages, non-HTML files, robots.txt-blocked URLs and the summary rows are free.
What you can use it for
- SEO audits for clients or your own sites, exported to CSV/Excel/Google Sheets
- Broken link and redirect clean-up
- Finding missing or duplicate titles and meta descriptions, missing H1s, thin pages, images without alt text
- Checking noindex / canonical / hreflang setup after a migration or redesign
- Scheduled monitoring: run weekly and compare
scoreandissuesover time - Feeding SEO data to AI agents (works via the Apify MCP server)
What it checks (issue codes)
| Severity | Code | When |
|---|---|---|
| high | MISSING_TITLE | No <title> |
| high | NOINDEX | noindex in meta robots or X-Robots-Tag |
| high | BROKEN_INTERNAL_LINKS | Links to your own site return 404/410/5xx, have a redirect loop, or the domain doesn't exist |
| medium | TITLE_TOO_LONG | Title > 60 characters (configurable) |
| medium | MISSING_META_DESCRIPTION | No meta description |
| medium | MISSING_H1 / EMPTY_H1 | No H1, or it's empty |
| medium | THIN_CONTENT | Main content < 300 words (configurable) |
| medium | MULTIPLE_CANONICALS | More than one different canonical URL |
| medium | MISSING_VIEWPORT | No meta viewport (mobile) |
| medium | BROKEN_EXTERNAL_LINKS | Links to other sites are dead |
| medium | NOT_HTTPS | Page served over plain HTTP |
| medium/low | IMAGES_MISSING_ALT | <img> without an alt attribute (medium at 5+) |
| low | TITLE_TOO_SHORT, META_DESCRIPTION_TOO_LONG (> 160), META_DESCRIPTION_TOO_SHORT | Length checks (configurable) |
| low | MULTIPLE_H1, MULTIPLE_TITLES, MULTIPLE_META_DESCRIPTIONS | Duplicated tags |
| low | MISSING_CANONICAL, MISSING_LANG, MISSING_OPEN_GRAPH, INVALID_JSON_LD | Missing/invalid tags |
| low | REDIRECTED, SLOW_RESPONSE (TTFB > 2 s), LARGE_HTML (> 2 MB), NOFOLLOW_PAGE, NO_INTERNAL_LINKS | Technical |
| info | CANONICALIZED, NO_STRUCTURED_DATA | For your information, no score penalty |
Score = 100 − 20 per high, 10 per medium, 4 per low issue (minimum 0).
Broken links: every link on an audited page is checked once per run (HEAD, then a GET to confirm before anything is reported). Responses like 401/403/429/999 and social networks blocking bots (Facebook, LinkedIn, Instagram, X…) are counted as linksRestricted, not broken, so you don't get false alarms. Turn link checking off (checkBrokenLinks: false) for the fastest crawl, or limit it to internal links only.
Input example
{"startUrls": ["https://www.example.com/"],"maxCrawlDepth": 3,"maxPages": 500,"crawlScope": "sameHostname","useSitemaps": true,"checkBrokenLinks": true,"checkExternalLinks": true}
Output example (one row per audited page)
{"rowType": "page","url": "https://react.dev/versions","statusCode": 200,"finalUrl": "https://react.dev/versions","redirectChain": [],"score": 90,"issueCount": 1,"issues": [{ "severity": "medium", "code": "MISSING_META_DESCRIPTION", "message": "Page has no meta description." },{ "severity": "info", "code": "NO_STRUCTURED_DATA", "message": "No JSON-LD or microdata structured data found." }],"title": "React Versions – React","titleLength": 22,"metaDescription": null,"metaDescriptionLength": 0,"h1": ["React Versions"],"h1Count": 1,"h2Count": 4,"canonicalUrl": "https://react.dev/versions","isCanonical": true,"robotsMeta": null,"xRobotsTag": null,"indexable": true,"hreflang": [],"openGraph": { "title": "React Versions – React", "description": "The library for web and native user interfaces", "image": "https://react.dev/images/og/versions.png", "url": "https://react.dev/versions", "type": "website" },"twitterCard": { "card": "summary_large_image", "title": "React Versions – React", "description": "The library for web and native user interfaces", "image": "https://react.dev/images/og/versions.png" },"schemaTypes": [],"wordCount": 1394,"contentWordCount": 1286,"imageCount": 1,"imagesMissingAltCount": 0,"internalLinkCount": 38,"externalLinkCount": 105,"brokenLinkCount": 0,"brokenLinks": [],"linksChecked": 143,"linksRestricted": 1,"linksUnchecked": 0,"responseTimeMs": 151,"pageSizeBytes": 234309,"charged": true,"crawledAt": "2026-10-22T13:30:00.000Z"}
A page with dead links lists them like this:
"brokenLinks": [{ "url": "https://httpbin.org/status/404", "statusCode": 404, "error": "HTTP 404", "internal": true },{ "url": "https://books.toscrape.com/missing-page.html", "statusCode": 404, "error": "HTTP 404", "internal": false }]
Free rows: rowType: "error" or "skipped" (404, 5xx, timeout, anti-bot page, non-HTML, robots.txt) carry statusCode, errorCode and error. One free rowType: "summary" row per site has averageScore, issueCounts, duplicateTitles, duplicateDescriptions, brokenLinks (with foundOn), failedUrls and lowestScoringPages. The RUN_SUMMARY record in the key-value store has the run totals.
Pricing (pay per event)
You pay per page audited: an HTML page that returned HTTP 2xx and got the full audit, including the link check if it's on.
| Apify plan | Price per 1,000 pages |
|---|---|
| Free | $8.00 |
| Bronze (Starter) | $7.00 |
| Silver (Scale) | $6.00 |
| Gold (Business) | $5.00 |
Link checks, failed URLs and summary rows are never charged. Platform usage (compute, storage) is included; you don't pay it separately. Each run also has Apify's standard start fee of $0.00005 per GB of memory. Optional Apify datacenter proxy (or your own proxy URLs) is included in the price; residential proxy isn't supported. Set Max total charge on the run to cap your spend; the run stops cleanly when it's reached, without storing unpaid results.
Features
- Crawling: depth limit, page limit, scope (same path / hostname / domain), include/exclude regex, optional sitemap discovery (robots.txt, sitemap indexes, .gz)
- Polite by default: respects robots.txt and Crawl-delay, per-host delay, retries with backoff and Retry-After
- Fair crawling across multiple start URLs (one big site can't starve the others)
- Full redirect chain per page, including broken https→http redirects
- Configurable thresholds for title, description, thin content and slow response
- Refuses private/internal addresses
Limitations
- No JavaScript rendering. The audit sees the HTML the server sends, like a basic crawler. Tags that are only added by JavaScript (some SPAs, client-side SEO plugins) are reported as missing.
wordCountcounts all text in the HTML body, including menus, footers and hidden pop-ups.contentWordCount(used forTHIN_CONTENT) uses<main>, or the body without nav/header/footer/dialogs.- Link checking is polite (same per-host delay), so sites with hundreds of unique links per page take longer. Use
maxLinkChecks,checkExternalLinks: falseorcheckBrokenLinks: falseto speed up. Links that time out are reported as unchecked, not broken. - No Core Web Vitals / Lighthouse scores, keyword rankings or backlink data.
- Sites with strong bot protection (Cloudflare challenge, Akamai) may block requests; those pages are free. Enabling Apify datacenter proxy sometimes helps.
Responsible use
Only crawl sites you are allowed to audit. robots.txt is respected by default.