Выше уже дали правильный и исчерпывающий в общем-то ответ, но, как разработчик в т.ч. API, подчеркну, что ошибки бывают разные. Когда используется код 200, но в ответе идет { "status": "error", "message": "..." }, то речь идет об ошибке уровня пользователя системы. Это пользователь захотел странного и был вежливо послан, с указанием в чем он неправ, а все остальное отработало как положено. Именно для разделения источников и уровней ошибок и используется такой подход. И, да, всегда надо читать документацию, это очень и очень полезно)