Technical SEO Audit (bulk, with issues) avatar

Technical SEO Audit (bulk, with issues)

Pricing

from $21.00 / 1,000 page auditeds

Go to Apify Store
Technical SEO Audit (bulk, with issues)

Technical SEO Audit (bulk, with issues)

Audit up to 500 pages per run on the technical basics and get a ranked list of issues per page: noindex, title and description length, canonical, headings, images without alt text, structured data, Open Graph, viewport and redirects. Respects robots.txt. Pay per page.

Pricing

from $21.00 / 1,000 page auditeds

Rating

0.0

(0)

Developer

Steadydata Team

Steadydata Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 minutes ago

Last modified

Share

Technical SEO Audit (bulk, with issues per page)

Audit up to 500 pages per run on the technical basics and get, per page, a ranked list of what is actually wrong: a forgotten noindex, a missing or overlong title, no canonical, no H1 or six of them, images without alt text, thin content, no viewport, no structured data. Plus the measured fields behind every verdict. Pages that their own robots.txt forbids are skipped and never charged.

Why this scraper

  • It tells you what to fix, not just what it found. Thirty columns of raw fields are a dataset; issues is a to-do list. Every failed check comes back with a code, a severity (critical, warning, info), a sentence and the measured value, sorted worst first. Filter on severity = critical and you have your morning.
  • The noindex check alone pays for a run. A page nobody can find because a staging noindex shipped to production is the most expensive SEO mistake there is, and it is invisible in a browser.
  • It respects robots.txt. The target's own robots.txt is read first, with the rules search engines actually use, and a page it forbids comes back as a free ROBOTS_DISALLOWED record. An audit that reports on robots meta tags while ignoring robots.txt would not be worth much.
  • Your limits, not ours. Title and description length limits are inputs, so the audit matches your own house style instead of a number we picked.
  • Sitemaps found for free. Every row lists the sitemaps declared in the site's robots.txt, which is usually the fastest way to find the rest of the pages.
  • Only delivered pages are charged. Robots refusals, dead URLs, timeouts and bot walls are free error records. No start fee.

Who this is for

SEO teams and agencies auditing a site or a portfolio of client sites on a schedule. Developers checking a release for the mistakes that only show up in the HTML. Anyone who needs the technical basics of hundreds of pages in one table.

Who this is not for

Read this before you buy. This actor fetches the HTML of each URL you give it and does not run JavaScript, so a page that renders its title and content in the browser shows up emptier here than it looks to a visitor. It also audits only the URLs you supply: it does not crawl a site to discover pages (the sitemapsInRobots field points you at the sitemap so you can feed those URLs in). Page speed, Core Web Vitals and Lighthouse scores are not included; those need a browser and Google's own API.

Input example

{
"urls": ["https://apify.com", "wordpress.org", "https://example.com/product/x"],
"language": "en-US,en;q=0.9",
"titleMaxLength": 60,
"descriptionMaxLength": 160
}

A domain is audited on its home page; a full URL is audited as given.

Output example

{
"url": "https://example.com/pagina",
"finalUrl": "https://example.com/pagina",
"statusCode": 200,
"issueCount": 3,
"issues": [
{"code": "noindex", "severity": "critical", "message": "The page tells search engines not to index it", "value": "noindex, nofollow"},
{"code": "canonical-missing", "severity": "warning", "message": "No canonical link", "value": null},
{"code": "images-without-alt", "severity": "warning", "message": "4 of 9 images have no alt text", "value": 4}
],
"title": "Een nette titel voor deze pagina",
"titleLength": 32,
"metaDescription": "Een nette beschrijving van deze pagina.",
"metaDescriptionLength": 39,
"canonical": null,
"robotsMeta": "noindex, nofollow",
"isIndexable": false,
"h1": ["Kop een"],
"h1Count": 1,
"h2Count": 2,
"wordCount": 251,
"imageCount": 9,
"imagesWithoutAlt": 4,
"internalLinks": 24,
"externalLinks": 3,
"hreflang": ["en", "nl"],
"structuredDataTypes": ["Organization", "PostalAddress"],
"openGraph": ["image", "title"],
"hasTwitterCard": true,
"hasViewport": true,
"htmlLang": "nl",
"charset": "utf-8",
"isHttps": true,
"redirected": false,
"contentEncoding": "br",
"pageSizeBytes": 81234,
"responseTimeMs": 412,
"robotsRule": "allow /",
"sitemapsInRobots": ["https://example.com/sitemap.xml"],
"status": "ok"
}

A page its own robots.txt forbids produces an error record instead, and is not charged:

{
"input": "https://example.com/private/page",
"status": "error",
"errorCode": "ROBOTS_DISALLOWED",
"error": "https://example.com/private/page is forbidden by its own robots.txt (disallow /private); skipped and not charged"
}

Error codes: INVALID_URL, ROBOTS_DISALLOWED, FETCH_FAILED, BLOCKED. INPUT_TRUNCATED appears once when your input is longer than this actor accepts.

Pricing

Pay per event: one page-audited event per delivered page. No charge for robots refusals, dead URLs, timeouts or bot walls, and no start fee.

Free Apify plan: this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full size, billed per delivered row, with failed rows never charged.

FAQ

Which issues can it report? noindex, http-error, title-missing, title-too-long, title-too-short, description-missing, description-too-long, canonical-missing, h1-missing, h1-multiple, images-without-alt, thin-content, viewport-missing, lang-missing, structured-data-missing, open-graph-missing and no-https.

Why does imagesWithoutAlt count images with alt=""? Because an empty alt is only correct for decorative images, and at scale it is far more often an oversight. The count and the total are both in the row, so you can judge.

Why does one page report 117 images without alt text? Because that is what the HTML as served contains. Sites that lazy-load images often set the alt attribute later in JavaScript, which this actor does not run, so treat a very high count on an image-heavy page as "check this by hand" rather than as 117 separate mistakes. The total count is in the row so you can see the ratio.

Are 251 words really thin content? The thin-content issue is info, not a verdict: for a product page it is normal, for an article it is a signal. Filter it out if it does not apply to your pages.

Can it crawl my whole site? No. It audits the URLs you give it. Use sitemapsInRobots from the first run to collect the rest of your URLs, then feed those in.

Is personal data collected? No. These are properties of a web page.

What happens when a check is wrong? Every issue carries the measured value, so a disagreement is verifiable rather than a matter of opinion. If a rule is genuinely wrong, it gets fixed.