SEO Audit Tool: Site Crawler, Broken Links & Score
Pricing
from $4.20 / 1,000 page auditeds
SEO Audit Tool: Site Crawler, Broken Links & Score
SEO audit tool that crawls your site and scores every page 0-100. Finds broken links, redirect chains, missing titles and meta descriptions, canonical, hreflang and JSON-LD errors, with a fix hint for each issue.
Pricing
from $4.20 / 1,000 page auditeds
Rating
0.0
(0)
Developer
Rod Services
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
SEO audit tool and site crawler: find broken links, redirect chains, missing titles, meta descriptions, canonical, hreflang and JSON-LD errors. Every page gets a 0-100 SEO score and every issue comes with a fix hint, plus one site score for the whole crawl. $6 per 1,000 pages, no API key needed.
What you get
- A 0-100 SEO score per page and a site score in the run summary, so you know where to start.
- A fix hint for every issue, for example "Shorten the title to 60 characters or less so Google does not cut it off."
- Broken link checker: internal links that return 404, 410, 5xx or a network error, with the page they are on.
- Redirect checker: full redirect chains, hop counts and redirect loops.
- On-page checks: title and meta description length and duplicates, H1 count, canonical tag, noindex signals, hreflang return links, JSON-LD parse errors, images without alt text, mixed content, Open Graph tags, word count and orphan pages.
- Two modes: crawl a whole site from one start URL, or check a list of URLs for status and redirects only, at $0.50 per 1,000 URLs.
- Apify platform extras: run it on a schedule, call it from the API, get results as JSON, CSV or Excel, and connect it to Make, Zapier, n8n or Google Sheets.
Quick start
- Click Try for free. The input is prefilled with a 20-page crawl of the Apify Academy docs.
- Change Start URL to your own site and set Max pages.
- Click Start. A 20-page audit takes about 30 seconds.
- Open the Output tab. The Overview view shows the score per page. The Issues view lists one row per issue with its fix.
- Open the
SUMMARYrecord in the key-value store for the site score, the top issues and the lowest-scoring pages.
Input example
Crawl a site:
{"mode": "crawl","startUrl": "https://docs.apify.com/academy","maxPages": 20}
Check a list of URLs for status codes and redirects, for example after a site migration:
{"mode": "urlList","urlList": ["http://apify.com", "https://apify.com/pricing", "https://apify.com/this-page-does-not-exist"]}
| Field | What it does | Default |
|---|---|---|
mode | crawl = full SEO audit of a site. urlList = status and redirect check of a URL list | crawl |
startUrl | Crawl mode: where the crawl starts. Same-site links and the XML sitemap are followed | prefill: Apify Academy |
urlList | URL list mode: the URLs to check | [] |
maxPages | Maximum pages to audit or URLs to check | 20 |
respectRobotsTxt | Skip pages that robots.txt disallows | true |
includeGlobs / excludeGlobs | Limit the crawl, for example to https://example.com/blog/** | [] |
maxConcurrency | Pages processed at the same time | 5 |
requestTimeoutSecs | Timeout per request | 30 |
userAgent | User agent for requests and robots.txt rules | SeoSiteAuditBot |
proxyConfiguration | No proxy, Apify datacenter proxy or your own proxy URLs | no proxy |
Output sample
One dataset item per page. Shortened:
{"url": "https://docs.apify.com/sdk","seoScore": 80,"finalUrl": "https://docs.apify.com/sdk","mode": "crawl","statusCode": 200,"redirectCount": 0,"responseTimeMs": 232,"title": "Apify Documentation","titleLength": 19,"metaDescriptionLength": null,"h1Count": 1,"canonicalStatus": "self","indexable": true,"brokenLinkCount": 0,"issueCount": 4,"errorCount": 0,"warningCount": 2,"issues": [{"severity": "warning","code": "meta-description-missing","message": "Page has no meta description","fix": "Add a meta description of 50-160 characters that sums up the page."},{"severity": "warning","code": "duplicate-title","message": "Title is the same as on 2 earlier page(s), first seen on https://docs.apify.com/api","fix": "Give each page a unique title that describes its own content."},{"severity": "notice","code": "title-too-short","message": "Title is 19 characters (recommended >= 30)","fix": "Expand the title to 30-60 characters and include the main keyword."},{"severity": "notice","code": "image-missing-alt","message": "4 image(s) are missing an alt attribute","fix": "Add descriptive alt text to content images. Use alt=\"\" for decorative images."}]}
The SUMMARY record in the key-value store, shortened:
{"siteScore": 95,"averagePageScore": 96,"siteScoreDeductions": [{ "reason": "1 group(s) of pages share the same title", "points": 1 }],"pagesByScoreBand": { "good": 17, "needsWork": 3, "poor": 0, "critical": 0 },"lowestScoringPages": [{ "url": "https://docs.apify.com/sdk", "seoScore": 80, "errorCount": 0, "warningCount": 2 }],"topIssues": [{"code": "meta-description-missing","severity": "warning","pages": 4,"fix": "Add a meta description of 50-160 characters that sums up the page."}],"pagesChecked": 20,"complete": true,"issuesByCode": { "meta-description-missing": 4, "duplicate-title": 3, "image-missing-alt": 3 },"duplicateTitles": [{ "value": "...", "count": 3, "urls": ["..."] }],"orphanPageUrls": [],"brokenInternalLinks": 0}
You can download the dataset as JSON, CSV, Excel, HTML or XML.
How the SEO score works
The score is simple and the same input always gives the same score.
- Page score: start at 100. Subtract 20 for each error, 8 for each warning and 2 for each notice. Each issue code counts once per page, so 30 images without alt text cost 2 points, not 60. A page that cannot be indexed at all scores 0: failed request, no response, HTTP 4xx or 5xx, a redirect loop or too many redirects.
- Site score: the average page score, minus small site-level deductions in crawl mode. Each one is capped at 5 points: duplicate title groups, duplicate meta description groups, orphan sitemap pages and broken internal links (1 point each), no robots.txt (2) and no XML sitemap (3). Non-HTML files such as PDFs are not scored.
- Bands: good 90-100, needs work 70-89, poor 50-69, critical 0-49.
The score is a prioritization aid for technical SEO. It does not measure content quality, backlinks or rankings.
Main fields
| Field | Meaning |
|---|---|
seoScore | 0-100 page score, see above |
statusCode / finalStatusCode | Status of the first request and after redirects |
redirectChain | Every hop: URL, status, Location and time |
canonicalStatus | self, other, missing, invalid or broken |
hreflang | Each alternate with returnLink: true/false/null |
brokenLinks | Internal links on this page with an error or restricted status |
inlinks | Internal links to this page found by the time the row was saved |
isOrphan | null when not decided yet, final list in SUMMARY.orphanPageUrls |
issues | { severity, code, message, fix } for every finding |
The full field list with descriptions is in the dataset schema on the Output tab and in the API.
Pricing
Pay per event. You pay for pages audited, not for compute time. Paid Apify plans get tier discounts.
| Event | FREE plan | BRONZE | SILVER | GOLD |
|---|---|---|---|---|
| Page audited, crawl mode, per 1,000 | $6.00 | $5.40 | $4.80 | $4.20 |
| URL checked, URL list mode, per 1,000 | $0.50 | $0.45 | $0.40 | $0.35 |
| Run start, once per run | $0.001 | $0.001 | $0.001 | $0.001 |
Examples on the FREE plan: a 100-page audit costs about $0.60. A 1,000-page audit costs about $6. Checking 1,000 URLs costs about $0.50. Set Maximum cost per run in the run options and the audit stops at that budget, keeping every page it already audited. Input mistakes cost only the $0.001 start fee.
FAQ
How do I find all broken links on my website?
Run crawl mode with your homepage as Start URL and a Max pages value that covers the site. Then filter the Issues view by the code broken-internal-link. Each row shows the page with the broken link, and brokenLinks lists the dead URLs and their status codes.
How do I check redirect chains for a list of old URLs?
Use URL list mode and paste the old URLs. Each row shows redirectCount, the full redirectChain, the final URL and status. Chains of 3 or more hops are flagged, and so are loops.
What is a good SEO score?
90 or more means only minor notices are left. 70-89 means there are warnings to fix, often missing meta descriptions or long titles. Below 50 usually means errors such as broken pages, missing titles or broken links. Start with the topIssues list in SUMMARY. It is sorted by impact.
Does it change anything on my website?
No. It only sends read-only GET and HEAD requests. It never submits forms or logs in.
Does it respect robots.txt?
Yes, by default. Pages that robots.txt disallows for the crawler user agent are not fetched. You can switch this off for a staging site you own.
Does it check external links?
It checks internal links only, on the same site. External links are counted but not fetched, which keeps runs fast and cheap.
Can I audit a site that blocks bots?
Some sites block unknown crawlers. Try Apify datacenter proxy or your own proxy URLs in Proxy configuration. Residential and SERP proxies are not supported. Links that return 401, 403 or 429 are reported as restricted, not broken.
What happens if a run times out or I stop it?
Pages are saved in batches of 25 while the crawl runs. A timeout, abort or platform migration keeps everything audited so far, and the run never charges the same page twice. An aborted run still writes a partial SUMMARY.
Why are only later pages flagged as duplicates?
Pages are saved during the crawl, so the first page with a given title is saved before the second one is found. Later pages get a duplicate-title or duplicate-meta-description warning naming the first page. The complete groups are in SUMMARY.duplicateTitles and SUMMARY.duplicateMetaDescriptions.
I found a bug or need another check. What now?
Open an issue on the Issues tab with the input you used. Requests for extra checks are welcome.
Related Actors
More tools from the same developer, built with the same pricing and output style.
| Actor | What it does |
|---|---|
| Website Content Crawler to Markdown for RAG & LLMs | Crawl whole websites into clean Markdown, RAG chunks and llms.txt |
| PDF to Markdown & Text Extractor with OCR | PDF, Word, Excel and PowerPoint files to Markdown and text, with OCR |
| PageSpeed Insights & Lighthouse Bulk Checker | Lighthouse scores and Core Web Vitals for many URLs at once |
| Tech Stack Detector: Wappalyzer & BuiltWith Alternative | Detect the CMS, frameworks, analytics and hosting of any website |
| Bulk Domain Lookup: DNS, WHOIS, SPF, DMARC & SSL | DNS, email security and SSL checks for a list of domains |
| Speech to Text: Audio, Video & Podcast Transcriber | Whisper transcripts, SRT and VTT subtitles from audio, video and podcast feeds |
| Email Validator & Verifier: Bulk MX & Disposable Check | Check email lists for syntax, MX records and disposable domains |
| Website Contact Scraper: Emails, Phones & Social Links | Find emails, phone numbers and social profiles on company websites |
| VIES VAT Checker & EU Company Registry Lookup | Validate EU VAT numbers and look up company registry data |
| Companies House Scraper: UK Company Search & Officers | Search UK companies and get profiles and officers |
| EU TED Tenders Scraper & Alerts: Public Procurement | Search EU public tenders and get alerts for new notices |
| Greenhouse, Lever & Ashby Job Scraper: 7 ATS in One Feed | Job postings from 7 applicant tracking systems in one schema |
| GitHub Scraper: Repo Stats, Stars, Trending & Search | Repository stats, stars, trending repos and search results |