Ошибки
Ошибки предвалидации запроса, внутренние ошибки сервера
Ошибки возвращаются в формате json
{
  "type": "...",
  "detail": "..."
}
| HTTP code | type | detail | Описание | 
|---|---|---|---|
| 400 | invalid_request | невалидный запрос (например, заголовок Authorization отсутствует либо прислан в невалидном формате, невалидное тело запроса) | |
| 400 | invalid_request | graphql_query_not_found | в теле запроса отсутствует обязательное поле "query" | 
| 401 | invalid_token | token_not_found | не найден токен доступа | 
| 401 | invalid_token | token_expired | токен доступа просрочен | 
| 403 | api_access | insufficient_permissions | отсутствует право использования API | 
| 403 | api_access | authorisation_not_found | авторизация в Talantix истекла или была отозвана, авторизируйтесь в системе Talantix | 
| 403 | api_access | access_blocked | доступ к API заблокирован, обратитесь в службу поддержки | 
| 404 | not_found | запрос несуществующего ресурса | |
| 413 | request_entity_too_large | тело запроса превышает установленный лимит | |
| 429 | too_many_requests | превышено допустимое количество запросов в единицу времени | |
| 500 | internal_server_error | внутренняя ошибка сервера | 
Ошибки выполнения запроса GraphQL
Прошедшие авторизацию запросы GraphQL возвращают HTTP ответ с кодом 200 или 210 и json телом фиксированного формата. Код 210 возвращается при возникновении внутренних технических ошибок (семантический аналог 500-х ошибок HTTP), во всех остальных случая возвращается код 200.
{
  "errors": [
    {
      "message": ...,
      "locations": [
        {
          "line": ...,
          "column": ...
        }
      ],
      "path": ...,
      "extensions": {
        "errorType": ...
      }
    }
  ],
  "data": ...,
  "dataPresent": ...
}
где
errors- список технических ошибок, произошедших в процессе выполнения запроса (ошибки в коде, таймауты походов, ошибка валидации данных запроса и т.д.). Пустой список означает, что запрос отработал успешно и все запрошенные данные присутствуют в полеdata;message- текст и описание ошибки;locations- массив расположения невалидных полей запроса либо полей, получении которых вызывало ошибку;path- путь к узлу, получение которого вызвало ошибку;extensions- дополнительная информация об ошибке;data- полученные данные либо null;dataPresent- true или false в зависимости от того, были получены какие-либо данные в результате запроса или нет.
Ошибки валидации запроса
Запрос, содержащий в поле query невалидные данные (ошибки в синтаксисе, несуществующие поля), возвращает ответ
{
  "errors": [
    {
      "message": "Validation error (FieldUndefined@[me/idd]) : Field 'idd' in type 'Me' is undefined",
      "locations": [
        {
          "line": 5,
          "column": 5
        }
      ],
      "path": null,
      "extensions": {}
    }
  ],
  "data": null,
  "dataPresent": false
}
Ошибки сложности запроса
Запрос с обходом большого количества узлов (в т.ч. вложенных списков узлов и их комбинаций) может создавать значительную нагрузку на систему. Поэтому сложность каждого запроса анализируется перед выполнением и, в случае превышения порогового значения, возвращается ответ с ошибкой
{
  "errors": [
    {
      "message": "Requested operation exceeds the permitted complexity limit: 2650 > 2499",
      ...
    }
  ],
  ...
}
Ошибки выполнения запроса технического характера
Ответ на запрос с технической ошибкой времени выполнения содержит поле errors с элементом, имеющим значением INTERNAL в поле extensions.errorType. Ошибки получения одного (или более) узлов не отменяют получение данных для узлов одного с ними уровня и выше по иерархии. Успешно полученные данные возвращаются в поле data.
{
  "errors": [
    {
      "message": "Internal error",
      "locations": [
        {
          "line": 2,
          "column": 3,
          "sourceName": null
        }
      ],
      "path": ["persons.items.personalDataAgreementStatus"],
      "extensions": {
        "errorType": "INTERNAL"
      }
    }
  ],
  "data": {
    "persons": {
      "items": [
        {
          "id": 1
        }
      ]
    }
  },
  "extensions": null,
  "dataPresent": true
}
Ошибки бизнес логики
Иноформация об ошибках бизнес логики (отсутствие прав доступа к сущности, отсутствие сущности) для запрашиваемого узла отдается в виде объекта кастомной типизированной ошибки. Такая подмена достигается за счет использования в узле абстрактного типа union GraphQL. Например, запрос менеджера по id с получением ошибки выглядит следующим образом
- graphql
 - cURL
 
query ManagerWithError {
  manager(id: 5) {
    __typename
    ... on CompanyManager {
      id
    }
    ... on ManagerError {
      errorType
      message
    }
  }
}
curl https://api.talantix.ru/graphql \
 -X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"query ManagerWithError {\\n  manager(id: 5) {\\n    __typename\\n    ... on CompanyManager {\\n      id\\n    }\\n    ... on ManagerError {\\n      errorType\\n      message\\n    }\\n  }\\n}\"}"
с ответом
{
  "errors": [],
  "data": {
    "manager": {
      "__typename": "ManagerError",
      "errorType": "NOT_FOUND",
      "message": null
    }
  },
  "dataPresent": true
}
Таким образом, ошибки бизнес логики возвращаются вместе с остальными данными в поле data, в то время как поле errors содержит только технические ошибки выполнения запроса.