Bulk URL Status Checker

Check large URL lists for status codes, redirects, broken links, response timing, headers, titles, canonical URLs, and robots meta.

Data fields

FieldTypeDescription
inputUrlstringOriginal URL supplied by the user.
normalizedUrlstring | nullURL after scheme normalization and fragment removal.
finalUrlstring | nullFinal URL after redirects.
statusCodeinteger | nullFinal HTTP status code, or null on request errors.
statusTextstring | nullCommon HTTP status text when known.
okbooleanTrue for final HTTP status 2xx or 3xx.
isBrokenbooleanTrue for request errors or final HTTP status 400+.
isRedirectbooleanTrue when at least one redirect was followed.

Input preview

urlsURLs
urlsTextURLs as text
listUrlHosted URL list
sitemapUrlSitemap URL
maxUrlsMax URLs
concurrencyConcurrency

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Check thousands of URLs for HTTP status codes, broken links, redirect chains, response timing, content headers, page titles, meta descriptions, canonical URLs, and robots meta tags.

Use this Actor for SEO audits, website migrations, QA checks, content operations, campaign link validation, and scheduled link-health monitoring.

At a glance

  • Primary job: Turn a URL list, pasted text block, hosted list, or sitemap into a structured URL health report.
  • Input: URLs, urlsText, listUrl, or sitemapUrl with configurable method, redirects, timeout, and concurrency.
  • Output: One dataset row per attempted URL, including both successful responses and failures.
  • Best for: SEO teams, agencies, site migration teams, QA teams, marketers, and developers building monitoring workflows.

Who is it for?

  • SEO teams and agencies validating migrations, redirects, canonical tags, and broken links.
  • QA teams checking landing pages before launches.
  • Content operations teams finding removed, redirected, or slow pages.
  • Developers feeding URL health data into dashboards, alerts, and CI workflows.

Input recipes

Start from a verified public Example task when you want a ready-made configuration:

Example input

{
  "urls": ["https://example.com/", "https://www.iana.org/domains/example"],
  "maxUrls": 20,
  "concurrency": 10,
  "method": "head-get-fallback",
  "followRedirects": true,
  "includeSeoMeta": true
}

What data can you export?

Field Description
inputUrl Original URL supplied by the user.
normalizedUrl URL after scheme normalization and fragment removal.
finalUrl Final URL after redirects.
statusCode / statusText Final HTTP response status.
ok True for final 2xx or 3xx responses.
isBroken True for request errors or final 4xx/5xx responses.
isRedirect / redirectCount Redirect classification and number of followed hops.
redirectChain Redirect hops with source URL, status code, and Location.
responseTimeMs Elapsed check time in milliseconds.
contentType / contentLength Response headers commonly used for QA and SEO exports.
title HTML page title when SEO extraction is enabled and available.
metaDescription HTML meta description when available.
canonicalUrl HTML canonical URL when available.
robotsMeta HTML robots meta tag content when available.
errorType / errorMessage Request failure details for DNS, TLS, timeout, and invalid URL cases.
responseHeaders Optional raw response headers.
checkedAt ISO timestamp for the check.

Example output

{
  "inputUrl": "https://example.com/",
  "normalizedUrl": "https://example.com/",
  "finalUrl": "https://example.com/",
  "statusCode": 200,
  "statusText": "OK",
  "ok": true,
  "isBroken": false,
  "isRedirect": false,
  "redirectChain": [],
  "redirectCount": 0,
  "responseTimeMs": 184,
  "contentType": "text/html",
  "contentLength": 1256,
  "title": "Example Domain",
  "metaDescription": null,
  "canonicalUrl": null,
  "robotsMeta": null,
  "errorType": null,
  "errorMessage": null,
  "checkedAt": "2026-07-10T00:00:00.000Z"
}

Tips for best results

  • Start small: Run 10-20 URLs first to verify target behavior and output columns.
  • Use head-get-fallback by default: It is fast and falls back when servers reject HEAD or HTML meta is requested.
  • Use GET-only when needed: Some servers return inaccurate HEAD responses.
  • Lower concurrency for one domain: If many URLs hit the same small site, lower concurrency to avoid rate limits.
  • Keep raw headers off unless needed: includeResponseHeaders increases dataset size.

Limits and caveats

  • Some websites block automated checks or return different results by User-Agent, method, region, or proxy.
  • 403, 429, timeout, DNS, TLS, and invalid URL cases are recorded as rows, not treated as actor failures.
  • Large runs stop admitting new URLs before the platform deadline, save completed rows progressively, and resume the remaining URLs if the run is restarted.
  • The Actor reports the observed HTTP result; it does not bypass access controls.

API usage

Node.js:

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/bulk-url-status-checker').call({
  urls: ['https://example.com/', 'https://httpstat.us/404'],
  followRedirects: true,
});
console.log(run.defaultDatasetId);

Python:

from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/bulk-url-status-checker').call(run_input={
    'urls': ['https://example.com/', 'https://httpstat.us/404'],
    'followRedirects': True,
})
print(run['defaultDatasetId'])

cURL:

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~bulk-url-status-checker/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"urls":["https://example.com/","https://httpstat.us/404"],"followRedirects":true}'

MCP and AI agents

Use the Actor from MCP-compatible clients through the Apify MCP Server:

claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/bulk-url-status-checker"

Claude Desktop JSON configuration:

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/bulk-url-status-checker"
    }
  }
}

Example prompts:

  • "Check these landing page URLs and summarize broken links."
  • "Run a sitemap status audit and group results by status code."
  • "Find redirect chains in this migration URL map."

Legality and responsible use

Only check URLs you are allowed to audit. Respect target websites, rate limits, robots policies, contracts, and applicable laws. Do not use the Actor to overload third-party servers.

Support

Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL.

Common questions

Questions and answers reused from the canonical actor README.

Can I check thousands of URLs?

Yes. Increase maxUrls and choose a safe concurrency for the target sites.

Does this use a browser?

No. It is a lightweight HTTP checker for status, redirects, headers, and basic HTML meta signals.

Why do I see 403 or 429?

The target server is refusing or rate limiting the request. Try lower concurrency, GET-only mode, a custom User-Agent, or an approved proxy setup.

Can I export the results?

Yes. Apify datasets can be exported as JSON, CSV, Excel, XML, RSS, HTML, or through the API.