Website SEO Audit Tool - On-Page, Broken Links & AI Bots
Pricing
from $4.00 / 1,000 page auditeds
Website SEO Audit Tool - On-Page, Broken Links & AI Bots
Bulk on-page SEO audit with a 0-100 score and a prioritized fix list per page: titles, meta descriptions, canonicals, noindex, headings, alt text, schema, Open Graph, hreflang, HTTPS, broken links, robots.txt, sitemap, llms.txt and blocked AI crawlers. $4 per 1,000 pages.
Pricing
from $4.00 / 1,000 page auditeds
Rating
0.0
(0)
Developer
Kanto Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Website SEO Audit Tool - 0-100 score and a prioritized fix list for every page
Audit any list of pages, or crawl whole websites, and get a 0-100 SEO score plus the exact issues to fix on each page - titles, meta descriptions, canonicals, noindex, headings, alt text, structured data, Open Graph, hreflang, HTTPS, broken links, robots.txt and sitemaps - in bulk, as JSON, CSV or Excel.
- $4 per 1,000 audited pages ($0.004 each) - broken-link checking included, no subscription
- Pages that cannot be fetched are free - you pay only for pages that were actually audited
- AI search readiness - see which AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot and more) your robots.txt blocks, and whether you publish an
llms.txt - Fix list, not just a score - every issue is
{severity, code, message}, sorted most important first
What does Website SEO Audit do?
For every URL you give it, the actor loads the page the way a search-engine crawler does, checks it against the on-page SEO rules below and returns one row per page with a score, an issue list and all the raw data behind it. With Max pages per site above 1 it also crawls internal links (breadth-first, robots.txt respected) and audits those pages too.
Per page
| Area | Checks |
|---|---|
| Status | HTTP status, redirect chain, response time, page size |
| Title & description | Missing, too short, too long, more than one <title> on the page |
| Indexability | noindex in meta robots or X-Robots-Tag, canonical missing, pointing elsewhere, or declared more than once |
| Content | H1 missing or multiple, heading counts H1-H6, visible word count (thin content) |
| Images | Images without alt text, with sample URLs |
| Links | Internal / external / nofollow counts, optional broken link check (4xx, 5xx, unreachable) |
| Rich results | JSON-LD and microdata types found, invalid JSON-LD blocks |
| Social | Open Graph title/description/image, Twitter card |
| International | hreflang alternates |
| Mobile & basics | Viewport meta, lang attribute |
| Security | HTTPS, HSTS header, mixed http:// resources |
Per site (once per host): robots.txt present, Googlebot allowed, sitemaps declared or found at
/sitemap.xml, llms.txt present, and the list of AI bots blocked vs allowed.
Use cases
- SEO agencies and freelancers - audit a prospect's site in seconds and send the issue list as a spreadsheet.
- Site owners - schedule a weekly run and get alerted when a page turns
noindexor links break. - Developers - add an SEO check to CI before a release, or monitor many client sites from one API call.
- Content teams - find pages with missing or overlong titles and descriptions, thin content or missing alt text.
- AI search visibility (GEO) - check whether ChatGPT, Claude, Perplexity and Google's AI crawlers are allowed to read your content.
- Migrations - audit the old and new site and compare scores, canonicals and redirect chains.
How to use it
- Click Try for free.
- Paste your pages or domains into Pages or websites to audit, one per line.
- Leave Max pages per site at
1to audit only those URLs, or raise it (e.g.50) to crawl each site. - Optionally switch on Check links for 404s.
- Click Start and download the results as JSON, CSV, Excel or HTML, or read them through the API.
Input example
{"urls": ["https://www.python.org", "https://wordpress.org/news/"],"maxPagesPerSite": 3,"checkBrokenLinks": true,"maxLinksToCheckPerPage": 25}
| Field | What it does | Default |
|---|---|---|
urls | Pages or domains to audit, one per line. Strings or {"url": "..."} objects both work. | two example sites |
maxPagesPerSite | 1 = only the URLs you list; higher = crawl internal links (breadth-first, robots.txt respected) | 1 |
checkBrokenLinks | Request every link on each page and report the broken ones | false |
maxLinksToCheckPerPage | Cap on link checks per page | 100 |
maxConcurrency | Pages fetched in parallel | 5 |
requestTimeoutSecs | Per-page timeout (pages that time out are not charged) | 30 |
proxyConfiguration | Optional Apify Proxy | off |
Output example
One dataset item per audited page. Real output from a cloud run of this actor (a few fields and lists shortened):
{"url": "https://www.python.org/","finalUrl": "https://www.python.org/","statusCode": 200,"redirectChain": [],"pageSizeKb": 51.3,"title": "Welcome to Python.org","titleLength": 21,"metaDescription": "The official home of the Python Programming Language","metaDescriptionLength": 52,"canonical": null,"indexable": true,"lang": "en","hasViewport": true,"h1": ["Intuitive Interpretation", "Compound Data Types", "All the Flow You’d Expect", "Functions Defined", "Quick & Easy to Learn"],"headingCounts": { "h1": 5, "h2": 9, "h3": 0, "h4": 0, "h5": 0, "h6": 0 },"wordCount": 984,"imageCount": 1,"imagesMissingAlt": 0,"internalLinkCount": 126,"externalLinkCount": 78,"openGraph": { "title": "Welcome to Python.org", "image": "https://www.python.org/static/opengraph-icon-200x200.png", "type": "website" },"structuredDataTypes": ["SearchAction", "WebSite"],"https": true,"hsts": true,"mixedContentCount": 1,"score": 86,"issueCount": 4,"issues": [{ "severity": "medium", "code": "canonical-missing", "message": "No canonical link." },{ "severity": "medium", "code": "mixed-content", "message": "1 resource/link URL(s) use http:// on an https page." },{ "severity": "low", "code": "meta-description-short", "message": "Meta description is 52 characters; 120-160 is the usual target." },{ "severity": "low", "code": "h1-multiple", "message": "5 <h1> headings on one page." }],"site": {"robotsTxtFound": true,"googlebotAllowed": true,"sitemapFound": false,"llmsTxtFound": false,"aiBotsBlocked": [],"aiBotsAllowed": ["GPTBot", "ChatGPT-User", "OAI-SearchBot", "ClaudeBot", "Claude-User", "PerplexityBot","Google-Extended", "CCBot", "Applebot-Extended", "Bytespider", "meta-externalagent"],"siteIssues": [{ "severity": "medium", "code": "sitemap-missing", "message": "No XML sitemap found in robots.txt or at /sitemap.xml." },{ "severity": "low", "code": "llms-txt-missing", "message": "No /llms.txt for AI assistants (optional, emerging standard)." }]},"error": null}
With Check links for 404s on, each row also gets linksChecked and brokenLinks
([{"url": ..., "status": 404}]), and a broken-links issue when any are found.
How the score works: it starts at 100 and subtracts 25 per critical, 10 per high, 5 per medium and
2 per low issue on that page (broken links subtract 10). Site-level findings are reported in
site.siteIssues and do not change page scores. The formula is fixed, so scores are comparable across
runs and sites.
How much does it cost?
$4 per 1,000 audited pages ($0.004 per page), pay-per-event, broken-link checking included. Apify platform compute is included. There is also a one-off start fee of $0.00005 per GB of run memory (the default 1 GB run = $0.00005 per run).
| You audit | You pay |
|---|---|
| 1 homepage | $0.004 |
| A 50-page crawl of one site | $0.20 |
| 500 client pages every month | $2.00 per month |
| 10,000 pages | $40.00 |
What is free: pages that cannot be fetched at all - DNS failure, timeout, refused connection,
TLS error - are returned with an error message and cost nothing. A page that answers (including a
404 or 500, which is itself an SEO finding) is audited and charged once. A URL that redirects to a page
already audited in the same run is not charged twice.
Cost cap: set Maximum cost per run in the run options; the actor stops cleanly when it is reached, so a crawl can never cost more than you decided. Apify's free plan includes monthly platform credit you can use to try it.
How it compares
| This actor | Desktop crawlers | Lighthouse / page-speed tools | |
|---|---|---|---|
| Runs in the cloud, on a schedule, via API | Yes | No (runs on your computer) | Per page |
| Bulk lists and whole-site crawls | Yes | Yes | One page at a time |
| On-page SEO issues with severity | Yes | Yes | Partly (SEO category) |
AI crawler blocking + llms.txt | Yes | Varies | No |
| Performance lab metrics (Core Web Vitals) | No | Varies | Yes |
| Renders JavaScript | No | Optional | Yes |
| Output | JSON, CSV, Excel, API | Export files | Report |
Pick this actor for fast, cheap, repeatable on-page and crawlability audits at scale. For performance lab metrics use a Lighthouse-style tool alongside it.
Integrations and API
- API:
POST https://api.apify.com/v2/acts/kantolabs~website-seo-audit/run-sync-get-dataset-items?token=YOUR_TOKENwith the input JSON as the body returns the audit in one call. - Schedules and alerts: run weekly from Apify Schedules and send the results to Slack, email or a webhook.
- Google Sheets, Make, Zapier, n8n: standard Apify integrations.
- AI agents (MCP): callable from Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server.
FAQ
Does it render JavaScript? No - it reads the HTML the server sends, which is what most on-page SEO checks are based on. Sites that build their entire content in the browser will show low word counts; that is itself a real SEO risk worth knowing about.
Does it respect robots.txt? Yes, for every page it discovers while crawling. URLs you list yourself are always audited.
Do I pay for pages that fail?
No. Pages that cannot be fetched (DNS error, timeout, refused connection) are listed with an error
and not charged.
Is it the same as Lighthouse? No. This is an on-page and crawlability audit, not a performance lab test; it is much faster per page and adds checks Lighthouse does not run, such as broken-link checking, sitemap discovery and AI crawler access.
Which AI crawlers are checked? GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, PerplexityBot, Google-Extended, CCBot, Applebot-Extended, Bytespider and meta-externalagent.
Can I pass {"url": "..."} objects instead of strings?
Yes. Both shapes are accepted in urls.
Something looks wrong? Open an issue on the Issues tab with the URL and what you expected.