Skip to main content

API-ключи

API-ключ — единственный способ аутентификации в Public API. JWT и cookie дашборда здесь не работают.

Authorization: Bearer mi_live_ab12cd34ef56gh78ij90kl12mn34op56

Ключ привязан к конкретному проекту и определяет, от чьего имени и в какой среде выполняется запрос. Создание, ротация и отзыв ключей — в дашборде: Проект → API-ключи.

Plain-токен показывается один раз

При создании дашборд один раз отдаёт полное значение ключа. Сохраните его сразу — потом видна только префикс-часть (mi_live_ab12cd…).

Окружение: LIVE и TEST

Окружение зашито в префикс ключа.

mi_live_… (LIVE)mi_test_… (TEST / sandbox)
Реальная отправкаданет, статус SIMULATED
Нужен верифицированный доменданет
Подписанный DPAданет
Тарифные лимитыпо плану50 писем в день

Sandbox удобен для CI и интеграционных тестов: тот же endpoint, та же схема ответа, без последствий для домена и репутации.

Права доступа

ПравоPOST /v1/emails
POST /v1/emails/batch
GET /v1/emails
GET /v1/emails/{id}
GET /v1/emails/{id}/events
FULL_ACCESSдада
SENDING_ONLYданет
READ_ONLYнетда

Запрос с недостаточными правами возвращает 403 Forbidden — ключ остаётся валидным, отзывать его не нужно.

Типичные сценарии:

  • SENDING_ONLY — backend-сервис, который только шлёт транзакционные письма и не должен иметь доступ к содержимому логов.
  • READ_ONLY — внутренние BI-дашборды, скрипты сверки, инциденты.
  • FULL_ACCESS — небольшие приложения, которым удобно делать оба класса операций одним ключом.

Срок действия и отзыв

  • expires_at (опционально) — после этой даты запросы возвращают 401 Unauthorized. По умолчанию ключ бессрочный.
  • Отзыв ключа в дашборде применяется немедленно: следующий запрос с этим ключом получит 401.

Хранение и ротация

Храните ключ как пароль — в переменных окружения или секретах CI, не в репозитории.

import os
api_key = os.environ["MAILINFRA_API_KEY"]

При утечке или плановой смене:

  1. Создайте новый ключ в дашборде.
  2. Обновите секрет в окружении приложения.
  3. Отзовите старый ключ.

Ошибки аутентификации

HTTPКогда возникает
401 UnauthorizedКлюч отсутствует, неверный, отозван или истёк
403 ForbiddenКлюч валиден, но прав недостаточно для этого endpoint

Управление ключами через API

Создавать, листать и отзывать ключи можно не только в дашборде, но и программно. Эти эндпоинты — часть Management API: они идут не с mi_live_… ключом, а с сессионным токеном пользователя.

Базовый префикс: /v1/organizations/{organization_id}/projects/{project_id}/api-keys.

Создать ключ

POST /v1/organizations/{organization_id}/projects/{project_id}/api-keys
Authorization: Bearer <session_token>
Content-Type: application/json
{
"name": "Backend production",
"permissions": "FULL_ACCESS",
"env": "LIVE",
"expires_at": null
}
ПолеТипПо умолчаниюОписание
namestring1–100 символов; уникален среди активных ключей проекта
permissionsFULL_ACCESS | SENDING_ONLY | READ_ONLYFULL_ACCESSСм. таблицу прав выше
envLIVE | TESTLIVEОкружение
expires_atdatetime | nullnullISO-8601, UTC; null — бессрочный

Ответ 201 Created содержит key — plain-токен, показывается только в этом ответе:

{
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"project_id": "...",
"name": "Backend production",
"prefix": "mi_live_ab12cd",
"permissions": "FULL_ACCESS",
"env": "LIVE",
"last_used_at": null,
"expires_at": null,
"revoked_at": null,
"created_at": "2026-05-12T09:00:00Z",
"key": "mi_live_ab12cd34ef56gh78ij90kl12mn34op56qr78st90uv12wx34yz56"
}
}

Список ключей

GET /v1/organizations/{organization_id}/projects/{project_id}/api-keys
Authorization: Bearer <session_token>

Параметр ?include_revoked=true дополнительно возвращает отозванные ключи. По умолчанию отозванные скрыты. Поле key в листинге не возвращается — видна только префикс-часть (prefix) для опознавания.

Отозвать ключ

DELETE /v1/organizations/{organization_id}/projects/{project_id}/api-keys/{key_id}
Authorization: Bearer <session_token>

После этого следующий запрос с этим ключом получит 401. Имя отозванного ключа можно переиспользовать — уникальность держится только среди активных.

Возможные ошибки

HTTPКодКогда
409conflictАктивный ключ с таким именем уже существует в проекте
404not_foundПроект не найден или не принадлежит организации
403forbiddenУ пользователя меньше прав, чем DEVELOPER в организации