VNCNT LABS 的 Website SEO Audit API:每 1,000 頁約 $3 檢查斷鏈、404 和頁面 SEO 問題
A website SEO audit from an API: broken links, 404s and on-page issues for $3 per 1,000 pages (Python, curl, MCP)
VNCNT LABS 開發的 Apify Actor Website SEO Audit 可爬取網站或檢查單頁 URL,並輸出頁面、網站概況及斷鏈資料。費用為每次 $0.005,另加每頁 $0.003;可透過 Python、curl 或 MCP 使用,也能供 AI Agent 調用。它不會載入 JavaScript,也不支援登入,因此依賴瀏覽器載入內容或設有登入限制的網站,稽核結果可能不完整。
This morning I ran an audit on vncntlabs.com and it came back with 9 broken links on a 10-page crawl. That got my attention for about thirty seconds. Every one of them pointed at /cdn-cgi/l/email-protection, the URL Cloudflare swaps in for email addresses. Crawlers get a 404 there. Real visitors never do, because a script rewrites the link in the browser.
So the audit was right (a crawler really does see a 404) and it's also not something I need to fix. That's the kind of thing I wanted an audit tool to say in plain words, so the tool I built, Website SEO Audit, puts a note on those rows: "crawlers see a 404 here, real visitors don't. Usually safe to ignore."
(The Store links here carry my Apify affiliate ID, so Apify pays me a small commission if you sign up through one.)
What a run gives you
You pass a domain and a page limit. It crawls the site and writes three kinds of rows, each with a type field:
-
page: status code, title and its length, meta description, H1, word count, load time and the list of issues on that page -
site: an overall score, pages crawled, broken pages, broken links, duplicate titles and content, sitemap, robots.txt, SSL and HTTPS redirect checks, and every issue grouped with how many pages it hits and a short fix -
broken-link: the page the link sits on, the anchor text, the target and the status code it returned
You can also skip the crawl and pass single page URLs. That's handy for a page you just published.
Here's my own site from today's run. Score 85.14 out of 100, 10 pages crawled (9 HTML pages plus the Cloudflare URL itself), 213 internal links and 37 external ones. Besides the 9 email links it flagged:
- the home page title at 68 characters, over the 65 it wants
- the /apps/ page title at 25 characters ("Android Apps · VNCNT Labs"), under 30
- one image without alt text on the home page
- render-blocking CSS or scripts on all 9 pages
- 3 URLs it calls not SEO friendly (/apps/ferntimer/, /apps/housetimer/ and /apps/whentimer/, I guess because the words run together)
Sitemap, robots.txt, SSL, HTTP/2 and the HTTP to HTTPS redirect all passed. Honestly the alt text is the only thing on that list I'm going to fix today. The URLs are app names and they're staying.
For a second test I used books.toscrape.com, a public practice site for scrapers. 10 pages scored 92.2 with no broken links, but it has no XML sitemap, no robots.txt, HTTP doesn't redirect to HTTPS, and all 10 pages are missing a meta description. All 10 were also flagged as near-duplicate content, which makes sense since they're all product grids. It caught that / and /index.html share the title "All products | Books to Scrape - Sandbox", which is the kind of duplicate you only notice when something lists it for you.
The code
Python with apify-client 3.x. In 3.x call() returns a Run object, so the dataset ID is run.default_dataset_id, not run["defaultDatasetId"]:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {"websites": ["books.toscrape.com"], "maxPagesPerSite": 10}
run = client.actor("vncntlabs/website-seo-audit").call(run_input=run_input)
for row in client.dataset(run.default_dataset_id).iterate_items():
if row["type"] == "site":
print(row["site"], row["status"], "| score", row.get("onpageScore"), "| pages", row.get("pagesCrawled"),
"| broken pages", row.get("brokenPages"), "| broken links", row.get("brokenLinks"))
for issue in (row.get("issues") or [])[:5]:
print(" ", issue.get("pagesAffected") or "site-wide", "|", issue["issue"], "->", issue.get("howToFix"))
elif row["type"] == "broken-link":
print(" broken link", row["linkFrom"], "->", row["linkTo"], row.get("targetStatusCode"))
elif row.get("issues"):
print(" page", row.get("statusCode"), row["url"], "|", ", ".join(row["issues"][:3]))
That took 52 seconds end to end today and printed the 10 pages, then this:
books.toscrape.com ok | score 92.2 | pages 10 | broken pages 0 | broken links 0
site-wide | No XML sitemap found -> Publish /sitemap.xml and list it in robots.txt.
site-wide | HTTP doesn't redirect to HTTPS -> Add a site-wide 301 from http:// to https://.
10 | Missing meta description -> Write a 120 to 160 character description that matches the page.
10 | Low text-to-HTML ratio -> Add useful text or trim heavy markup.
10 | Very little text on the page -> Add more helpful content, or noindex the page if it shouldn't rank.
Checking two single pages with curl, no crawl:
curl -sS -X POST "https://api.apify.com/v2/acts/vncntlabs~website-seo-audit/run-sync-get-dataset-items?timeout=290" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"pageUrls":["https://books.toscrape.com/","https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"]}'
That one came back in about 4 seconds with two page rows (scores 97.07 and 97.44). The home page got dinged for the missing meta description and a missing charset meta tag.
If you use Claude, Cursor or another MCP client, add this as a remote MCP server. It loads only this one Actor, and you sign in to Apify in the browser, so no token goes in the file:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=vncntlabs/website-seo-audit"
}
}
}
The Node version is in the repo linked at the bottom.
Speed and cost
It's not instant. The crawl runs on DataForSEO's OnPage crawler, and both 10-page runs today took about 46 seconds on the platform. Queue time is the wild card. On Oct 28 a 20-page test took close to 5 minutes, almost all of it waiting. That's why the curl example checks single pages: the sync endpoint gives up after 300 seconds, so for a real crawl start the run and read the dataset when it's done (which is what the Python does).
Price is $0.005 per run plus $0.003 per page audited. Both 10-page runs were $0.035 each, the 2-page curl check was $0.011, and 1,000 pages comes to about $3. Sites that can't be crawled and single URLs that fail to load aren't charged. A 404 found during a crawl does count as an audited page, since finding it is the point. On the free Apify plan a run audits one site of up to 25 pages plus 10 single URLs.
It doesn't render JavaScript, and it won't log in. Sites that build their content in the browser, or sit behind a login or a bot wall, will come back thin.
How it compares
I checked these today (October 30, 2026) on the Apify Store API and Screaming Frog's site.
| Tool | What it does | Price |
|---|---|---|
| vncntlabs/website-seo-audit | Crawls a site or checks single URLs; page, site and broken-link rows | $0.005 per run + $0.003 per page ($3.01 per 1,000) |
| smart-digital/complete-seo-audit-tool | Crawls a site; 0 to 100 score per page, meta tags, headings, schema, images, accessibility, Core Web Vitals per its description | $0.04 per page free plan, $0.035 Silver, $0.03 Gold and up |
| logiover/bulk-url-status-checker | Status codes and redirect chains for a list of URLs you give it, no crawl | $0.0025 per URL free plan, down to $0.001 Gold and up |
| Screaming Frog SEO Spider | Desktop crawler, 300+ issue types | Free up to 500 URLs per crawl, £199 a year for more |
Where they're better, plainly. smart-digital's audit checks more things than mine (schema, accessibility and performance are all toggles in its input) and has 787 users with a 5.0 rating. Mine has 1 user. If you want depth per page and don't mind paying about 13 times more, that's a reasonable pick. If you already have a list of URLs and only want status codes and redirect chains, logiover's checker is cheaper per URL than mine and traces redirects. And for a one-off audit of your own site from a laptop, Screaming Frog's free version is hard to beat. It renders JavaScript too, which mine doesn't.
Where mine fits is when the audit has to run somewhere else: on a schedule, inside a script or an n8n flow, across a list of client sites, or as a tool an AI agent can call, at a per-page price that doesn't hurt when you run it every week. I haven't run the other two Actors on the same sites, so I'm not going to claim mine finds more.
Code: https://github.com/PravinrajV/vncntlabs-apify-examples/tree/main/10-website-seo-audit
What do you check first when you audit a site? I always go straight to the broken links, then the missing meta descriptions, and I'd like to know if anyone actually acts on the render-blocking warnings.
Disclosure: I build the Apify Actor used here (VNCNT Labs). Every number in this post comes from a real run on Oct 30, 2026 (plus the 20-page queue timing noted above from Oct 28), and the prices are Apify Store list prices checked that day.
來源:DEV Community · dev.to