Код 200 говорит клиенту: «Всё прошло штатно, держи результат». Если вместо результата внутри тела прячется ошибка, то клиент вынужден парсить ответ, чтобы понять, что запрос на самом деле провалился. Это ломает саму идею HTTP-контракта.
Когда это всё-таки допустимо? При ошибках бизнес-логики. Например, валидация формы вернула список замечаний: сам запрос обработан корректно, просто данные не прошли проверку на уровне домена. Но даже тут стоит трижды подумать.
Для всего остального в HTTP уже есть подходящие коды — и они существуют не просто так:
🔹
400 Bad Request — клиент прислал невалидные данные 🔹
404 Not Found — ресурс не существует 🔹
500 Internal Server Error — сервер сломался и не смог обработать запрос 🔹
503 Service Unavailable — сервер на паузе: перегрузка, деплой, обслуживание🐸 Библиотека Go для собеса