HTTP Status Code Checker: Bulk URL, Website & Redirect Chains avatar

HTTP Status Code Checker: Bulk URL, Website & Redirect Chains

Pricing

from $0.16 / 1,000 url checkeds

Go to Apify Store
HTTP Status Code Checker: Bulk URL, Website & Redirect Chains

HTTP Status Code Checker: Bulk URL, Website & Redirect Chains

Status code checker and redirect checker for lists of URLs. Get the HTTP status, redirect chain, redirect type, final URL, response time and errors for each link. Bulk URL status checks that find broken links, 404s, 5xx errors and redirect loops. Pay per URL checked.

Pricing

from $0.16 / 1,000 url checkeds

Rating

0.0

(0)

Developer

Data Done Right

Data Done Right

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

11 days ago

Last modified

Security

Limited permissions

Share

This HTTP status code checker takes a list of URLs and returns one row per URL with the final status code, every redirect hop, the redirect type, response time and a plain-language error when a URL cannot be reached. Use it as a bulk URL status checker and redirect checker to find broken links, 404s, 5xx errors, redirect loops and slow pages in seconds, without writing a script.

Paste a few URLs or up to 20,000. Each URL is checked on its own, so one dead domain never stops the run, and every URL you enter produces a row you can sort, filter and export as JSON, CSV or Excel.

What does the HTTP status code checker return?

  • Final HTTP status (statusCode, statusText) and a simple category: 2xx ok, 3xx redirect, 4xx client error, 5xx server error or error.
  • isBroken: true for 4xx, 5xx and for URLs that could not be reached at all.
  • Redirect chain: every hop with its status code and target (redirectChain), the number of redirects, the type (301 permanent, 302 temporary, mixed) and the final URL.
  • Redirect flags: hasRedirectLoop, httpToHttps (an http URL that ends on https) and wwwChange (the redirect only adds or removes www).
  • Timing and headers: total responseTimeMs, ttfbMs, contentType, contentLength and server.
  • Clear errors: dns, timeout, ssl, connection refused, connection reset, redirect loop, too many redirects, blocked private address or invalid URL.
  • Expected status check: give the codes you expect, for example [200], and every row gets matchesExpected.
  • A run summary (SUMMARY record) with counts by category and status code, the number of broken URLs and the five slowest URLs.

How to check HTTP status codes in bulk

  1. Paste your URLs into URLs to check, one per line (use "Bulk edit" for long lists), or into Or paste URLs as plain text. A missing https:// is added for you.
  2. Leave the defaults (HEAD with automatic GET fallback, follow up to 10 redirects, 15 second timeout, 20 parallel checks) or change them.
  3. Run the Actor and open the Overview table, or download the dataset as CSV, Excel or JSON.

Redirect checker and redirect chain tracer

With Follow redirects on (the default), the Actor follows 301, 302, 303, 307 and 308 redirects hop by hop and records each one in redirectChain:

"redirectChain": [
{"url": "http://github.com/", "statusCode": 301, "location": "https://github.com/"}
]

You see where a link really ends, whether the redirects are permanent or temporary, whether a page bounces through several hops, and whether a redirect loop exists. Turn Follow redirects off to see only the first response and its location. Redirects done with an HTML meta refresh or JavaScript are not detected, because the Actor does not run a browser.

Export URLs from a sitemap, a CRM, a spreadsheet, Search Console or a backlink report, paste them in, and filter the result for isBroken = true. Rows with category 4xx client error are dead pages (404, 410), 5xx server error are server problems, and error rows are domains or certificates that fail. To check a migration, set Expected status codes to the code you want (for example [301] with Follow redirects off) and filter on matchesExpected = false.

Input example

{
"urls": [
"https://example.com",
"http://github.com",
"https://httpbin.org/status/404",
"https://apify.com"
],
"method": "HEAD",
"followRedirects": true,
"maxRedirects": 10,
"timeoutSecs": 15,
"concurrency": 20,
"expectedStatus": [200]
}
FieldWhat it does
urlsURLs to check. Duplicates are removed, the first one is kept.
urlsTextOptional: the same, as a plain text block with one URL per line.
methodHEAD (default; falls back to GET when a server answers a HEAD with 400 or higher) or GET.
followRedirectsFollow redirects and record the chain (default on).
maxRedirectsRedirects allowed per URL, 1 to 20 (default 10).
timeoutSecsTotal seconds per URL including redirects (default 15).
concurrencyParallel checks, 1 to 50 (default 20). At most 10 at once per website.
userAgentbrowser (default) or bot (honest StatusCodeCheckerBot).
requestHeadersOptional extra headers, stored encrypted, dropped when a redirect leaves the site.
expectedStatusOptional codes such as [200, 301] or ["2xx"], adds matchesExpected.
maxUrlsCap on unique URLs, up to 20,000 (default 1,000). Also caps your spend.
proxyConfigurationOptional Apify Proxy, off by default.

Output example

One row per URL, in the order you entered them:

{
"url": "http://github.com/",
"inputUrl": "http://github.com",
"finalUrl": "https://github.com/",
"statusCode": 200,
"statusText": "OK",
"category": "2xx ok",
"isBroken": false,
"redirectCount": 1,
"redirectChain": [
{"url": "http://github.com/", "statusCode": 301, "location": "https://github.com/"}
],
"redirectType": "301 permanent",
"hasRedirectLoop": false,
"httpToHttps": true,
"wwwChange": false,
"methodUsed": "HEAD",
"responseTimeMs": 269,
"ttfbMs": 125,
"contentType": "text/html",
"contentLength": null,
"server": "github.com",
"location": null,
"matchesExpected": true,
"error": null,
"checkedAt": "2026-10-25T12:00:00+00:00"
}

A URL that cannot be reached still gets a row, for example "statusCode": null, "category": "error", "isBroken": true, "error": "dns: domain name not found or not resolvable".

The SUMMARY record in the key-value store looks like this:

{
"urlsInInput": 4, "duplicatesRemoved": 0, "urlsChecked": 4, "charged": 4,
"byCategory": {"2xx ok": 3, "3xx redirect": 0, "4xx client error": 1, "5xx server error": 0, "error": 0},
"byStatusCode": {"200": 3, "404": 1},
"broken": 1, "redirected": 1,
"slowest": [{"url": "https://httpbin.org/status/404", "responseTimeMs": 328, "statusCode": 404}]
}

Use with AI agents / MCP

Connect Apify's MCP server (mcp.apify.com) to Claude, ChatGPT or Cursor and an agent can verify links itself. Example prompt: "Check these 200 URLs and tell me which ones are broken or redirect more than once." The agent only needs the urls field and reads isBroken, redirectCount and finalUrl from the dataset. The same input works from the Apify API, Python and JavaScript clients, Make, Zapier and n8n.

Use cases

  • SEO and site migrations: confirm old URLs return the right 301 and land on the right page, with no chains or loops.
  • Broken link checks: run a list from a sitemap, backlink export or spreadsheet and fix the dead ones.
  • Uptime spot checks: schedule the Actor and compare the SUMMARY of each run.
  • Link building and outreach: drop dead backlinks and prospects before you contact anyone.
  • Redirect audits: find http to https and www rules, temporary redirects that should be permanent, and long chains.

How the checks work, and the limits

  • HEAD versus GET. HEAD is fast because no page is downloaded. Some servers answer HEAD wrongly (405 or even 404), so any HEAD answer of 400 or higher is checked again with GET and the GET result wins. methodUsed tells you which one produced the final status. The page body is never downloaded either way.
  • No JavaScript. The Actor does not run a browser, so JavaScript or meta refresh redirects, and pages that show an error inside a 200 response (soft 404s), are not detected.
  • Blocked or rate-limited sites. Some sites (large social networks, shops, sites behind a CDN firewall) answer data center IPs with 403, 429 or 999, or drop the connection. Those are reported as the status the site returned. Turn on Proxy (Apify Proxy) and try again. The Actor does not try to bypass bot protection.
  • Private addresses are never contacted. Localhost, private networks, link-local and cloud-metadata addresses are blocked, also after DNS resolution and on every redirect hop. Such URLs get a row with blocked private address.
  • Politeness. At most 10 checks run in parallel against the same website, whatever concurrency you set.
  • Certificates are verified. An expired or invalid certificate shows up as ssl in error.
  • Cookies are not kept between URLs.

How much does it cost

Pay per event: $0.20 per 1,000 URLs checked (event url-checked, $0.0002 each), and there is no start fee. You are charged once per URL row that was actually checked, redirects and the automatic GET fallback included. Entries that cannot be checked at all (invalid text, mailto: links, or a private address written directly in the URL) are free. A URL that fails with DNS, SSL or timeout still counts as checked. Checking 20,000 URLs costs about $4. Set Max URLs and your Apify spending limit to cap a run; the Actor stops cleanly when the limit is reached and says so in the status message and SUMMARY.

FAQ

What is the difference between HEAD and GET for status checks?

HEAD asks the server for headers only, so it is faster and lighter. A few servers refuse HEAD. This Actor retries those URLs with GET automatically, so you get the status a browser would see.

Run the list and filter the dataset for isBroken = true. 404 and 410 are dead pages, 5xx are server errors, and error rows are unreachable domains, bad certificates or timeouts.

Does it follow redirects and show the whole redirect chain?

Yes, up to 20 hops. Each hop is listed in redirectChain with its status code and target, and redirectType summarises them. Redirect loops are stopped at the first repeated URL and flagged with hasRedirectLoop.

Why does a site return 403 or 429 here but works in my browser?

Some sites block data center IP addresses or unusual traffic. Try User agent: browser and Apify Proxy. If the site still refuses, the result is reported as returned.

Can it check pages that need a login?

Only if a header is enough. Put an Authorization header or a cookie in Request headers. It is stored encrypted and not sent to other sites after a redirect. The Actor does not log in through forms.

Does it check the content of the page?

No. It checks the HTTP response only: status, redirects, headers and timing.

What happens when a URL fails?

It becomes a row with category: "error" and an error message. The run continues and still ends as succeeded.

  • SEO Audit Tool & Meta Tag Checker: Crawler, Broken Links crawls a whole site and audits titles, canonicals and links, when you do not have a URL list yet.
  • HTTP Request Runner: Bulk API Calls, Retries, Proxies sends POST, PUT and other API calls in bulk when you need more than a status check.