Ba mã ứng với ba tầng lỗi khác nhau:
- 400 Bad Request — request sai cú pháp, server không parse nổi: JSON hỏng, thiếu field bắt buộc, kiểu dữ liệu sai (
age: "abc"), query param không hợp lệ. - 422 Unprocessable Content — cú pháp đúng, parse được, nhưng vi phạm luật nghiệp vụ hoặc ràng buộc ngữ nghĩa: email sai định dạng,
end_datetrướcstart_date, số lượng vượt tồn kho. - 409 Conflict — request hợp lệ nhưng xung đột với trạng thái hiện tại của resource: username đã tồn tại, huỷ đơn đã giao, cập nhật bản ghi đã bị người khác sửa (xung đột version).
json
// 422 kèm chi tiết field nào sai
{
"type": "https://api.example.com/errors/validation",
"title": "Validation failed",
"status": 422,
"errors": [{ "field": "end_date", "detail": "must be after start_date" }]
}Thực tế nhiều API chỉ dùng 400 cho cả hai nhóm đầu và điều đó vẫn chấp nhận được — điều quan trọng là nhất quán trong toàn API và luôn trả kèm thân lỗi nói rõ field nào sai.
Đừng dùng 500 cho lỗi validate: 5xx nghĩa là lỗi của server, sẽ kích hoạt cảnh báo và retry vô ích.