I am currently developing a service and a client and I use HTTP statuses for communicating certain info.
For example, I have a POST /vikings endpoint that starts a long running process to create a viking object and returns a HTTP 201 status and a JSON with the viking id. I also have a GET /vikings/{viking_id} endpoint that may return a 1) HTTP 202 Accepted response code if the viking is still being created with a "Retry-After" HTTP header to tell the client to come back again or 2) an HTTP 200 OK status if the viking is already created (and some JSON representation of a viking).
My colleague argues that instead of HTTP status codes everything can be implemented in the JSON layer. So in the both cases above, we return HTTP 200 and the rest of the details are encoded in the JSON payload. The argument in favour of this are in line with Occam's razor.
As much as I like what I proposed -- more granular HTTP codes -- I don't really have much arguments in favour of it apart from this is a convention that is somewhat accepted and presumably a person who reads this code will get it faster. I have an uncomfortable feeling of being part of cargo cult.
Question: can you name some real-life examples, where using standard HTTP statuses gave you any benefit? For example, I imagine some smart HTTP client that can understand a "Retry-After" header and resend a request (but I have not seen such clients in wild life).