# HTTP status codes: the full list for site owners, with SEO effects

> HTTP status codes are the three-digit answers a server gives to every request. Every code a site owner meets, what browsers do with it and how Google treats it.

Updated 2026-09-26 · Technical SEO · HTML version: https://getreport.app/guides/http-status-codes

HTTP status codes are the three-digit numbers a web server puts at the start of every answer, telling the browser or crawler whether the request worked (2xx), moved (3xx), was wrong or not allowed (4xx) or failed on the server (5xx). A site owner meets about twenty of them in practice. This reference lists each one with what it means, what browsers do and how Google Search treats it, so you can read a link check, a server log or a Search Console report and know what to fix. For the problems they cause, see the guide to [finding and fixing broken links](https://getreport.app/guides/find-and-fix-broken-links).

## Quick answer

- **200** is the only answer a page you want in search should give.
- **301 and 308** are permanent redirects; Google moves the page's signals to the target. **302, 303 and 307** are temporary.
- **304** means "your cached copy is still current"; it is normal and good.
- **404 and 410** mean the page is not there; Google drops the URL. Every 4xx except 429 is treated the same for indexing.
- **429 and 5xx** make Google slow its crawling; URLs that keep failing are eventually dropped.
- Check any URL in the browser's Network panel, with `curl -sI`, or for a list with the [bulk URL checker](https://getreport.app/tools/bulk-url-checker).

## How HTTP status codes work

Every request a browser or crawler sends gets an answer that starts with a status line, such as `HTTP/2 200` or `HTTP/1.1 404 Not Found`. The code comes before the page, the headers and everything else, and it is what machines read; the text on the page is for people. That is why a page saying "not found" with a 200 status confuses Google: the code and the content disagree.

The codes are defined in RFC 9110, the current HTTP standard, with a few in their own RFCs (429 in RFC 6585, 451 in RFC 7725, 103 in RFC 8297). The first digit is the class:

| Class | Meaning | What you do about it |
| --- | --- | --- |
| 1xx Informational | An interim answer; the real one follows | Nothing |
| 2xx Success | The request worked | Nothing, if it is the page you meant |
| 3xx Redirection | Go somewhere else, or use your cache | Keep redirects to one hop |
| 4xx Client error | The request cannot be served as asked | Fix links, or leave true 404s alone |
| 5xx Server error | The server failed on a valid request | Fix the server, quickly |

Google's crawling behaviour below comes from its documentation on [how HTTP status codes affect Google Search](https://developers.google.com/search/docs/crawling-indexing/http-network-errors).

## 2xx: success

| Code | Name | What it means | Browsers | Google |
| --- | --- | --- | --- | --- |
| 200 | OK | The page answered normally | Show the page | Passes the content on to indexing |
| 201 | Created | A new resource was made, usually by an API | Show the body | Waits briefly, then uses what it got |
| 202 | Accepted | The request was queued, not done | Show the body | Waits briefly, then uses what it got |
| 204 | No Content | Success, with nothing to send | Stay on the current page | Nothing to index |
| 206 | Partial Content | Part of a file, for a range request | Used for video and resumed downloads | Not relevant to pages |

A 200 is necessary for indexing, not sufficient. A 200 page can still be kept out by `noindex`, a canonical to another URL, a robots.txt block, or Google judging it a [soft 404](https://getreport.app/guides/soft-404s-what-they-are-and-how-to-fix-them): a "not found", empty or error page that answers 200. getReport's indexability finding checks all three conditions you control:

> **Check: The page can be indexed.** To appear in search, a page must return HTTP 200, carry no noindex directive and be allowed in robots.txt. If any of the three fails, the page is invisible to searchers.
>
> 1. Open the technical detail to see which condition fails, then fix that one; the individual findings above have the steps.
> 2. After the fix, request indexing in Google Search Console to speed things up.

## 3xx: redirects and caching

| Code | Name | What it means | Browsers | Google |
| --- | --- | --- | --- | --- |
| 301 | Moved Permanently | The page moved for good | Follow; may cache the redirect indefinitely | Strong signal that the target is canonical |
| 302 | Found | The page is elsewhere for now | Follow; don't cache by default | Weak signal; the source usually stays indexed |
| 303 | See Other | Look at another URL, typically after a form is sent | Follow with GET | Treated like 302 |
| 304 | Not Modified | The copy you have is still current | Use the cached copy | Content unchanged; no other effect |
| 307 | Temporary Redirect | Like 302, but keep the request method | Follow with the same method | Treated like 302 |
| 308 | Permanent Redirect | Like 301, but keep the request method | Follow; may cache indefinitely | Treated like 301 |

Every redirect answer carries a `Location` header with the new address. Googlebot follows up to 10 hops and ignores any content the redirecting URL sends; browsers give up after about 20 and show a "too many redirects" error. For ordinary pages, 301 and 308 behave the same, and so do 302 and 307; the method difference only matters for forms and APIs.

The expensive mistakes are a 302 for a permanent move, chains of several hops, and loops. The [301 redirects guide](https://getreport.app/guides/301-redirects) covers when to use which, and [301 vs 302, 307 and 308](https://getreport.app/guides/redirects-without-chains) goes deeper on the codes and on collapsing chains.

> **Check: The URL loads without a redirect chain.** Each redirect is a full request and response before the browser can start loading the page, which slow mobile connections feel most. Google says redirects do not lose ranking value, but Googlebot follows at most 10 hops, and long chains slow crawling and break when one hop changes.
>
> 1. Point every old URL straight at the final one (a single 301), and update internal links to use the final URL directly.
> 2. Look for rules that stack, for example http → https, then non-www → www, then trailing slash; combine them into one rule.

A 304 is not an error. It is the answer to a conditional request, one that sends `If-None-Match` or `If-Modified-Since` with the version the client already has. Servers that answer 304 well save bandwidth for visitors and crawl budget for Google. The [cache-control guide](https://getreport.app/guides/cache-control-for-humans) explains the headers behind it.

## 4xx: client errors

| Code | Name | What it means | Browsers | Google |
| --- | --- | --- | --- | --- |
| 400 | Bad Request | The request was malformed | Show the error | Not indexed |
| 401 | Unauthorized | Log in first | Show a login prompt if the server asks for one | Not indexed |
| 403 | Forbidden | The server refuses, even if you log in | Show the error | Not indexed |
| 404 | Not Found | No page at this address | Show the site's 404 page | Not indexed; indexed URLs are dropped |
| 405 | Method Not Allowed | This method, such as HEAD or POST, is not accepted here | Rarely seen | Not indexed |
| 408 | Request Timeout | The client took too long to send the request | Rarely seen | Not indexed |
| 410 | Gone | Removed on purpose and not coming back | Show the error page | Same as 404 |
| 429 | Too Many Requests | Slow down | Show the error | Treated as a server error: crawls more slowly |
| 451 | Unavailable For Legal Reasons | Blocked for legal reasons, such as a court order | Show the error | Not indexed |

Google's documentation groups 400, 401, 403, 404, 410 and 411 together: the content is not used, the URLs are crawled less and less often, and indexed ones are removed. It also asks you not to use 401 or 403 to slow Googlebot down; answer 429 or 503 for that.

### 404 and 410

A 404 is the most common error on the web and the main cause of broken links. It is the right answer for a page that never existed or is gone for good, and wrong for a page that moved, which needs a 301. The [404 error guide](https://getreport.app/guides/404-error) covers what it means for visitors and how owners find and fix the ones that matter. Whether a removed page should answer 404, 410 or a redirect is a per-URL decision; [404 vs 410 vs redirect](https://getreport.app/guides/404-vs-410-vs-redirect-what-to-do-with-removed-pages) has the rules.

Missing pages should still get a helpful page with the site's navigation, served with status 404:

> **Check: Missing pages get a proper 404 page.** A visitor on a broken link should see your own "page not found" with a menu and search, and search engines should get HTTP 404 so they drop the URL. A server default page or a 200 answer does neither.
>
> 1. Return HTTP 404 (not 200 or 302) for unknown URLs; a "soft 404" keeps dead pages in Google.
> 2. Design the 404 page with your header, a short apology, search and links to the main sections; most CMSs have a 404 template.

### 401 and 403

401 says "you have not proved who you are"; 403 says "I know, and the answer is still no". A staging site behind a password answers 401, which is how it should stay out of Google. A 403 on a public page usually comes from a firewall, a bot filter or file permissions, and it can hit Googlebot and link checkers while working in your own browser. If a checker reports 403 on a page you can open, look at your security plugin, CDN bot rules or server firewall first; [403 forbidden: every cause and its fix](https://getreport.app/guides/403-forbidden) works through each layer in order.

### 429

429 means the client sent too many requests in a given time. It often carries a `Retry-After` header saying how long to wait. Google treats it as a sign of overload and slows down, like a 5xx. Rate limits are a good defence against abusive bots, but set them so real crawlers are not hit on normal pages.

## 5xx: server errors

| Code | Name | What it means | Google |
| --- | --- | --- | --- |
| 500 | Internal Server Error | The application or a server rule failed | Slows crawling; drops URLs if it persists |
| 502 | Bad Gateway | A proxy or CDN got an invalid answer from the server behind it | As for 500 |
| 503 | Service Unavailable | Overloaded or in maintenance, on purpose | As for 500; right for short, planned downtime |
| 504 | Gateway Timeout | A proxy or CDN waited for the server behind it and gave up | As for 500 |

Browsers show whatever page the server or CDN sends, or their own "This page isn't working" if there is none. Google lowers its crawl rate in proportion to the number of URLs that fail, keeps indexed pages at first, and drops URLs that keep failing. For planned maintenance, answer 503 with a `Retry-After` header rather than 200 with a "back soon" page. A robots.txt file that answers 5xx is a special case: Google's robots.txt documentation says it stops crawling the whole site for the first 12 hours.

The [500 Internal Server Error guide](https://getreport.app/guides/500-internal-server-error) covers the causes, from plugin errors to memory limits, and how to find them in the error log. When the error names a gateway, the chain is one link longer: [502 bad gateway: what it means and how to fix it](https://getreport.app/guides/502-bad-gateway) finds which server behind your proxy or CDN stopped answering. A 504 is the same chain with a clock in it: [504 gateway timeout](https://getreport.app/guides/504-gateway-timeout) shows which timeout ran out and how to fix the slow request instead of raising every limit. For a 503, [503 service unavailable](https://getreport.app/guides/503-service-unavailable) separates planned maintenance from an overloaded server.

## 1xx: informational

These are never the final answer to a page request, so you rarely see them. **100 Continue** tells a client it may send a large request body. **101 Switching Protocols** upgrades an HTTP/1.1 connection, most often to WebSockets. **103 Early Hints** lets the server send `Link` headers for preload and preconnect while it is still building the page, so the browser can start fetching fonts and styles earlier. Chrome, Edge and Firefox support them; Safari uses them for preconnect only.

## Codes that are not in the standard

A few codes you will see come from particular products, not from the HTTP standard:

- **Cloudflare 520-526.** Cloudflare's own errors about your origin server: 521 means your server refused the connection, 522 that the connection timed out, 524 that your server took too long to answer, and 525 and 526 that the SSL handshake with your server failed or its certificate was invalid. The fix is at your server, not at Cloudflare.
- **nginx 444 and 499.** 444 tells nginx to close the connection without answering, a common way to drop bad bots. 499 is written only in nginx's logs: the client closed the connection before nginx answered. Neither ever reaches a browser as a status.

## Which status codes matter for SEO

For a site owner, five questions cover it:

1. **Do the pages you want in search answer 200?** Check your sitemap URLs; each should be a 200 with no redirect.
2. **Do moved pages answer 301 or 308, in one hop, to the right page?** Temporary codes and chains slow the move of signals.
3. **Do missing pages answer 404 or 410,** not 200 and not a redirect to the home page?
4. **Are 5xx errors rare and short?** Long outages cost crawling and, eventually, indexed pages.
5. **Does robots.txt answer 200 or 404?** A 5xx there can halt crawling of the whole site.

> **Check: Sitemap URL status.** A sitemap should list only pages that answer 200. Redirects, 404s and noindex pages in it waste crawl budget and make Google trust the file less.
>
> 1. Remove deleted pages from the sitemap and list the final URL of redirected pages.
> 2. Most CMS plugins do this automatically; if you generate the file yourself, rebuild it from the live URL list before publishing.

## How to check a page's HTTP status code

**In the browser.** Open the developer tools (F12, or Cmd+Option+I on a Mac), go to the Network panel, tick "Preserve log" so redirects are kept, and reload. The first row is the page, with its status in the Status column; redirects appear as separate rows before it. Browsers cache 301s, so use a private window when you test a redirect.

**In a terminal.** `curl` shows the status line and headers without the page:

```bash
curl -sI https://example.com/page
```

Add `-L` to follow redirects and see every hop. Some servers answer `HEAD` requests differently from `GET`; if the result looks odd, compare with `curl -s -o /dev/null -w "%{http_code}\n" https://example.com/page`, which uses GET.

**For a list of URLs.** The bulk URL checker requests up to 1,000 addresses with GET, follows up to 10 redirects and labels each row OK, redirect, redirect chain, not found, server error, noindex or unreachable, with every hop, the final URL and a CSV export.

> **Free tool:** [Bulk redirect checker: status of 1,000 URLs](https://getreport.app/tools/bulk-url-checker): Free bulk redirect checker. Paste up to 1,000 URLs and get each status code, final URL, redirect hops, noindex and canonical in one table, with CSV export.

**For the links on a page.** The broken link checker requests every link on a page, up to 100 on your site and 50 to other sites, and shows the status, redirect target and response time of each.

> **Free tool:** [Broken link checker: find dead links on a page](https://getreport.app/tools/broken-link-checker): Free broken link checker: test up to 150 links on a page, internal and external, with status code, redirect target and response time. Find dead links fast.

> **Check: Broken links.** A link to a 404 page is a dead end for visitors and a wasted crawl for search engines. Old campaign or product pages are the usual cause.
>
> 1. Update or remove each link listed in the technical detail; redirect the missing pages if they still get visits.
> 2. In WordPress, a plugin such as Broken Link Checker finds these site-wide.

**For one redirect.** The [redirect checker](https://getreport.app/tools/redirect-checker) follows every hop of one URL and also tries its http and www variants.

**As Google sees it.** Search Console's URL Inspection tool shows how Google last fetched a page, and Indexing → Pages groups URLs by problems such as "Not found (404)", "Server error (5xx)" and "Page with redirect".

## Questions people ask

### What are HTTP status codes?

HTTP status codes are the three-digit numbers a server sends at the start of every answer to say how the request went. The first digit gives the class: 1xx informational, 2xx success, 3xx redirection, 4xx client error and 5xx server error. Browsers and search engines act on the code before they look at the page itself.

### How do I check the HTTP status code of a page?

Open the browser's developer tools, choose the Network panel and reload: the Status column shows the code of each request. In a terminal, curl -sI followed by the URL prints the status line and headers. For many URLs at once, paste them into a bulk status checker, which also lists every redirect hop.

### What are the most common HTTP status codes?

The ones you will see most are 200 OK, 301 and 302 redirects, 304 Not Modified, 403 Forbidden, 404 Not Found, 500 Internal Server Error and 503 Service Unavailable. Together they cover nearly every answer a normal website gives: working pages, moved pages, cached pages, blocked or missing pages, and server failures.

### Which HTTP status codes matter for SEO?

The ones that decide whether a URL can be indexed and where its signals go. Pages you want in search must answer 200. Moved pages should answer 301 or 308 in one hop, missing pages 404 or 410. Long runs of 5xx or 429 slow Google's crawling and eventually drop pages, and a 5xx on robots.txt can halt crawling entirely.

### What is the difference between 401 and 403?

A 401 means the client has not authenticated: log in and try again. A 403 means the server understood who is asking and refuses anyway, or refuses everyone. For Google both mean the page is not indexed. A 403 on a public page usually comes from a firewall, bot filter or file permissions, and is worth investigating.

### What does 304 Not Modified mean?

It means the version the browser or crawler already has is still current, so the server sends no body. The client asked with If-None-Match or If-Modified-Since, and the server confirmed nothing changed. It is a healthy answer that saves bandwidth and crawl budget, not an error, and needs no fix.
