| Код | Когда использовать |
|---|---|
| 200 | GET успешный, данные в теле |
| 201 | POST создал ресурс. Верни Location: /id |
| 204 | DELETE или PUT без тела ответа |
| 301 | Постоянный редирект (SEO-safe) |
| 302 | Временный редирект (метод меняется на GET) |
| 304 | Кеш актуален — отдать из браузера |
| 400 | Невалидный запрос (плохой JSON, пропущены поля) |
| 401 | Нет токена / токен истёк. Требуй аутентификацию |
| 403 | Токен есть, но нет прав |
| 404 | Ресурс не существует |
| 409 | Конфликт: дубликат, устаревшие данные |
| 422 | Синтаксис OK, но данные невалидны (лучше чем 400 для API) |
| 429 | Rate limit. Верни Retry-After |
| 500 | Непредвиденная ошибка сервера. Логируй! |
| 502 | Nginx получил плохой ответ от upstream |
| 503 | Сервер недоступен: деплой, обслуживание |
| 504 | Nginx timeout ожидая ответа от бэкенда |
401 vs 403: 401 = «кто ты?» (аутентификация), 403 = «знаю кто ты, но нельзя» (авторизация).
301 vs 302: 301 кешируется браузером, 302 — нет. 307/308 сохраняют метод (POST остаётся POST).
400 vs 422: 400 — синтаксически неверный запрос, 422 — синтаксис OK, но данные не проходят валидацию.
502 vs 504: 502 — плохой ответ от upstream, 504 — upstream не ответил вовремя.