# Bulk URL Status Checker — Broken Links, Redirects & SSL (`hipersoft/bulk-url-checker`) Actor

Check thousands of URLs over plain HTTP: status codes, broken links (404/410/5xx), full redirect chains, response time, content type, page title and SSL certificate expiry. No browser, no login.

- **URL**: https://apify.com/hipersoft/bulk-url-checker.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.002 / url checked

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bulk URL Status Checker — Broken Links, Redirects & SSL

Audit thousands of URLs in one run. Feed the Actor any list of links and it reports
each one's **HTTP status, whether it's broken, the full redirect chain, response
time, content type, page title, and SSL certificate expiry** — over plain HTTP, no
browser and no login.

Great for **broken-link audits, redirect/migration QA, uptime spot-checks, sitemap
validation, and SSL-expiry monitoring**.

### What you get per URL

| Field | Notes |
|---|---|
| `statusCode` | Final HTTP status (200, 301, 404, 410, 500, …). |
| `ok` / `broken` / `blocked` | `ok` = 2xx/3xx; `broken` = genuinely dead (404/410/5xx); `blocked` = access-restricted (401/403/429, usually bot-protection — try a proxy). Keeps blocks from being mistaken for dead links. |
| `redirectChain` | Every hop: `{url, status, location}` — see exactly where a link lands. |
| `redirectCount` | Number of redirects followed. |
| `finalUrl` | Where the URL ended up after all redirects. |
| `responseTimeMs` | End-to-end time for the whole chain. |
| `contentType`, `contentLength`, `server` | From the final response headers. |
| `title` | `<title>` of successful HTML pages (toggle off for pure speed). |
| `ssl` | For https: `{ issuer, validTo, daysToExpiry, authorized }` — catch expiring certs. |
| `error` | Classified failure: `dns-error`, `timeout`, `connection-refused`, `ssl-error`, `too-many-redirects`, … |

#### Why it's more than a status checker

Besides the status code it traces the **complete redirect path** (not just the final
landing), measures **latency**, grabs the **page title** so a report is human-readable,
and checks the **TLS certificate expiry** — so one run doubles as a broken-link audit
*and* an SSL-expiry watch.

### Input

```json
{
  "urls": ["https://apify.com", "https://apify.com/this-page-does-not-exist"],
  "checkSsl": true,
  "fetchTitle": true,
  "maxConcurrency": 20
}
```

- **urls** — links to check, one per line. (Or use **startUrls** for a request list.)
- **maxRedirects** — hops to trace before giving up (default 10).
- **fetchTitle** — read `<title>` of HTML pages (default on; turn off for max speed).
- **checkSsl** — report certificate expiry for https URLs (default on).
- **maxConcurrency** — URLs checked in parallel (default 20).
- **maxItems** — cap total URLs (0 = all).
- **proxyConfiguration** — optional; enable for reliable access at scale.

### Output (one row per URL)

```json
{
  "input": "https://apify.com/this-page-does-not-exist",
  "url": "https://apify.com/this-page-does-not-exist",
  "statusCode": 404,
  "ok": false,
  "broken": true,
  "redirectCount": 0,
  "finalUrl": "https://apify.com/this-page-does-not-exist",
  "responseTimeMs": 220,
  "contentType": "text/html; charset=utf-8",
  "title": "Page not found",
  "ssl": { "issuer": "Google Trust Services", "daysToExpiry": 61, "authorized": true },
  "error": null
}
```

### Pricing

Pay per URL checked. No monthly fee — you only pay for what you run.

### FAQ

**Do I need an account or API key?**
No. The Actor works over plain HTTP with no login or API key — just supply your list of URLs.

**How many URLs can I check per run?**
Thousands in a single run. `maxItems` caps the total (0 = all) and `maxConcurrency` controls how many URLs are checked in parallel (default 20).

**Is bulk URL checking legal?**
The Actor only reads the HTTP response of the URLs you supply. You are responsible for having the right to audit those targets and for respecting each site's terms and rate limits.

**What's the output format?**
A JSON dataset with one row per URL (status, broken/blocked flags, redirect chain, response time, title, SSL details). Export as JSON, CSV, or Excel from the Apify Console or API.

**Can I filter or limit results?**
Yes. Use `maxItems`, `maxConcurrency`, and `maxRedirects`, and toggle `checkSsl` and `fetchTitle` on or off to trade detail for speed.

### Related Actors

Combine this with other web-diagnostics and archival tools:

- [Domain Inspector](https://apify.com/hipersoft/domain-inspector) — WHOIS/RDAP, DNS, and SSL details for any domain.
- [Wayback Machine Scraper](https://apify.com/hipersoft/wayback-machine-scraper) — list archived snapshots of a URL or domain.
- [Bulk Image Downloader](https://apify.com/hipersoft/bulk-image-downloader) — fetch and store images at scale from a URL list.
- [Website Content Crawler](https://apify.com/hipersoft/website-content-crawler) — crawl a site into clean text for analysis or RAG.

### Notes

Checks only the HTTP response of URLs you supply. You are responsible for having the
right to audit the target URLs.

# Actor input Schema

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

List of URLs to check (e.g. "https://apify.com", "example.com/page"). One per line.

## `startUrls` (type: `array`):

Alternative to "URLs": a request list of {"url": "..."} objects, e.g. from a linked dataset or Key-Value store.

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

Upper bound on redirect hops traced per URL before reporting "too-many-redirects".

## `fetchTitle` (type: `boolean`):

Read the <title> of successful HTML pages. Turn off for maximum speed (headers only).

## `checkSsl` (type: `boolean`):

For https URLs, report the certificate issuer and days until expiry — catch soon-to-expire certs.

## `maxConcurrency` (type: `integer`):

How many URLs to check in parallel.

## `maxItems` (type: `integer`):

Cap on how many input URLs to check (0 = no cap, check all).

## `proxyConfiguration` (type: `object`):

Optional. Most checks work from datacenter IPs; enable a proxy if a target blocks them or you need a specific country.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://apify.com/this-page-does-not-exist"
  ],
  "maxRedirects": 10,
  "fetchTitle": true,
  "checkSsl": true,
  "maxConcurrency": 20,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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",
        "https://apify.com/this-page-does-not-exist"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/bulk-url-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",
        "https://apify.com/this-page-does-not-exist",
    ] }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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",
    "https://apify.com/this-page-does-not-exist"
  ]
}' |
apify call hipersoft/bulk-url-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=hipersoft/bulk-url-checker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/tFNjQKmbWTtQMPSkF/builds/bjuKgYNZJVrfhM41m/openapi.json
