HTTP Status and Headers Checker
Pricing
from $0.50 / 1,000 url checks
HTTP Status and Headers Checker
Audit a list of URLs in one run: status code, every hop of the redirect chain and the final URL, response time, server and content type, and six key security headers. Plain GET requests only, no proxies, no page content stored.
Pricing
from $0.50 / 1,000 url checks
Rating
0.0
(0)
Developer
Gridline Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
HTTP Status and Headers Checker: status codes, redirect chains and security headers for a list of URLs
Paste a list of URLs and get one row per URL with the HTTP status code, every hop of the redirect chain and the final URL, the response time, the Server and Content-Type headers and six security headers that matter most in audits. The Actor sends a single plain GET request per URL, keeps the headers and drops the body, so there are no browsers, no proxies and no stored page content. The table is a regular Apify dataset: download it as JSON, CSV or Excel, or read it through the API.
What it is good for
- Broken link and uptime audits: find 404/410/5xx pages in a sitemap or a list of backlinks.
- Redirect checks after a migration: see every hop (301 → 302 → 200), spot loops and chains longer than one hop, confirm that
http://lands onhttps://. - Security header inventory: list which domains send
Strict-Transport-Security,Content-Security-Policy,X-Frame-Options,X-Content-Type-Options,Referrer-PolicyandPermissions-Policy, and which do not. - Server fingerprinting for SEO or ops:
ServerandContent-Typeof the final response for each URL, plus response time in milliseconds. - Feeding other tools: the output is flat JSON, one record per input URL, easy to join with your own spreadsheets or to schedule as a monitoring run.
How to use it
- Open the Actor and paste your list of URLs into the
urlsfield, one per line (or pass a JSON array through the API). - Adjust the options if you need them (
followRedirects,includeHeaders,timeoutSecs,maxConcurrency); the defaults work for most runs. - Click Start. When the run finishes, the status message reads
Checked N of M URLs (X with errors, Y invalid). - Download the results from the Dataset tab as JSON, CSV or Excel, or read them through the API.
Input
| Field | Type | Default | Meaning |
|---|---|---|---|
urls | array of strings | small self-test list | Absolute URLs starting with http:// or https://. Exact duplicates (same string) are skipped. Up to 1,000 per run (extra entries are dropped and counted in SUMMARY). |
followRedirects | boolean | true | Follow up to 10 redirects and report the chain. Set to false to record only the first response. |
timeoutSecs | integer 1–60 | 15 | Time limit per URL, including all redirects. |
maxConcurrency | integer 1–50 | 10 | How many URLs are checked in parallel. |
includeHeaders | boolean | true | Add the full header map of the final response (headers field) to each record. |
Example input:
{"urls": ["https://example.com","http://github.com","https://example.com/does-not-exist"],"followRedirects": true,"timeoutSecs": 15}
Output
One JSON record per input URL in the default dataset (nested fields are expanded into columns in the CSV/Excel export). Example (values illustrative, headers shortened):
{"url": "http://github.com","finalUrl": "https://github.com/","statusCode": 200,"statusText": "OK","ok": true,"redirectCount": 1,"redirectChain": [{ "url": "http://github.com/", "statusCode": 301, "location": "https://github.com/" }],"responseTimeMs": 184,"server": "GitHub.com","contentType": "text/html; charset=utf-8","contentLength": null,"securityHeaders": {"strictTransportSecurity": "max-age=31536000; includeSubdomains; preload","contentSecurityPolicy": "default-src 'none'; ...","xFrameOptions": "deny","xContentTypeOptions": "nosniff","referrerPolicy": "origin-when-cross-origin, strict-origin-when-cross-origin","permissionsPolicy": null},"headers": { "content-type": "text/html; charset=utf-8", "server": "GitHub.com" },"error": null,"errorMessage": null,"checkedAt": "2026-09-06T12:00:00.000Z"}
Field notes:
urlis your input exactly as given (credentials, if any, are masked asuser:***@; a user name without a password as***@; a password containing a raw/,\,?or#is not recognized as credentials, so percent-encode such characters);finalUrlis always the parser-normalized form of the last URL requested (lower-case scheme and host, trailing slash on a bare host).okistrueonly for a final status in the 2xx range.statusCodeisnullwhen no final response was received (timeout or network error); hops that were already followed stay inredirectChain. Look aterrorthen.erroris one ofINVALID_URL,TIMEOUT,NETWORK_ERROR,TOO_MANY_REDIRECTS, ornullon success.errorMessagecarries the detail (for example the DNS error text). WithTOO_MANY_REDIRECTSthe record still carries the status and headers of the last3xxresponse.INVALID_URL(never charged) covers: anything that is not an absolutehttp(s)://URL; URLs with embedded credentials (https://user:pass@host/); ports that the Fetch standard refuses to connect to (for example 22, 25, 53, 6000, 10080); and private, loopback, link-local or localhost addresses (127.0.0.1,10.x,192.168.x,169.254.x,localhost,[::1], …). The Actor checks publicly reachable URLs only. Note that a public host name that resolves to a private address is not detected.- Redirects to anything other than a public
http(s)://target (for exampledata:,ftp:or a private address) are not followed; the3xxresponse is recorded as the final one. responseTimeMscovers the whole redirect chain, from the first request to the final response;checkedAtis the time the check started.contentLengthis theContent-Lengthof the final response as sent to this client. Requests advertiseAccept-Encoding: gzip, deflate, so servers that compress report the compressed size (nullfor chunked responses).securityHeadersvalues are the raw header strings;nullmeans the server did not send that header.- Header names in
headersare lower-cased.Set-Cookieheaders are dropped on purpose: cookie values are session identifiers and the Actor does not collect them.
A SUMMARY record is saved to the run's key-value store: inputEntries (rows you provided), inputUrls (after trimming, de-duplication and the 1,000 cap), skippedDuplicates, droppedEmptyOrNonString, truncatedOverLimit, processed, checked, failed, invalid, notSavedAfterLimit, unexpectedErrors, stoppedByChargeLimit. The run's status message repeats the key numbers (for example Checked 7 of 7 URLs (2 with errors, 1 invalid)).
Pricing
This Actor uses Apify pay per event pricing. Each run costs a small fixed start fee plus a price per URL checked; the exact amounts are shown in the Pricing tab. A URL is charged when it was actually requested (timeouts and network errors count, because a request was made). Invalid entries (error = "INVALID_URL", see field notes) are written to the dataset but are not charged. There are no additional platform usage fees.
If you set a maximum total charge for the run, the Actor stops when the budget is reached, finishes successfully and says in its status message how many URLs were checked; the remaining URLs are not requested. A limit lower than one Actor start plus one URL makes the run fail immediately with an explanatory message. If the platform migrates the run to another server, the Actor resumes from its saved state, URLs already saved are not checked or charged again.
Limits and behavior
- Up to 1,000 URLs per run; up to 10 redirects per URL; timeout 1–60 seconds per URL.
- Requests are sent from Apify's shared infrastructure without proxies. Some servers answer
403or429to automated clients; that is reported as a normal result, not retried. - The Actor sends a descriptive
User-Agent(GridlineTools-HTTPStatusChecker) so site owners can identify it. - Response bodies are never downloaded, stored or parsed. Only response metadata is saved.
- No login, cookies or JavaScript execution: pages behind authentication return whatever the server sends to an anonymous request.
FAQ
Does it follow meta refresh or JavaScript redirects? No. Only HTTP redirects (301, 302, 303, 307, 308 with a Location header) are followed.
Why do I see 403 for a site that opens fine in my browser? The site blocks automated clients or requires cookies. The status you get is exactly what the server returned to a plain request, useful information in itself.
Can I check the same list every day? Yes, schedule the Actor in Apify Console and download the dataset, or connect a webhook to your own system.
Is the order of results the same as the input? Records are written as checks finish (parallel processing). Each record carries the original url, so you can sort or join on it.
What counts as one "URL checked"? One input URL, regardless of how many redirects it took to reach the final response. Timeouts and network errors do count (the request was made); invalid URLs (including private addresses and blocked ports) do not.
Can I check servers on my own network or on localhost? No. The Actor runs in Apify's cloud and only checks publicly reachable addresses; private, loopback and link-local addresses are rejected as INVALID_URL without a request.
Other Actors by Gridline Tools
Other checks from the same publisher, each with one row per address and the same pricing rule (start fee plus price per checked item):
- Robots.txt Checker: Test a list of URLs against each site's robots.txt for a chosen user agent (RFC 9309).
- RDAP Domain Lookup and Expiry Checker: Query RDAP registries for a list of domains and get registrar, creation and expiry dates, EPP statuses, name servers and DNSSEC in one table.
- AI Crawler Access Audit: See which AI and search crawlers (GPTBot, ClaudeBot, Google-Extended, CCBot and 150+ more) each site allows or blocks in robots.txt, and whether llms.txt is published.
Disclaimer
This Actor provides technical metadata about publicly reachable URLs. You are responsible for making sure that your use complies with applicable law and with the terms of service of the sites you check. The Actor comes without any availability guarantee. Output data is provided as-is for your own use; it does not contain personal data by design (cookies are never stored and credentials in URLs are masked).