Есть 2 точки зрения.
Классический REST говорит что надо отдавать ошибки в http кодах сервера.
На практике занимались разработкой api под мобильные приложения несколько лет и столкнулись с тем, что многие библиотеки используемые для работы с апи на мобильных приложениях:
а) хреново работают с любым заголовком отличным от 200
b) хреново работают с любыми методами отличными от GET/POST
В итоге пришли к следующему решению (кусок из внутренней документации):
где code 400 говорит о том что серверу не нравятся какие то данные в запросе, error_code говорит о том что именно не нравится (почта, пароль итд - список свой в каждом методе api)