HTTP Status Checker
A bulk URL checker for status codes: paste up to 100 URLs and see each one's first and final status, every redirect hop, and what Google does with the answer.
The list goes to our server only to be checked: nothing is kept, and only a single URL ever appears in the address bar.

Paste any listURLs, bare host names, a CSV or a sitemap's XML. Repeats are merged, up to 100 a run.Every outcome counted2xx, redirects to a 2xx, 4xx, 5xx, blocked and couldn't check, with the run's time.One row per URLThe first status, the hops, the final status and URL, the time, and one note that matters.What Google does with theseEach answer in the group Googlebot puts it in, from Google's own documentation.What is an HTTP status code?
An HTTP status code is the three-digit number at the start of every answer a web server sends. It's the first thing an HTTP status code checker reads: 200 means the request worked, 301 that the page moved, 404 that nothing is there.
The answer's first line holds three parts: the protocol version, the code and a reason phrase. Every valid code is between 100 and 599, and its first digit is its class.
The reason phrase is only a suggestion. A server can write "Not Found", "Nope" or nothing at all after a 404, and it's still a 404: software reads the number, never the words.
HTTP/1.1Protocol version404Status codeClass: the first digitNot FoundReason phrase (only a suggestion)HTTP/1.1 404= 404 · Same code, same meaningPage missingHTTP/1.1 404= 404 · Same code, same meaning
HTTP status codes list: the five classes
Status codes fall into five classes by their first digit: 1xx informational, 2xx success, 3xx redirection, 4xx client error and 5xx server error. To read an HTTP status code, take the class first, then the exact code.
A client that meets a code it doesn't know reads it as its class's x00: an unknown 471 counts as a 400. A number outside 100–599 isn't a valid code at all, and is read as a server error.
The bar is the example run in the product shot above, 17 made-up URLs, each counted by where it ended. The table lists every code this checker explains, with what it means, what Google does with it and its source.
- 2xx Success 8
- 3xx Redirection 1
- 4xx Client error 2
- 5xx Server error 2
- Blocked our check 2
- No answer / not asked 2
| Code | Name | What it means | What Google does | Source |
|---|---|---|---|---|
| 200 | OK | The request succeeded. | Google can index the page. A 2xx doesn't promise it will. | S6S41 |
| 201 | Created | The request created a new resource. | Google can index the page. A 2xx doesn't promise it will. | S7S41 |
| 202 | Accepted | Accepted for processing, not finished. The answer is noncommittal on purpose. | Google can index the page. A 2xx doesn't promise it will. | S8S77S41 |
| 204 | No Content | Success with nothing to send: a 204 can't carry content. | Google has nothing to process. | S9S44 |
| 206 | Partial Content | Part of a resource, sent for a range request. | Google can index the page. A 2xx doesn't promise it will. | S10S41 |
| 301 | Moved Permanently | The resource has a new permanent URL. | A strong signal: Google follows it and treats the target as the canonical URL. | S14S46S47 |
| 302 | Found | The resource is temporarily at another URL; keep using the original. | A weak signal: Google follows it but may keep the old URL in its results. | S15S46S47 |
| 303 | See Other | Go to another resource for the answer, usually after a form is sent. The new URL isn't the same page. | A weak signal: Google follows it but may keep the old URL in its results. | S16S47S46 |
| 304 | Not Modified | Only for a conditional request: the copy the client has is still current. It carries no content. | Tells Google the content hasn't changed since the last crawl; otherwise no effect on indexing. | S17S48 |
| 307 | Temporary Redirect | Temporary, and the client must keep the method (a POST stays a POST). | A weak signal: Google follows it but may keep the old URL in its results. | S18S46S47 |
| 308 | Permanent Redirect | Permanent like 301, keeping the method. It dates from 2014, so very old clients may not know it. | A strong signal: Google follows it and treats the target as the canonical URL. | S19S46S47 |
| 400 | Bad Request | The server won't process the request because of what it sees as a client error. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S20S49S50 |
| 401 | Unauthorized | Valid credentials are missing; the server must say how to send them (WWW-Authenticate). | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S21S51S49S50 |
| 403 | Forbidden | Understood and refused. A server may answer 404 instead, to hide that the page exists. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S22S50S52S70S76S78S49 |
| 404 | Not Found | No current page at this URL, or the server won't say. It doesn't say whether that's for good. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S23S49S50 |
| 405 | Method Not Allowed | The method is known but this resource doesn't support it; the server must list the methods it allows. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S24S37S77S49S50 |
| 408 | Request Timeout | The server didn't receive the whole request in time. The client may send it again. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S25S49S50 |
| 410 | Gone | No longer available, and likely for good. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S26S50S49 |
| 418 | (Unused) | From an April Fools' RFC; reserved so nothing else can take the number. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S27S50S49 |
| 421 | Misdirected Request | This server can't answer for this URL on this connection. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S28S49S50 |
| 429 | Too Many Requests | Too many requests in a given time. It may say when to try again (Retry-After). | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S38S53S75S54S55 |
| 431 | Request Header Fields Too Large | The request's headers are too large, often oversized cookies. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S39S49S50 |
| 451 | Unavailable For Legal Reasons | Blocked by a legal demand. It says nothing about whether the page exists, and the sender may be your ISP. | To Google the content doesn't exist: an indexed URL is removed, and crawling of it slows. | S40S49S50 |
| 500 | Internal Server Error | Something unexpected stopped the server. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S29S53S54S55 |
| 501 | Not Implemented | The server doesn't support what was asked, such as the method. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S30S37S53S54S55 |
| 502 | Bad Gateway | A gateway or proxy got an invalid answer from the server behind it. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S31S68S53S54S55 |
| 503 | Service Unavailable | Overloaded or down for maintenance, for now. It may say when to come back (Retry-After). | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S32S34S55S53S54 |
| 504 | Gateway Timeout | A gateway or proxy got no answer in time from the server behind it. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S33S68S53S54S55 |
| 520 | Web server returned an unknown errorCloudflare | Cloudflare got an empty, unknown or unexpected answer from the origin. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S59S53S54S55 |
| 521 | Web server is downCloudflare | The origin refused Cloudflare's connection. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S60S53S54S55 |
| 522 | Connection timed outCloudflare | Cloudflare couldn't reach the origin: no handshake in 19 s, or no answer to the request in 90 s. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S61S53S54S55 |
| 523 | Origin is unreachableCloudflare | Cloudflare has no route to the origin's address. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S62S53S54S55 |
| 524 | A timeout occurredCloudflare | Cloudflare connected, but the origin sent no answer within 125 seconds. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S63S53S54S55 |
| 525 | SSL handshake failedCloudflare | The TLS handshake between Cloudflare and the origin failed. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S64S53S54S55 |
| 526 | Invalid SSL certificateCloudflare | Cloudflare couldn't validate the origin's certificate (Full (strict) mode). | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S65S53S54S55 |
| 530 | Origin DNS errorCloudflare | Cloudflare couldn't resolve the origin. The page's body names a 1xxx error, such as 1016. | Google slows its crawling of the whole host; a URL that keeps failing for days is dropped. | S66S67S53S54S55 |
Which HTTP status codes matter for SEO?
Five answers decide what Google does with a URL: 200 (it can be indexed), 301 or 308 (moved for good), 302 or 307 (moved for now), 404 or 410 (gone) and 429 or 503 (slow down). A status code checker that shows them side by side tells you which URLs Google will keep.
Google treats every 4xx except 429 the same way: the content doesn't exist, so 403 and 410 are no different from 404. A 429 or a 5xx is different: Google slows its crawling of the whole host, keeps the URLs for a while, and drops the ones that keep failing.
Bing gives the same advice in its own words: 301 for a permanent move, 302 only for a change of a couple of days, and 404 for content that's gone.
| Answer | In Google's index | Old URL's signals | Crawling |
|---|---|---|---|
| 200S41 | Can be indexed (not guaranteed) | Stays here | Normal |
| 301308S46S47 | The target is indexed | Pass to the target (strong signal) | Normal |
| 302307S46S47 | The old URL may stay | Weak signal | Normal |
| 404410S49S50 | Removed | Lost | Slows for that URL |
| 429503S53S54S55 | Kept a while, then dropped | Unchanged | Slows for the whole host |
First status vs final status: why a URL status checker follows redirects
A URL's first status is what that exact address answers; the final status is what you land on after every redirect. A URL status checker needs both: http://example.com/ answers 301, but the page people see answers 200.
Each Location header is read against the URL that sent it, so every hop is a new request to a new address. The checker records each one's status and time, and stops at loops.
Googlebot follows up to 10 redirect hops; past that it stops, and Search Console reports a "Redirect error". Each extra hop also costs your visitors a round trip, so link to the final URL.
- 301
http://example.com/hop 1 · 238 ms - 301
https://example.com/hop 2 · 138 ms - 200
https://www.example.com/431 ms
Blocked isn't down: when a status code checker meets a bot wall
A 403, 429 or even a 202 to an automated check often comes from a bot wall in front of the site, not from the site itself. This status code checker names the wall and counts the row as "couldn't check", never as down or broken.
The walls say who they are. Cloudflare's challenge pages carry the header cf-mitigated: challenge, AWS WAF's carry x-amzn-waf-action (with a 202 for a challenge and a 405 for a captcha), and Akamai's deny page answers 403. A browser usually gets through by running the challenge's script; a checker that doesn't run JavaScript sees only the challenge.
So a blocked row means the site is up and turned automated requests away. Try the Googlebot user agent, and check your logs: some walls let verified crawlers through, some don't.
| URL | Our check got | The sign | Wall |
|---|---|---|---|
https://www.example.org/ | 403 | cf-mitigated: challenge | Cloudflare challenge |
https://www.example.org/robots.txt | 200 | the page itself | No wall |
https://store.example.net/ | 202 | x-amzn-waf-action: challenge | AWS WAF challenge |
https://news.example.net/ | 403 | Server: AkamaiGHost, 403 | Akamai deny |
https://api.example.net/v1/ | 429 | 429 + Retry-After | Rate limit |
https://www.example.com/ | 200 | the page itself | No wall |
HEAD or GET: which should a bulk URL checker send?
GET, unless you know your servers answer HEAD properly. A bulk URL checker that sends HEAD is faster, but some servers refuse it (405 or 501) or drop the connection, and HEAD answers may leave out headers a GET would carry.
The standard says every general-purpose server must support GET and HEAD, and that a HEAD answer should carry the same headers as GET. In practice frameworks and old servers break that, so a HEAD check can show a 405 for a page that works.
This checker sends GET by default, as browsers and Googlebot do. With HEAD picked, a row whose server refuses HEAD or drops it is asked again with GET, and the row says what HEAD got.
https://example.com/HEAD200HEAD answeredhttps://nohead.example.com/HEAD405GET200shownhttps://legacy.example.net/HEAD501GET200shownhttps://cdn.example.org/files/manual.pdfHEAD200HEAD answeredhttps://dropper.example.com/HEADdroppedGET200shown
Soft 404s: a 200 that says "not found"
A soft 404 is a page that answers 200 but tells the visitor the page doesn't exist. Google reports it as a soft 404 in Search Console and treats it like a 404, so a status code alone can look healthy while the page is gone.
This checker reads the final page's title and flags a 200 whose title says "not found", "404" or "doesn't exist" as a hint. It's never counted as a 4xx: only the page's own content can tell.
The fix is to send a real 404 (or 410) for a missing page, or a 301 to the page that replaced it.
HTTP status checker FAQ
What's HTTP status 404?
What is an HTTP status?
How do I read an HTTP status code?
What's HTTP status 400?
How do I check the HTTP status of a URL?
curl -I https://example.com/ prints the first answer's status line (add -L to follow redirects), but it sends HEAD, which some servers answer differently.How do I check the status of many URLs at once?
Why does a URL show "Blocked" here but open in my browser?
Does Google index every page that returns 200?
Is my site down?
How do I check every link on a page?
Missing something?Suggest a feature or a new tool
Related tools
Redirect Checker
Follow every redirect hop by hop: 301/302 chains, timing and bulk checks
HTTP Header Checker
Response headers exactly as sent, with a Mozilla Observatory security grade
Link Analyzer
Analyze all links on a webpage with dofollow/nofollow detection and HTTP status checking
Website Down Checker
Is it down for everyone or just you? Check any site from 11 places and your own connection, with a live screenshot
Sitemap Checker
Find and validate a website's XML sitemap: syntax, URL limits, lastmod dates, robots.txt conflicts and broken or redirecting URLs
Robots.txt Checker
Fetch any site's robots.txt, test whether a URL is blocked for Googlebot or AI crawlers, and find syntax errors
Meta Tag Checker
Check a page's title, meta description, canonical, hreflang, Open Graph and X card tags, with Google and social previews
Hreflang Checker
Check a page's hreflang tags and every alternate they name: return links, codes, redirects, noindex and canonicals, plus a tag generator
SSL Certificate Check
Verify SSL certificate validity and security details