Если почитать рандомные статьи (раз, два) про работу с GraphQL, то получается, что обработка ошибок как в REST — это “неправильный” подход к использованию GraphQL. Потому что, во-первых, GraphQL не привязан к транспортному протоколу, а во-вторых, спецификация явно определяет, что для ошибок есть специальное поле. Кроме того, один запрос может содержать несколько подзапросов, и не понятно, что делать, если один обработался успешно (как вариант, предлагают 207), а другой — нет. И вроде как надо возвращать 200, если запрос выполнился успешно, и 500 — в любом другом случае.

Однако, когда тебе на невалидный запрос возвращается 200 с пустыми данными, это выглядит, как минимум, странно. Если копнуть глубже, то выяснится, что в официальной документации про статус-код не говорится ничего. В 2018 в рабочей группе GraphQL поднимался этот вопрос, и потом еще в 2019 и 2020. Но четкого результата у этих обсуждений нет, только черновик.

Я в итоге на текущем проекте решил группировать по убыванию. Если нет ошибок — 200, хотя бы один 5xx код — это 500, несколько 4xx = 400, один 4xx — его и вернуть, в любой непонятной ситуации — 500.