Тенанты и брендинг
Управление школами (тенантами) суперадмином платформы, публичный брендинг для экрана входа и чтение/редактирование собственной школы тенант-админом.
/api/v1/public/tenantПубличный брендинг школы
Возвращает безопасную публичную проекцию школы (название, субдомен, логотип, цветовая схема) по субдомену. Используется экраном входа на {subdomain}.edumentor.kz для отрисовки бренда ДО авторизации. Авторизация не требуется.
Приостановленные, ожидающие и удалённые школы возвращают 404 — без раскрытия факта существования (защита от перечисления школ). Поле logo всегда отдаётся как готовый URL: если логотип хранится как медиа-ассет, сервер подставляет свежий presigned-URL.
Query-параметры
| Параметр | Тип | Описание |
|---|---|---|
subdomainобяз. | string | Субдомен школы.Пример: acme |
Пример запроса
curl "https://api.edumentor.kz/api/v1/public/tenant?subdomain=acme"Пример ответа
{
"success": true,
"data": {
"title": "Acme School",
"subdomain": "acme",
"logo": "https://cdn.edumentor.kz/logos/acme.png",
"color_scheme": "#2563eb"
}
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | subdomain_required | Параметр subdomain отсутствует или пуст. |
| 404 | tenant_not_found | Школа не найдена либо неактивна (приостановлена/удалена). |
/api/v1/admin/tenants/Создать школу
Создаёт новую школу (тенант) со статусом pending. Доступно только суперадмину платформы. Slug и субдомен нормализуются к нижнему регистру и должны быть уникальны.
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
titleобяз. | string | Название школы (2–255 символов). |
slugобяз. | string | Уникальный slug (латиница/цифры, 2–100).Пример: acme |
subdomainобяз. | string | Уникальный субдомен (латиница/цифры, 2–100).Пример: acme |
logoопц. | string | URL логотипа или UUID медиа-ассета (изображение). |
color_schemeопц. | string | HEX-цвет ровно из 7 символов (например #2563eb).Пример: #2563eb |
Пример запроса
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"
}'Пример ответа
{
"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 | Когда |
|---|---|---|
| 400 | slug or subdomain already taken | Школа с таким slug или субдоменом уже существует. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Недостаточно прав — требуется роль суперадмина. |
/api/v1/admin/tenants/:idОбновить школу (суперадмин)
Частично обновляет название, логотип и цветовую схему школы. Доступно только суперадмину. Slug и субдомен через этот эндпоинт не меняются — переименования каскадно затрагивают URL и интеграции.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор школы. |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
titleопц. | string | Новое название (2–255 символов). |
logoопц. | string | URL логотипа или UUID медиа-ассета (изображение). |
color_schemeопц. | string | HEX-цвет ровно из 7 символов.Пример: #16a34a |
Пример запроса
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" }'Пример ответа
{
"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 | Когда |
|---|---|---|
| 400 | invalid id format | Идентификатор школы не является корректным UUID. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Недостаточно прав — требуется роль суперадмина. |
| 404 | tenant not found | Школа с таким идентификатором не найдена. |
/api/v1/admin/tenants/:idУдалить школу (суперадмин)
Мягко удаляет школу (проставляет deleted_at). Доступно только суперадмину. После удаления школа исчезает из публичного брендинга и недоступна для входа.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор школы. |
Пример запроса
curl -X DELETE https://api.edumentor.kz/api/v1/admin/tenants/8f3b1c2a-1d2e-4a5b-9c6d-7e8f9a0b1c2d \
-H "Authorization: Bearer <token>"Пример ответа
{
"success": true,
"data": { "deleted": true }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | invalid id format | Идентификатор школы не является корректным UUID. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Недостаточно прав — требуется роль суперадмина. |
| 404 | tenant not found | Школа с таким идентификатором не найдена. |
/api/v1/t/tenantТекущая школа
Возвращает полную запись школы, в которую разрешён запрос по заголовку субдомена. Доступно любому авторизованному участнику школы. Эндпоинт открыт даже при приостановленном биллинге — чтобы экран продления мог отрисовать брендинг.
Пример запроса
curl https://api.edumentor.kz/api/v1/t/tenant \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"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 | Когда |
|---|---|---|
| 401 | unauthorized | Токен отсутствует, истёк или недействителен либо школа не определена. |
/api/v1/t/tenantОбновить свою школу
Тенант-админ обновляет название, логотип и цветовую схему собственной школы. Доступно только роли admin. Slug и субдомен остаются под управлением суперадмина. Требует активного биллинга.
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
titleопц. | string | Новое название (2–255 символов). |
logoопц. | string | URL логотипа или UUID медиа-ассета (изображение). |
color_schemeопц. | string | HEX-цвет ровно из 7 символов.Пример: #7c3aed |
Пример запроса
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" }'Пример ответа
{
"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 | Когда |
|---|---|---|
| 400 | validation error | Тело запроса не прошло валидацию (например, color_scheme не из 7 символов). |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен либо школа не определена. |
| 403 | forbidden | Недостаточно прав — требуется роль администратора школы. |