How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
{"url": "https://example.com"}in URLs to check. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Check a list of public URLs before a site move or SEO review. This bulk URL status checker returns the final HTTP status, redirect destinations and broken-link flags for each processed URL. Start with one URL and open its result table. Each run accepts up to 100 input items. An empty list fails; a stopped run may return part of the list. The charge model is pay per useful HTTP result plus an Actor Start event and platform usage. Optional Apify Proxy traffic adds usage costs.
Who uses it
SEO specialists
Find broken links and long redirect chains in a URL list.
Site migration teams
Check that old URLs point to the right new pages.
QA engineers
Re-check key links after a release and keep a dated export.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.001 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| HTTP URL result | $0.00225 | One stored URL result with an HTTP response, including 404 or 503. No charge for technical failures, duplicates or invalid inputs. |
Examples
- One URL: about $0.0032.
- 1,000 URLs: about $2.26 (10 runs of up to 100).
- Every day 100 URLs, for 30 days: about $6.78 a month.
- 100 URLs once a week (4 runs a month): about $0.90 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,200 URLs.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Does it find soft 404 pages?
No. It reports the real HTTP status. A page that says not found with status 200 is not flagged.
Is every redirect a problem?
No. A redirect is normal. Check loops, many hops or a broken final page.
Can I check internal or login pages?
No. It checks only public HTTP and HTTPS addresses.
Does a 404 cost money?
Yes. A 404 is a useful result and counts. Network failures with status 0 do not count.
Can I see the status of every redirect hop?
The Dataset stores destination URLs, not a status code for each hop. statusCode is the final HTTP code, or 0 on technical failure.
Is a redirect always broken?
No. A redirect to 200 normally has isRedirect: true and isBroken: false. A redirect to 404 is broken.
Is the response time a speed score?
No. It is the whole URL check time from the run environment, including retries and waits. It is not a Core Web Vital.
Does a schedule compare results for me?
No. Export the dated rows and compare them in your own system.
Details
Step by step on Apify
- Open the Actor in Apify Console and choose Input.
- Switch to JSON and paste the minimal input below, or enter the URL objects in URLs to check.
- Keep direct requests for a first check. A fresh form offers one public example.com URL; you can start this sample without editing it. API calls still require startUrls and never substitute a hidden demo.
- Click Start. A run uses the selected build and run options.
- Open Output → URL results → Table. Check
statusCodeandfinalUrl. - Choose Export to save the results. Open Storage to read the separate summary.
Use cases
| Task | Add to startUrls | Review | Next step |
|---|---|---|---|
| Site migration URL check | Your old public URLs | redirectChain, finalUrl, isBroken | Compare the final destination with your own migration map |
| Broken link list | URLs from a link report | statusCode, isBroken, statusMessage | Fix or replace failing links |
| QA after a release | Known public endpoints | statusCode, responseTime, checkedAt | Re-check failed endpoints and keep the dated export |
| Redirect audit | Known redirecting URLs | Ordered redirectChain, isRedirect | Review extra hops or broken destinations |
Tips for better results
- Compare the final URL with your own redirect map after a move.
- Split big lists into parts of 100 URLs. One run takes up to 100.
- Look at the hop list. Many steps can slow pages and hurt SEO.
Limits and good to know
- At most 100 input items per run, counted before duplicate removal. Split larger lists yourself
- Concurrency range 1–100, default 20. Actual Cloud capacity was checked at concurrency 3 with 100 simple HTTP results; this does not promise the same speed or success for all sites
- Up to 10 redirect hops; loops and the hop limit produce broken results. A final target can be present in the chain before the cap prevents fetching it
- Up to 2 extra retries per request for network failures, 429 or 5xx. HEAD→GET fallback adds a request. Requests can therefore exceed the number of URLs
- Request phase timeout 1–30 seconds, default 10. Several phases, hops and retries can take longer than one timeout value
- Only public HTTP/HTTPS destinations. Private-network, loopback and unsafe targets are blocked, including at redirects and retries. TLS verification stays on
- URL credentials, secret query values and fragments are rejected. Custom proxy credentials are not accepted
- Results are saved as a batch after checking. A graceful stop can save finished and active rows and count queued URLs in
unprocessed; a hard platform kill or storage failure may lose final results. There is no streaming or resume guarantee
Troubleshooting
| Symptom | Possible reason | Check | Action |
|---|---|---|---|
| Input form says “This field is required” | Empty URL list | startUrls object array | Add at least one full public URL |
FAILED with INVALID_INPUT | Missing/empty/too-large list, unsupported option, or no valid URLs | Error summary and input shape | Correct the input; do not add secrets |
| Status 0 with null final URL | DNS, TLS, connection failure, timeout or blocked target | statusMessage, failed inputs and logs | Verify a public URL and retry a small subset |
| HTTP 404 | Server returned Not Found | Submitted and final URLs | Correct the URL or redirect |
| Fewer rows than input items | Duplicates, rejected entries, or queued work | duplicates, failedInputs, unprocessed | Fix the input or split a list |
| Succeeded but PARTIAL | Some checks failed technically or input was rejected | Summary, status0 rows | Review the failed subset; a platform success is not proof all URLs are good |
| Many 429/slow checks | Server rate limits or slow response | rateLimits, attempts, retries | Reduce concurrency and wait before a small re-check |
| Run stopped before results appeared | Batch saving and hard stop | Terminal status, summary/storage presence | Use smaller lists and enough run time; do not assume saved rows |
For developers
Use it from code
Actor ID: cliqtomedia/bulk-url-status-redirect-checker. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/bulk-url-status-redirect-checker").call(run_input={
"startUrls": [
{
"url": "https://example.com"
}
],
"maxConcurrency": 20
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~bulk-url-status-redirect-checker/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls": [{"url": "https://example.com"}], "maxConcurrency": 20}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/bulk-url-status-redirect-checker")
result = tool.invoke({"run_input": {"startUrls": [{"url": "https://example.com"}], "maxConcurrency": 20}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (9)
| Field | Type |
|---|---|
url | string |
statusCode | integer |
statusMessage | string |
isBroken | boolean |
isRedirect | boolean |
redirectChain | array |
finalUrl | string |
responseTime | integer |
checkedAt | string |
Input settings (4)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| URLs to check required | startUrls | array | [{"url": "https://example.com"}] |
| URLs checked at once | maxConcurrency | integer | 20 |
| Connection mode | proxyConfiguration | object | {"useApifyProxy": false} |
| Request timeout (seconds) | requestTimeoutSecs | integer | 10 |
Use cases with this tool
Each guide shows all the steps and the other tools.