Which status code should I use for failed validations or invalid duplicates?
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
When developing an API, choosing the correct HTTP status code for responses is essential for effective communication between the client and the server. Different status codes have different implications and can impact how clients handle responses. This article focuses on determining the appropriate status codes for failed validations or invalid duplicates. Here, we'll explore two common situations when designing RESTful APIs or similar services: failed validations and handling of duplicate data.
Failed Validations
Failed validations typically occur when the input from the client does not meet the predefined criteria set by the server. This could involve data type mismatches (e.g., providing a string where a number is expected), range errors (e.g., providing a value below a minimum threshold), or format errors (e.g., incorrect date format).
For failed validations, the most suitable HTTP status code is 400 Bad Request. This status code informs the client that the server cannot process the request because the client’s input is malformed or incomplete.
Example of Failed Validation Response:
Invalid Duplicates
Invalid duplicates occur when a client attempts to create a record that would violate some uniqueness constraint within the application database. For instance, trying to register a username or email address that already exists.
For handling invalid duplicates, the best fit is generally 409 Conflict. This status indicates that the request could not be processed because of a conflict with the current state of the target resource, such as an attempt to create a duplicate record where uniqueness is required.
Example of Invalid Duplicate Response:
Choosing Between 400 Bad Request and 409 Conflict
While both 400 and 409 can be used in scenarios related to data validity and integrity, the choice often depends on the context of the error:
- 400 Bad Request should be used when the error is purely due to the client's malformed data input.
- 409 Conflict should be used when the input is syntactically correct but fails due to the current state of the server data (e.g., violating uniqueness constraints).
Here is a table summarizing these considerations:
| Status Code | Applicable Scenario | Description |
| 400 Bad Request | Data type mismatches, format errors, parameter missing | The request is malformed and thus cannot be processed. |
| 409 Conflict | Unique constraint violations, state conflicts | The request conflicts with the current server state. |
Further Considerations
While 400 and 409 cover most scenarios related to data validation issues, some APIs may also use:
- 422 Unprocessable Entity (WebDAV; RFC 4918): Indicates that the server understands the content type of the request entity, and the syntax of the request entity is correct, but it was unable to process the contained instructions.
- 428 Precondition Required (RFC 6585): Useful to prompt the client to condition their requests, such as providing precondition headers to help avoid issues like the "lost update" problem.
Example of 422 Unprocessable Entity Response:
Conclusion
Choosing the appropriate HTTP status code for responses involving failed validations or invalid duplicates is crucial for clarity and robustness in API design. Understanding the subtle differences between these codes allows developers to implement more precise error handling, improving the API's usability and reliability. Always consider how these responses align with the overall design principles of the API and the expected handling on the client side.

