HTTP URL Probe avatar

HTTP URL Probe

Pricing

$0.40 / 1,000 url probeds

Go to Apify Store
HTTP URL Probe

HTTP URL Probe

Check up to 50 URLs per run with HEAD or GET: HTTP status code, final URL after redirects, redirect count, Content-Type header, and timing. No page body is read.

Pricing

$0.40 / 1,000 url probeds

Rating

0.0

(0)

Developer

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

9 days ago

Last modified

Security

Limited permissions

Share

First run in two steps

  1. Cheapest single probe. Run with one public URL and default HEAD. Cost = $0.0004 for that URL on the current Pricing tab (url-probed; no start fee; rates can change). Set a run spending limit (maxTotalChargeUsd) before you run so a larger batch cannot overspend.
{
"urls": ["https://example.com/"],
"method": "HEAD",
"timeoutSecs": 15,
"followRedirects": true
}

You get one dataset row: status code, final URL after redirects, redirect count, Content-Type, and timing. The page body is never read.

  1. Same shape, two outcomes. Re-run with a small list so you see a success row and an HTTP-error row in one batch. Still $0.0004 × number of URLs that got a network attempt (invalid or private/loopback URLs are not charged; do not use those as a free path).
{
"urls": [
"https://example.com/",
"https://httpbin.org/status/404"
],
"method": "HEAD",
"timeoutSecs": 15,
"followRedirects": true
}

If a host answers HEAD with 405 (or you need headers that only arrive on GET), keep the same urls and set method to "GET". The body is still not downloaded.

Store API / client examples for this Actor: the API section on the listing page.

Check whether URLs answer over HTTP, and where they end up. For each URL the Actor sends one HEAD (default) or GET request, follows redirects if you allow it, and returns one flat row with the status code, final URL, redirect count, Content-Type header and timing.

It is meant as a cheap first step before heavier work: prune dead links, record final URLs after redirects, or decide which URLs are worth sending to a content extractor.

What it does not do

  • It does not read, return or analyze the page body. GET is only used to get headers.
  • It does not check SEO, indexability, robots.txt, content or "uptime".
  • It does not use proxies, rotate IPs or bypass bot protection. Requests come from Apify datacenter IPs, so some sites answer 403, 429 or refuse HEAD. That status is what you get back.
  • It does not switch from HEAD to GET on its own. If a host answers HEAD with 405, run it again with method: "GET".

Input

FieldTypeDefaultNotes
urlsarray of stringsrequired1 to 50 absolute http:// or https:// URLs per run.
methodHEAD or GETHEAD
timeoutSecsinteger151 to 30. Total time per URL, including redirects.
followRedirectsbooleantrueUp to 10 hops. If false, the first response (e.g. 301) is reported.
userAgentstringEchoEmpire-HTTP-URL-Probe/0.1 (+https://apify.com/skilled_glee/http-url-probe)Up to 200 printable characters.
{
"urls": ["https://example.com/", "https://httpbin.org/status/404"],
"method": "HEAD",
"timeoutSecs": 15,
"followRedirects": true
}

If urls is missing or empty, the run fails with a clear message. There is no built-in example input that runs in its place.

Output

One dataset row per input URL, in input order:

FieldMeaning
urlThe input URL as given.
finalUrlURL of the last response after redirects, or null if there was no HTTP response.
statusCodeHTTP status of the last response, or null.
oktrue when statusCode is 200–399 and there is no error.
redirectCountRedirects followed.
contentTypeContent-Type response header as sent by the server, or null.
elapsedMsMilliseconds until response headers, or until the failure.
errornull, or one of: http_status (status 400+), timeout, dns, tls, connection, too_many_redirects, invalid_url, blocked_address.

Rows from a real cloud run (2026-10-25):

{"url": "http://github.com/", "finalUrl": "https://github.com/", "statusCode": 200, "ok": true, "redirectCount": 1, "contentType": "text/html; charset=utf-8", "elapsedMs": 109, "error": null}
{"url": "https://httpbin.org/status/404", "finalUrl": "https://httpbin.org/status/404", "statusCode": 404, "ok": false, "redirectCount": 0, "contentType": "text/html; charset=utf-8", "elapsedMs": 91, "error": "http_status"}
{"url": "https://does-not-exist.invalid/", "finalUrl": null, "statusCode": null, "ok": false, "redirectCount": 0, "contentType": null, "elapsedMs": 76, "error": "dns"}

Partial failures are isolated: a bad URL never stops the batch. It becomes a row with ok: false and an error. A run summary (counts per outcome, URLs charged, whether a spending limit stopped the run) is saved as SUMMARY in the default key-value store.

invalid_url means the string is not an absolute http(s) URL, or it contains credentials. blocked_address means the host resolves to a private, loopback or link-local address; such URLs are not requested.

Pricing (pay per event, platform costs included)

EventWhenPrice
url-probedOnce per URL that got a network attempt, whatever the outcome (ok, http_status, timeout, dns, tls, connection, too_many_redirects)$0.0004

No start fee and no minimum charge. Not charged: rows with invalid_url or blocked_address (no request was sent), and dataset items as such. Example: 50 URLs in one run cost 50 × $0.0004 = $0.02.

If you set a maximum charge per run, the Actor stops before it would exceed it; URLs that were not probed get no row and are counted in SUMMARY.skippedForSpendingLimit.

Limitations

  • 50 URLs per run; 10 requests in parallel.
  • Redirects: at most 10 hops; more gives too_many_redirects.
  • TLS certificates are verified; an invalid certificate gives tls.
  • Many sites answer HEAD with 405, or block datacenter IPs with 403/429. These are reported as the real status (ok: false, error: "http_status"), not hidden or retried.
  • elapsedMs is measured from the Apify cloud and is not a latency benchmark for end users.