Аутентификация
Формат API-ключа, ограничения отдельных ключей, доступ к задачам и действия при утечке ключа.
Каждый вызов API, который создаёт или читает данные либо связан с оплатой, должен передавать ваш API-ключ в заголовке Authorization. Единственное исключение — публичный каталог моделей для ознакомления: ключ для него не нужен.
Authorization: Bearer sk-spicy-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxНативный API (/api/v1/*) принимает только Bearer-ключи — без cookies и параметров в строке запроса.
Эндпоинты совместимости для текста и видео (/v1, /v1beta) используют тот же ключ и также принимают заголовок x-api-key, используемый SDK Anthropic, и заголовок x-goog-api-key, используемый SDK Google GenAI. Поэтому в официальных SDK достаточно изменить базовый URL — см. Текст и потоковые ответы. Эти два заголовка не действуют на /api/v1, и ни один эндпоинт не принимает ключ в параметрах URL.
API-ключи и консоль используют разную авторизацию
API-ключи принимают только /api/v1, /v1 и /v1beta. Веб-консоль использует отдельную браузерную сессию. Поэтому сессия входа в консоль не может служить API-ключом, а утёкший API-ключ не позволяет войти в консоль. Передача неподходящего типа учётных данных всегда возвращает 401, а не ошибку прав доступа.
Как выглядит ключ
Фиксированный префикс sk-spicy-, за которым идут 48 строчных шестнадцатеричных символов.
| Часть | Назначение |
|---|---|
sk-spicy- | Фиксированный префикс, позволяющий распознать ключ в логах, репозиториях и при сканировании секретов GitHub |
| Следующие 8 символов | Поисковый сегмент: позволяет быстро найти запись ключа. При этом проверяется всё равно весь ключ |
| Оставшиеся 40 | Остальная часть секрета. Мы храним только SHA-256-хеш всего ключа с дополнительным серверным секретом (pepper) — восстановить исходный ключ не можем и мы |
Префикс выбран намеренно: лучше получить уведомление сканера, чем узнать об утечке после того, как кто-то потратил ваш баланс.
Ключ показывается только один раз
Скопируйте его или нажмите Сохранить в файл, прежде чем закрыть диалог. Если потеряете ключ, придётся создать новый. Мы не можем его восстановить — это предусмотрено специально. Возможность восстановления означала бы хранение в открытом виде.
Как создать ключ
- Откройте Консоль → API-ключи и нажмите Создать ключ.
- Назовите его по сервису, который будет его использовать (
production backend,staging worker). При отзыве ключа вам потребуется узнать его среди остальных. - При необходимости откройте Дополнительно, чтобы задать лимиты расходов, список разрешённых моделей, список разрешённых IP-адресов и срок действия. Все эти настройки можно изменить позже.
- Скопируйте ключ или нажмите Сохранить в файл и подтвердите, что сохранили его. После закрытия диалога показать ключ снова нельзя.
Создавать ключи могут владелец, администратор или разработчик команды. Ключ принадлежит команде, выбранной в левом верхнем углу консоли: его расходы и лимиты учитываются в рамках этой команды. В каждой команде может быть до 50 активных ключей. Для платных операций аккаунту также нужны подтверждённый адрес электронной почты и баланс; см. Настройка аккаунта.
Где хранить ключ
- На своём компьютере для тестирования: задайте
export SPICY_API_KEY="…"в терминале (переменная действует до закрытия окна) или используйте файл.env, который загружает ваш код. Добавьте.envв.gitignoreдо первого коммита. - На сервере или платформе хостинга: используйте настройки секретов или переменных окружения и читайте
SPICY_API_KEYиз окружения в коде. - Никогда не вставляйте ключ в исходный код, чат, скриншот, обращение в поддержку или промпт для AI-ассистента.
Не передавайте ключ клиенту
Всё, что попало в браузер или приложение, можно извлечь
Сборка, обфускация, разделение строки между файлами — ничто из этого не защищает ключ. Пользователь с инструментами разработчика или декомпилятором получит его, а утёкший ключ продолжит работать, пока не исчерпаются баланс или его лимиты.
Если фронтенду нужна генерация, направляйте запросы через собственный бэкенд: браузер обращается к вам, а вы — к нам. На этом же уровне можно применять свои квоты для каждого пользователя.
То же касается мобильных приложений, настольных клиентов, публичных ноутбуков, логов CI и любых данных, которые попадут в вывод curl -v, скопированный в обращение в поддержку.
Ваши собственные инструменты в вашем собственном браузере — другой случай. API принимает браузерные вызовы, поэтому инструменты для личного использования, например расширение SillyTavern или приложение для ролевых диалогов, куда вы вставляете собственный ключ, могут обращаться к нему напрямую. Правило выше относится к встраиванию ключа в то, что загружают другие люди. Выдавайте каждому такому инструменту отдельный ключ с дневным лимитом: так вы сможете видеть его расходы и отозвать его независимо от остальных.
Ограничения отдельного ключа
Настройте их в консоли при создании ключа или позже. Ограничения применяются на стороне сервера.
| Ограничение | Что оно даёт | Код API при срабатывании |
|---|---|---|
| Дневной лимит расходов | У новых ключей нет лимита, пока вы его не зададите. Установите свою сумму, чтобы ограничить последствия ошибки настройки или утечки. Лимит обновляется каждый день по UTC | 40202 |
| Месячный бюджет | Сумма, которую ключ может потратить в текущем календарном месяце по UTC | 40202 |
| Лимит расходов за всё время | Максимальная сумма расходов ключа за весь срок его использования. Удобно для ключей, переданных партнёрам | 40202 |
| Срок действия | Ключ прекращает работать в конце выбранного дня по UTC | 401 |
| Список разрешённых IP-адресов | Вызовы разрешены только с указанных адресов или диапазонов CIDR. Рекомендуется для серверных интеграций | 40302 |
| Список разрешённых моделей | Например, можно разрешить тестовым ключам только недорогие модели. Без ограничения ключ сможет вызывать и модели, добавленные позже | 40301 |
Карточка каждого ключа показывает действующие лимиты; изменить их можно там же в любое время.
В лимитах учитываются и средства, зарезервированные под выполняющиеся задачи, и уже потраченные деньги. Поэтому ключ может достичь лимита, пока задачи ещё выполняются. Поле msg указывает, какой именно лимит достигнут. Если при 40202 поле msg упоминает квоту платформы, дело не в вашем ключе: создание другого ключа не поможет, повторите запрос позже.
Список разрешённых IP-адресов проверяется по вашему фактическому публичному адресу, который видит наша пограничная сеть, а не по адресу последнего прокси. Исходящий адрес — публичный IP, с которого отправляются запросы вашего сервера. Большинство хостингов указывает его в сетевых настройках; на своём компьютере его можно посмотреть командой curl https://ifconfig.me.
Задачи принадлежат создавшему их ключу
Через API задача видна только тому API-ключу, который её создал. При использовании любого другого ключа, даже из той же команды:
| Действие с другим ключом | Результат |
|---|---|
Прочитать задачу (recordInfo), повторить её, удалить данные или запросить ссылку для скачивания | 404, как для несуществующей задачи |
Получить список задач (GET /api/v1/jobs) или данные об использовании (GET /api/v1/usage) | Только задачи и расходы самого этого ключа |
Повторно отправить запрос с тем же Idempotency-Key | 409, без ID исходной задачи |
409 после смены ключа не означает, что задача не была создана
Если отправка с одним ключом завершилась тайм-аутом, а вы повторили её с другим, за 409 может скрываться уже выполняющаяся задача, которая будет оплачена. Не считайте это подтверждением отсутствия задачи и не отправляйте запрос с новым ключом идемпотентности: так вы оплатите вторую генерацию. Повторите запрос с API-ключом первой попытки или найдите задачу в консоли.
Два механизма не привязаны к ключу. Вебхуки задачи доставляются даже после отзыва создавшего её ключа. Кроме того, все задачи команды, независимо от ключа, доступны в разделе Консоль → Логи, а в деталях каждой задачи указан Использованный ключ.
Замена ключей
- Отдельный ключ для каждой среды (рабочая / тестовая / локальная), чтобы можно было отозвать один, не затрагивая остальные.
- Плановая замена: создайте новый ключ и отправляйте с ним только новые задачи. Оставьте старый ключ активным, пока все созданные им задачи не достигнут конечного состояния (не позже соответствующего
deadlineAt) и вы не получите результаты, затем отзовите его. Используйте такой порядок только если старый ключ всё ещё надёжен. - Отзыв действует сразу и необратим. Не нужно ждать истечения кеша; повторно включить ключ нельзя — требуется создать новый.
Если ключ утёк
Немедленно отзовите ключ
В разделе Консоль → API-ключи откройте меню действий ключа и выберите Отозвать. Отзыв действует сразу.
Не ждите завершения своих активных задач: после отзыва их нельзя будет читать через API с этим ключом. Уже принятые задачи продолжают выполняться и по-прежнему оплачиваются. Получите их результаты из вебхуков или в разделе Консоль → Логи. При утечке ждать нельзя.
Создайте замену
Создайте новый ключ и обновите конфигурацию сервера. Не оставляйте утёкший ключ активным, пока готовите замену.
Проверьте, как использовался ключ
Откройте Консоль → Логи за период утечки и найдите задачи, которые вы не запускали: незнакомые модели, необычный объём или необъяснимые расходы. В деталях каждой задачи указан Использованный ключ, а Экспорт CSV включает ID ключа для каждой задачи. На странице API-ключей также показано, когда каждый ключ использовался в последний раз.
Усильте ограничения нового ключа
Настройте для нового ключа подходящий список разрешённых IP-адресов и дневной лимит. Устраните исходную причину утечки в коде, логах или конфигурации развёртывания.
Если возникли неожиданные расходы, обратитесь через Консоль → Поддержка и передайте ID задач или значения request_id.
Как выглядит ошибка
{
"code": 401,
"msg": "Credentials are invalid or expired",
"request_id": "req_01k3m8x9q2z4v7n5p6r8s0t1w2"
}HTTP-статус также будет 401. Любая ошибка аутентификации возвращает code: 401, а msg указывает её тип:
Начало msg | Что произошло | Что делать |
|---|---|---|
Missing credentials | Ключ не был передан | Проверьте заголовок Authorization: Bearer … и убедитесь, что SPICY_API_KEY задана в процессе, отправляющем запрос (переменная из одного окна терминала недоступна в другом) |
API key format is not recognized | Данные переданы, но это не ключ SpicyAPI | Ключи начинаются с sk-spicy-. Проверьте наличие префикса Bearer , пропущенные или лишние символы, кавычки и перенос строки, скопированный вместе с ключом |
Credentials are invalid or expired | Ключ правильного формата не существует, отозван или просрочен | Эти случаи намеренно не различаются, чтобы нельзя было проверить существование конкретных ключей. Посмотрите статус в разделе Консоль → API-ключи или создайте новый ключ |
Обрабатывайте code, а не текст: формулировка может меняться и зависит от языка ошибок. Подробнее о различиях — в разделе Ошибки.
Если сам аккаунт не может вызывать API (электронная почта не подтверждена или аккаунт приостановлен), вы получите 403. Замена ключа в этом случае не поможет.

