# Bulk URL & Link Health Checker (SEO, redirects) (`arthursbuisness/url-link-health-checker`) Actor

Check a list of URLs for HTTP status, redirect chains, broken links, HTTPS/HSTS, page title, meta description and canonical. Optionally extract and check on-page links. Pay only per URL checked ($1 per 1,000).

- **URL**: https://apify.com/arthursbuisness/url-link-health-checker.md
- **Developed by:** [Arthur](https://apify.com/arthursbuisness) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 2 total users, 1 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/actors/running/actors-in-store.md#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 & Link Health Checker (status, redirects, broken links, SEO)

Give it a list of URLs and get a clean health report for every one — in one run, priced per URL checked. Built for technical SEO audits, site migrations, uptime spot‑checks and link monitoring.

### What it checks per URL

- **Final HTTP status** (after following redirects) and whether the URL is healthy (`ok`).
- **Full redirect chain length** — spot unexpected or chained redirects.
- **Response time** in milliseconds and **download size**.
- **HTTPS** and **HSTS** (Strict‑Transport‑Security) presence.
- **X‑Robots‑Tag** response header (indexing directives).
- **Title**, **meta description** and **canonical URL** for HTML pages — quick on‑page SEO signals.
- **Broken links** (optional): for each HTML page it extracts on‑page links, resolves relative URLs, and reports every dead one (status ≥ 400 or unreachable), with a per‑page broken count.

### Typical uses

- Run a **broken‑link audit** across a set of important pages before a launch.
- Verify a **site migration**: confirm old URLs now 301 to the right place and return 200.
- **Monitor uptime and redirects** for a list of landing pages on a schedule.
- Bulk‑check a **backlink or outreach list** for dead targets.
- Feed the JSON/CSV/Excel output straight into a sheet or SEO dashboard.

### Input

- `urls` — the list of URLs (bare domains are upgraded to `https://`).
- `checkLinks` — turn on on‑page broken‑link scanning (slower).
- `maxLinksPerPage` — cap links checked per page (default 50).
- `followRedirects` — follow 3xx to the final URL (default on).
- `timeoutSecs` — per‑request timeout (default 20).
- `userAgent` — the User‑Agent header to send.

### Output

One dataset item per URL with: `url`, `final_url`, `status`, `ok`, `redirects`, `response_ms`, `size_bytes`, `content_type`, `https`, `hsts`, `x_robots_tag`, `title`, `description`, `canonical`, `links_checked`, `broken_count`, `broken_links[]`. Export as JSON, CSV, Excel or via API.

### Pricing & billing

Pay‑per‑result: you are charged **one event per URL whose result is successfully stored**. If a result cannot be stored, it is **not** billed — you never pay for output you did not receive.

### Notes & limits

- The actor only requests the URLs you provide (and, with link checking on, the links found on those pages). It respects your timeout and link caps. It does not execute JavaScript, so links injected purely client‑side are not seen.
- For very large sites, split URLs across runs and use `maxLinksPerPage` to bound cost.
- Not affiliated with any third‑party website; it simply performs standard HTTP requests.

# Actor input Schema

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

List of URLs (or bare domains) to check. Each becomes one result row.

## `checkLinks` (type: `boolean`):

For every HTML page, extract its links and report dead ones (status >= 400 or unreachable). Slower.

## `maxLinksPerPage` (type: `integer`):

Cap on how many links to check per page when 'Check on-page links' is on.

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

Follow 3xx redirects to the final URL (recommended). If off, the first response is reported.

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

Maximum seconds to wait per URL.

## `userAgent` (type: `string`):

User-Agent header sent with each request.

## Actor input object example

```json
{
  "urls": [
    "https://example.com"
  ],
  "checkLinks": false,
  "maxLinksPerPage": 50,
  "followRedirects": true,
  "timeoutSecs": 20,
  "userAgent": "Mozilla/5.0 (compatible; UrlHealthCheck/1.0; +https://apify.com)"
}
```

# Actor output Schema

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

One item per checked URL

# 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://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arthursbuisness/url-link-health-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://example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("arthursbuisness/url-link-health-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://example.com"
  ]
}' |
apify call arthursbuisness/url-link-health-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arthursbuisness/url-link-health-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/DpeUt60DvIlMZOhOd/builds/5dQxgYcbSL3aizjCn/openapi.json
