SEO Audit Tool: On-Page Checker, Schema, Open Graph & llms.txt
Pricing
from $6.00 / 1,000 page auditeds
SEO Audit Tool: On-Page Checker, Schema, Open Graph & llms.txt
Crawl a website (or a list of URLs) and audit on-page SEO: titles, meta descriptions, headings, canonical, indexability, hreflang, JSON-LD schema, Open Graph, image alt text, links and word count, with a 0-100 score per page and a site report with robots.txt, sitemap and llms.txt checks.
Pricing
from $6.00 / 1,000 page auditeds
Rating
0.0
(0)
Developer
Julian Genuario
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Audit the on-page SEO of a whole website (or a list of URLs) in one run. The Actor crawls the site like a search engine bot (respecting robots.txt, with a page cap you choose) and returns one row per page with the data and the issues an SEO specialist checks first, a 0-100 score per page, and a site report.
What does SEO Audit Tool do?
SEO Audit Tool crawls a website or a list of URLs and audits on-page SEO: title tags, meta descriptions, headings, canonical, indexability, hreflang, JSON-LD schema, Open Graph, image alt text, links and word count, with a 0-100 score per page and a site report with robots.txt, XML sitemap and llms.txt checks.
How to use SEO Audit Tool
- Click Try for free on this page (a free Apify account is enough to start).
- Fill in the input (see the examples below) or keep the prefilled example.
- Click Start and wait for the run to finish.
- Download the results from the Output tab as JSON, CSV, Excel or HTML, or read them with the Apify API.
- Optional: create a Schedule to run it daily or weekly, and connect a webhook or an integration (Make, Zapier, n8n, Slack).
What it checks
Per page
- Title and meta description: text, length, too long / too short, duplicates across the site.
- Headings: H1 text and count (missing / multiple), H2 count.
- Indexability: HTTP status, meta robots and
X-Robots-Tag(noindex / nofollow), canonical (self, other URL, missing, invalid), redirect chain. - International:
html lang, hreflang alternates. - Structured data: JSON-LD and microdata types (Organization, Product, Article, FAQPage...), JSON-LD blocks that do not parse.
- Social previews: Open Graph (title, description, image, type, URL) and Twitter card.
- Images: total, missing alt, empty alt.
- Links: internal, external, nofollow; mixed content on HTTPS pages.
- Content and speed: word count (thin content), HTML size, server response time, mobile viewport.
Per site (record REPORT in the key-value store)
- robots.txt found or not, sitemaps (from robots.txt or
/sitemap.xml) and their size. - llms.txt and llms-full.txt (the new standard that tells AI assistants what your site is about): found, size, title, summary, sections and links.
- Average score, indexable / noindex pages, broken pages (4xx / 5xx), issues ranked by number of pages, worst pages, schema types used, URLs disallowed by robots.txt, and where the crawl stopped.
Input
| Field | What it does |
|---|---|
| Websites or URLs | Start URLs. Also from a dataset or a CSV / Google Sheets link. |
| Mode | Crawl the website (follows internal links and sitemap URLs) or Only the URLs in the list. |
| Max pages per site | Default 30, up to 5,000. |
| Max link depth | 0 = only the start URLs. |
| Also use the sitemap | Seed the crawl with sitemap URLs. |
| Only URLs containing / Skip URLs containing | Text or /regex/ filters, e.g. only /blog/. |
| Requests in parallel per site, Sites in parallel, Delay | Speed vs. politeness. |
Example input
{"startUrls": ["https://www.example.com"],"mode": "crawl","maxPagesPerSite": 200,"excludeUrlPatterns": ["/tag/", "?page="]}
Output (one row per page)
{"site": "https://crawlee.dev","url": "https://crawlee.dev/js/docs/quick-start","statusCode": 200,"status": "ok","score": 97,"title": "Quick Start | Crawlee for JavaScript","titleLength": 36,"metaDescription": "...","metaDescriptionLength": 41,"h1": ["Quick Start"],"h1Count": 1,"canonical": "https://crawlee.dev/js/docs/quick-start","canonicalStatus": "self","indexable": true,"lang": "en","hreflang": [],"openGraph": { "title": "Quick Start", "image": "https://crawlee.dev/img/crawlee-javascript-og.webp" },"schemaTypes": ["BreadcrumbList"],"imagesMissingAlt": 0,"internalLinks": 58,"wordCount": 912,"responseTimeMs": 140,"issues": [{ "code": "meta-description-too-short", "severity": "notice", "message": "Meta description shorter than 50 characters" }]}
Pages that answer 4xx / 5xx, time out or redirect to another site are listed with status: "error" and are not charged.
Scoring
Every page starts at 100 and loses points per issue (e.g. missing title -15, missing meta description -8, missing H1 -8, not HTTPS -10, missing viewport -5, images without alt -5, thin content -5, duplicate title -5, long title -3). The issue list with severity (error / warning / notice) is in each row, so you can filter and fix in order.
Pricing
Pay per event:
- USD 6 per 1,000 pages audited (USD 0.006 per page).
- USD 0.05 per site report (one per website with at least one audited page).
Broken or unreachable pages and URLs blocked by robots.txt are free. The run respects your max charge per run and stops crawling before going over it.
Good behaviour
- robots.txt is always respected (every redirect hop is checked too), including
Crawl-delay;nofollowpages are audited but their links are not followed. - Identifiable user-agent
SeoAuditBot, at most 2 requests in parallel per site with a delay between requests, retries with back-off on 429 / 5xx. - Plain HTTP and an HTML parser, no browser: JavaScript-only sites (that render all content in the browser) show little content; server-rendered and static sites are fully covered.
Why use SEO Audit Tool
- Page rows + a site report in one run: every page with its issues and a 0-100 score, plus a
REPORTwith robots.txt, sitemaps, broken pages, duplicates and the worst pages to fix first. - Checks the new AI-era files:
llms.txtandllms-full.txtare parsed (title, summary, sections, links), next to JSON-LD schema and Open Graph previews. - Duplicates across the site: duplicate titles and meta descriptions are flagged on every page that shares them.
- Fair pricing: broken, blocked and off-site pages are free, and the crawl stops before your max charge per run.
- Polite crawler: robots.txt and
Crawl-delayare respected on every request and redirect hop, so you can audit client and competitor sites safely.
Cost examples
Prices at the current pay-per-event rates (see Pricing). You can set a maximum charge per run in the run options.
| Job | Approximate cost |
|---|---|
| 1 site, 30 pages (default) | about $0.23 |
| 1 site, 500 pages | about $3.05 |
| 20 client sites, 100 pages each, monthly | about $13.00 |
Use it from your code, an integration or an AI agent
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("latamdatatools/seo-onpage-audit").call(run_input={"startUrls": ["https://crawlee.dev"],"maxPagesPerSite": 10})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript / Node.js (npm install apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('latamdatatools/seo-onpage-audit').call({"startUrls": ["https://crawlee.dev"],"maxPagesPerSite": 10});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
No code:
- Schedules: run it daily or weekly from Apify Console (Schedules), with the same input saved as a Task.
- Integrations: send results to Google Sheets, Slack, email, Make, Zapier, n8n or Airbyte from the Integrations tab, or call your own webhook when a run finishes.
- AI agents: add it as a tool in Claude, Cursor, VS Code and other MCP clients through the Apify MCP server (
https://mcp.apify.com), so the agent can run SEO Audit Tool and read the results.
FAQ
Can I audit only some sections? Yes: use Only URLs containing (for example /blog/) or switch the mode to Only the URLs in the list and paste the URLs.
Do you have a Core Web Vitals checker too? Yes: Bulk PageSpeed Insights Checker runs Lighthouse and CrUX for a list of URLs.
Does it check Core Web Vitals? No. Use a PageSpeed Insights Actor for lab and field performance.
Why did the crawl stop? See crawlStoppedAt in the report: page cap, depth or max charge per run.
Questions or a check you miss? Open an issue in the Issues tab.