SEO Audit Tool & Meta Tag Checker: Crawler, Broken Links avatar

SEO Audit Tool & Meta Tag Checker: Crawler, Broken Links

Pricing

from $25.60 / 1,000 audited pages

Go to Apify Store
SEO Audit Tool & Meta Tag Checker: Crawler, Broken Links

SEO Audit Tool & Meta Tag Checker: Crawler, Broken Links

SEO audit tool and SEO crawler: audit every page for technical SEO (status codes, redirect chains, titles, meta descriptions, H1s, canonicals, noindex, alt text, hreflang, Open Graph, JSON-LD). Works as a meta tag checker and broken link checker. Every page gets issues and a 0-100 score.

Pricing

from $25.60 / 1,000 audited pages

Rating

0.0

(0)

Developer

Data Done Right

Data Done Right

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

This SEO audit tool crawls a website the way a search engine does and checks every page for technical SEO problems: HTTP status codes, redirect chains, titles, meta descriptions, H1s, canonicals, noindex, image alt text, hreflang, Open Graph, structured data (JSON-LD) and broken links. Each page comes back as one row with an issues list and a 0-100 score. A site SUMMARY record groups the duplicate titles, the broken links (with the pages that contain them) and the worst pages. It is built for SEO consultants, agencies, developers and site owners who want a repeatable technical SEO audit they can schedule, export to CSV/Excel or plug into their own tools through the API.

What does this SEO audit check?

For every crawled page:

AreaWhat you getIssues it can raise
HTTPstatusCode, full redirectChain, responseTimeMs, pageSizeByteshttp-4xx, http-5xx, fetch-failed, redirect-loop, redirected, redirect-chain, slow-response, large-html
Titletitle, titleLengthtitle-missing, title-too-long (>60), title-too-short (<30), title-multiple, title-duplicate
Meta descriptionmetaDescription, metaDescriptionLengthmeta-description-missing, -too-long (>160), -too-short (<70), -multiple, -duplicate
Headingsh1, h1Count, headings outlineh1-missing, h1-multiple, heading-level-skipped
Indexingcanonical, canonicalIsSelf, robotsMeta, xRobotsTag, indexable, noindexnoindex, nofollow, canonical-missing, canonical-elsewhere, canonical-multiple, meta-refresh
ContentwordCount, lang, viewportthin-content (<200 words), html-lang-missing, viewport-missing
ImagesimagesCount, imagesMissingAlt, samplesimages-missing-alt
LinksinternalLinks, externalLinks, nofollowLinks, inlinks, brokenLinks, redirectedLinksbroken-internal-links, broken-external-links, redirected-links
Internationalhreflang listhreflang-invalid
SocialopenGraph, twitterCardopen-graph-missing, twitter-card-missing
Structured datastructuredDataTypes (JSON-LD @types, @graph included), structuredDataErrors, microdataTypesstructured-data-invalid
SecuritymixedContent (HTTP resources on an HTTPS page)mixed-content

Duplicate titles and descriptions are compared across the whole crawl. Pages that are noindex or canonicalized to another URL are left out of the duplicate groups, because they are not competing in search.

Page score: 100 minus a fixed penalty for each distinct issue type (error 15, warning 6, notice 2). A page that returns 4xx/5xx or cannot be fetched scores 0.

How to do an SEO audit of a website

  1. Enter the Website URL (usually your home page).
  2. Set Max pages to audit (start with 100) and, if you like, turn on Also audit pages from the sitemap so pages that nothing links to are found too.
  3. Turn on Check external links if you also want outgoing links checked.
  4. Run it. Open the dataset to see one row per page (worst pages first), and the SUMMARY record in the key-value store for the site overview.
  5. Export to CSV, Excel or JSON, or schedule the run weekly to catch new problems.

The crawl already knows the status of every page it visits. In addition, with Check internal links that were not crawled (on by default), every other internal link (pages beyond the page or depth limit, PDFs, images that are linked) gets a quick HEAD request (GET if the server refuses HEAD). With Check external links, each unique outgoing URL is checked once, too. You get:

  • brokenLinks on each page row: the URL, status code or error (timeout, DNS, connection) and anchor text.
  • brokenLinks in SUMMARY: every broken URL with foundOnCount and up to 20 foundOn pages, internal links first.
  • redirectedLinks: links that point to a redirect instead of the final URL, with the final URL and number of hops.
  • External sites that refuse bots (401, 403, 429, 999) are listed as restrictedLinks, not as broken, to avoid false alarms.

Website SEO checker with a score for every page

Every page gets a 0-100 SEO score and a plain list of its issues (missing meta description, duplicate title, broken links, redirect chain, noindex...). Sort by score to see the worst pages first.

SEO audit tool for agencies

Run it for each client site, schedule it monthly, and export to CSV, Excel or Google Sheets for your report. You can also call it from the Apify API, Make, Zapier or n8n.

Use it in Claude, ChatGPT and Cursor

Connect Apify's MCP server (mcp.apify.com) and your AI assistant can audit a site itself. For example: "audit example.com and list the 10 worst SEO problems." The only required input is startUrl.

Input example

{
"startUrl": "https://docs.apify.com/",
"maxPages": 100,
"maxDepth": 10,
"useSitemap": true,
"checkLinks": true,
"checkExternalLinks": true,
"maxLinkChecks": 1000,
"excludeUrlPatterns": ["/tag/", "?sort="],
"reportPages": "all"
}

reportPages can be all, issues (any issue), warnings (warnings or errors) or errors. You pay only for the pages returned; the SUMMARY always covers every audited page.

Output example

One dataset row per page (shortened, from a real run):

{
"url": "https://docs.apify.com/api",
"statusCode": 200,
"score": 74,
"issueCount": 7,
"errors": 0,
"warnings": 3,
"notices": 4,
"issues": [
{"type": "meta-description-missing", "severity": "warning", "message": "No meta description."},
{"type": "images-missing-alt", "severity": "warning", "message": "Images without an alt attribute.", "detail": 7},
{"type": "title-duplicate", "severity": "warning", "message": "Same title as other pages on the site.", "detail": "2 pages share it"},
{"type": "redirected-links", "severity": "notice", "message": "Links that point to a redirect instead of the final URL.", "detail": 1}
],
"title": "Apify Documentation",
"titleLength": 19,
"metaDescription": null,
"h1": ["Apify API documentation"],
"canonical": "https://docs.apify.com/api",
"canonicalIsSelf": true,
"indexable": true,
"wordCount": 511,
"responseTimeMs": 41,
"pageSizeBytes": 56631,
"redirectChain": [],
"inlinks": 9,
"internalLinks": 27,
"externalLinks": 24,
"brokenLinksCount": 0,
"redirectedLinks": [{"url": "https://docs.apify.com/cli", "finalUrl": "https://docs.apify.com/cli/docs", "hops": 1, "status": 200, "internal": true}],
"imagesMissingAlt": 7,
"hreflang": [{"lang": "en", "href": "https://docs.apify.com/api"}, {"lang": "x-default", "href": "https://docs.apify.com/api"}],
"openGraph": {"title": "Apify Documentation", "image": "https://apify.com/og-image/docs-article"},
"twitterCard": {"card": "summary_large_image"},
"structuredDataTypes": [],
"mixedContent": []
}

The SUMMARY record (key-value store) looks like this:

{
"site": "docs.apify.com",
"pagesAudited": 10,
"averageScore": 89.7,
"pagesWithErrors": 1,
"pagesAffectedByIssue": {"redirected-links": 10, "heading-level-skipped": 8, "images-missing-alt": 3, "broken-internal-links": 1},
"worstPages": [{"url": "https://docs.apify.com/api", "score": 74, "issues": ["meta-description-missing", "images-missing-alt"]}],
"duplicateTitles": [{"value": "Apify Documentation", "count": 2, "pages": ["https://docs.apify.com/api", "https://docs.apify.com/"]}],
"duplicateMetaDescriptions": [],
"brokenLinksCount": 1,
"brokenLinks": [{"url": "https://docs.apify.com/residential_proxy", "status": 404, "internal": true, "foundOnCount": 1, "foundOn": ["https://docs.apify.com/proxy"]}],
"redirectedLinksCount": 6,
"stoppedBecause": "maxPages (10) reached; 127 more URLs were queued"
}

Problems that did not stop the run (robots.txt unreachable, unreadable sitemap) are listed in notes and in a NOTES record.

How the crawler behaves

  • Same site only. It follows links on the start URL's host. www and non-www count as one site; subdomains only when you turn on Include subdomains. If the start URL redirects (http to https, or to a new domain), the final host becomes the site.
  • Respects robots.txt. It identifies itself as SEOAuditBot (User-Agent Mozilla/5.0 (compatible; SEOAuditBot/1.0; Apify SEO Audit Tool actor; honors robots.txt)), skips disallowed URLs (also when a redirect points into them), honors Crawl-delay up to 10 s, and does not follow links from pages marked nofollow. If robots.txt itself returns a 5xx error or cannot be reached, the site is treated as disallowed (RFC 9309) and the run says so. External link checks are single requests to each linked URL, like a visitor clicking the link; they do not crawl other sites.
  • Polite by default. 5 parallel requests (adjustable 1 to 10), at most 2 at a time to any external host, one retry on timeouts, 429 and 503.
  • Caps that also cap cost: Max pages, Max link depth, Max link checks.

How much does it cost

Pay per event, platform usage included:

  • page: $0.032 per audited page returned ($32 per 1,000 pages). Internal link checks are included.
  • external-link-check: $0.0008 per unique external URL checked ($0.80 per 1,000), only when Check external links is on.

Example: a 500-page site with 2,000 unique external links costs 500 x $0.032 + 2,000 x $0.0008 = $17.60. When the run's spending limit is near, the actor lowers the page count up front and stops external checks before they would eat into the pages you will receive.

Use cases

  • Technical SEO audit for a client site before a proposal or a migration.
  • Weekly broken link check on a schedule, exported to Google Sheets or Slack.
  • Pre-launch QA: catch noindex left on, missing canonicals, staging links and mixed content.
  • Content clean-up: thin pages, duplicate titles and meta descriptions, missing H1s and alt text.
  • Agencies and developers: call it through the Apify API and feed the JSON into your own reports.

FAQ

What is a technical SEO audit?

A check of the things that decide whether search engines can crawl, index and understand a site: status codes, redirects, canonicals, robots directives, titles, descriptions, headings, structured data, hreflang and internal links. That is exactly what this actor reports, page by page.

How much does an SEO audit cost?

A manual audit by an agency or consultant is priced by the hour or by the project. The crawl-and-check part costs $0.032 per page here, so a 200-page site is $6.40. You still need a person to decide which fixes matter most.

Is there a free SEO audit tool?

Apify's free plan includes $5 of platform credit every month. That covers a full audit of about 150 pages at $0.032 per page.

How do I check my website's SEO score?

Enter your home page URL and run. Each page row has a score from 0 to 100 and its list of issues, and the run summary gives the site-wide totals.

They request every linked URL and read the HTTP status. A 4xx or 5xx status, a timeout or a DNS failure means the link is broken. This tool sends a HEAD request and falls back to GET when a server refuses HEAD, which avoids most false alarms.

Mostly. Some sites (LinkedIn, some shops behind bot protection) answer automated requests with 403, 429 or 999 even though the page works in a browser. These are reported separately as restrictedLinks rather than as broken.

Does it render JavaScript?

No. It reads the HTML the server sends, like most SEO crawlers in their default mode. Sites that build their content only in the browser (some single-page apps) will show few links and thin content. Server-rendered and static sites (most WordPress sites, docs sites and server-rendered frameworks) work well.

Can I audit a site that blocks crawlers in robots.txt?

No. Disallowed URLs are skipped and listed as skipped. To audit your own staging site, allow SEOAuditBot in its robots.txt.

Limits

  • One website per run (run it several times or schedule it for more sites).
  • No JavaScript rendering, no login-protected pages, no Core Web Vitals (see the PageSpeed tool below).
  • HTML larger than 5 MB is read only up to 5 MB.
  • Results are written when the crawl ends (duplicate titles and broken links need the whole site). If the run's timeout is near, the crawl stops early on its own and still delivers what it audited (stoppedBecause says so). A run you abort by hand returns nothing.
  • Images are counted and checked for alt text, but image URLs are not link-checked unless they are linked with <a href>.
  • Sitemap Extractor: All URLs + New Pages Monitor: export every URL from a site's sitemaps and get only new pages on later runs.
  • Bulk PageSpeed & Core Web Vitals Checker: Lighthouse scores and Core Web Vitals for a list of URLs.
  • Keyword Suggestions Tool: Google, YouTube, Amazon, Bing: find the keywords to target once the technical issues are fixed.