spicyapiДокументация
Разработка с API
Основное содержимое

Аутентификация

Формат 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) — восстановить исходный ключ не можем и мы

Префикс выбран намеренно: лучше получить уведомление сканера, чем узнать об утечке после того, как кто-то потратил ваш баланс.

Ключ показывается только один раз

Скопируйте его или нажмите Сохранить в файл, прежде чем закрыть диалог. Если потеряете ключ, придётся создать новый. Мы не можем его восстановить — это предусмотрено специально. Возможность восстановления означала бы хранение в открытом виде.

Как создать ключ

  1. Откройте Консоль → API-ключи и нажмите Создать ключ.
  2. Назовите его по сервису, который будет его использовать (production backend, staging worker). При отзыве ключа вам потребуется узнать его среди остальных.
  3. При необходимости откройте Дополнительно, чтобы задать лимиты расходов, список разрешённых моделей, список разрешённых IP-адресов и срок действия. Все эти настройки можно изменить позже.
  4. Скопируйте ключ или нажмите Сохранить в файл и подтвердите, что сохранили его. После закрытия диалога показать ключ снова нельзя.

Создавать ключи могут владелец, администратор или разработчик команды. Ключ принадлежит команде, выбранной в левом верхнем углу консоли: его расходы и лимиты учитываются в рамках этой команды. В каждой команде может быть до 50 активных ключей. Для платных операций аккаунту также нужны подтверждённый адрес электронной почты и баланс; см. Настройка аккаунта.

Где хранить ключ

  • На своём компьютере для тестирования: задайте export SPICY_API_KEY="…" в терминале (переменная действует до закрытия окна) или используйте файл .env, который загружает ваш код. Добавьте .env в .gitignore до первого коммита.
  • На сервере или платформе хостинга: используйте настройки секретов или переменных окружения и читайте SPICY_API_KEY из окружения в коде.
  • Никогда не вставляйте ключ в исходный код, чат, скриншот, обращение в поддержку или промпт для AI-ассистента.

Не передавайте ключ клиенту

Всё, что попало в браузер или приложение, можно извлечь

Сборка, обфускация, разделение строки между файлами — ничто из этого не защищает ключ. Пользователь с инструментами разработчика или декомпилятором получит его, а утёкший ключ продолжит работать, пока не исчерпаются баланс или его лимиты.

Если фронтенду нужна генерация, направляйте запросы через собственный бэкенд: браузер обращается к вам, а вы — к нам. На этом же уровне можно применять свои квоты для каждого пользователя.

То же касается мобильных приложений, настольных клиентов, публичных ноутбуков, логов CI и любых данных, которые попадут в вывод curl -v, скопированный в обращение в поддержку.

Ваши собственные инструменты в вашем собственном браузере — другой случай. API принимает браузерные вызовы, поэтому инструменты для личного использования, например расширение SillyTavern или приложение для ролевых диалогов, куда вы вставляете собственный ключ, могут обращаться к нему напрямую. Правило выше относится к встраиванию ключа в то, что загружают другие люди. Выдавайте каждому такому инструменту отдельный ключ с дневным лимитом: так вы сможете видеть его расходы и отозвать его независимо от остальных.

Ограничения отдельного ключа

Настройте их в консоли при создании ключа или позже. Ограничения применяются на стороне сервера.

ОграничениеЧто оно даётКод API при срабатывании
Дневной лимит расходовУ новых ключей нет лимита, пока вы его не зададите. Установите свою сумму, чтобы ограничить последствия ошибки настройки или утечки. Лимит обновляется каждый день по UTC40202
Месячный бюджетСумма, которую ключ может потратить в текущем календарном месяце по UTC40202
Лимит расходов за всё времяМаксимальная сумма расходов ключа за весь срок его использования. Удобно для ключей, переданных партнёрам40202
Срок действияКлюч прекращает работать в конце выбранного дня по UTC401
Список разрешённых 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-Key409, без 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. Замена ключа в этом случае не поможет.

На этой странице