Bulk URL Status & Redirect Checker
Pricing
from $1.00 / 1,000 results
Bulk URL Status & Redirect Checker
Check HTTP status codes and full redirect chains for thousands of URLs. Get the final URL, hops, loops, 302s and noindex headers, and verify expected redirects for site migrations. Works with Sitemap URL Extractor output. Respects robots.txt. $1 per 1,000 URLs.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
kernfetch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Bulk URL Status & Redirect Checker – status codes and redirect chains in bulk
Check thousands of URLs in one run and get, for each one, the HTTP status code, the full redirect chain (every hop with its status), the final URL and a ready-made list of issues: redirect chains, loops, temporary (302/307) redirects, HTTPS→HTTP downgrades, cross-host redirects, X-Robots-Tag: noindex, 4xx and 5xx errors.
Built for SEO audits, site migrations, broken link checks, sitemap QA and monitoring.
Why this Actor
- ⚡ Fast and cheap – headers only (HEAD, with automatic GET fallback): page bodies are never downloaded.
- 🔁 Full redirect chains – every hop with its status code, loop detection, configurable max hops, final URL and final status.
- 🚚 Migration QA – paste
old URL -> expected new URLpairs and getmatchesExpectedfor each one, plusallRedirectsPermanent(only 301/308 in the chain). - 🧩 Works with Sitemap URL Extractor – pass the dataset ID of a Sitemap URL Extractor run and check every URL of a site.
- 🩺 Issues ready to filter –
redirect_chain,temporary_redirect,https_downgrade,cross_host_redirect,redirect_loop,noindex_header,final_4xx,final_5xx,expected_mismatch. - 📋 Run report – a
SUMMARYrecord with counts by outcome, status code and issue, plus skipped URLs, blocked hosts and unreachable hosts. - 💸 Fair billing – URLs that are not requested (robots.txt, host that refused access) are not charged.
- ✅ Reliable and gentle – robots.txt respected on every hop, low load per site, protections never bypassed.
How to use
- Paste your URLs in URLs to check (one per line; Bulk edit accepts thousands). URLs without
http(s)://gethttps://. - Optionally add Expected redirects (
https://old.com/page -> https://new.com/page) or a Dataset ID from another run. - Click Start and download the results as JSON, CSV, Excel or via API. Use the Overview and Redirect chains views.
Input example
{"urls": ["https://apify.com", "http://example.com", "example.org/old-page"],"redirectMap": ["https://old.example.com/a -> https://www.example.com/a"],"method": "HEAD_THEN_GET","maxRedirects": 10,"maxUrls": 1000}
Output example
{"url": "http://example.com/old","outcome": "redirected_ok","statusCode": 301,"finalStatusCode": 200,"finalUrl": "https://www.example.com/new","redirectCount": 2,"redirectChain": [{ "url": "http://example.com/old", "status": 301, "location": "https://example.com/old" },{ "url": "https://example.com/old", "status": 302, "location": "https://www.example.com/new" },{ "url": "https://www.example.com/new", "status": 200 }],"allRedirectsPermanent": false,"issues": ["redirect_chain", "temporary_redirect"],"expectedUrl": "https://www.example.com/new","matchesExpected": true,"contentType": "text/html; charset=UTF-8","contentLength": 1256,"lastModified": null,"xRobotsTag": null,"errorType": null,"method": "HEAD","responseTimeMs": 412,"checkedAt": "2026-09-29T10:00:00+00:00"}
| Field | Description |
|---|---|
url | URL you submitted (normalized) |
outcome | ok, redirected_ok, client_error, server_error, unreachable, redirect_loop, too_many_redirects, redirect_without_location, invalid_redirect, blocked, robots_disallowed |
statusCode / finalStatusCode | Status of the first response / of the last response in the chain |
finalUrl | Where the URL finally lands |
redirectCount / redirectChain | Number of redirects / every hop with status and location |
allRedirectsPermanent | true if every redirect is 301 or 308 |
issues | List of detected problems (see above) |
expectedUrl / matchesExpected | Only with Expected redirects: true if the URL lands on the expected URL with a 2xx status |
contentType, contentLength, lastModified, xRobotsTag | Headers of the final response |
errorType | For unreachable: dns, connect, ssl, timeout, protocol |
method | HEAD or GET (fallback) |
responseTimeMs | Network time only (queueing and politeness delays excluded) |
checkedAt | Check timestamp (UTC) |
Use with Sitemap URL Extractor
- Run Sitemap URL Extractor on a domain.
- Copy the run's Dataset ID (Storage tab).
- Paste it in Dataset ID here and start: every sitemap URL is checked. Sitemaps should list only URLs that return 200 without redirects: anything else is a finding.
Use with AI agents
Give your agent a list of URLs and get back structured, stable fields it can reason on: status, final URL, redirect hops and issues. Useful to validate links before citing them, clean URL lists before scraping, or verify that pages still exist. Works with the Apify API, Apify MCP server, Make, Zapier, n8n and LangChain.
Pricing
Pay only for results: $1.00 per 1,000 checked URLs. No subscription. A run of 10,000 URLs costs about $10. URLs skipped because of robots.txt or a host that refused access are not charged. Set Maximum cost per run in Run options to cap your spend: the Actor never checks more URLs than your limit allows.
FAQ
Why is a URL "blocked" when it works in my browser?
The site answered 403, 429 or an anti-bot challenge to automated requests. The Actor respects that and never tries to bypass protections: the remaining URLs of that host are skipped, listed in the SUMMARY and not charged.
Why is finalStatusCode empty?
The URL was unreachable (see errorType), or a redirect pointed to a URL disallowed by robots.txt, which is not requested.
Does it download the pages? No. It only reads response headers, so it is fast, cheap and gentle on websites, and no page content is collected.
How fast is it? Lists spread over many hosts run in parallel. On a single host the Actor waits at least 500 ms between requests (about 2 URLs per second), so 5,000 URLs on one site take about 40 minutes.
HEAD or GET? The default HEAD then GET is the lightest option and retries with GET when a server answers HEAD with an error. Choose GET only for servers that answer HEAD incorrectly.
Can I run it on a schedule?
Yes. Create a Task with your URLs and a daily schedule, then filter rows where issues is not empty or connect an alert via Integrations (Slack, email, webhook).
Is it legal?
The Actor only requests public URLs you provide, reads HTTP headers, follows robots.txt and stops when a site refuses access. Site owners can block it with User-agent: kernfetch in robots.txt. You are responsible for the URLs you submit.
Related Actors by kernfetch
- Sitemap URL Extractor – every URL of a website from its sitemaps, with lastmod dates.
- RSS Feed Finder & Reader – discover the RSS, Atom and JSON feeds of any site and get the latest articles.
Support
Found a URL that doesn't behave as expected? Open an issue on the Issues tab with the URL: fixes are usually shipped within days.