Bulk URL Status and Redirect Checker
Pricing
Pay per event
Bulk URL Status and Redirect Checker
Check HTTP status codes and redirect chains for thousands of URLs: every hop with status and Location, final URL, response time, broken flag, and warnings for redirect loops, long chains, temporary redirects and HTTPS to HTTP downgrades. Comprobar redirecciones, verificar redirecionamentos.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Scott Williams
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Bulk URL Status Checker: HTTP Status Codes and Redirect Chains
Check the HTTP status code of thousands of URLs at once and trace every redirect. For each URL you get:
- the final status code and its category (success, redirect, client-error, server-error or error);
- the full redirect chain, with each hop's status code,
Locationand response time; - the final URL;
- total time, content type, content length and server;
- a broken-link flag;
- warnings for common redirect problems.
At a glance: $0.50 per 1,000 URLs, plus a $0.00005 Apify start event per run at the default 256 MB memory. You pay per result with no subscription, and you can set a maximum cost per run. Export to JSON, CSV or Excel, or call it from the Apify API.
It uses fast async HTTP with no browser and respects robots.txt.
What this HTTP status code checker is for
- SEO site migrations: check that every old URL 301s to the right new page in one hop.
- Broken link checks for a list of URLs exported from a CMS, sitemap or spreadsheet. Any 4xx or 5xx status, connection error, timeout, redirect loop or robots.txt skip sets
isBroken: true. - Redirect checking: expand short links and tracking links to their real destination, and catch redirect loops and HTTPS-to-HTTP downgrades.
- Uptime spot checks: schedule the Actor to confirm that key pages still return 200.
Redirect problems it flags
- Redirect loops and chains longer than
maxRedirects, reported inerror. redirect-chain-longer-than-1-hop.temporary-redirect: a 302, 303 or 307 where a permanent 301 or 308 is usually intended.https-to-http-downgrade.
Input
{"urls": [{"url": "https://python.org"},{"url": "https://httpbin.org/status/404"},{"url": "https://httpbin.org/redirect/3"}],"method": "GET","maxRedirects": 10}
| Field | Default | Notes |
|---|---|---|
urls | https://example.com | URLs to check. A bare domain gets https:// added. Duplicates are checked once. If the list is empty or is only https://example.com, that demo URL is checked free (a status: warning row). |
method | GET | GET reads only the status and headers and does not read the response body. HEAD is lighter for most servers. If a server rejects HEAD with 405 or 501, that URL is retried with a normal GET. |
maxRedirects | 10 | Max 30. |
includeHeaders | false | Adds the final response headers to each row (Set-Cookie is removed). |
maxConcurrency | 20 | Max 50. Requests to the same host are spaced at least 0.25 s apart. |
maxResults | 0 | Stops after this many URLs. 0 means no cap. |
Output
Each URL gets one dataset row. These are real rows from a test run on 30 October 2026. Response times vary.
{"url": "https://python.org","statusCode": 200,"statusText": "OK","category": "success","initialStatusCode": 301,"finalUrl": "https://www.python.org/","redirectCount": 1,"redirectChain": [{"url": "https://python.org", "statusCode": 301, "responseTimeMs": 423, "location": "https://www.python.org/"},{"url": "https://www.python.org/", "statusCode": 200, "responseTimeMs": 225}],"isRedirected": true,"isBroken": false,"totalTimeMs": 647,"contentType": "text/html; charset=utf-8","contentLength": 11659,"server": "nginx","warnings": [],"error": null,"checkedAt": "2026-10-31T01:33:24.531200+00:00"}
A three-hop temporary redirect (https://httpbin.org/redirect/3) returns redirectCount: 3, finalUrl: "https://httpbin.org/get" and warnings: ["redirect-chain-longer-than-1-hop", "temporary-redirect"].
A host that doesn't resolve returns statusCode: null, category: "error", isBroken: true and error: "DNS or connection error", plus status: "error" and a message starting "Not charged". This row is free. A robots.txt skip gets status: "skipped", and the free demo row gets status: "warning". Charged rows have no status or message field.
Pricing
Pricing is pay per event:
- $0.0005 per URL checked, which is $0.50 per 1,000 URLs. Only URLs that were actually checked are charged. Rows for URLs that could not be checked (connection error, timeout, redirect loop, too many redirects) and URLs skipped by robots.txt are free and carry
statusandmessage. - $0.00005 per run start (the standard Apify
apify-actor-startevent). It is charged per GB of run memory, minimum 1. That is 1 event at the default 256 MB (or any size up to 1 GB), or 2 events at the 2 GB maximum.
Free rows waive only the per-URL fee. The start event is charged on every run, including runs where every row is free.
Examples, at the default 256 MB memory:
- An empty input
{}(or only the prefilledhttps://example.com) returns 1 free demo row and costs only the start event, $0.00005. - 1,000 URLs that were all checked cost $0.50005.
- 1,000 URLs of which 50 could not be checked (for example DNS errors) cost 950 × $0.0005 + $0.00005 = $0.47505.
- 10,000 URLs that were all checked cost $5.00005.
The RUN_SUMMARY record in the run's key-value store shows rowsPushed, rowsCharged (rows billed as checked URLs) and rowsFree (free rows). Free rows still count towards maxResults.
Set Maximum cost per run and the Actor stops cleanly when it is reached.
Use it from n8n, Make or Zapier
Run the Actor through the Apify API and read the dataset. You can use the Apify integrations for Make, Zapier or n8n, or a plain HTTP request to the Apify API's "run Actor synchronously and get dataset items" endpoint. In either case:
- Send the input JSON above.
- Filter the returned rows on
isBrokenorwarnings.
The Apify Console's API tab for this Actor shows the exact endpoint URLs.
Use with AI agents / MCP
AI agents can run this Actor as a tool through Apify's MCP server. Add this server URL to your MCP client (Claude, Cursor, VS Code, OpenAI Agents SDK, LangChain and others) and sign in with OAuth, or send your Apify token as Authorization: Bearer <token>:
https://mcp.apify.com?tools=fecklesspleb/url-status-checker
The tool is named fecklesspleb--url-status-checker. Agents can also find it with search-actors and run it with call-actor. The run returns a dataset ID; read the rows with get-dataset-items, and pass fields (for example url,statusCode,finalUrl,isBroken,warnings,error) to keep the response small.
Minimal tool input:
{"urls": [{"url": "https://python.org"}, {"url": "https://httpbin.org/redirect/3"}, {"url": "https://example.invalid/"}]}
Two rows of the output (real items from a run of this input; rows come in the order the checks finish):
[{"url": "https://httpbin.org/redirect/3","statusCode": 200,"statusText": "OK","category": "success","initialStatusCode": 302,"finalUrl": "https://httpbin.org/get","redirectCount": 3,"isRedirected": true,"isBroken": false,"warnings": ["redirect-chain-longer-than-1-hop", "temporary-redirect"],"error": null},{"url": "https://example.invalid/","statusCode": null,"category": "error","isBroken": true,"error": "DNS or connection error","status": "error","message": "Not charged: this URL could not be checked (DNS or connection error)."}]
(Shortened: other fields such as redirectChain, totalTimeMs, contentType, server and checkedAt are left out here. Only free rows have status and message.)
Tips for agents:
- Cost is $0.0005 per checked URL, including URLs that return 4xx or 5xx. Rows with
errorset are free. SetmaxTotalChargeUsdin the run options (callOptionsincall-actor) to cap a run. - Filter on
isBrokenfor broken links, and onwarningsorredirectCountfor redirect problems in a migration. - Rows are not in input order: match them to your list by
url. - The
RUN_SUMMARYrecord in the run's key-value store showsbyCategory,rowsChargedandrowsFree.
Limits
- On the Apify platform, a URL whose host, or any redirect hop, resolves to a private, loopback or link-local address is not requested. Its row has
error: "private, loopback and link-local addresses are not allowed"andstatus: "error", and it is free.
FAQ
Does it download page content? In GET mode, no. It reads the status line and headers and then closes the response. In HEAD mode, a server that refuses HEAD gets one normal GET instead.
Does it render JavaScript or follow meta-refresh redirects? No. It follows HTTP redirects (Location headers) only.
Why is a URL marked "not checked: robots.txt disallows it"? The site's robots.txt forbids that path for crawlers, so the Actor doesn't request it. The row is still returned so your list stays complete. The row is free.
Can I crawl a whole website for broken links? This Actor checks the list of URLs you give it. It doesn't discover links by crawling.
What happens with invalid input? If the input is not a JSON object, or a field has the wrong type (for example a number where a list of URLs is expected, or "abc" for a number), the run fetches nothing and ends with one free status row: Invalid input, nothing was fetched and no results were charged: <reason>. No results are charged for it; the standard Apify start event still applies.
Is it legal? The Actor sends ordinary requests (one per URL and per redirect hop, plus one robots.txt request per site), obeys robots.txt and never logs in. You are responsible for the URLs you check.