Аутентификация по API-ключу
Как запрос сообщает, кто он, — API-ключ, единственный проект, в котором ключ действует, и разрешения, которые говорят, что ему можно.
3 мин чтения
Каждый запрос к API несёт API-ключ. Ключ говорит, в каком проекте действует запрос и что ему там разрешено.
Ключ
Отправляйте ключ в заголовке Authorization после слова Bearer.
Authorization: Bearer sl_live_…Ключ начинается с sl_live_. Ключ, выпущенный до того, как префикс стал sl_live_, начинается с sg_live_ и продолжает работать. Вы видите его один раз — при выпуске или ротации, — потому что Slen хранит только его хэш. Ключи выпускаются на странице ключей — по шагам это описано в статье Управление API-ключами.
Храните ключ там, где ваш сервер хранит свои секреты. Не помещайте его в код, который выполняется в браузере или на устройстве клиента.
Примеры в этом справочнике читают ключ из переменной окружения SLEN_API_KEY.
curl https://api.slen.ai/api/v1/models \
-H "Authorization: Bearer $SLEN_API_KEY"{
"data": [
{
"model_code": "gpt-4o-mini",
"provider": "openai",
"model_price_id": "1108",
"input_price_per_million": "0.15000000",
"output_price_per_million": "0.60000000",
"cached_input_price_per_million": "0.07500000",
"max_output_tokens": 16384,
"currency": "USD",
"effective_from": "2026-01-01T00:00:00+00:00",
"effective_to": null
}
]
}Две проверки состояния, /health и /ready, — единственные пути, которым ключ не нужен.
Что доступно ключу
Ключ принадлежит одному проекту одной организации и действует только в этом проекте.
То, что создаёт ключ, создаётся в его проекте. Список отвечает строками его проекта.
Строка другого проекта или другой организации отвечает
404— точно так же, как строка, которой не существует.То, что организация делит между своими проектами, ключом можно прочитать и нельзя изменить. Попытка отвечает
403с кодомproject_access_restricted.
Сервису, который работает с двумя проектами, нужны два ключа.
Разрешения
Ключ несёт одно или несколько разрешений. Каждая операция, принимающая ключ, требует одного разрешения, и страница ресурса называет его для каждой операции.
| Разрешение | Даёт также |
|---|---|
read | — |
gateway:write | read |
management:read | customers:read |
management:write | management:read, flows:write, customers:read, customers:write |
flows:write | management:read, customers:read |
customers:read | — |
customers:write | customers:read |
| Разрешение | Для чего оно |
|---|---|
read | Читать то, что делал проект, — операции, выполнения, авторизации, реестр, аналитику, каталог моделей |
gateway:write | Отправлять запросы, которые могут тратить, — запускать флоу |
management:read | Читать конфигурацию — флоу, подключения и пулы провайдеров, клиентов и их кредиты |
management:write | Менять конфигурацию и бюджеты, пополнять и корректировать кредиты клиентов, одобрять или отклонять то, что ждёт решения |
flows:write | Создавать, редактировать и публиковать флоу |
customers:read | Читать ваших клиентов, их счета кредитов и выписки, а также цены в кредитах |
customers:write | Создавать, пополнять, списывать, корректировать, блокировать и удалять ваших клиентов и менять настройки их счетов |
Некоторые разрешения включают другие, и первая таблица перечисляет всё, что включает каждое из них. management:write включает management:read, flows:write, customers:write и customers:read. Оно не включает read, поэтому ключ, у которого есть только management:write, не может вызвать операцию, требующую read.
Давайте ключу те разрешения, которые нужны его сервису, и не больше. Сервису, который только отправляет запросы, нужно gateway:write. Приложению, которое ещё и ведёт своих клиентов, — добавляет их, пополняет, списывает с них и блокирует, — нужны gateway:write и customers:write, и больше ничего оно с ними не меняет.
Когда запрос отклонён
401с кодомinvalid_api_key— в запросе нет ключа, такого ключа не существует или он отозван. Так же ключ после ротации отвечает на свой старый секрет.403с кодомinsufficient_scope— ключ действителен, но не несёт разрешения, которого требует операция.error.messageназывает недостающее разрешение.403с кодомproject_access_restricted— ключ пытался изменить то, что принадлежит всей организации.
Конверт ошибки описан в статье Обзор, а каждый код — в статье Коды ошибок.
Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d