Well, we have two types of errors:
- expected errors
- unexpected errors
expected errors are the ones where it's the end users "fault" and in that case the code should handle it according to that by displaying a nice message to the user.
Unexpected errors as usually due to coding or infra related issues. In this case, showing a generic "something went wrong" to the end user is what's needed and the message (if any) is for the dev to debug the issue.
---------
So to make this clear, we kept expected errors as 200 status code. I know it's a little unconventional, but it allows us to communicate the intended affect of the error more easily.