# Bulk URL Status Checker & Broken Link Checker (`rtworule/bulk-url-health-auditor`) Actor

Check public URLs in bulk for HTTP status codes, broken links, redirect chains, response time, content type, titles, canonicals, robots directives, and safe errors.

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

## Pricing

$1.00 / 1,000 url checkeds

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 Link Checker

Check up to 1,000 public URLs per run for HTTP status, broken links, redirect chains, response time, content type, canonical tags, and robots directives. Use it as a bulk URL status checker, broken link checker, uptime diagnostic, or technical SEO input.

### What you get

- final URL and complete redirect chain
- HTTP status, success state, and structured errors
- total and per-hop response time
- content type and declared content length
- page title, canonical URL, and robots meta directives
- one export-ready dataset row per checked URL

### Common use cases

- find 4xx/5xx pages and broken links after a migration
- audit redirect chains, loops, and unexpected destinations
- monitor landing pages, client sites, or partner links
- validate sitemaps and content inventories in bulk
- enrich SEO, QA, and observability dashboards

### Quick start

1. Click **Try for free** or **Run**.
2. Paste public URLs into **URLs**.
3. Keep **Extract HTML signals** on if you need title, canonical, and robots fields.
4. Run the Actor and export the dataset as JSON, CSV, or XLSX.

```json
{
  "urls": ["https://example.com", "https://apify.com"],
  "concurrency": 10,
  "timeoutSeconds": 20,
  "maxRedirects": 10,
  "includeHtmlSignals": true
}
```

### Example result

```json
{
  "inputUrl": "https://example.com",
  "finalUrl": "https://example.com/",
  "statusCode": 200,
  "statusText": "OK",
  "ok": true,
  "redirectCount": 0,
  "redirectChain": [{
    "url": "https://example.com/",
    "statusCode": 200,
    "responseTimeMs": 74
  }],
  "responseTimeMs": 82,
  "contentType": "text/html",
  "title": "Example Domain",
  "checkedAt": "2026-07-06T17:26:53.011Z"
}
```

### Run by API

Set `APIFY_TOKEN` in your environment and keep it out of source control.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/rtworule~bulk-url-health-auditor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://example.com"],"includeHtmlSignals":true}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('rtworule/bulk-url-health-auditor').call({
  urls: ['https://example.com'],
  includeHtmlSignals: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("rtworule/bulk-url-health-auditor").call(run_input={
    "urls": ["https://example.com"],
    "includeHtmlSignals": True,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Pricing

This Actor uses pay per event. A `url-checked` event costs **$0.001 per stored result**: 100 checked URLs cost $0.10 and 1,000 cost $1.00 in event charges. Apify applies a **$0.01 minimum run charge**. The Actor checks the run's maximum total charge before storing more paid results.

### Integrations and automation

- run on an Apify schedule for daily or weekly URL monitoring
- send failed rows (`ok: false`) to Slack, email, Make, Zapier, or n8n
- export results to Google Sheets, a BI tool, or a data warehouse
- call from CI after a deployment or migration and fail the workflow on bad statuses
- join results to sitemap, CRM, or content-inventory records by `inputUrl`

### FAQ and troubleshooting

**Does it render JavaScript?** No. It performs HTTP diagnostics and reads a bounded static HTML sample. JavaScript-generated canonical or robots tags are not evaluated.

**Why does the result differ from my browser?** CDNs can vary responses by location, headers, cookies, or bot policy. The result reflects the Actor run at `checkedAt`.

**Why was a URL rejected?** Only public HTTP/HTTPS destinations are allowed. Credentials and private, local, reserved, or metadata-service addresses are blocked, including redirect targets.

**Why did a URL time out?** Increase `timeoutSeconds`, lower concurrency for the affected host, or verify the host accepts requests from Apify infrastructure.

**Can I monitor changes?** Yes. Schedule runs and compare `statusCode`, `finalUrl`, `redirectCount`, or `responseTimeMs` by `inputUrl` in your automation.

### Responsible use, limitations, and support

The HTML sample is capped at 128 KiB. DNS is checked before every request, but application checks cannot eliminate every hostile DNS-rebinding scenario; the Actor is designed to run with Apify's limited permissions and platform protections. Only submit URLs you are permitted to access.

For unexpected results on a valid public URL, open an issue from the Actor page and include the run ID, URL, and expected status. Never post credentials or sensitive data.

### More tools from this developer

- [AI Search Readiness / GEO & AEO Auditor](https://apify.com/rtworule/ai-search-readiness-auditor)
- [Website Tech Stack Detector](https://apify.com/rtworule/bulk-website-tech-detector)
- [RSS, Atom & JSON Feed Normalizer](https://apify.com/rtworule/public-feed-normalizer)
- [Greenhouse, Lever & Ashby Jobs Normalizer](https://apify.com/rtworule/public-ats-job-feed-normalizer)

# Actor input Schema

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

Public HTTP or HTTPS URLs to inspect. Private and local network destinations are rejected.

## `concurrency` (type: `integer`):

Number of URLs checked in parallel.

## `timeoutSeconds` (type: `integer`):

Maximum seconds allowed for each redirect hop.

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

Stop and report an error after this many redirects.

## `includeHtmlSignals` (type: `boolean`):

Read a bounded HTML sample to extract title, canonical URL, and robots directives.

## Actor input object example

```json
{
  "urls": [
    "https://example.com"
  ],
  "concurrency": 10,
  "timeoutSeconds": 20,
  "maxRedirects": 10,
  "includeHtmlSignals": true
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("rtworule/bulk-url-health-auditor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("rtworule/bulk-url-health-auditor").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 '{}' |
apify call rtworule/bulk-url-health-auditor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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