SEO Audit & Sitemap Checker - 404s, Redirects, Meta Tags avatar

SEO Audit & Sitemap Checker - 404s, Redirects, Meta Tags

Pricing

from $1.50 / 1,000 pages

Go to Apify Store
SEO Audit & Sitemap Checker - 404s, Redirects, Meta Tags

SEO Audit & Sitemap Checker - 404s, Redirects, Meta Tags

Audit a website you own or may audit: reads robots.txt and sitemaps, then checks each page for status code, redirects, title, meta description, H1, canonical and 35+ SEO issues, or lists every sitemap URL. Plain HTTP, no browser, honours robots.txt and Crawl-delay. From $1.50 per 1,000 pages.

Pricing

from $1.50 / 1,000 pages

Rating

0.0

(0)

Developer

Syntrovia Data

Syntrovia Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Features

Limited permissions

Share

Run a technical SEO audit of a website you own or are authorised to audit, and get one row per page with its issue codes. The Actor reads robots.txt and the sitemaps, then checks each page for status code, redirect, title, meta description, H1, canonical, indexability, word count, links and images, and tags it with codes such as not-found, redirect-chain or missing-meta-description. Or list every URL of the sitemaps without requesting a single page. Plain HTTP (no headless browser), so runs are fast and cheap. It follows robots.txt and Crawl-delay, sends at most 2 requests at a time, never fills in forms, and stops as soon as the site refuses access.

Try it now: click Try for free, replace the example site with a site you own or may audit, and click Start. A 20-page audit costs $0.035 and a 1,000-page audit $1.505. Listing 5,000 sitemap URLs costs $1.505.

Who uses it

  • SEO freelancers and agencies: a fix-list for a client site you are authorised to audit, filtered by issue code and exported to a spreadsheet.
  • Developers before a launch or migration: 404s, redirect chains, canonical problems and leftover noindex tags across the whole sitemap.
  • Content teams: missing, duplicate, too short or too long titles and meta descriptions, page by page.
  • Weekly site health checks: save the input as a Task, add a Schedule, and compare the RUN_SUMMARY issue totals from week to week.

Sample audit rows

URLStatusIndexabilityTitle lengthIssues
https://www.example.com/pricing200indexable17title-too-short, missing-meta-description, images-missing-alt
https://www.example.com/old-pricing301redirect-redirect

Rows from the output example below. The run summary (RUN_SUMMARY) adds how many pages have each issue code.

What can this Actor do?

  • SEO audit (default): starts at your URL, reads robots.txt, reads the sitemaps (the Sitemap: lines of robots.txt, or /sitemap.xml and /sitemap_index.xml, or the ones you give), then checks the start page, the sitemap URLs and the links it finds on the checked pages, up to Max pages.
  • Sitemap URLs only: reads robots.txt and the sitemaps and lists each URL with its lastmod, changefreq and priority, flags URLs that robots.txt disallows, URLs on another host, plain-http URLs on an https site and invalid fields. No page is requested, so it is very cheap.
  • Understands sitemap indexes (up to 3 levels), gzip sitemaps (.xml.gz), plain-text sitemaps (one URL per line), and sitemaps up to the protocol limits (50,000 URLs, 50 MB each; up to 50 sitemap files per run).
  • Reports 35+ issue codes per page (missing or duplicate titles and meta descriptions, missing H1, canonical problems, noindex, redirects and redirect chains, 4xx and 5xx, thin content, pages that need JavaScript, images without alt text, slow answers, pages missing from the sitemap, and more; full list below).
  • Writes a run summary (RUN_SUMMARY) with the robots.txt rules it applied, every sitemap file it read, how many rows have each issue, status code classes, skipped URLs by reason, where the site refused access if it did, and why the run stopped.
  • No browser, no proxies, no tricks: one honest User-Agent, plain HTTP GET requests, nothing else.

What data can you extract?

SEO audit: one row per requested URL

FieldExampleDescription
urlhttps://www.example.com/pricingThe URL that was requested
statusCode200HTTP status (one request per row; a redirect is not followed inside a row)
redirectUrlhttps://www.example.com/pricing/Where a 3xx answer points. A same-site target is checked as its own row
foundIn, depth, inSitemaplink, 1, falseHow the URL was found (start, sitemap, link, redirect), clicks from the start URL, and whether a sitemap lists it
indexable, indexabilitytrue, indexableindexable, noindex, canonicalized, redirect, client-error, server-error or not-html
title, titleLengthPricing - Example, 17First <title> and its length
metaDescription, metaDescriptionLengthPlans for teams of any size., 28Meta description and its length
h1, h1Count, h2CountPricing, 1, 4First H1 and heading counts
canonicalUrl, canonicalStatushttps://www.example.com/pricing, selfrel="canonical" and self, other, missing, multiple or invalid
metaRobots, xRobotsTagnoindex, follow, nullRobots meta tag and X-Robots-Tag header
lang, hreflangCount, hasViewport, hasOpenGraphen, 2, true, trueLanguage, hreflang alternates, viewport tag, Open Graph tags
structuredDataTypes["Organization", "WebSite"]schema.org types found in JSON-LD
wordCount642Words of visible text
internalLinks, externalLinks, nofollowLinks58, 12, 0Link counts
images, imagesWithoutAlt14, 3Image counts
contentType, htmlBytes, responseTimeMstext/html; charset=utf-8, 77435, 420Answer facts
issues["title-too-short", "missing-meta-description"]Issue codes (table below)
checkedAt2026-11-15T08:00:00.000ZWhen the page was checked

The title, meta description and H1 are the site's own short texts. E-mail addresses and phone numbers in them are masked with pattern rules (replaced with [contact removed]), and you can switch the texts off (Include title, meta description and H1 text) to get only their lengths and counts. The Actor does not return the page body, link texts, mailto: or tel: links.

Sitemap mode: one row per listed URL

FieldExampleDescription
urlhttps://www.example.com/blog/post-1URL listed in the sitemap
sitemapUrlhttps://www.example.com/sitemap-posts.xmlSitemap file that lists it
lastmod, changefreq, priority2026-11-02, weekly, 0.6As published (null when missing or invalid)
allowedByRobotstrueWhether robots.txt lets crawlers fetch the URL (null for another host)
issues["blocked-by-robots"]blocked-by-robots, other-host, insecure-http, invalid-lastmod, invalid-changefreq, invalid-priority
listedAt2026-11-15T08:00:00.000ZWhen the run started

Duplicate URLs across sitemap files are listed once.

Issue codes (audit)

CodeRule
http-4xx, not-found4xx answer; not-found for 404 and 410
http-5xx5xx answer after 2 retries
redirect, redirect-chain, redirect-loop, redirect-off-site3xx answer; a redirect reached through another redirect; a redirect back to an earlier URL; a redirect to another host
non-html2xx answer that is not HTML (no on-page checks)
missing-title, multiple-titles, title-too-short, title-too-long, duplicate-titleNo title; more than one; under 30 or over 60 characters; same title as an earlier indexable page of the run
missing-meta-description, multiple-meta-descriptions, meta-description-too-short, meta-description-too-long, duplicate-meta-descriptionSame rules with 70 and 160 characters
missing-h1, multiple-h1No H1; more than one H1
missing-canonical, multiple-canonicals, invalid-canonical, canonical-points-elsewhereCanonical tag problems
noindex, nofollowRobots meta tag or X-Robots-Tag with noindex/nofollow (or none)
meta-refresh<meta http-equiv="refresh">
thin-contentFewer than 200 words of visible text
javascript-renderedFewer than 50 words and scripts present: the content probably needs JavaScript, which this Actor does not run
images-missing-altAt least one <img> without an alt attribute
missing-lang, missing-viewportNo lang on <html>; no viewport meta tag
invalid-structured-dataA JSON-LD block that is not valid JSON
slow-responseComplete answer took more than 3 seconds
large-html, html-truncatedHTML over 1 MB; over 5 MB (only the first 5 MB is checked)
insecure-httpPage served over plain http
not-in-sitemapIndexable page found through links but missing from the sitemaps (only when every sitemap was read completely)
has-login-formThe page contains a password field that is not its main content (for example a login popup in the header or a sidebar login box)
has-captchaThe page contains a CAPTCHA widget that is not a bot check of the page itself (for example on a contact or newsletter form)

How to use it

  1. Click Try for free. The form opens with Apify's public documentation site (docs.apify.com) as an example. Replace it with the Website URL you want to audit, and keep I own this website or am authorised to audit it ticked only if that is true for the site you enter. The prefilled run checks 20 pages.
  2. Choose SEO audit of the pages or List sitemap URLs only, and set Max pages. Click Start.
  3. Open the SEO audit view of the results (or Status and redirects, or Sitemap URLs), download them as JSON, CSV, Excel or HTML, or read them through the Apify API. The RUN_SUMMARY record in the run's key-value store has the totals per issue.

Weekly site health check: save your input as a Task and add a Schedule (for example every Monday at 07:00 in your time zone). Send the results onward with Apify integrations, for example Slack, e-mail, Google Sheets, Zapier or Make.

How much does it cost?

This Actor uses pay-per-event pricing with exactly three events; nothing else is charged. Platform usage is included.

EventPrice
Run start, charged once per run together with the first saved result$0.005
Page requested, checked and saved (audit mode)$0.0015 ($1.50 per 1,000 pages)
Sitemap URL listed and saved (sitemap mode)$0.0003 ($0.30 per 1,000 URLs)

Examples:

  • The prefilled audit of 20 pages: $0.005 + 20 × $0.0015 = $0.035.
  • An audit of 1,000 pages: $0.005 + $1.50 = $1.505.
  • Listing 5,000 sitemap URLs: $0.005 + $1.50 = $1.505.

Every requested URL that gets an HTTP answer is one page, including redirects, 404s and server errors (they are findings). You are not charged for URLs that robots.txt disallows or that the Actor skips, for requests that got no answer, for login or CAPTCHA pages, or when the input is invalid. A run that saves no result costs nothing, not even the run start. You can set a maximum cost per run; the Actor checks it before it requests each page and before every charge, and stops when the next result would go over it.

Input example

{
"startUrl": "https://www.example.com/",
"authorizedToAudit": true,
"mode": "audit",
"maxPages": 500,
"discoverFrom": "sitemaps-and-links",
"includePageText": true,
"maxRequestsPerMinute": 60
}

Sitemap mode:

{
"startUrl": "https://www.example.com/",
"authorizedToAudit": true,
"mode": "sitemap",
"maxSitemapUrls": 20000
}

Output example

[
{
"url": "https://www.example.com/pricing",
"statusCode": 200,
"redirectUrl": null,
"foundIn": "sitemap",
"inSitemap": true,
"depth": null,
"contentType": "text/html; charset=utf-8",
"responseTimeMs": 412,
"htmlBytes": 58246,
"title": "Pricing - Example",
"titleLength": 17,
"metaDescription": null,
"metaDescriptionLength": null,
"h1": "Pricing",
"h1Count": 1,
"h2Count": 4,
"canonicalUrl": "https://www.example.com/pricing",
"canonicalStatus": "self",
"metaRobots": null,
"xRobotsTag": null,
"indexable": true,
"indexability": "indexable",
"lang": "en",
"hreflangCount": 0,
"hasViewport": true,
"hasOpenGraph": true,
"structuredDataTypes": ["Organization"],
"wordCount": 481,
"internalLinks": 39,
"externalLinks": 6,
"nofollowLinks": 0,
"images": 9,
"imagesWithoutAlt": 2,
"issues": ["title-too-short", "missing-meta-description", "images-missing-alt"],
"checkedAt": "2026-11-15T08:00:12.000Z"
},
{
"url": "https://www.example.com/old-pricing",
"statusCode": 301,
"redirectUrl": "https://www.example.com/pricing",
"foundIn": "link",
"inSitemap": false,
"depth": 1,
"indexable": false,
"indexability": "redirect",
"issues": ["redirect"],
"checkedAt": "2026-11-15T08:00:13.000Z"
}
]

(The redirect row has the same fields; the on-page fields are null.)

Limits and responsible use

Use this Actor only on websites you own or are authorised to audit, and only where
the site's terms allow automated access. The Actor follows robots.txt and
crawl-delay, sends at most 2 concurrent requests per host, skips individual login
pages and stops when the site sits behind a login wall, a CAPTCHA or bot challenge,
or answers HTTP 401/403/429, and never bypasses access controls.
It does not collect e-mail addresses or phone numbers. You are responsible for the
websites you choose to audit.
  • robots.txt (RFC 9309): read again at the start of every run, for each origin the run touches. The Actor obeys the group for its own name (SitemapSeoCheckHttp) when there is one, otherwise the * group. A disallowed URL is never requested, even when you enter it yourself. If robots.txt answers with a server error or cannot be reached, nothing is crawled; if it does not exist (404), every path may be crawled. If robots.txt itself answers 401, 403, 407 or 429, the Actor treats the site as refusing bots and stops without crawling.
  • Speed: at most 2 requests at the same time and at most 60 requests per minute by default (you can choose 10-120), per website: www.example.com and example.com share these limits. With a robots.txt Crawl-delay, one request at a time and at least that many seconds between requests. The audit supports a Crawl-delay of up to 10 seconds and sitemap mode up to 60 seconds; above that, the run stops before requesting anything and costs nothing.
  • Stops, never works around: HTTP 401, 403, 407 or 429, or a CAPTCHA or bot-check page shown instead of the content (a challenge page, a near-empty page with a CAPTCHA, "Just a moment...", "Attention Required", "Access denied"), stops the run at once. Results saved before are kept. The Actor never submits forms, never sends or stores cookies, and uses no proxies and no browser.
  • Login pages are skipped, login walls stop the run: a page whose main content is a password form is never filled in; it is skipped (not saved, not charged, its links not followed, counted as login-page in RUN_SUMMARY.skipped) and the crawl goes on. When 5 checked pages in a row, or more than half of the first 20 checked pages, are login pages, the site sits behind a login wall and the run stops (stopReason: login-wall, see blockedAt); pages saved before are kept. Skipped login pages count toward Max pages, so a login-only site never makes more requests than that. A login popup, a sidebar login box or a CAPTCHA on a contact or newsletter form that is only part of a page does not stop anything: the page is checked and gets the has-login-form or has-captcha issue. Network errors and server errors are retried twice (after 2 and 5 seconds); after 5 network failures or 10 server errors in a row the run stops so the site is left alone.
  • Scope: only the host you enter, with and without www., over http or https, on the default ports. Login, sign-up, account, cart and checkout pages (such as /login, /signup, /register, /join, /users/sign_in, /my-account/, /cart, /checkout, /wp-admin) and files (images, PDFs, archives, scripts) are not requested. Links with a query string are not followed unless you turn on Follow links with a query string. Links marked nofollow and links on pages marked nofollow are not followed.
  • Safety: only public websites. Local names, private, link-local and reserved IP addresses (including cloud metadata addresses) are refused, also when a redirect or a DNS answer points to them.
  • JavaScript: pages are read as HTML, without running JavaScript. Pages that build their content in the browser are flagged javascript-rendered.
  • Run timeout: the Actor stops cleanly about 2 minutes before the run timeout and keeps what it saved (stopReason: time-limit). With the default 1-hour timeout and 60 requests per minute, an audit checks about 3,400 pages; raise the run timeout for more.
  • Size: up to 5,000 pages per audit run and 100,000 URLs per sitemap run; 5 MB of HTML per page; 50 sitemap files per run; URLs up to 2,048 characters (the sitemap protocol limit). Memory is fixed at 256 MB.
  • Interrupted runs: if Apify moves the run to another server or you abort it, the Actor finishes the batch it is saving, records it, and stops. A moved run is designed to continue where it left off without saving or charging any page twice.
  • Using this Actor to overload a website or to get around its access controls also breaks the Apify Acceptable Use Policy.

For website owners

The Actor identifies itself as SitemapSeoCheckHttp/0.1 (+https://apify.com/syntrovia/sitemap-seo-check-http). To keep it away from your site, add to your robots.txt:

User-agent: SitemapSeoCheckHttp
Disallow: /

You can also slow it down with Crawl-delay. To report misuse, open an issue on this Actor's Issues tab.

Data and privacy

  • What this Actor returns: technical facts about the pages of the website you name (status codes, tags, counts, lengths, issue codes) and, if you keep it on, three short texts per page (title, meta description, first H1) with e-mail addresses and phone numbers masked. Fields are limited to an allow-list.
  • Page texts belong to the website owner: titles, meta descriptions and H1 texts are the website owner's content and are returned only so you can audit that website. Do not republish them or use them for other purposes without the owner's permission.
  • What it does not return: page body text, link texts, mailto: or tel: links, cookies or Set-Cookie headers. E-mail addresses and phone numbers in the returned texts are masked with pattern rules, and URLs that contain an e-mail address or phone number are not requested and not listed.
  • Your website, your responsibility: you confirm that you may audit the website. If page titles of your website contain names of people (for example staff profile pages), they appear in the title field; switch Include title, meta description and H1 text off if you do not want that.
  • Removal requests: open an issue on this Actor's Issues tab. We aim to review requests within 72 hours.
  • Data is provided as is, without warranty. It is not legal or professional SEO advice.

FAQ

Why did my run stop early? Open the RUN_SUMMARY record and read stopReason: max-pages, max-urls, charge-limit (your maximum cost per run), blocked (see blockedAt: the site answered 401/403/407/429, or showed a CAPTCHA or bot-check page instead of the content), login-wall (most pages ask for a login), robots-unreachable, crawl-delay-too-long, site-unavailable, server-errors, time-limit (close to the run timeout), or all-urls-checked.

Why were some pages not checked? RUN_SUMMARY.skipped counts them by reason: robots (disallowed by robots.txt), login-page (a login form page, skipped and not charged), account-area, non-page-file, contact-in-url, query-link (links, each time one is found), url-too-long, queue-full, crawl-delay-too-long, unsafe-target or invalid-row.

My site needs JavaScript to show its content. Will this work? Only partly: the Actor reads the HTML your server sends. Titles, meta tags, canonicals and status codes are usually in that HTML; body text built by JavaScript is not. Such pages get the javascript-rendered issue.

Is it legal to audit any website? Use it on your own websites and on websites you are authorised to audit, where automated access is allowed. The Actor follows robots.txt and stops when a site refuses access, but it cannot read each site's terms for you.

How is the "not-in-sitemap" issue decided? Only when every sitemap was read to the end; an indexable page reached through links that no sitemap lists gets the issue.

More data tools from Syntrovia Data

Support

Open an issue on the Issues tab with your run ID. We aim to review issues and requests within 72 hours.