Status code, full redirect chain and final URL for every link in the list. Most bulk HTTP status checkers stop between 25 and a few hundred URLs a run, so a real list means pasting the same page over and over. This one takes 100,000 in a single job. Paste it below, or send it from code. Try 15,000 URL checks your first month, on us.
We check them on the next screen. Nothing to sign up for to start.
The ceiling
The tools that rank for this search were built for spot checks. They take 25 URLs, or 100, or a couple of hundred. That is fine for a handful of redirects and useless for a sitemap, a backlink export or a product catalogue.
At 100,000 URLs a job there is no batching step. You do not split the file, you do not paste the same page forty times, and you do not write a loop around someone else's form. One list in, one report out, and the job runs on our machines so you can close the tab.
The other thing a limit hides: a tool checking 100 URLs from one IP never has to solve bot detection. At fifty thousand it is the whole problem, and a status code that says 403 because we were blocked is worse than no answer at all. That is why the report separates a genuine 403 from a block against us, instead of handing you a column of numbers to re-check by hand.
Prefer it from code? The same job runs through the REST API, the Python and Node SDKs and MCP, so a status sweep can live in CI rather than in a browser tab.
Status codes
The useful question is not what a code means in the RFC. It is what you have to do about it across fifty thousand rows, and which ones you can ignore.
The 403 problem
Everyone who checks URLs at volume writes this script once. It works on a thousand URLs and starts lying somewhere around five thousand.
A runner making requests from one machine and one address gets turned away after a few thousand of them. The responses come back 403, 429 or a reset connection, and a single-attempt runner writes them down as failures. You open twenty by hand and find nineteen load perfectly.
The fix is not more concurrency. It is a second attempt from somewhere else, plus pacing per host so the door does not get shut in the first place. That is the part that stops being a weekend project.
Measured on our own production database over the 90 days to 21 September 2026, across 603 jobs and 41,308 distinct domains: 56,892 URLs refused at least one request, and 13,597 of them answered when re-requested by an independent route. That is 23.9%.
Every one is a row your own run would have handed you as broken.
API · SDKs · MCP
One backend and one pool of credits behind every surface. One credit per URL wherever the request came from, on every plan, with no developer tier to buy.
# 50,000 URLs, one call, a job id back curl -X POST https://api.bulkurlchecker.com/v2/jobs \ -H "Authorization: Bearer $BUC_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"urls": [...]}' { "job_id": "9024c1a6", "queued": 50000 } # cursor is stable while the run is still finishing curl .../v2/jobs/9024c1a6/results?cursor=... { "url": "/old", "status": 301, "final_url": "/new" } { "url": "/gone", "status": 404, "verdict": "gone" }
REST API. Start a job and poll it, or use the blocking call for small batches. Idempotency-Key makes retries safe, results page with stable cursors, and every response carries a request id and the rate-limit headers.
Python and Node SDKs. Type-hinted Python with a CLI, strict TypeScript with ESM and CJS builds, both MIT licensed with a webhook signature helper.
Webhooks and MCP. A signed job.completed event posted to your endpoint, and a hosted MCP server that works in Claude, ChatGPT and Cursor over OAuth with no key to paste.
FAQ
If yours is not here, write to us and a person answers. The address is at the bottom of this page.
No card. Setting up a scheduled check costs nothing; only the runs use credits, and unused credits roll over.
We use analytics cookies to improve your experience. Opt out anytime in Cookie Settings. Privacy Policy