First CHAppsWeb apps

First CH Apps / Bulk URL Checker — HTTP Status Codes

Bulk URL Checker — HTTP Status Codes

Paste a list of URLs, one per line (up to 20), and our server checks each one and lists its HTTP status code, response time and final URL after redirects. Use it to confirm key pages still respond after a relaunch or migration, or to find dead entries in a prospect or link list.

To see every hop of a single URL's redirect chain, use the Redirect Chain Tracer; to grade the header values, use the Security Header Grader. This page answers three questions in bulk: is it alive, is it fast, and where does it end up?

There is no scheduled monitoring — this is a one-off bulk check. Because neither the URLs nor the results are stored, we cannot send alerts or keep a history.

Using the bulk URL checker

Paste a URL list

  1. Put one URL per line — up to 20 lines. Blank lines are ignored.
  2. If a line has no scheme, https:// is added. Only http and https URLs are checked.
  3. Query strings are kept (only percent-encoded where needed, e.g. a space becomes %20), so WordPress addresses such as https://example.com/?page_id=123 are checked as that page, not the home page.
  4. URLs containing a username or password (user:pass@…) are rejected. Do not paste tokens or other secrets either — the check is a plain public GET without cookies or credentials.
  5. Press “Check all”. The page sends the URLs to our server five at a time, and each group of results appears as soon as it is ready.

Reading 301/302, 403/404 and timeouts

  • 301 / 302: Redirects are followed (up to 5), and the code shown is the one at the end. A row that moved shows its final URL — check that it lands where you expect. To see every hop of one URL, use the Redirect Chain Tracer.
  • 404 / 410: The server answered that the page does not exist (410: removed on purpose). After a relaunch this usually means a redirect is missing.
  • 403 / 429: The site refused or rate-limited our server. This does not mean the page is missing — many sites block automated requests that a browser would get through. Open it in your browser to confirm. We do not retry or work around the block.
  • Timeout / could not connect: No answer within 8 seconds, or the connection failed. Our server could not reach it at that moment; it is not proof the site is down.

This page checks the URLs you paste. To find broken links inside a single page, use the Broken Link & Image Alt Checker.

A one-off check, not monitoring

Each run checks the list once, at the moment you press the button. Nothing is scheduled, nothing is stored and no alerts are sent, so it cannot replace an uptime monitor. Run it again whenever you want a fresh result, up to 20 URLs per run.

How to read it

The status is the one returned at the end of the chain (we follow up to five redirects and report the final code). Rows that redirected show their final URL.

Response times are measured from our server (Cloudflare Workers) and exclude the body, which we never download — we read the status and close the connection. They vary by network and region, so compare URLs with each other rather than reading absolute values.

404 (gone missing) and 410 (deleted) usually mean a redirect was never set up; 403 means our server was refused. Some sites open fine in a browser but return 403 to automated requests (bot protection).

Each URL times out after 8 seconds and follows at most 5 redirects. Only public GET requests are made — no cookies, no credentials.

A single run handles up to 20 URLs (to stay inside the free-tier subrequest limit). If the budget runs out, the remaining rows are labelled “not checked” rather than silently dropped.

SERVER PROCESSING — what we send and what we keep

Sent: only the list of URLs you paste. Our server (Cloudflare Workers) fetches each one with a public GET. No cookies and no credentials are sent.

Stored: nothing. The check lives entirely inside one request and writes neither the URLs nor the results to any database (no KV, no D1). It leaves memory when the request ends. There is no login and no account.

Returned: the status, response time and final URL for each entry. We never read the page body (not one byte) and never re-serve it — this app cannot be used to browse other sites through us.

Note: there is no scheduled monitoring (no stored results means no alerts and no history). URLs pointing at internal networks, localhost or private IPs are rejected.

Use it as an API

POST /status-check/api/check with JSON ({"urls": ["https://example.com/", "https://example.net/"]}) and you get the same results back as JSON. Up to 10 URLs per request (the JavaScript on this page calls the same endpoint in batches of 5).