# Bulk URL Checker > Cloud-hosted bulk URL validation. Submit up to 100,000 URLs per job and receive HTTP status codes, redirect chains, soft-404 detection, and broken-link flags. Handles proxy rotation, per-domain rate limiting, and resumable processing in the cloud so jobs that would crash a local crawler with 403s or rate limits run to completion. Stress tested with over 1 million URLs. A single job handles up to 100,000 URLs with no splitting required. Why results differ from other bulk checkers: most tools check every URL from one IP address. After a few thousand requests sites begin refusing them, and those refusals get recorded as broken links. Bulk URL Checker spreads requests across rotating residential proxies and paces them per domain, so those blocks largely do not occur. When a URL still returns 403, it is re-checked from an independent proxy path before being classified as broken. Soft 404s (HTTP 200 responses on pages that say "not found") are detected and flagged separately, which status-code-only checkers cannot do. Bulk URL Checker is used by SEO agencies for monthly link audits, by developers integrating URL validation into pipelines via the Python and Node.js SDKs, and by AI agents calling the MCP server for on-demand checks. Free tier: 300 URL checks on signup, no credit card. Paid plans start at $9/month. The marketing site, docs, and pricing live at https://bulkurlchecker.com. The signed-in dashboard is at https://app.bulkurlchecker.com. ## What it does Bulk URL Checker validates URLs at scale. Users upload a CSV of URLs (or submit them via the REST API or one of the SDKs). The service checks every URL in the cloud using rotating residential proxies and smart per-domain rate limiting, then returns a detailed report with HTTP status codes, redirect chains, response times, and soft-404 detection. ## Developer integration For programmatic access, three surfaces share the same backend and credit pool: - [REST API reference](https://bulkurlchecker.com/developers/api): canonical docs for `POST /api/v2/jobs`, `POST /api/v2/jobs/wait`, `GET /api/v2/jobs/{id}`, `GET /api/v2/jobs/{id}/results`, `DELETE /api/v2/jobs/{id}`, `GET /api/v2/usage`, plus the webhooks suite at `/api/v2/webhooks/endpoints`. Bearer-token auth via API keys. Supports `Idempotency-Key` header, cursor-based pagination, and 429 responses include `Retry-After` + `X-RateLimit-*` headers. - [MCP server](https://bulkurlchecker.com/developers/mcp): hosted Model Context Protocol server at `https://mcp.bulkurlchecker.com/mcp`. OAuth 2.1 + PKCE with dynamic client registration. Works in Claude.ai connectors, ChatGPT custom MCP, and Cursor without an API key paste; sign-in is interactive. - [Python SDK](https://pypi.org/project/bulkurlchecker/): `pip install bulkurlchecker`. Type-hinted, includes a Click-based CLI (`pip install 'bulkurlchecker[cli]'`) and a `verify_signature()` helper for inbound webhooks. MIT licensed. Source: https://github.com/carlosofscience/bulkurlchecker-python - [Node.js SDK](https://www.npmjs.com/package/bulkurlchecker): `npm install bulkurlchecker`. Strict TypeScript, dual ESM + CJS build, Node 18+, includes a `verifySignature()` helper for inbound webhooks. MIT licensed. Source: https://github.com/carlosofscience/bulkurlchecker-js - [OpenAPI 3.1 spec](https://api.bulkurlchecker.com/openapi.json): machine-readable contract. Importable into Postman, Bruno, Stoplight, or any OpenAPI-aware tooling. - [Postman collection](https://bulkurlchecker.com/developers/postman/bulkurlchecker.postman_collection.json): pre-built request collection with sensible defaults and an auto-capture test script that stores `job_id` from the first POST so follow-up requests just work. ## Key concepts (for code-generation context) - One credit = one URL check. Jobs deduct credits when started; cancelling a job mid-run refunds unchecked credits. The REST API, MCP server, and web UI all share the same credit pool. - URL submission requires explicit `http://` or `https://` scheme. Invalid URLs are dropped and counted in the response's `invalid_urls_rejected`. Duplicates are removed and counted in `duplicates_removed`. - The single-request `POST /api/v2/jobs/wait` endpoint blocks server-side for up to 900 seconds, returning the full result set inline. For batches over ~2,000 URLs, use `POST /api/v2/jobs` + poll `GET /api/v2/jobs/{id}` then page through `GET /api/v2/jobs/{id}/results`. - Pagination on `/results` supports both classic `?limit=&offset=` and stable cursor mode (`?cursor=`). Cursor mode is recommended for full exports because it's immune to "URL finished mid-export" shifting; pages end when `next_cursor: null`. - Idempotency: pass `Idempotency-Key: ` on `POST /api/v2/jobs` to make retries safe. Same key + same body within 24h returns the cached response; same key + different body returns 409. - Webhooks: register an HTTPS endpoint via `POST /api/v2/webhooks/endpoints`, get a signing secret returned once, and we POST signed events (`job.completed`) to your URL. Signature is HMAC-SHA256 over `.` in the `Bulkurlchecker-Signature: t=,v1=` header (Stripe-compatible). Retry policy is exponential backoff over ~38 hours before marking failed. Verify with `bulkurlchecker.verify_signature()` (Python) or `verifySignature()` (Node); both ship in the SDKs. - Rate limits: 60 requests/minute (burst) and 10,000 requests/day per API key. 429 responses include `Retry-After` plus `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (unix epoch). - All `/api/v2/*` responses share a canonical error envelope: `{"error": {"code", "message", "details?"}, "request_id"}`. The `X-Request-ID` response header is on every call for support correlation. ## Pricing - Free tier: 300 URL checks on signup, no credit card required. - Starter: $9/month or $90/year (~17% off): 15,000 URL checks/month - Pro: $29/month or $290/year: 50,000 URL checks/month, 5 scheduled checks, daily monitoring - Agency: $99/month or $990/year: 200,000 URL checks/month, 50 schedules, Slack + webhook alerts - Top-up credit packs: pay-as-you-go credits that never expire, available beyond the monthly pool. ## Key features - Check up to 100,000 URLs per batch (per job) - Residential proxy rotation to avoid rate limits and IP blocks - Smart per-domain rate limiting (20 requests/minute/domain by default) - Soft-404 detection (200 OK + "page not found" body) - Redirect chain analysis with `final_url` tracking - Schedule monitoring (Pro/Agency tiers): re-run a saved URL list daily/weekly and diff results - Site audits by domain: paste a domain at https://bulkurlchecker.com/broken-link-monitor, we pull /sitemap.xml and check every URL once (free) with a "watch weekly" upgrade path - Slack + webhook completion alerts (Agency tier; webhooks on all paid tiers) - Email notifications on job completion (every tier) - Dashboard with filtering, search, sorting, and analytics - Export to CSV or JSON (or stream via the REST API) - No installation required: 100% cloud-based ## Use cases - SEO audits: check all internal and external links across a website - Backlink verification: validate that backlinks still point to live pages - Site migration: verify old URLs redirect correctly to new pages - Documentation maintenance: check external references in knowledge bases - Content audits: find broken links across hundreds of blog posts - Agency work: batch-check client URLs at scale, schedule weekly re-checks, alert on diffs - Programmatic: integrate into CI/CD pipelines (Lambda, GitHub Actions, etc.) via the SDKs - AI agents: connect Claude.ai or ChatGPT via the MCP server so the model can validate URLs on demand ## How it compares Unlike desktop tools like Screaming Frog or Sitebulb, Bulk URL Checker runs in the cloud. No RAM limits, no single-IP rate limiting, no need to keep your laptop running. Designed specifically for checking large batches of known URLs rather than crawling and discovering URLs (we complement crawler-style tools rather than replace them). Unlike always-on SEO monitors like ContentKing (per-URL pricing on the pages you own), Bulk URL Checker is a recurring scheduled checker with flat-tier pricing. Better fit when daily or weekly cadence is enough and you need to watch arbitrary URL lists, including ones you don't own (tracked backlinks, partner pages, outreach prospects, sitemap exports). Unlike rolling your own with httpx + asyncio: you skip the proxy-rotation infrastructure, per-domain rate limiting, soft-404 detection, retry classification, and resumable job state that you'd otherwise build over weeks. ## Links - Website: https://bulkurlchecker.com - Pricing: https://bulkurlchecker.com/pricing - Developer hub: https://bulkurlchecker.com/developers - REST API docs: https://bulkurlchecker.com/developers/api - MCP docs: https://bulkurlchecker.com/developers/mcp - Dashboard: https://app.bulkurlchecker.com - Status: https://app.bulkurlchecker.com/status - Blog: https://bulkurlchecker.com/blog - Broken Link Monitor (sitemap-based audit): https://bulkurlchecker.com/broken-link-monitor - Sitebulb comparison: https://bulkurlchecker.com/compare/sitebulb - ContentKing comparison: https://bulkurlchecker.com/compare/contentking - Apify comparison: https://bulkurlchecker.com/compare/apify ## Specialized landing pages - Broken URL Checker: https://bulkurlchecker.com/broken-url-checker - Batch URL Checker: https://bulkurlchecker.com/batch-url-checker - Redirect Checker: https://bulkurlchecker.com/redirect-checker - Broken Link Monitor (sitemap-based audit): https://bulkurlchecker.com/broken-link-monitor - Sitebulb comparison: https://bulkurlchecker.com/compare/sitebulb - ContentKing comparison: https://bulkurlchecker.com/compare/contentking - Apify comparison: https://bulkurlchecker.com/compare/apify