# Bulk URL Status Code & Redirect Checker – 404, 301, 302 (`friedl/url-status-checker`) Actor

Check thousands of URLs for HTTP status codes (200, 301, 302, 404, 410, 500), redirect chains, final URLs, broken and dead links, DNS and SSL errors and response times. HEAD requests, no browser, very cheap. Delta mode alerts when a status changes.

- **URL**: https://apify.com/friedl/url-status-checker.md
- **Developed by:** [Friedrich K](https://apify.com/friedl) (community)
- **Categories:** SEO tools, Developer tools
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bulk URL Status & Redirect Checker

Check thousands of URLs at once for status codes, redirects and errors. The actor sends lightweight HEAD requests, needs no browser and costs very little.

- **Status codes:** 200, 301, 302, 404, 410, 500 and more, plus an `ok` flag
- **Redirect chains:** every hop with its status code, plus the final URL. Loops and too many redirects are detected.
- **Errors:** `DNS_NOT_FOUND`, `TIMEOUT`, `CONNECTION_REFUSED`, `TLS_ERROR` (for example an expired certificate)
- **Headers:** content type, content length, last-modified, `X-Robots-Tag` and server
- **Response time** per URL
- **Delta mode:** schedule it and receive only URLs whose status, redirect or error **changed**. This works as a simple uptime and redirect monitor.

### Use cases

- **SEO:** find broken links (404 or 410) and redirect chains, and verify 301 redirects after a site migration.
- **Link lists:** clean up backlinks, affiliate links or the URLs in a CRM or newsletter.
- **Monitoring:** check landing pages or partner URLs hourly or daily and get alerts on changes through Apify integrations (email, Slack, webhooks).
- **Short links:** expand bit.ly or other short URLs to their final destination.

### Input example

```json
{
  "urls": ["https://example.com/old-page", "http://example.com", "bit.ly/3xyz"],
  "followRedirects": true,
  "maxRedirects": 10,
  "timeoutSecs": 20
}
```

To use it as a monitor, add `"mode": "delta"` and create a schedule.

### Output (one item)

```json
{
  "id": "http://apify.com",
  "url": "http://apify.com",
  "finalUrl": "https://apify.com/",
  "statusCode": 200,
  "statusText": "OK",
  "ok": true,
  "redirectCount": 1,
  "redirectChain": [{ "url": "http://apify.com", "statusCode": 301 }],
  "contentType": "text/html; charset=utf-8",
  "contentLength": null,
  "lastModified": null,
  "xRobotsTag": null,
  "server": "cloudflare",
  "responseTimeMs": 412,
  "error": null,
  "fetchedAt": "2026-10-08T14:00:00.000Z"
}
```

In delta mode, the volatile fields `responseTimeMs`, `lastModified`, `contentLength` and `server` are omitted, so that only real status changes are reported. Those items include `changeType`.

### Pricing

Pay per event: **USD 0.50 per 1,000 URLs** (event `result`), with lower prices on higher Apify subscription plans. There is no start fee. Users on the Apify Free plan are limited to 50 URLs per run.

### How it works and limits

- The actor sends a HEAD request first. If a server rejects HEAD (403, 405, 501 or 5xx), it sends a GET instead and reads only the headers, never the page body.
- It sends at most 1 request per second to each host and checks 10 URLs in parallel. 1,000 URLs on different hosts take about 1–3 minutes, while 1,000 URLs on the same host take about 17 minutes.
- Some websites answer automated requests with 403 or a bot challenge. The actor reports that status as is and does not try to bypass such protection.
- Status codes reflect what the server returned to the actor's data center. A user's browser can see a different result, for example because of geo-blocking.

### Responsibility

The actor only requests the URLs that you provide and reports technical response data. It does not store or extract page content. You are responsible for checking only URLs that you are allowed to check. This actor is not affiliated with any of the websites checked.

### Impressum / Legal notice

Anbieter dieses Actors (Angaben gemäß § 5 DDG) / Provider of this actor:

Friedrich Köhler\
Spatzenweg 7\
04720 Döbeln\
Deutschland\
E-Mail: actorcreater_010@web.de

# Actor input Schema

## `urls` (type: `array`):

URLs to check, one per line. URLs without scheme get https://. Duplicates are removed.

## `followRedirects` (type: `boolean`):

Follow 3xx redirects and report the full chain and the final URL. Off = report the first response only.

## `maxRedirects` (type: `integer`):

Maximum redirect hops per URL before reporting TOO_MANY_REDIRECTS.

## `timeoutSecs` (type: `integer`):

Requests slower than this are reported with error TIMEOUT.

## `mode` (type: `string`):

'all' returns every URL. 'delta' returns only URLs whose status code, redirect chain, final URL or error changed since the last run with the same input – ideal for scheduled uptime and redirect monitoring.

## `maxResults` (type: `integer`):

Maximum number of checked URLs (= charged events) per run. Users on the Apify Free plan are limited to 50 results per run.

## `deltaStateName` (type: `string`):

Name for the delta state, e.g. "uptime-monitor". Leave empty to derive it from the input. Use different names to run independent monitors.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "http://example.com",
    "https://httpbin.org/status/404"
  ],
  "followRedirects": true,
  "maxRedirects": 10,
  "timeoutSecs": 20,
  "mode": "all",
  "maxResults": 10000
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://apify.com",
        "http://example.com",
        "https://httpbin.org/status/404"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("friedl/url-status-checker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": [
        "https://apify.com",
        "http://example.com",
        "https://httpbin.org/status/404",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("friedl/url-status-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://apify.com",
    "http://example.com",
    "https://httpbin.org/status/404"
  ]
}' |
apify call friedl/url-status-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,friedl/url-status-checker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VFiUkoWxtYWWjXnoI/builds/ZBpSHygbK5aly8hsy/openapi.json
