Когда использовать API-ключ
- Бэкенд, которому нужно выписывать чеки, читать marketplace-агентов или дёргать
/me/*от имени владельца. - CI-пайплайн, публикующий агентов или гоняющий стрим-тесты сборки.
- Долгоживущий бот, для которого поддерживать SIWE-сессию неудобно.
af_session от POST /auth/verify — она HttpOnly и обновляется автоматически.
Формат ключа
af_live_a1b2) хранятся в открытом виде, чтобы списки и аудит могли идентифицировать ключ, не раскрывая секрет.
UI кабинета
В кабинете есть вкладка “API Keys” для создания, просмотра и отзыва ключей. Скоро: ограничение по scopes, allowlist по IP.Создание через API
Человекочитаемое имя, до 64 символов. Видит только владелец.
Использование
Отправляйте сырой ключ в заголовкеx-api-key. Middleware проверяет x-api-key раньше, чем падает на Authorization: Bearer и cookie:
last_used_at обновляется best-effort — это подсказка о свежести, не гарантия.
Список ключей
Отзыв
Мягкое удаление — необратимо. Строка остаётся для аудита, но ключ перестаёт авторизовать.x-api-key возвращает 401 invalid_api_key.
Ротация без даунтайма
apiKeys.create({ name: "ci-runner-v2" })— сохраните новое значение в секрет-менеджер.- Раскатите деплой, читающий новую переменную.
- После завершения раскатки — отзовите старый ключ.
Чеклист безопасности
- Храните сырой ключ в env-переменных, секрет-менеджерах (1Password, AWS Secrets Manager, doppler) или зашифрованных CI-переменных. Никогда не коммитьте в git.
- Относитесь к ключу как к паролю. Если человек ушёл из команды или раннер скомпрометирован — сразу отзывайте и ротируйте.
- В браузере используйте cookie-сессию;
apiKeyимеет смысл только в доверенном серверном контексте. - HMAC-секрет на сервере (
API_KEY_HMAC_SECRET) ротируется независимо от JWT-секрета. В проде имеет смысл задать его явно.
Scopes
Сейчас каждый ключ наследует полные права владельца. Колонкаscopes уже есть в схеме, и create будет принимать массив scopes в будущей версии (план — Q3 2026). До тех пор считайте ключи полнодоступными и берегите их соответственно.
Ошибки
| Status | Code | Когда |
|---|---|---|
| 400 | invalid_body | name отсутствует или длиннее 64 символов |
| 400 | bad_id | :id не положительное целое |
| 401 | invalid_api_key | Заголовок битый, неизвестен или отозван |
| 401 | unauthenticated | Учётка не предоставлена |
| 404 | not_found | Отзыв ключа, который не существует или не ваш |