API-ключи позволяют вызывать AgentFlow с серверов, CI-раннеров, скриптов и webhook-интеграций — без жонглирования SIWE / Telegram-сессиями. Это третий путь авторизации рядом с cookie и JWT: те же роуты, те же права, просто другой заголовок. У каждого ключа свой биллинг: лимит запросов в минуту, опциональный кап по тратам FLOW за период (день / неделя / месяц / forever) и журнал каждого вызова. Это копия Activity page у OpenRouter — в FLOW вместо USD.Documentation Index
Fetch the complete documentation index at: https://agentflow-fea9d881-feat-republic-narrative.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Формат ключа
72 символа:af_live_ плюс 64 hex (32 байта CSPRNG, 256 бит энтропии). На сервере хранится только HMAC-SHA256 хэш + 12-символьный display prefix. Сырой ключ показывается ровно один раз.
Когда использовать API-ключ
- Бэкенд, которому нужно выписывать чеки, читать marketplace-агентов или дёргать
/me/*от имени владельца. - CI-пайплайн, публикующий агентов или гоняющий стрим-тесты сборки.
- Долгоживущий бот, для которого поддерживать SIWE-сессию неудобно.
af_session от POST /auth/verify — она HttpOnly и обновляется автоматически.
POST /me/api-keys — создать ключ
Auth: cookie / bearer / x-api-key.Название, 1–64 символа. Положите его в secret manager — будущему вам пригодится.
Лимит запросов в минуту. По умолчанию 60. 0 — без лимита.
Кап FLOW на период. Лучше передавать строкой (
"100.5") — числа теряют точность дальше 6 знаков. Пропустите для отсутствия капа.Период —
day, week, month или forever. По умолчанию month.GET /me/api-keys — список активных ключей
Возвращается публичная форма — без хэша. Каждая запись несёт текущие лимиты иspend_period_used, чтобы прогресс-бары рисовались без второго запроса.
PATCH /me/api-keys/:id — править лимиты
Все поля опциональны — передавайте только то, что хотите изменить. Сменаspend_period сбрасывает spend_period_used в 0, чтобы новый bucket стартовал с чистого листа.
DELETE /me/api-keys/:id — отозвать
Soft-revoke: строка остаётся для audit-трейла (кто создал, когда последний раз использовался). Все следующие запросы сx-api-key отозванного ключа получают 401.
Заголовок авторизации
Сырой ключ вx-api-key для любого запроса, который иначе требует сессию:
x-api-key, и Authorization: Bearer …, и ключ невалидный — будет 401, даже если bearer сам по себе работал.
Rate limits
В каждом успешном ответе:| Header | Что значит |
|---|---|
X-RateLimit-Limit | Текущее rate_limit_rpm. |
X-RateLimit-Remaining | Сколько слотов осталось в текущем минутном окне. |
X-RateLimit-Reset | ISO-время, когда окно сбросится. |
Retry-After (в секундах) + body:
api_keys row, поэтому лимит держится одинаково по всем репликам. rate_limit_rpm = 0 отключает лимит совсем.
Spend limits
Каждый запрос также получает:| Header | Что значит |
|---|---|
X-FLOW-Cost | FLOW списано за этот запрос (0 для бесплатных endpoint’ов). |
X-FLOW-Period-Used | FLOW потрачено в текущем периоде. |
X-FLOW-Period-Limit | Текущий cap (отсутствует если cap не задан). |
X-FLOW-Period-Reset | ISO-время, когда период закроется. |
period_used >= spend_limit_flow API возвращает 402 Payment Required:
Журнал использования
Каждый запрос сx-api-key пишется в api_key_usage (best-effort, не блокирует ответ). Два endpoint’а отдают данные:
GET /me/api-keys/:id/usage?since=day|week|month|all
GET /me/api-keys/:id/recent?limit=50
limit ограничен сверху 200. Подходит для live tail / отладки. На странице кабинета (API Key detail) этот endpoint опрашивается для секции “Recent calls”.
Сравнение с OpenRouter
Если вы уже на OpenRouter — модель та же, отличается только единица:| OpenRouter | AgentFlow |
|---|---|
| API key c USD spend cap | API key c FLOW spend cap |
| Activity page (calls + cost) | /me/api-keys/:id/usage + UI кабинета |
X-RateLimit-* headers | X-RateLimit-* headers (те же имена) |
| Per-model breakdown | by_model в /usage |
UI кабинета
В кабинете есть вкладка “API Keys” для создания, просмотра и отзыва ключей. Per-key detail на/account/api-keys/:id показывает редактор лимитов и activity surface, описанные выше.
Ротация
С точки зрения учётки ключ — иммутабельный. Ротация:apiKeys.create({ name: 'ci-runner-v2', … }).- Переключите конфиг сервиса на новый ключ. Оба работают параллельно.
apiKeys.revoke(<old-id>).
last_used_at, и вы видите, что весь трафик ушёл на новый, прежде чем выдёргивать вилку.
Чеклист безопасности
- Храните сырой ключ в env-переменных, секрет-менеджерах (1Password, AWS Secrets Manager, doppler) или зашифрованных CI-переменных. Никогда не коммитьте в git.
- В audit-вьюхах используйте
prefixкак идентификатор для пользователя — его безопасно показывать. - Ставьте
spend_limit_flow, даже если доверяете потребителю — это самый дешёвый blast-radius limit, какой можно настроить. - Ротируйте по расписанию (раз в квартал — здравый дефолт) через create-then-revoke.
- Отзывайте сразу при подозрении на утечку — soft-revoke сохраняет audit-трейл и не оставляет атакующему пространства для манёвра.