HTTP status codes for SEO: the ones that matter
·4 min read
HTTP status codes are the three-digit answers your server sends before any page content, and Googlebot reads them first. A 2xx lets Google consider the page for indexing, a 3xx sends it to another URL, a 4xx tells it the page does not exist, and a 5xx tells it your server is struggling. Only about a dozen codes change how Google crawls and indexes a site, and the table below lists them.
Everything here comes from Google's page on how HTTP status codes affect Google Search.
The HTTP status codes that affect crawling and indexing
| Code | Name | What Googlebot does |
|---|---|---|
| 200 | OK | Passes the content on for indexing. Indexing is still not guaranteed |
| 204 | No Content | Gets no content, so it has nothing to index |
| 301 | Moved Permanently | Follows it and treats it as a strong signal that the target is the canonical URL |
| 308 | Permanent Redirect | Same as 301 |
| 302 | Found | Follows it and treats it as a weak canonical signal |
| 307 | Temporary Redirect | Same as 302 |
| 304 | Not Modified | Reuses what it crawled last time |
| 404 | Not Found | Treats the content as missing. Indexed URLs drop out over time |
| 410 | Gone | Treated the same as 404 |
| 401, 403 | Unauthorized, Forbidden | Treated the same as 404. No effect on crawl rate |
| 429 | Too Many Requests | Treated as a server error. Slows crawling |
| 500, 502, 503 | Server errors | Slows crawling. URLs that keep failing are dropped |
Two rows surprise people. A 410 buys you almost nothing over a 404 in Google, and a 429 behaves like a 5xx, not like the other 4xx codes.
2xx: success, but not a promise
A 200 means Google receives the page and hands it to the indexing systems, which may still decide not to index it. Google says so plainly. A 2xx response "doesn't guarantee indexing." If a healthy 200 page stays out of the index, the status code is not your problem. Read crawled, currently not indexed instead.
The trap in this class is the 200 that should not be a 200. An empty template or a "product not found" message served with a 200 shows up in Search Console as a soft 404. Our post on the soft 404 covers how to find and fix them.
3xx: redirects and how much they pass
Google follows a redirect, and the code tells it how seriously to take the move. 301 and 308 are strong signals that the target should be the canonical URL. 302, 303 and 307 are weak signals, so Google may keep the old URL in results. Google's crawlers follow up to 10 hops by default, though every hop adds a request and a delay.
Use a 301 when a page has moved for good, which covers most migrations. Use a 302 only when the old URL is coming back. The details are in 301 vs 302 redirects and 307 vs 308. If a redirect points at another redirect, collapse it, as described in redirect chains.
A 304 is not a redirect at all, even though it sits in this class. It answers a conditional request and tells Google the page has not changed since its last crawl.
4xx: the page is not here
Google treats every 4xx code except 429 the same way. The content does not exist, indexed URLs leave the index over time, and newly found 404s are never processed. These codes do not slow Googlebot down on the rest of your site, so a few hundred 404s on deleted pages are normal and harmless.
The mistakes are elsewhere. Returning 403 or 401 to throttle Googlebot does not work, because Google reads them as "page missing" and keeps crawling at the same rate. Returning 404 for pages you meant to keep, after a botched migration or a broken route, removes them from search. Check the 404 error post for the cleanup steps and 404 vs 410 if you are weighing the two.
5xx and 429: the server is in trouble
A 5xx or a 429 makes Google crawl your site more slowly. It keeps already indexed URLs for a while, but drops the ones that keep failing. When the server answers 2xx again, Google raises the crawl rate gradually.
That gives you one useful tool. For planned maintenance, a 503 tells Google to come back later without treating the page as gone. Keep the outage short, because a 503 that lasts for days ends the same way as a 500. For the other common server errors, see status code 500 and 502 Bad Gateway.
Check the status codes of a URL list
The HTTP Status Bulk Checker takes up to 20 pasted URLs and requests each one with a GET, following up to 5 redirects. For every URL it returns the final status code, the first redirect's code and target, the hop count and the response time. It then flags 4xx and 5xx results and URLs that could not be reached. When a site answers with a rate limit, a bot check or a 403, the tool marks that row as unanswered rather than calling it a client error. One run costs 20 credits.
It does not read page bodies, so it cannot catch a soft 404 that returns 200. It does not crawl your site or expand a sitemap, and it cannot see what Search Console recorded for Googlebot. Run it after a migration goes live, with the old URLs from your redirect map, and every row should come back as a redirect to a final 200.