Формат ответов

Все ответы API обёрнуты в единый конверт. Это упрощает обработку успеха и ошибок на клиенте.

Конверт ответа

Каждый ответ — JSON-объект с булевым полем success. При успехе полезная нагрузка лежит в data, при ошибке — код в error.

Успех
{
  "success": true,
  "data": { "id": "8f3b1c2a-...", "title": "Введение в Python" }
}
Ошибка
{
  "success": false,
  "error": "course_not_found"
}
ПолеТипКогда присутствует
successbooleanВсегда
dataobject | arrayПри успехе
errorstringПри ошибке — машиночитаемый код
messagestringИногда — необязательное пояснение
Поля data, error и message необязательные — они опускаются, когда не нужны. Ориентируйтесь на success и HTTP-статус.

HTTP-статусы

СтатусЗначение
200 OKУспешный GET / PATCH / PUT / DELETE
201 CreatedУспешный POST, создавший ресурс
400 Bad RequestОшибка валидации или некорректное тело/параметры
401 UnauthorizedТокен отсутствует, истёк или недействителен
403 ForbiddenНедостаточно прав или приостановлен биллинг
404 Not FoundРесурс не найден (в т.ч. из-за изоляции школ)
409 ConflictНарушение бизнес-правила (см. эндпоинт)
423 LockedВременная блокировка (защита входа от перебора)
500 Internal Server ErrorНепредвиденная ошибка сервера

Заголовки

  • Тело запроса и ответа — application/json; charset=utf-8 (кроме экспорта CSV — text/csv).
  • Authorization: Bearer <token> — для защищённых эндпоинтов.
  • X-Tenant-Subdomain: <субдомен> — для эндпоинтов школы /api/v1/t/*.

Полный перечень кодов ошибок — в разделе Ошибки.