Should a RESTful API return 400 or 404 when passed an invalid id

Rest

Rest Problem Overview


When building a RESTful API and a user provides an id of resource that does not exist, should you return 404 Not Found or 400 Bad Request.

For example:

https://api.domain.com/v1/resource/foobar

Where foobar does not exist.

Rest Solutions


Solution 1 - Rest

I would return 404 in case of resource does not exist(means the url path is wrong) and i will return 400 only if the rest call is made with some invalid data (@PathParam) for example
https://api.domain.com/v1/profile/test@email : here i am trying to get profile of email id, but the email itself is wrong, so I will return 400.
https://api.domain.com/v1/profile1111/[email protected] will return 404 because the url path is invalid.

Solution 2 - Rest

Should be 404 ( Not Found ). 400 is used if you can't fulfill the request due to bad syntax, however for your case, the syntax is correct, however there is no resource foobar.

You can use 400 if user uses non-existent API like below :

https://api.domain.com/v1/nonexistAPI/xyz/xyz

You can also refer to this REST API Design Blog which tell you how to design your REST error codes.

Solution 3 - Rest

404 Not Found is the proper answer I think, 400 is more about the body of the requests and not the resource identifier, so for example you can send that by validation errors.

Solution 4 - Rest

Is it a valid request? Can the id of the resource exist? Is it formatted as a proper id? Is it syntactically correct? etc.. If so then you can use, 404 Not Found. Otherwise 400 Bad Request is more suitable.

Solution 5 - Rest

According to the RFC (https://www.rfc-editor.org/rfc/rfc2616#section-10.4) the API should return 404 when > "The server has not found anything matching the Request-URI",

which is your example.

400 would be when the resource is found, but the request itself is malformed.

For instance: i. https://api.domain.com/v1/resource/foobar

where foobar DOES NOT exist should return 404

ii. https://api.domain.com/v1/resource/foobar where foobar DOES exist, but the request is wrong ({age:"NOTANINTEGER"}, a string instead of an int for example), it should return 400.

Hope I could help.

Solution 6 - Rest

404 would be a more common practice one. Its for Resource Not Found. In your case the particular URL is not found.

400 is generally used for Bad Request. You can use this one for any bad request. For eg. MissingRequiredQueryParameter, InvalidInput.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJustinView Question on Stackoverflow
Solution 1 - RestManojView Answer on Stackoverflow
Solution 2 - RestRudyView Answer on Stackoverflow
Solution 3 - Restinf3rnoView Answer on Stackoverflow
Solution 4 - RestgkrlsView Answer on Stackoverflow
Solution 5 - RestTiarajuView Answer on Stackoverflow
Solution 6 - Restuser636856View Answer on Stackoverflow