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 и субдомен нормализуются к нижнему регистру и должны быть уникальны.

Тело запроса

ПараметрТипОписание
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",
    "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 и интеграции.

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

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

Тело запроса

ПараметрТипОписание
titleопц.stringНовое название (2–255 символов).
logoопц.stringURL логотипа или UUID медиа-ассета (изображение).
color_schemeопц.stringHEX-цвет ровно из 7 символов.Пример: #16a34a

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

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" }'

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

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",
    "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

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

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

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",
    "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

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

Тело запроса

ПараметрТипОписание
titleопц.stringНовое название (2–255 символов).
logoопц.stringURL логотипа или UUID медиа-ассета (изображение).
color_schemeопц.stringHEX-цвет ровно из 7 символов.Пример: #7c3aed

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

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" }'

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

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",
    "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Недостаточно прав — требуется роль администратора школы.