URL Status Checker avatar

URL Status Checker

Pricing

from $0.15 / 1,000 urls

Go to Apify Store
URL Status Checker

URL Status Checker

Checks the HTTP status of thousands of URLs and lists every redirect hop with its Location, plus the final URL, response time, title, canonical and robots tags. Each failure gets a class such as DNS, timeout, TLS or refused connection.

Pricing

from $0.15 / 1,000 urls

Rating

0.0

(0)

Developer

deriverge s.r.o.

deriverge s.r.o.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

URL Status Checker takes a list of URLs and returns one row per URL: the final HTTP status, every redirect hop with its status and Location, the final URL, response time, content type and length, page title, canonical URL, meta robots, X-Robots-Tag and HSTS. When there is no answer, the row says why: DNS, timeout, TLS, refused or reset connection, or a redirect loop. Paste your URLs into URLs and click Start. Pages behind bot protection are marked restricted because their real status cannot be read. It costs $0.30 per 1,000 URLs on the Free plan ($0.15 on Business), and the $5 of monthly credit in Apify's Free plan covers about 16,000 URLs.

What data does it return?

FieldDescription
urlThe URL as checked. A line without a scheme gets https://, and the #fragment is dropped because servers never see it.
resultok (final answer 2xx), broken (4xx, 5xx or no answer), restricted (401, 407, bot protection or rate limit), redirect (a 3xx with Follow redirects off) or not checked.
status, statusTextStatus code and reason phrase of the final answer, such as 404 and Not Found. Empty when no answer came.
finalUrlWhere the URL ends up after all redirects, such as https://www.wikipedia.org/ for http://wikipedia.org.
redirectCount, redirectChainNumber of redirects and each hop in order: url, status (301, 302, 303, 307 or 308) and location.
responseTimeMsMilliseconds from the request for the final URL to its response headers (time to first byte).
totalTimeMsMilliseconds for the whole check, redirects included.
contentType, contentLengthContent-Type and Content-Length headers of the final answer. Many compressed pages send no length, so it is often empty.
titleText of the page's <title> tag.
canonicalURL from <link rel="canonical">, made absolute.
metaRobots, xRobotsTagThe <meta name="robots"> tag and the X-Robots-Tag header, such as noindex, follow.
isHttps, hstsWhether the final URL uses HTTPS, and its Strict-Transport-Security header.
serverThe Server header, such as nginx or cloudflare.
methodHEAD or GET, the method of the final request.
errorClass, errorWhy there is no usable answer: dns, timeout, tls, connection_refused, connection_reset, network, invalid_response, redirect_loop, too_many_redirects, invalid_url, bot_protection, rate_limited or not_requested, with a sentence such as The TLS certificate has expired.
changeWith a watch name: new URL, newly broken, fixed, changed or unchanged since the last run.
checkedAtWhen the URL was checked, as an ISO 8601 UTC timestamp.

How to check the status of many URLs

  1. Paste the URLs into URLs, one per line. A spreadsheet column pasted as is works too: header lines and anything that is not a URL are skipped and counted in SUMMARY.
  2. Leave Read title, canonical and meta robots on for an SEO check. Turn it off when you only need status codes and redirects: each URL then gets a HEAD request, with GET only when the server refuses HEAD.
  3. Turn off Follow redirects if you want the first answer of each URL, for example to audit a redirect map: a moved URL then shows its 301 and where it points.
  4. Set Timeout per URL and the two concurrency limits if needed, and a User agent if your firewall only lets certain clients through.
  5. Click Start. Rows appear in the Output tab in the order of your list, with views for redirects, SEO tags and errors, and can be exported as CSV, Excel or JSON. The SUMMARY record in the key-value store counts results by status code and error class and gives the median and 95th percentile response time.

Over the API, an input looks like this:

{
"urls": ["https://example.com/", "http://example.com/old-page"],
"pageDetails": true,
"followRedirects": true,
"timeoutSecs": 15,
"watchName": "shop-urls"
}

Example output

One row from a run on 11 October 2026, for a URL that redirects from HTTP to HTTPS:

{
"url": "http://github.com/",
"result": "ok",
"status": 200,
"statusText": "OK",
"finalUrl": "https://github.com/",
"redirectCount": 1,
"redirectChain": [
{
"url": "http://github.com/",
"status": 301,
"location": "https://github.com/"
}
],
"responseTimeMs": 41,
"totalTimeMs": 75,
"contentType": "text/html; charset=utf-8",
"contentLength": null,
"title": "GitHub · Change is constant. GitHub keeps you ahead. · GitHub · GitHub",
"canonical": "https://github.com/",
"metaRobots": null,
"xRobotsTag": null,
"isHttps": true,
"hsts": "max-age=31536000; includeSubdomains; preload",
"server": "github.com",
"method": "GET",
"errorClass": null,
"error": null,
"change": null,
"checkedAt": "2026-10-11T15:26:28.812Z"
}

How much does it cost to check URL status?

Free planStarterScaleBusiness
1,000 URLs$0.30$0.24$0.195$0.15

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

A list of 10,000 URLs costs $3.00 on the Free plan and $1.50 on Business. A URL repeated in the list is checked and charged once. Lines that are not URLs, and URLs that were not requested because their host had already answered with a bot protection challenge, are not charged.

Limits

  • Speed depends on the hosts. On 11 October 2026 a list of 1,000 URLs from Hacker News stories, spread over 656 hosts, took 50 seconds with the default settings; slow hosts and timeouts take most of that time. 390 URLs on one fast host took 2 seconds.
  • Each host gets at most 4 parallel requests by default (Requests at once per host, up to 10), so a long list from one site runs at that pace.
  • A host that answers 429 Too Many Requests gets a pause (its Retry-After, between 2 and 60 seconds) and then one request at a time. A URL is tried 3 times; after the fifth 429 from one host, its remaining URLs are returned as not checked.
  • A 502, 503 or 504 slows that host to one request per second and the URL is tried once more before the status counts.
  • When a host answers with a bot protection challenge (Cloudflare, DataDome, Akamai, Imperva, PerimeterX, AWS WAF, Anubis, LinkedIn's 999 and similar block pages), the row is restricted, the actor does not try to get around it, and the host's remaining URLs are not checked.
  • Up to 10 redirects are followed. Cookies set during a redirect chain are sent on the next hops, as a browser would, so cookie-based redirects do not look like loops.
  • The title, canonical and meta robots come from the <head> of HTML pages with a 2xx answer, read up to 1 MB. Tags added later by JavaScript are not seen, because pages are not rendered.
  • Certificates are verified. An expired, self-signed or mismatched certificate is reported as tls, which is what a visitor's browser would complain about too.
  • Each URL in your list gets one check (plus its redirects). robots.txt is not read; use Broken Link Checker to crawl a whole site with robots.txt respected.

Watching URLs on a schedule

Give the run a Watch name, or save the input as a task, and schedule it daily or hourly. Each row then has a change value compared with the previous run of that watch, and a CHANGES record lists:

  • newlyBroken: URLs that worked last time and fail now, with the old and new status.
  • fixed: URLs that failed last time and work now.
  • changed: URLs whose status, final URL or error class changed in another way, such as a new redirect.
  • newUrls: how many URLs were not in the previous run.

URLs from earlier runs that are missing from today's list stay in the snapshot for 90 days, so a watch can rotate through several lists.

FAQ

The actor sends the same requests a browser sends when someone opens the URL, one check per URL, and stores only HTTP metadata and the head tags of each page. It does not log in, solve challenges or read page content beyond the <head>. You are responsible for the URLs you check and for following the terms of the sites they belong to.

Why does a URL work in my browser but show 403 here?

Some sites block requests from data centers or without browser cookies. When the answer looks like a bot protection page, the row says restricted with the name of the service; a plain 403 stays broken. Setting User agent to what your own firewall allows helps for your own sites.

Does HEAD give the same result as GET?

Not always, which is why a URL is requested again with GET whenever HEAD returns 400 or more or drops the connection. The method field shows which one gave the final answer.

Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the Issues tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the API tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.