SEO Audit Crawler: On-Page Issues, Broken Links & Score avatar

SEO Audit Crawler: On-Page Issues, Broken Links & Score

Pricing

from $5.00 / 1,000 page auditeds

Go to Apify Store
SEO Audit Crawler: On-Page Issues, Broken Links & Score

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

Mogul Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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 score and issues over time
  • Feeding SEO data to AI agents (works via the Apify MCP server)

What it checks (issue codes)

SeverityCodeWhen
highMISSING_TITLENo <title>
highNOINDEXnoindex in meta robots or X-Robots-Tag
highBROKEN_INTERNAL_LINKSLinks to your own site return 404/410/5xx, have a redirect loop, or the domain doesn't exist
mediumTITLE_TOO_LONGTitle > 60 characters (configurable)
mediumMISSING_META_DESCRIPTIONNo meta description
mediumMISSING_H1 / EMPTY_H1No H1, or it's empty
mediumTHIN_CONTENTMain content < 300 words (configurable)
mediumMULTIPLE_CANONICALSMore than one different canonical URL
mediumMISSING_VIEWPORTNo meta viewport (mobile)
mediumBROKEN_EXTERNAL_LINKSLinks to other sites are dead
mediumNOT_HTTPSPage served over plain HTTP
medium/lowIMAGES_MISSING_ALT<img> without an alt attribute (medium at 5+)
lowTITLE_TOO_SHORT, META_DESCRIPTION_TOO_LONG (> 160), META_DESCRIPTION_TOO_SHORTLength checks (configurable)
lowMULTIPLE_H1, MULTIPLE_TITLES, MULTIPLE_META_DESCRIPTIONSDuplicated tags
lowMISSING_CANONICAL, MISSING_LANG, MISSING_OPEN_GRAPH, INVALID_JSON_LDMissing/invalid tags
lowREDIRECTED, SLOW_RESPONSE (TTFB > 2 s), LARGE_HTML (> 2 MB), NOFOLLOW_PAGE, NO_INTERNAL_LINKSTechnical
infoCANONICALIZED, NO_STRUCTURED_DATAFor 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 planPrice 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.
  • wordCount counts all text in the HTML body, including menus, footers and hidden pop-ups. contentWordCount (used for THIN_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: false or checkBrokenLinks: false to 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.