HTTP Status Checker: Bulk URL & Redirect Audit avatar

HTTP Status Checker: Bulk URL & Redirect Audit

Pricing

Pay per usage

Go to Apify Store
HTTP Status Checker: Bulk URL & Redirect Audit

HTTP Status Checker: Bulk URL & Redirect Audit

Bulk URL status check that also grades the redirect: 301s that silently drop the path to the homepage, loops and long chains, HTTPS downgrades, meta-refresh and JavaScript redirects, soft 404s answering 200, and noindex on live pages. One row per URL with a plain-English issue list.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ai-Q Labs

Ai-Q Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

HTTP Status Checker: Bulk URLs & Redirect Audit

Paste a list of URLs. Get one row per URL with the status code, the full redirect chain, and — the part other status checkers skip — a verdict on whether that redirect actually did its job.

A status code on its own lies to you. 301 → 200 OK looks healthy in every bulk checker on the market. It is also exactly what you see when 4,000 old article URLs quietly redirect to your homepage after a migration, which Google treats as a soft 404 and drops from the index.

This Actor reads the chain, not just the last number.

What it finds

IssueSeverityWhy it costs you
redirect_drops_patherrorThe URL redirects to the site root and the path is gone. Google calls a redirect-to-homepage a soft 404: the old URL's ranking is discarded instead of passed on.
soft_404errorAnswers 200 but the page reads like a not-found page. Indexable, rankable, and useless.
brokenerror404 or 410.
server_errorerror5xx.
unreachableerrorDNS failure, TLS failure, connection refused or timeout, reported with the underlying message.
redirect_looperrorA URL in the chain redirects back to one already visited.
too_many_redirectserrorThe chain never terminates inside the hop limit.
https_downgradeerrorA hop moves from https:// to http://.
meta_refresh_redirectwarningHTTP said 200, then the HTML redirects with <meta http-equiv="refresh">. Status-only checkers call this URL fine.
noindexwarningAnswers 2xx but carries noindex in a meta tag or the X-Robots-Tag header.
canonical_to_homepagewarningA sub-page canonicalises to /, asking search engines to drop it.
redirect_drops_path_offsitewarningSame as the headline error, but the destination is another site — normal for a link shortener, a problem after an acquisition.
redirect_to_parentwarning/a/b/c ends at /a/b. Sometimes right, often a lazy catch-all rule.
redirect_chain_longwarningThree or more hops. Every hop is a round trip.
temporary_redirect_for_permanent_movewarning302/307 used for an HTTP→HTTPS or www change. Those moves are permanent; use 301.
query_droppedwarningThe redirect lost query parameters that are not tracking codes. utm_*, gclid, fbclid and friends are ignored on purpose.
content_type_mismatchwarningThe URL ends in .pdf but the server answered with HTML — a missing file served as a page still returns 200.
blocked_by_robotswarningThe site's own robots.txt blocks the URL. Reported with the exact rule.
slow_responsewarningThe whole chain took longer than your threshold.
access_denied / rate_limitedwarning401, 403, 429, 999. Reachable but refused — not the same as broken.
cross_site_redirect / path_changed / js_redirect_hint / canonical_elsewhere / http_to_https / redirectedinfoFacts worth knowing that are not necessarily faults.

Every row carries issueDetails: one plain sentence per issue saying what to do about it.

The one that pays for itself

After a site move, the tempting shortcut is a catch-all rule that sends anything unmatched to /. Visitors land somewhere, nothing 404s, the dashboard is green.

What actually happens: Google follows each redirect, sees a homepage that has nothing to do with the requested URL, classifies it as a soft 404, and drops the old URL — along with every link pointing at it. Because the response is 200 OK, no status checker complains.

This Actor compares the path you asked for with the path you ended up on:

/blog/2019/migration-notes -> / error redirect_drops_path
/products/old-sku-1182 -> / error redirect_drops_path
/index.html -> / ok (index tidying, not a fault)
/a/b -> /a/b/ info (trailing slash, not a fault)

index.html, default.aspx and friends are recognised as directory tidying and never flagged. Trailing-slash and http→https hops are not faults either.

What makes a status checker miss things

Three cases where the HTTP layer says 200 and the page still fails:

  1. <meta http-equiv="refresh"> — the browser and Google both move on. The status check sees a healthy page.
  2. A not-found page served as 200 — the title says "Page not found", the status says success. Detected from <title> and the first <h1> in nine languages, and the matched text is quoted back to you in softNotFoundEvidence so you can judge it yourself.
  3. noindex — the URL works perfectly and is excluded from search. Read from both the meta tag and the X-Robots-Tag header, so noindex on a PDF is caught too.

A bare 404 in a page title is not enough to trigger a soft-404 report: an article called "Our 404 page redesign story" is left alone.

Input

{
"urls": [
"https://example.com/blog/old-post",
"https://example.com/products/sku-1182",
"http://example.com/"
],
"analyzeHtml": true,
"respectRobotsTxt": true,
"onlyIssues": false,
"maxConcurrency": 8
}

The path is never thrown away. https://example.com/blog/old-post is checked as that page, not reduced to example.com. Bare hosts work too. One line may hold several URLs separated by spaces or newlines.

OptionDefaultWhat it does
analyzeHtmltrueRead the final HTML for soft 404s, noindex, meta refresh, canonical and JS redirects. Off = status and chain only.
respectRobotsTxttrueSkip URLs the site's robots.txt blocks and report them as blocked_by_robots. Turn off for sites you own that block all crawlers.
robotsAgentGooglebotWhose robots.txt rules to apply.
onlyIssuesfalseKeep only rows with a warning or an error.
maxConcurrency8Requests in flight. Lower it for a small server.
requestTimeoutSecs20Per-request timeout.
maxRedirects8Hop limit before the chain is called too long.
slowResponseMs3000Slow-response threshold.
maxUrls10000Safety cap per run.

Output

One row per URL. The key fields:

FieldMeaning
status / ok / severityFinal status code, a clean-run boolean, and ok/info/warning/error.
issues / issueDetailsThe codes above, and one sentence each on what to do.
finalUrl / redirectPath / redirectChainWhere it ended up, the chain as 301 -> 301 -> 200, and every hop with its own status.
pathDroppedtrue when the redirect discarded the path.
softNotFound / softNotFoundEvidenceThe soft-404 verdict and the text it was based on.
noindex / metaRobotsIndexing verdict and the raw directives, header and meta together.
canonicalUrl / metaRefreshTo / jsRedirectHintsWhat the HTML says about where this page really lives.
title / h1 / contentType / contentLength / responseTimeMs / charsetThe plain facts.
blockedByRobots / robotsRuleWhether robots.txt stopped the check, and the exact rule.

A SUMMARY record in the key-value store holds the totals: how many were broken, how many redirects dropped the path, how many soft 404s, plus a count per issue code.

Dataset views: Overview, Problems only, Redirects.

How it behaves on your servers

  • Two requests per URL at mostrobots.txt once per host (cached), then the URL itself. No crawling, no link following, no JavaScript execution.
  • Redirects are followed by hand, so the chain survives into the output instead of being collapsed into a single 200.
  • The body is read up to 200 KB and then the connection is dropped. A status check has no business downloading a video.
  • Non-HTML responses are not parsed as HTML — a .zip is checked and released.
  • Legacy charsets are decoded properly, so a Shift_JIS "page not found" title is still readable.
  • An honest user agent that identifies the Actor and links back to this page.

Limits, stated plainly

  • The HTML checks are regex over the first 200 KB, not a browser. Pages that build their <head> in JavaScript will report less. truncated_body tells you when </head> was past the cut.
  • js_redirect_hint is a hint: the assignment it found may sit behind a condition that never fires.
  • soft_404 is a heuristic over nine languages. The evidence is always quoted so you can overrule it.
  • Sites behind bot protection may answer 403 to any non-browser client. That is reported as access_denied, not as broken, because it usually is not.
  • respectRobotsTxt is on by default. If you are checking a staging site with a blanket Disallow: /, turn it off.

Built by Ai-Q Labs. Verified by 61 unit tests and 72 live checks against real servers before publishing.