Broken Link Checker & Scraper - 404 Audit API avatar

Broken Link Checker & Scraper - 404 Audit API

Pricing

from $1.60 / 1,000 results

Go to Apify Store
Broken Link Checker & Scraper - 404 Audit API

Broken Link Checker & Scraper - 404 Audit API

Scan pages for broken links, dead URLs, 404s, redirects, TLS failures, timeouts, and resource errors. Bulk link checker/scraper for SEO audits, content QA, migrations, and link-rot monitoring with source evidence, safe URL handling, and bounded paid output.

Pricing

from $1.60 / 1,000 results

Rating

0.0

(0)

Developer

Ava Torres

Ava Torres

Maintained by Community

Actor stats

0

Bookmarked

16

Total users

1

Monthly active users

16 hours ago

Last modified

Features

Limited permissions

Share

Scan the static HTML of one or more web pages, extract unique links and resources, and check each target for HTTP, DNS, TLS, timeout, and request failures. The actor preserves source-page evidence, follows redirects, retries blocked HEAD checks with GET, and saves large jobs in bounded batches.

The default scans BadSSL and returns 10 working/TLS-failure examples for at most $0.0201 including the minimum actor-start event.

Use cases

  • Technical SEO audits — find 404/5xx links and dead resources
  • Site migrations — check links after URL or CMS changes
  • Link-rot monitoring — schedule repeated point-in-time audits
  • Content QA — validate cited external links before publishing
  • Frontend asset checks — inspect img, script, and stylesheet URLs

Input

FieldTypeDefaultDescription
urlsstring arrayhttps://badssl.com/Pages whose static HTML should be scanned
maxResultsinteger10Total paid result cap across every supplied page; up to 50,000
concurrencyinteger10Parallel link checks; 1–50
timeoutSecondsinteger15Per-request timeout; 3–60 seconds

If the input is empty, runtime uses the same BadSSL/10-result Store default. Apify maximum-total-charge limits are applied before checks begin and can reduce maxResults further.

What is extracted

The actor reads URLs from static HTML:

  • <a href>
  • <link href>
  • <img src>
  • <script src>

Relative URLs are resolved against the fetched page's final URL, fragments are removed, and duplicate targets are checked once per page. Private, loopback, link-local, credential-bearing, and non-HTTP(S) targets are rejected to prevent unsafe network access.

Output

Every dataset row uses stable evidence fields:

FieldDescription
resultTypeLINK_CHECK, SOURCE_ERROR, or NO_LINKS
sourceUrl, sourceFinalUrlRequested and final scanned page URLs
sourceStatusCode, sourceContentType, sourceResponseTimeMsSource fetch evidence
linkUrl, elementType, anchorTextDiscovered target and its HTML context
statusCode, statusText, finalUrlChecked target response evidence
redirectCount, responseTimeMs, contentTypeRedirect, timing, and response metadata
checkMethodHEAD or fallback GET
isBroken, errorBroken/error classification and diagnostic detail
retrievedAtUTC observation time
coverageNote, interpretationMandatory scope and evidence limitations

Example TLS failure:

{
"resultType": "LINK_CHECK",
"sourceUrl": "https://badssl.com/",
"sourceStatusCode": 200,
"linkUrl": "https://expired.badssl.com/",
"elementType": "a",
"statusCode": 0,
"statusText": "",
"redirectCount": 0,
"checkMethod": "GET",
"isBroken": true,
"error": "tls: failed to verify certificate: x509: certificate has expired...",
"retrievedAt": "2026-07-25T10:07:30Z"
}

Source pages that cannot be fetched return one explicit SOURCE_ERROR row instead of silently producing an empty dataset. Successfully fetched pages with no supported links return one NO_LINKS row.

Reliability and scale

  • Bounded concurrency prevents unbounded request fan-out.
  • Output is persisted in batches of at most 500 rows, below Apify's dataset-request limit.
  • HEAD checks that receive 403, 405, or 501 retry with a small GET request to reduce false broken-link classifications.
  • DNS resolution rejects private/local targets before connecting.
  • TLS certificates are verified; certificate failures remain visible evidence rather than being bypassed.
  • Output order follows document order even though checks run concurrently.

Interpretation limits

This is a point-in-time network and static-HTML audit, not proof of continuous uptime or page correctness. The actor does not execute JavaScript or crawl beyond each supplied page. Client-rendered links, authenticated content, form actions, CSS url(...) references, and links beyond maxResults are outside the result set.

A 2xx response does not prove useful content. A broken/error result can reflect bot defenses, authentication, geolocation, rate limiting, transient network conditions, or source policy rather than a permanently dead target. Re-run important failures and inspect the target directly before changing production links.

Pricing

Pay per event: $0.0001 minimum actor-start event plus $0.002 per dataset row (about $2 per 1,000 rows, plus the start event). The 10-row default costs at most $0.0201. Source-error and no-links evidence rows are paid dataset items.

How to use

  1. Open Broken Link Checker & Scraper - 404 Audit API in Apify Console and click Start (or Try for free).
  2. Fill in the input form - start with Page URLs, Max Results, Concurrency. Every field is optional unless marked required, and the form is prefilled with a working example.
  3. Set Maximum results to cap your cost, then run the Actor.
  4. Download the results as JSON, CSV, Excel, XML or HTML, or pull them with the Apify API.

Example input

{
"urls": [
"https://badssl.com/"
],
"maxResults": 10,
"concurrency": 10,
"timeoutSeconds": 15
}

Output example

One record from a real run (long values shortened, contact details partly masked):

{
"resultType": "SOURCE_ERROR",
"sourceUrl": "https://badssl.com/",
"sourceFinalUrl": "",
"sourceStatusCode": 0,
"sourceContentType": "",
"sourceResponseTimeMs": 4380,
"linkUrl": "",
"elementType": "",
"anchorText": "",
"statusCode": 0,
"statusText": "",
"finalUrl": "",
"redirectCount": 0,
"responseTimeMs": 0,
"contentType": "",
"checkMethod": "",
"isBroken": true,
"error": "Get \"https://badssl.com/\": read tcp 172.21.132.244:33906->104.154.89.105:443: read: connection reset by peer",
"retrievedAt": "2026-11-11T02:53:06Z",
"coverageNote": "Checks unique HTTP(S) links present in the fetched static HTML, up to maxResults. It does not execute JavaScript or crawl beyond each supplied page.",
"interpretation": "Results are point-in-time HTTP/TLS observations. A working response does not prove continuous availability; blocked HEAD/GET requests, authentication, bot de..."
}

FAQ

$0.002 per result plus $0.0001 per run. For example, 1,000 results cost about $2.00. Higher Apify plans get a Store discount.

Do I need an API key or login?

No. Just configure the input and run it.

Can I run it on a schedule or from code?

Yes. Use Apify Schedules for recurring runs, or call it from the Apify API, the JavaScript or Python client, Make, Zapier, n8n, or any MCP-compatible AI agent.

Why did my run return no results?

Your filters are probably too narrow. Remove a filter or broaden the search, then run again. You only pay the result price for records that are actually saved.

Is the data accurate and up to date?

Each run fetches live data from the source described above, so results are as current as that source. Verify critical records with the original source before acting on them.

⌂ 换网址