PublicTenantAdminSuperadmin

Тенанты и брендинг

Управление школами (тенантами) суперадмином платформы, публичный брендинг для экрана входа, чтение/редактирование собственной школы и настройки видимости разделов клиентского меню.

GET/api/v1/public/tenant

Публичный брендинг школы

Public Без авторизации

Возвращает безопасную публичную проекцию школы (название, субдомен, логотип, цветовая схема) по субдомену. Используется экраном входа на {subdomain}.edumentor.kz для отрисовки бренда ДО авторизации. Авторизация не требуется.

Приостановленные, ожидающие и удалённые школы возвращают 404 — без раскрытия факта существования (защита от перечисления школ). Поле logo всегда отдаётся как готовый URL: если логотип хранится как медиа-ассет, сервер подставляет свежий presigned-URL.

Query-параметры

ПараметрТипОписание
subdomainобяз.stringСубдомен школы.Пример: acme

Пример запроса

cURL
curl "https://api.edumentor.kz/api/v1/public/tenant?subdomain=acme"

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": {
    "title": "Acme School",
    "subdomain": "acme",
    "logo": "https://cdn.edumentor.kz/logos/acme.png",
    "color_scheme": "#2563eb"
  }
}

Ошибки

КодerrorКогда
400subdomain_requiredПараметр subdomain отсутствует или пуст.
404tenant_not_foundШкола не найдена либо неактивна (приостановлена/удалена).
POST/api/v1/admin/tenants/

Создать школу

Superadmin JWT

Создаёт новую школу (тенант) со статусом pending. Доступно только суперадмину платформы. Slug и субдомен нормализуются к нижнему регистру и должны быть уникальны.

Настройки видимости hide_tests, hide_assignments и hide_trial_exams для новой школы создаются со значением false: самостоятельные разделы клиентского меню по умолчанию видимы.

Тело запроса

ПараметрТипОписание
titleобяз.stringНазвание школы (2–255 символов).
slugобяз.stringУникальный slug (латиница/цифры, 2–100).Пример: acme
subdomainобяз.stringУникальный субдомен (латиница/цифры, 2–100).Пример: acme
logoопц.stringURL логотипа или UUID медиа-ассета (изображение).
color_schemeопц.stringHEX-цвет ровно из 7 символов (например #2563eb).Пример: #2563eb

Пример запроса

cURL
curl -X POST https://api.edumentor.kz/api/v1/admin/tenants/ \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Acme School",
    "slug": "acme",
    "subdomain": "acme",
    "color_scheme": "#2563eb"
  }'

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": {
    "id": "8f3b1c2a-1d2e-4a5b-9c6d-7e8f9a0b1c2d",
    "title": "Acme School",
    "slug": "acme",
    "subdomain": "acme",
    "logo": null,
    "color_scheme": "#2563eb",
    "hide_tests": false,
    "hide_assignments": false,
    "hide_trial_exams": false,
    "status": "pending",
    "timezone": "Asia/Almaty",
    "storage_cap_bytes": 5368709120,
    "plan_state": "trial",
    "expires_at": "2026-06-12T00:00:00Z",
    "created_at": "2026-05-28T10:00:00Z",
    "updated_at": "2026-05-28T10:00:00Z"
  }
}

Ошибки

КодerrorКогда
400slug or subdomain already takenШкола с таким slug или субдоменом уже существует.
401unauthorizedТокен отсутствует, истёк или недействителен.
403forbiddenНедостаточно прав — требуется роль суперадмина.
PUT/api/v1/admin/tenants/:id

Обновить школу (суперадмин)

Superadmin JWT

Частично обновляет название, логотип, цветовую схему и настройки видимости разделов клиентского меню школы. Доступно только суперадмину. Slug и субдомен через этот эндпоинт не меняются — переименования каскадно затрагивают URL и интеграции.

hide_tests, hide_assignments и hide_trial_exams управляют только самостоятельными пунктами меню. Они не меняют серверные права и не блокируют API или прямые маршруты; прикреплённый контент остаётся доступен со страницы соответствующего курса или урока.

Параметры пути

ПараметрТипОписание
idобяз.uuidИдентификатор школы.

Тело запроса

ПараметрТипОписание
titleопц.stringНовое название (2–255 символов).
logoопц.stringURL логотипа или UUID медиа-ассета (изображение).
color_schemeопц.stringHEX-цвет ровно из 7 символов.Пример: #16a34a
hide_testsопц.booleantrue — скрыть самостоятельный пункт «Тесты» в клиентском меню; false — показывать.
hide_assignmentsопц.booleantrue — скрыть самостоятельный пункт «Задания» в клиентском меню; false — показывать.
hide_trial_examsопц.booleantrue — скрыть самостоятельный пункт «Пробные ЕНТ» в клиентском меню; false — показывать.

Пример запроса

cURL
curl -X PUT https://api.edumentor.kz/api/v1/admin/tenants/8f3b1c2a-1d2e-4a5b-9c6d-7e8f9a0b1c2d \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Acme Academy",
    "color_scheme": "#16a34a",
    "hide_tests": true,
    "hide_assignments": false,
    "hide_trial_exams": true
  }'

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": {
    "id": "8f3b1c2a-1d2e-4a5b-9c6d-7e8f9a0b1c2d",
    "title": "Acme Academy",
    "slug": "acme",
    "subdomain": "acme",
    "logo": null,
    "color_scheme": "#16a34a",
    "hide_tests": true,
    "hide_assignments": false,
    "hide_trial_exams": true,
    "status": "active",
    "plan_state": "trial",
    "expires_at": "2026-06-12T00:00:00Z",
    "created_at": "2026-05-28T10:00:00Z",
    "updated_at": "2026-05-28T11:30:00Z"
  }
}

Ошибки

КодerrorКогда
400invalid id formatИдентификатор школы не является корректным UUID.
401unauthorizedТокен отсутствует, истёк или недействителен.
403forbiddenНедостаточно прав — требуется роль суперадмина.
404tenant not foundШкола с таким идентификатором не найдена.
DELETE/api/v1/admin/tenants/:id

Удалить школу (суперадмин)

Superadmin JWT

Мягко удаляет школу (проставляет deleted_at). Доступно только суперадмину. После удаления школа исчезает из публичного брендинга и недоступна для входа.

Параметры пути

ПараметрТипОписание
idобяз.uuidИдентификатор школы.

Пример запроса

cURL
curl -X DELETE https://api.edumentor.kz/api/v1/admin/tenants/8f3b1c2a-1d2e-4a5b-9c6d-7e8f9a0b1c2d \
  -H "Authorization: Bearer <token>"

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": { "deleted": true }
}

Ошибки

КодerrorКогда
400invalid id formatИдентификатор школы не является корректным UUID.
401unauthorizedТокен отсутствует, истёк или недействителен.
403forbiddenНедостаточно прав — требуется роль суперадмина.
404tenant not foundШкола с таким идентификатором не найдена.
GET/api/v1/t/tenant

Текущая школа

Tenant JWT

Возвращает полную запись школы, включая настройки видимости hide_tests, hide_assignments и hide_trial_exams, в которую разрешён запрос по заголовку субдомена. Доступно любому авторизованному участнику школы. Эндпоинт открыт даже при приостановленном биллинге — чтобы клиент мог отрисовать брендинг и актуальное меню.

Значение true скрывает только самостоятельный пункт соответствующего раздела в клиентском меню. Серверные права, API и прямые маршруты не блокируются; тест, задание или пробный ЕНТ, прикреплённые к курсу, остаются доступны со страницы курса или урока.

Пример запроса

cURL
curl https://api.edumentor.kz/api/v1/t/tenant \
  -H "Authorization: Bearer <token>" \
  -H "X-Tenant-Subdomain: acme"

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": {
    "id": "8f3b1c2a-1d2e-4a5b-9c6d-7e8f9a0b1c2d",
    "title": "Acme School",
    "slug": "acme",
    "subdomain": "acme",
    "logo": "https://cdn.edumentor.kz/logos/acme.png",
    "color_scheme": "#2563eb",
    "hide_tests": true,
    "hide_assignments": false,
    "hide_trial_exams": true,
    "status": "active",
    "timezone": "Asia/Almaty",
    "storage_cap_bytes": 5368709120,
    "plan_state": "trial",
    "expires_at": "2026-06-12T00:00:00Z",
    "created_at": "2026-05-28T10:00:00Z",
    "updated_at": "2026-05-28T10:00:00Z"
  }
}

Ошибки

КодerrorКогда
401unauthorizedТокен отсутствует, истёк или недействителен либо школа не определена.
PATCH/api/v1/t/tenant

Обновить свою школу

Admin JWT

Тенант-админ обновляет название, логотип, цветовую схему и настройки видимости hide_tests, hide_assignments и hide_trial_exams собственной школы. Доступно только роли admin. Slug и субдомен остаются под управлением суперадмина. Требует активного биллинга.

Каждый флаг изменяется независимо; пропущенное поле сохраняет текущее значение. true скрывает самостоятельный пункт меню, false возвращает его. Это настройка навигации, а не авторизации: API и прямые маршруты остаются доступны, а прикреплённый контент открывается со страницы курса или урока.

Тело запроса

ПараметрТипОписание
titleопц.stringНовое название (2–255 символов).
logoопц.stringURL логотипа или UUID медиа-ассета (изображение).
color_schemeопц.stringHEX-цвет ровно из 7 символов.Пример: #7c3aed
hide_testsопц.booleantrue — скрыть самостоятельный пункт «Тесты» в клиентском меню; false — показывать.
hide_assignmentsопц.booleantrue — скрыть самостоятельный пункт «Задания» в клиентском меню; false — показывать.
hide_trial_examsопц.booleantrue — скрыть самостоятельный пункт «Пробные ЕНТ» в клиентском меню; false — показывать.

Пример запроса

cURL
curl -X PATCH https://api.edumentor.kz/api/v1/t/tenant \
  -H "Authorization: Bearer <token>" \
  -H "X-Tenant-Subdomain: acme" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Acme Online",
    "color_scheme": "#7c3aed",
    "hide_tests": true,
    "hide_assignments": false,
    "hide_trial_exams": true
  }'

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": {
    "id": "8f3b1c2a-1d2e-4a5b-9c6d-7e8f9a0b1c2d",
    "title": "Acme Online",
    "slug": "acme",
    "subdomain": "acme",
    "logo": "https://cdn.edumentor.kz/logos/acme.png",
    "color_scheme": "#7c3aed",
    "hide_tests": true,
    "hide_assignments": false,
    "hide_trial_exams": true,
    "status": "active",
    "plan_state": "trial",
    "expires_at": "2026-06-12T00:00:00Z",
    "created_at": "2026-05-28T10:00:00Z",
    "updated_at": "2026-05-28T12:00:00Z"
  }
}

Ошибки

КодerrorКогда
400validation errorТело запроса не прошло валидацию (например, color_scheme не из 7 символов).
401unauthorizedТокен отсутствует, истёк или недействителен либо школа не определена.
403forbiddenНедостаточно прав — требуется роль администратора школы.
GET/api/v1/t/tenant/screenshot-protection

Статистика защиты от скриншотов

Admin JWT

Возвращает статистику текущей школы по урокам, тестам, заданиям и пробным ЕНТ: общее количество активных объектов, сколько из них разрешают скриншоты и сколько требуют блокировки. Доступно только администратору школы и требует активного биллинга.

screenshot_protection_enabled=false попадает в screenshots_allowed, true — в screenshots_blocked. Мягко удалённые объекты не учитываются. Сервер только отдаёт политику; фактическую блокировку скриншотов выполняет мобильное приложение.

Пример запроса

cURL
curl https://api.edumentor.kz/api/v1/t/tenant/screenshot-protection \
  -H "Authorization: Bearer <token>" \
  -H "X-Tenant-Subdomain: acme"

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": {
    "lessons": { "total": 42, "screenshots_allowed": 10, "screenshots_blocked": 32 },
    "quizzes": { "total": 12, "screenshots_allowed": 12, "screenshots_blocked": 0 },
    "assignments": { "total": 8, "screenshots_allowed": 3, "screenshots_blocked": 5 },
    "exams": { "total": 4, "screenshots_allowed": 0, "screenshots_blocked": 4 }
  }
}

Ошибки

КодerrorКогда
401unauthorizedТокен отсутствует, истёк или недействителен либо школа не определена.
403forbiddenНедостаточно прав — требуется роль администратора школы.
403PAYMENT_REQUIREDБиллинг школы неактивен.
PATCH/api/v1/t/tenant/screenshot-protection

Массово изменить защиту от скриншотов

Admin JWT

Устанавливает одно значение screenshot_protection_enabled для всех активных объектов выбранного типа в текущей школе. Позволяет, например, заблокировать скриншоты во всех уроках и отдельно разрешить их во всех тестах.

enabled=true включает защиту, enabled=false разрешает скриншоты. Обновляются только строки, значение которых действительно меняется; их число возвращается в updated_count. Операция не меняет updated_at контента и не затрагивает мягко удалённые объекты. В settings приходит свежая статистика по всем четырём типам.

Тело запроса

ПараметрТипОписание
content_typeобяз.stringТип контента: lessons, quizzes, assignments или exams.Пример: quizzes
enabledобяз.booleantrue — блокировать скриншоты; false — разрешить.

Пример запроса

cURL
curl -X PATCH https://api.edumentor.kz/api/v1/t/tenant/screenshot-protection \
  -H "Authorization: Bearer <token>" \
  -H "X-Tenant-Subdomain: acme" \
  -H "Content-Type: application/json" \
  -d '{ "content_type": "quizzes", "enabled": false }'

Пример ответа

200 OK · application/json
{
  "success": true,
  "data": {
    "content_type": "quizzes",
    "screenshot_protection_enabled": false,
    "updated_count": 7,
    "settings": {
      "lessons": { "total": 42, "screenshots_allowed": 10, "screenshots_blocked": 32 },
      "quizzes": { "total": 12, "screenshots_allowed": 12, "screenshots_blocked": 0 },
      "assignments": { "total": 8, "screenshots_allowed": 3, "screenshots_blocked": 5 },
      "exams": { "total": 4, "screenshots_allowed": 0, "screenshots_blocked": 4 }
    }
  }
}

Ошибки

КодerrorКогда
400validation errorНе передан enabled или content_type не входит в допустимый список.
401unauthorizedТокен отсутствует, истёк или недействителен либо школа не определена.
403forbiddenНедостаточно прав — требуется роль администратора школы.
403PAYMENT_REQUIREDБиллинг школы неактивен.