Перейти к основному содержанию
API-ключи позволяют серверному коду, CI-раннерам и ботам обращаться к AgentFlow без SIWE-входа на каждом холодном старте. Каждый ключ привязан к одному пользователю и наследует его права. Ключ показывается создателю ровно один раз. Сервер хранит только HMAC-SHA256 хеш — если потеряли значение, придётся выпустить новый.

Когда использовать API-ключ

  • Бэкенд, которому нужно выписывать чеки, читать marketplace-агентов или дёргать /me/* от имени владельца.
  • CI-пайплайн, публикующий агентов или гоняющий стрим-тесты сборки.
  • Долгоживущий бот, для которого поддерживать SIWE-сессию неудобно.
Для браузерных сценариев предпочтительнее cookie af_session от POST /auth/verify — она HttpOnly и обновляется автоматически.

Формат ключа

af_live_a1b2c3d4e5f6...   (префикс из 8 символов + 64 hex-символа)
Первые 12 символов (af_live_a1b2) хранятся в открытом виде, чтобы списки и аудит могли идентифицировать ключ, не раскрывая секрет.

UI кабинета

В кабинете есть вкладка “API Keys” для создания, просмотра и отзыва ключей. Скоро: ограничение по scopes, allowlist по IP.

Создание через API

name
string
обязательно
Человекочитаемое имя, до 64 символов. Видит только владелец.
curl -X POST https://api.agentflow.website/me/api-keys \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $JWT" \
  -d '{ "name": "ci-runner" }'
Ответ
{
  "ok": true,
  "id": 42,
  "name": "ci-runner",
  "prefix": "af_live_a1b2",
  "key": "af_live_a1b2c3d4e5f60718293a4b5c...полные 64 hex...",
  "created_at": "2026-04-25T10:00:00Z",
  "warning": "Save this key now — it will not be shown again."
}

Использование

Отправляйте сырой ключ в заголовке x-api-key. Middleware проверяет x-api-key раньше, чем падает на Authorization: Bearer и cookie:
curl https://api.agentflow.website/me \
  -H "x-api-key: af_live_a1b2c3d4..."
last_used_at обновляется best-effort — это подсказка о свежести, не гарантия.

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

curl https://api.agentflow.website/me/api-keys \
  -H "Authorization: Bearer $JWT"
{
  "ok": true,
  "items": [
    {
      "id": 42,
      "name": "ci-runner",
      "prefix": "af_live_a1b2",
      "created_at": "2026-04-25T10:00:00Z",
      "last_used_at": "2026-04-25T10:05:14Z"
    }
  ]
}
Хеш никогда не возвращается. В UI безопасно показывать только prefix.

Отзыв

Мягкое удаление — необратимо. Строка остаётся для аудита, но ключ перестаёт авторизовать.
curl -X DELETE https://api.agentflow.website/me/api-keys/42 \
  -H "Authorization: Bearer $JWT"
Отозванный ключ в x-api-key возвращает 401 invalid_api_key.

Ротация без даунтайма

  1. apiKeys.create({ name: "ci-runner-v2" }) — сохраните новое значение в секрет-менеджер.
  2. Раскатите деплой, читающий новую переменную.
  3. После завершения раскатки — отзовите старый ключ.
Оба ключа могут жить одновременно, пока идёт деплой.

Чеклист безопасности

  • Храните сырой ключ в env-переменных, секрет-менеджерах (1Password, AWS Secrets Manager, doppler) или зашифрованных CI-переменных. Никогда не коммитьте в git.
  • Относитесь к ключу как к паролю. Если человек ушёл из команды или раннер скомпрометирован — сразу отзывайте и ротируйте.
  • В браузере используйте cookie-сессию; apiKey имеет смысл только в доверенном серверном контексте.
  • HMAC-секрет на сервере (API_KEY_HMAC_SECRET) ротируется независимо от JWT-секрета. В проде имеет смысл задать его явно.

Scopes

Сейчас каждый ключ наследует полные права владельца. Колонка scopes уже есть в схеме, и create будет принимать массив scopes в будущей версии (план — Q3 2026). До тех пор считайте ключи полнодоступными и берегите их соответственно.

Ошибки

StatusCodeКогда
400invalid_bodyname отсутствует или длиннее 64 символов
400bad_id:id не положительное целое
401invalid_api_keyЗаголовок битый, неизвестен или отозван
401unauthenticatedУчётка не предоставлена
404not_foundОтзыв ключа, который не существует или не ваш