---
title: HTTP Status Codes
description: Every HTTP status code explained — what each class means, the full reference table, and deep dives into the codes that actually page people at 3am.
canonical: https://watchfor.io/docs/reference/http-status-codes
---

# HTTP Status Codes

Every HTTP status code explained — what each class means, the full reference table, and deep dives into the codes that actually page people at 3am.

Every HTTP response starts with a three-digit status code. The first digit tells
you who's talking and how it went:

| Class | Meaning | Who's at fault |
| --- | --- | --- |
| **1xx** | Informational — request received, keep going | Nobody |
| **2xx** | Success — the request worked | Nobody |
| **3xx** | Redirection — the resource is elsewhere | Nobody (usually) |
| **4xx** | Client error — the request was wrong | The caller |
| **5xx** | Server error — the request was fine, the server wasn't | You |

The distinction matters for monitoring: a **4xx** on a health check usually
means a broken URL or expired credentials in the check itself, while a **5xx**
means your service is genuinely misbehaving — which is why
[HTTP monitors](/docs/monitors/web) treat them differently by default.

## Full reference

### 1xx — Informational

| Code | Name | Notes |
| --- | --- | --- |
| 100 | Continue | Client may proceed with the request body |
| 101 | Switching Protocols | Upgrading, e.g. to WebSocket |
| 103 | Early Hints | Preload hints before the final response |

### 2xx — Success

| Code | Name | Notes |
| --- | --- | --- |
| 200 | OK | The standard success response |
| 201 | Created | New resource exists; see the `Location` header |
| 202 | Accepted | Queued for async processing — not done yet |
| 204 | No Content | Success with an empty body (common for DELETE) |
| 206 | Partial Content | Range requests — video streaming, resumed downloads |

### 3xx — Redirection

| Code | Name | Notes |
| --- | --- | --- |
| [301](/docs/reference/http-status-codes/301) | Moved Permanently | The SEO-relevant one — passes link equity |
| [302](/docs/reference/http-status-codes/302) | Found | Temporary redirect, method may change to GET |
| 304 | Not Modified | Conditional request — use your cached copy |
| 307 | Temporary Redirect | Like 302 but preserves the method and body |
| 308 | Permanent Redirect | Like 301 but preserves the method and body |

### 4xx — Client errors

| Code | Name | Notes |
| --- | --- | --- |
| [400](/docs/reference/http-status-codes/400) | Bad Request | Malformed syntax, invalid body, bad headers |
| [401](/docs/reference/http-status-codes/401) | Unauthorized | Missing or invalid authentication |
| [403](/docs/reference/http-status-codes/403) | Forbidden | Authenticated, but not allowed |
| [404](/docs/reference/http-status-codes/404) | Not Found | The classic |
| 405 | Method Not Allowed | Right URL, wrong verb (POST vs GET) |
| [408](/docs/reference/http-status-codes/408) | Request Timeout | Server gave up waiting for the request |
| 409 | Conflict | State conflict — concurrent edits, duplicate create |
| 410 | Gone | Permanently removed, deliberate signal to crawlers |
| 413 | Content Too Large | Body exceeds server limits |
| 418 | I'm a teapot | An April Fools RFC that shipped to production everywhere |
| 422 | Unprocessable Content | Syntax fine, semantics wrong — validation errors |
| [429](/docs/reference/http-status-codes/429) | Too Many Requests | Rate limited; honor `Retry-After` |

### 5xx — Server errors

| Code | Name | Notes |
| --- | --- | --- |
| [500](/docs/reference/http-status-codes/500) | Internal Server Error | Unhandled exception, the catch-all |
| 501 | Not Implemented | The server doesn't support this functionality |
| [502](/docs/reference/http-status-codes/502) | Bad Gateway | A proxy got a bad response from upstream |
| [503](/docs/reference/http-status-codes/503) | Service Unavailable | Overloaded or down for maintenance |
| [504](/docs/reference/http-status-codes/504) | Gateway Timeout | A proxy timed out waiting for upstream |
| 507 | Insufficient Storage | The server is out of space |

> **CDN vendor codes:** Cloudflare extends 5xx with its own codes (520–526) —
> for example 522 is "connection timed out reaching the origin" and 525 is an
> SSL handshake failure with the origin. If you're behind Cloudflare, those
> codes point at the connection between the CDN and your server.

## Debugging any status code

1. **Reproduce with full detail** — the free
   [HTTP header checker](/http-header-checker) shows the status, every response
   header and the complete redirect chain for any URL.
2. **Check whether it's you or them** — run the check
   [from multiple regions](/docs/monitors/web); a 5xx from one region but not
   others usually means a network path or CDN PoP issue, not your origin.
3. **Watch it over time** — a one-off 502 during a deploy is normal; a 502
   every few minutes is a failing backend. An
   [HTTP monitor](/docs/monitors/web) with
   [confirmed alerting](/docs/alerting/incidents) makes that distinction for
   you.

---

Canonical page: https://watchfor.io/docs/reference/http-status-codes · All docs: https://watchfor.io/docs · Site guide: https://watchfor.io/llms.txt
