# Broken Link Checker — Find All 404s & Dead Links on Any Website (`q_services/broken-link-checker`) Actor

Crawl any website and find every broken link (404, 500, dead domains) with status code, source page and anchor text. SEO audit ready.

- **URL**: https://apify.com/q\_services/broken-link-checker.md
- **Developed by:** [Q Services](https://apify.com/q_services) (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

from $1.00 / 1,000 broken link founds

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

## Broken Link Checker — Find All 404s & Dead Links on Any Website

Crawle **n'importe quel site web** et détecte **tous les liens cassés** — 404, erreurs serveur, domaines morts — avec le code HTTP, la page où le lien a été trouvé et le texte du lien. Résultats prêts à exporter en JSON, CSV ou Excel.

Idéal pour : audits SEO, maintenance de sites e-commerce, contrôle qualité avant mise en production, rapports clients d'agences web.

**Exemple de résultat :**

```json
{
    "url": "https://example.com/old-page",
    "statusCode": 404,
    "error": null,
    "foundOn": "https://mysite.com/blog/article-1",
    "anchorText": "voir notre ancienne offre",
    "isInternal": false,
    "scrapedAt": "2026-07-09T10:30:00.000Z"
}
```

### Comment l'utiliser

1. Collez l'URL de votre **site** (la page d'accueil suffit)
2. Choisissez le **budget de crawl** (nombre de pages internes analysées)
3. Cliquez sur **Start** — les liens cassés apparaissent dans l'onglet *Dataset*

**Dataset vide = bonne nouvelle** : aucun lien cassé trouvé. Le message de statut du run récapitule le nombre de pages crawlées et de liens vérifiés.

Astuce : planifiez un run mensuel (onglet *Schedule*) pour une surveillance continue.

### Combien ça coûte ?

Tarification à l'usage, sans abonnement :

| Événement | Prix |
|---|---|
| Démarrage du run (crawl + vérifications incluses) | 0,02 $ |
| Par lien cassé trouvé | 0,001 $ |

**Exemple concret : un site de 50 pages avec 12 liens cassés ≈ 0,03 $.** Vous pouvez fixer une limite de dépense par run dans les options — l'Actor s'arrête proprement dès qu'elle est atteinte.

### Champs retournés

| Champ | Type | Toujours présent ? |
|---|---|---|
| `url` | lien (le lien cassé) | Oui |
| `statusCode` | nombre (404, 500…) | Non (`null` si erreur réseau) |
| `error` | texte (erreur réseau) | Non (`null` si code HTTP obtenu) |
| `foundOn` | lien (page contenant le lien) | Oui |
| `anchorText` | texte du lien | Non (`null` si lien sans texte) |
| `isInternal` | booléen | Oui |
| `scrapedAt` | date ISO | Oui |

### Limitations (en toute transparence)

- Chaque lien cassé est rapporté une seule fois (première page où il a été rencontré)
- Les liens générés en JavaScript côté client ne sont pas vus (crawl HTML statique)
- Certains sites bloquent les requêtes automatiques et peuvent renvoyer des faux 403 — vérifiez les cas ambigus manuellement
- Garde-fou : maximum 10 000 liens vérifiés par run

### FAQ

**Le dataset est vide, c'est un bug ?**
Non — cela signifie qu'aucun lien cassé n'a été trouvé. Le message de statut du run indique combien de pages et de liens ont été vérifiés.

**Puis-je vérifier uniquement les liens internes ?**
Oui, désactivez l'option **Vérifier aussi les liens externes**.

**Puis-je l'utiliser via API ?**
Oui, chaque Actor Apify est appelable par API et via MCP. Voir l'onglet *API* de cette page.

**Est-ce légal ?**
L'Actor se comporte comme un visiteur classique et ne vérifie que des URLs publiquement accessibles. Vous restez responsable de l'usage sur des sites qui ne vous appartiennent pas.

### Verified automation package

The following reproducible example comes from successful Apify run `SkRPZZusOnmvVOB3a`. See the [full Q Services technical guide](https://q-services.fr/blog/broken-link-checker-2026-07-23-growth-guide/) and the [tested n8n automation example](https://github.com/Gasppacho/q-services-automations/tree/main/n8n/broken-link-checker).

Crawlez un site dans une limite de pages définie, identifiez les liens cassés avec leur page source et automatisez un contrôle périodique pour les équipes SEO, web et e-commerce.

#### High-value use cases

- Contrôle mensuel des liens internes d\&#x27;un site e-commerce
- Rapport récurrent multi-sites pour une agence SEO
- Vérification après migration ou refonte de site
- Détection de liens externes devenus injoignables
- Création automatique de tickets de maintenance web

**Target audience:** Agences SEO, équipes web et responsables e-commerce qui maintiennent plusieurs sites et doivent détecter les régressions de liens dans la durée

**Growth hypothesis:** Présenter un workflow mensuel prêt à connecter à une destination d\&#x27;équipe convertira davantage d\&#x27;audits ponctuels en contrôles récurrents et fera progresser le volume de runs sur trente jours par rapport à la référence de 14.

#### Tested input

```json
{
  "checkExternalLinks": false,
  "maxPages": 1,
  "startUrls": [
    "https://the-internet.herokuapp.com/status_codes"
  ]
}
```

#### Clean output sample

```json
[
  {
    "anchorText": "\u003cstring\u003e",
    "error": "\u003cstring\u003e",
    "foundOn": "\u003cstring\u003e",
    "statusCode": "\u003cstring\u003e",
    "url": "\u003cstring\u003e"
  }
]
```

#### API example

```bash
curl --request POST   'https://api.apify.com/v2/acts/ZigQl4RkZ3SNxel6k/runs?waitForFinish=120&maxTotalChargeUsd=0.05'   --header "Authorization: Bearer $APIFY_TOKEN"   --header 'Content-Type: application/json'   --data @input.json
```

#### Measured cost and limits

The proof run took 7.00 seconds and reported $0.001623 in platform usage. Actual cost depends on input size and source behavior. Set an Apify maximum charge per run and conservative result limits.

Known limits:

- Public sources can change or become unavailable.
- Output completeness depends on the supplied input.
- The measured proof cost is evidence for one run, not a universal quote.

[Run Broken Link Checker — Find All 404s & Dead Links on Any Website on the Apify Store](https://apify.com/q_services/broken-link-checker).

# Actor input Schema

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

URL(s) de départ. L'Actor crawle les pages internes du même domaine et vérifie tous les liens rencontrés.

## `maxPages` (type: `integer`):

Budget de crawl : nombre de pages internes analysées. Les liens de chaque page sont tous vérifiés.

## `checkExternalLinks` (type: `boolean`):

Si activé, les liens sortants vers d'autres domaines sont aussi vérifiés (recommandé pour un audit SEO complet).

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

Configuration proxy. Le proxy Apify par défaut convient dans la plupart des cas.

## Actor input object example

```json
{
  "startUrls": [
    "https://books.toscrape.com"
  ],
  "maxPages": 50,
  "checkExternalLinks": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        "https://books.toscrape.com"
    ],
    "maxPages": 50,
    "checkExternalLinks": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("q_services/broken-link-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 = {
    "startUrls": ["https://books.toscrape.com"],
    "maxPages": 50,
    "checkExternalLinks": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("q_services/broken-link-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 '{
  "startUrls": [
    "https://books.toscrape.com"
  ],
  "maxPages": 50,
  "checkExternalLinks": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call q_services/broken-link-checker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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