At a glance
What the Broken Link Crawler & SEO Audit does
- Audit
- One site per run, up to 2,000 pages, plus its XML sitemap
- Checks
- Status, redirects, title and meta length, H1, canonical, noindex, broken links, alt text, size, response time
- Output
- 33 fields per page row plus a ranked summary row; JSON, CSV, Excel, API
- Automate
- Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents
Who it is for
- SEO agencies running a technical audit before a client pitch
- Site owners scheduling a weekly check for broken links and new 404s
- Developers checking redirects, canonicals and noindex after a migration
- Content teams finding missing titles, meta descriptions and H1s
Output
What you get
- One 'page' row per audited URL with 30+ fields, including the issue codes on that page, most severe first
- broken_links: [{url, status_code, error}] per page, plus counts of broken and unverified links
- in_sitemap per page and sitemap problems
- One 'summary' row: pages audited, health score, status code counts, average response time, sitemap stats and issues ranked [{issue, severity, description, pages, examples}]
Example
Input and output
Input
{
"siteUrl": "https://books.toscrape.com",
"maxPages": 200,
"useSitemap": true,
"checkExternalLinks": true,
"maxLinkChecks": 500
}One output record
{
"record_type": "page",
"url": "https://docs.python.org/3/",
"final_url": "https://docs.python.org/3/",
"status_code": 200,
"redirect_count": 0,
"redirects": [],
"error": null,
"content_type": "text/html",
"response_time_ms": 4,
"page_size_bytes": 19632,
"crawl_depth": 0,
"in_sitemap": true,
"title": "Python 3.15.2 documentation",
"title_length": 27,
"meta_description": "The official Python documentation.",
"meta_description_length": 34,
"h1_count": 1,
"h1": "Python 3.15.2 documentation",
"canonical_url": "https://docs.python.org/3/index.html",
"noindex": false,
"nofollow": false,
"language": "en",
"word_count": 526,
"internal_links_count": 44,
"external_links_count": 12,
"images_count": 3,
"images_missing_alt_count": 0,
"broken_links_count": 0,
"broken_links": [],
"unchecked_links_count": 25,
"issues": [
"duplicate_title",
"canonical_to_other_url",
"duplicate_meta_description",
"… 2 more"
],
"source_url": "https://docs.python.org/3/",
"scraped_at": "2026-11-04T07:48:53Z"
}From a real run of this tool; long text and lists shortened here.
How to use it
Three steps
- Enter the site URL, e.g. https://www.example.com, and set Max pages.
- Keep 'Read the XML sitemap' and 'Check external links' on for a full audit, or turn them off for a quick on-page check.
- Click Start, open the summary row for the ranked issues, then filter the page rows by issue code. Download JSON, CSV or Excel, or schedule it weekly.
API
Call it from Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("aurelix/seo-audit-crawler").call(run_input={'siteUrl': 'https://books.toscrape.com',
'maxPages': 200,
'useSitemap': True,
'checkExternalLinks': True,
'maxLinkChecks': 500})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)pip install apify-client. The same input works from the Apify console, a schedule, Make, n8n, Zapier or an AI agent through the Apify MCP server.
Pricing
Pay per result
| Per 1,000 pages, free plan | $2.50 |
| Per 1,000 pages, paid plans | $1.75 |
| Start fee per run | $0.001 |
Live prices from the Apify Store; no subscription and no platform usage billed on top. See the Store page.
Honest limits
What it does not do
- One host per run: www. and the bare domain count as one site; other subdomains are not crawled (their links are checked as external).
- At most two requests per second per site, slower with a robots.txt Crawl-delay; up to 2,000 pages per run (about 1,100 pages an hour, so a full 2,000-page audit takes nearly 2 hours; raise the run timeout accordingly).
- No JavaScript rendering and no Core Web Vitals or Lighthouse scores; response time is the time to download the page (headers and body) from Apify's servers, and any page over 80 ms is re-timed alone at the end so the crawler's own load never counts as a slow server.
- Link checks are capped by 'Max extra link checks' (internal links first); links over the cap are counted as not checked.
- Duplicate titles and descriptions are compared only across the pages audited in the run, ignoring noindex pages.
- HTML pages over 2 MB are skipped (not charged) to keep memory low; they are listed in the summary.
FAQ
Questions buyers ask
How much does the Broken Link Crawler & SEO Audit cost?
$2.50 per 1,000 pages ($1.75 on paid Apify plans), billed through your Apify account; you pay only for results. Apify's free plan includes $5 of credit a month, enough for about 2,000 pages.
What counts as an audited page?
Each crawled HTML page on the site that returned an HTTP status, including redirects and 404s, because those are findings too. Free: URLs blocked by robots.txt, URLs that could not be loaded at all (timeout, dead connection), non-page files such as PDF, image or JSON (listed in the summary), pages the site throttles with HTTP 429 even after retries with backoff (listed in the summary and named in the status message) and pages over 2 MB (skipped with a log line).
Which issues are checked?
High: 5xx, 4xx, unreachable pages, broken links, missing title. Medium: noindex, bad sitemap URLs, missing H1, missing meta description, duplicate titles, redirect chains, responses over 1 s, images without alt. Low: canonical to another URL, duplicate descriptions, title over 60 or under 30 characters, description over 160 or under 70, multiple H1s, missing canonical, under 200 words, HTML over 1 MB, single redirects, indexable pages missing from the sitemap.
Does it respect robots.txt?
Always, and it cannot be switched off. Disallowed pages are not requested and are counted in the summary; external links are checked only where that site's robots.txt allows it.
Why is a link 'unverified' rather than broken?
Many sites answer automated checks with 401, 403 or 429 even when the page works in a browser. Those are counted as unverified so the broken list holds only real 404/410, 5xx and dead-host links.
Does it render JavaScript?
No. It audits the HTML the server sends, which is what search engines index first. Links injected only by JavaScript are not discovered.
Can I use it from an AI assistant?
Yes. Give 'siteUrl' and optionally 'maxPages'. It works through Apify's MCP server and API.
Is this legal?
It reads only public data any logged-out visitor can see: the website you choose (crawl only sites you have the right to crawl, such as your own or a client's). It goes at a polite pace, respects robots.txt, never logs in and never solves CAPTCHAs. It returns technical SEO fields per page (status, titles, headings, links, issues); no personal data is extracted. To have a record removed, open an issue on this Actor's Issues tab; if a site owner formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.
What is the health score?
The share of audited pages, from 0 to 100, that have no high or medium issue. Low issues, such as a title a little too long, do not lower it. It is in the summary row and in the run's status message.
What am I charged when the site is down or blocks the crawl?
Only the $0.001 start fee. URLs blocked by robots.txt are counted in the summary, pages that could not be loaded come back as free rows with an error, and the summary row is always free. Only page rows with an HTTP status are charged.
How are pages found?
From the site URL and, with Read the XML sitemap on, from the sitemaps named in robots.txt or at /sitemap.xml (sitemap indexes and .gz files included, up to 25 sitemap files). Links on crawled pages are then followed within the same host until Max pages is reached.
What exactly is response_time_ms?
The time to download the page, headers and body, from Apify's servers. Requests are timed one at a time, and up to 100 rows over 80 ms are re-timed alone after the crawl, so the crawler's own load does not show up as a slow server. A page over 1 second gets the slow_response issue.
What does Max extra link checks cover?
Requests for links that were not crawled as pages: external links, files and internal pages beyond Max pages. Internal links are checked first. Links over the cap are counted in unchecked_links_count, not reported as fine or broken. Set it to 0 to rely only on the status of crawled pages.
How long does an audit take?
About 1,100 pages an hour at two requests a second. If the run timeout comes near, the run stops crawling early, still checks links, saves every page row and the summary, ends SUCCEEDED and says it stopped early.
Can I track progress after fixing issues?
Yes. Save the input as a task, schedule it weekly or monthly, and compare the summary rows: health_score and the pages count of each issue. There is no built-in diff between runs.
How do I export pages to Google Sheets?
Download the run's results as CSV or Excel and open them in Google Sheets, or add Apify's Google Sheets integration to the run or a schedule so every run's results land in a sheet.
Guides
Tutorials using this tool
Related
Related tools
Google Trends by Region
Google Trends interest over time, by region and rising queries for any number of keywords, plus trending searches.
Website to Markdown API
Crawls a site and returns one row of clean main-content Markdown per page, with title, headings and links.
PDF Table Extraction
Turns linked PDF and Word files into Markdown per page, with tables as JSON rows, RAG chunks and OCR.
Try the Broken Link Crawler & SEO Audit
Open it on the Apify Store, paste the example input above and click Start. Results download as CSV, Excel or JSON.