Redirect Checker & Bulk URL Status: Chains, Loops, 301 Map QA avatar

Redirect Checker & Bulk URL Status: Chains, Loops, 301 Map QA

Pricing

$0.80 / 1,000 url checkeds

Go to Apify Store
Redirect Checker & Bulk URL Status: Chains, Loops, 301 Map QA

Redirect Checker & Bulk URL Status: Chains, Loops, 301 Map QA

Bulk redirect checker and HTTP status code checker. Traces every hop (301/302/307/308, meta refresh) and flags redirect chains, loops, 404s, soft 404s, noindex targets and redirect-map mismatches after a site migration. First 20 URLs free, then $0.0008/URL.

Pricing

$0.80 / 1,000 url checkeds

Rating

0.0

(0)

Developer

Umair Saleem Mohammad Saleem

Umair Saleem Mohammad Saleem

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

Answer first: this actor is a bulk redirect checker and HTTP status code checker for SEO, site migrations and link cleanup. Give it a list of URLs, old → new pairs, a redirect map CSV (paste it, or a Google Sheets / Drive / Dropbox link) or a sitemap. It follows every hop itself (301, 302, 303, 307, 308 and meta refresh), records the status and Location of each one, and gives every URL a verdict and a one-line fix: REDIRECT_CHAIN, LOOP, TOO_MANY_REDIRECTS, TEMPORARY_REDIRECT (302 where a 301 belongs), BROKEN_4XX, SERVER_ERROR, SOFT_404, REDIRECTS_TO_HOMEPAGE, TARGET_NOINDEX, MAP_MISMATCH / NOT_REDIRECTED (the redirect doesn't land where your map says), HTTPS_TO_HTTP, SSL_ERROR, DNS_ERROR and more. It also writes a fix list CSV and a flattened redirects CSV (source → final URL for every chain, ready for your redirect rules). The first 20 URLs of every run are free, then $0.0008 per URL ($0.80 per 1,000). URLs that block the checker (401/403/429 or a bot challenge), invalid lines and duplicates are never billed.

Quick facts
Best forSite migration QA (old → new redirect maps), redirect chain and loop cleanup, broken link / 404 checks, HTTP → HTTPS and www checks, checking old sitemaps or backlink targets after a relaunch
InputURLs (one per line), old new pairs with optional expected status (410), a redirect map CSV (pasted or by link), or a sitemap URL
OutputOne row per URL: verdict, severity, chainText (e.g. 301 → 302 → 200), hops, finalStatus, finalUrl, expectedUrl, matchesExpected, issues[], fix, finalTitle, finalRobots, finalCanonical, chain[] (every hop with status, Location and time) + FIX_LIST.csv, FLATTENED_REDIRECTS.csv, SUMMARY
PriceFirst 20 URLs free every run, then $0.0008 per URL checked. No start fee. Same price with the final-page check on or off
NeedsNo API keys, no proxies, no login. Plain HTTP requests, max 4 at a time per host
Not includedJavaScript (window.location) redirects, crawling a whole site for links (use our Internal Link Audit for that), rank tracking

Try it now: the input is prefilled with 4 lines, so the first run is free.

Sample output (real run, 20 Oct 2026)

Build 0.1.2, run zMx0ss7vuq6Ngmrui, 15 input lines (3 of them old → new pairs), finished in about 8 seconds. All 15 were within the 20 free URLs, so the run cost $0. Full public dataset: JSON · CSV · FIX_LIST.csv

URL checkedVerdictStatus chainLands on
support.google.com/webmasters/answer/93633REDIRECT_CHAIN301 → 301 → 200developers.google.com/search/docs/crawling-indexing/301-redirects
docs.apify.com/platform/actors/running/REDIRECT_CHAIN + TEMPORARY_REDIRECT301 → 302 → 200docs.apify.com/actors/running
http://wikipedia.orgREDIRECT_CHAIN301 → 301 → 200https://www.wikipedia.org/
httpbin.org/redirect/3REDIRECT_CHAIN + TEMPORARY_REDIRECT302 → 302 → 302 → 200httpbin.org/get
developers.google.com/search/docs/advanced/crawling/301-redirectsREDIRECT_OK301 → 200…/search/docs/crawling-indexing/301-redirects
twitter.com/apify → expected x.com/apifyMAP_OK301 → 200https://x.com/apify
http://github.com/about → expected https://github.com/aboutMAP_OK301 → 200https://github.com/about
http://apify.com/store → expected apify.com/pricing (deliberately wrong)MAP_MISMATCH301 → 200https://apify.com/store
http://bing.comREDIRECT_OK + HTTP_FINAL, CANONICAL_ELSEWHERE301 → 200http://www.bing.com/ (canonical says https)
httpbin.org/status/404BROKEN_4XX404–
expired.badssl.comSSL_ERROR–CERT_HAS_EXPIRED: certificate has expired
http://localhost:8080/xPRIVATE_HOST (not requested, not billed)––

One row from that run (docs.apify.com/platform/actors/running/), trimmed:

{
"inputUrl": "https://docs.apify.com/platform/actors/running/",
"verdict": "REDIRECT_CHAIN",
"severity": "warning",
"chainText": "301 → 302 → 200",
"hops": 2,
"finalStatus": 200,
"finalUrl": "https://docs.apify.com/actors/running",
"issueCodes": "REDIRECT_CHAIN, TEMPORARY_REDIRECT",
"issueSummary": "REDIRECT_CHAIN: 2 hops: 301 → 302 → 200 | TEMPORARY_REDIRECT: 302 at https://docs.apify.com/actors/running/",
"fix": "Multi-hop chain. Update the first rule to point straight at the final URL (one 301) and update internal links.",
"chain": [
{ "step": 0, "url": "https://docs.apify.com/platform/actors/running/", "status": 301, "type": "redirect", "location": "https://docs.apify.com/actors/running/" },
{ "step": 1, "url": "https://docs.apify.com/actors/running/", "status": 302, "type": "redirect", "location": "https://docs.apify.com/actors/running" },
{ "step": 2, "url": "https://docs.apify.com/actors/running", "status": 200, "type": "final" }
],
"charged": false
}

(These are public pages picked to show each verdict. A chain on someone else's site is just an observation, not a claim that it hurts them.)

Verdicts and what to do

VerdictSeverityMeaningFix
OK / REDIRECT_OK / MAP_OK / STATUS_OKok200 directly, one clean 301/308 to a 200, lands where your map says, or returns the status you expected (e.g. 410)–
MAP_MISMATCHerrorRedirects, but not to the URL in your mapPoint the rule at the expected URL
NOT_REDIRECTEDerrorYour map expects a redirect, the URL answers itselfAdd the missing 301
STATUS_MISMATCHerrorStatus differs from the one you expected (e.g. expected 410, got 200)Fix the rule or the expectation
LOOP / TOO_MANY_REDIRECTSerrorNever reaches a page (more than 10 hops by default; Googlebot follows up to 10)Remove the conflicting rule
BROKEN_4XX / SERVER_ERRORerrorEnds on 404, 410, 5xx…301 to the closest live page, or 410 on purpose
TARGET_NOINDEXerrorRedirects to a noindex page (meta robots or X-Robots-Tag)Remove noindex or pick another target
DNS_ERROR / SSL_ERROR / TIMEOUT / CONNECTION_ERRORerrorHost doesn't resolve, bad certificate, no answerFix DNS / certificate / server
REDIRECT_CHAINwarning2+ hopsPoint the first URL straight at the final one (see FLATTENED_REDIRECTS.csv)
TEMPORARY_REDIRECTwarningA 302/303/307 in the chainUse 301 or 308 for permanent moves
REDIRECTS_TO_HOMEPAGEwarningDeep URL dumped on the homepage (Google often treats it as a soft 404)Redirect to the closest matching page
SOFT_404warning200 page that says "not found"Return 404/410 or redirect properly
META_REFRESHwarningClient-side refresh used as a redirectReplace with a server 301
HTTPS_TO_HTTP / HTTP_FINALwarning / noticeChain drops to HTTP, or ends on HTTPKeep every hop on HTTPS
CANONICAL_ELSEWHERE, CROSS_DOMAIN, NOINDEXnoticeFinal page's canonical points elsewhere; redirect leaves the domain; page is noindexCheck it is intended
BLOCKED, PRIVATE_HOST, INVALID_INPUTnotice401/403/429/bot challenge, internal address, unreadable lineNever billed

Input

Plain list, pairs and expected statuses in one box:

{
"urls": [
"https://example.com/old-page",
"https://old-site.com/blog/post-1 https://new-site.com/blog/post-1",
"https://example.com/discontinued-product 410"
]
}

A migration redirect map (header names like old/new, source/destination, from/to and status are recognised; comma, semicolon or tab):

{
"redirectMapCsv": "old_url,new_url,status\n/blog/seo-tips,/guides/seo-tips,301\n/old-pricing,/pricing,301\n/spring-sale,,410",
"baseUrl": "https://www.example.com"
}

Or a link: "redirectMapUrl": "https://docs.google.com/spreadsheets/d/<id>/edit#gid=0" (share as Anyone with the link can view). Or check an old sitemap after launch: "sitemapUrl": "https://old.example.com/sitemap.xml", "maxUrls": 5000.

Options: maxRedirects (10), checkTargetPage (on: noindex, canonical, soft 404, meta refresh), followMetaRefresh (on), strictTrailingSlash (off: /page = /page/), browserUserAgent (off), maxConcurrency (10), requestTimeoutSecs (20), maxUrls (1,000; up to 20,000).

What a run costs

URLsPrice
20$0 (free every run)
100$0.064
1,000$0.784
10,000$7.98

Set Maximum cost per run in the run options and the actor stops exactly there (tested: cap $0.004 → 20 free + 5 billed URLs, then a clean stop with stoppedAtSpendLimit: true in SUMMARY).

How it compares (live Apify Store prices, verified 20 Oct 2026)

ActorPriceMap QA (old → expected)Notes
This actor20 free/run, then $0.0008/URLyes (pairs, CSV, Sheets link)Chains, loops, soft 404, noindex target, homepage dumps, fix list + flattened CSV
Broken link / bulk status checkers (several)$0.001–$0.0025 per URLnoStatus codes and chains
Budget bulk status checkers~$0.00008–$0.0006/URL + $0.005–$0.035 start feenoCheaper at very large volume, start fee on small runs
Site migration redirect map validator$0.005 per mappingyes6× the price per row

For AI agents / MCP

Works as a tool in Claude, ChatGPT, Cursor or any agent through the Apify MCP server (cygnix_labs/redirect-checker) or the API. Ask: "Check these 300 old URLs redirect to the new site and give me the ones that don't." The agent passes:

{ "redirectMapUrl": "https://docs.google.com/spreadsheets/d/<id>/edit#gid=0", "maxUrls": 300 }

and reads verdict, matchesExpected and fix from the dataset, or the ready FIX_LIST.csv. Run it synchronously with POST https://api.apify.com/v2/acts/cygnix_labs~redirect-checker/run-sync-get-dataset-items.

FAQ

How do I check if a 301 redirect works? Put the old URL and the new URL on one line (old new). MAP_OK means it lands there; MAP_MISMATCH shows where it really goes; TEMPORARY_REDIRECT means it's a 302, not a 301.

How do I find redirect chains and loops in bulk? Paste the URLs or your sitemap. Every row shows the full chain (301 → 302 → 200), and FLATTENED_REDIRECTS.csv lists source → final for each chain so you can rewrite the rules as single hops.

Does it follow JavaScript redirects? No, only HTTP redirects and meta refresh (no browser, which keeps it fast and cheap). Search engines also prefer server-side 301s.

Why is a URL BLOCKED? The server answered 401/403/429 or a bot challenge, so nothing could be checked. It's free. Try browserUserAgent: true or check from your own network.

Does /page vs /page/ count as a mismatch? Not by default. Turn on strictTrailingSlash if it matters. Host case, default ports and #fragments are always ignored.

Is it safe to run on a live site? Yes: plain GET requests, max 4 at a time per host, no form posts. Bodies are only read for final HTML pages (first 1.5 MB).

Changelog

  • 0.1 (20 Oct 2026): first public release. Hop-by-hop tracing, map QA (pairs, CSV, Sheets/Drive/Dropbox links, relative paths), sitemap input (indexes, .gz), 20+ verdicts with fixes, fix list + flattened redirects CSVs, spend cap safe, private-address guard.

More tools by Cygnix Labs