spicyapiДокументация
Аккаунт и оплата
Основное содержимое

Оплата

Оплата SpicyAPI по использованию в USD: расчёт цены, резерв средств, итоговые списания, условия отказов моделей, пополнение, лимиты расходов и счета.

Деньги, а не баллы

Цены указаны в долларах США: «$0.008 за изображение», «$0.042 за секунду результата». Предоплаченные средства, промо-средства и кредитные линии выражены в долларах, но кредитный лимит не является денежным балансом.

Мы намеренно не используем баллы. Система баллов добавляет пересчёт между «пополните на X, получите бонус Y» и стоимостью одного балла, что затрудняет вычисление реальной цены за единицу. Показанная цена — та, которую вы платите.

Как устроена оплата

  1. Сначала пополните баланс. Новый аккаунт начинает с $0; бесплатного тарифа нет. Задача, отправленная до пополнения, отклоняется с 40201 и ничего не стоит.
  2. При принятии задачи её оценочная стоимость резервируется. Это резерв. Деньги по-прежнему ваши, но одновременно оплатить другую задачу ими нельзя.
  3. Если задача успешна, вы платите за фактическое использование, не больше резерва. Остаток возвращается в доступный баланс.
  4. Неудавшиеся или просроченные задачи обычно освобождают весь резерв. Некоторые отказы по содержанию оплачиваются по принятому расчёту только если страница модели явно раскрывает это исключение. Проверяйте settled и cost для итогового списания.
  5. Лимиты расходов, заданные для каждого API-ключа, не дают неконтролируемому скрипту опустошить баланс.

Ниже каждый шаг объясняется подробнее.

Пополнение баланса

Пополняйте баланс в разделе Оплата консоли: картой, криптовалютой или ручным переводом, если эта возможность показана. Можно включить автопополнение, чтобы длительные задачи не останавливались при низком балансе. Оплаченный баланс не истекает; промо-средства истекают в дату, указанную в разделе Оплата.

Пошаговое описание способов оплаты, сроков зачисления и автопополнения — в разделе Настройка аккаунта. Обычно пополнение нельзя вернуть денежным переводом; политика возврата перечисляет исключения, например повторное списание.

Три этапа

Каждая задача проходит одинаковые три этапа оплаты. От вас действий не требуется; описание помогает уверенно читать историю баланса.

hold
settlerelease
Сумма резервируется при приёме задачи и закрывается один раз: списывается по фактическому расходу либо возвращается целиком.

Резерв

При создании задачи мы резервируем средства на оценочный объём использования. Сумма точно равна estimatedCost, возвращённой createTask.

Резерв закрепляет за задачей её источники финансирования; это не окончательное списание. Зарезервированные предоплаченные средства, подходящие промо-средства или одобренный кредит нельзя одновременно использовать для другой задачи. Сумма показана как held в GET /api/v1/chat/credit и как «В резерве» в консоли.

Резерв и запись задачи создаются в одной транзакции базы данных. Промежуточного состояния, где задача существует без резерва или наоборот, нет.

Расчёт или освобождение средств

  • succeeded → расчёт по фактическому использованию, не выше принятого резерва. Неиспользованные средства возвращаются в исходные источники финансирования; позднее сверх этого резерва ничего не списывается.
  • failed / expired → обычно полное освобождение средств. Страница модели может явно указывать, что определённые ошибки content_rejected оплачиваются по принятому расчёту. Исторические записи canceled также полностью освобождают средства, но сейчас принятые задачи отменить нельзя.

После завершения расчёта recordInfo показывает settled: true, и cost становится итоговым. Пока settled равно false, cost ещё может меняться.

Фоновая сверка

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

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

Проверяйте расчёт, а не только состояние задачи

Неудавшиеся или просроченные задачи обычно освобождают весь резерв. Некоторые отказы по содержанию оплачиваются по принятому расчёту только если страница модели явно раскрывает это исключение. Проверяйте settled и cost для итогового списания. Оплаченный отказ сохраняет state: "failed" с errorCode: "content_rejected"; после расчёта settled равно true, а cost положителен. Другие ошибки и просроченные задачи автоматически освобождают весь резерв.

Проверка баланса

Самый быстрый способ — страница Оплата в консоли: она показывает доступный баланс, текущий резерв и все движения средств. Из кода вызывайте:

GET /api/v1/chat/credit
curl
curl https://api.spicyapi.ai/api/v1/chat/credit \
  -H "Authorization: Bearer $SPICY_API_KEY"
JavaScript
const res = await fetch('https://api.spicyapi.ai/api/v1/chat/credit', {
  headers: { Authorization: `Bearer ${process.env.SPICY_API_KEY}` },
});
const body = await res.json();
if (body.code !== 200) throw new Error(`${body.code} ${body.msg}`);

const balance = body.data;
console.log(balance.funding ?? balance);
Python
import os, requests

res = requests.get(
    "https://api.spicyapi.ai/api/v1/chat/credit",
    headers={"Authorization": f"Bearer {os.environ['SPICY_API_KEY']}"},
)
body = res.json()
if body["code"] != 200:
    raise RuntimeError(f'{body["code"]} {body["msg"]}')

balance = body["data"]
print(balance.get("funding", balance))
{
  "code": 200,
  "msg": "success",
  "data": {
    "available": "128.42",
    "held": "0.36",
    "total": "128.78"
  }
}
ПолеЗначение
availableЧистая сумма кошелька; может стать отрицательной после использования одобренного кредита и сама по себе не определяет допустимость запроса
heldСредства, зарезервированные под активные задачи
totalСумма двух значений

Если финансирования, подходящего для выбранной модели и времени, недостаточно для оценки, createTask возвращает 40201. Истечение кредита, исчерпание лимитов и недостаток средств после возврата внешнего платежа также могут влиять на принятие запроса. Не заменяйте серверные проверки клиентской проверкой знака available.

Проверять баланс перед каждой генерацией не требуется: при принятии задачи уже проверяются доступные средства и лимиты расходов.

В API деньги передаются строкой без знака доллара

«$0.008» — формат цены для читателя этой страницы. API возвращает десятичную строку без символа валюты: estimatedCost, cost и все три поля баланса выглядят как "0.008" — без $ и разделителей, всегда в USD.

// Keep the exact decimal string for display
const usd = task.cost;

Строки вместо чисел JSON используются намеренно: в большинстве языков число JSON превращается в float64, а 0.008 не имеет точного двоичного представления. Для финансового учёта разбирайте сумму как десятичное число:

from decimal import Decimal
usd = Decimal(task["cost"])   # not float()

Лимиты расходов

Лимит расходов ограничивает сумму, которую можно потратить. К задаче могут применяться до шести ограничений; первое достигнутое отклоняет задачу с 40202, до создания задачи или резервирования средств:

ЛимитКто задаётmsg при достижении
Общий лимит ключаВы, на странице API-ключей. Максимум расходов ключа за всё времяThis key has reached its total spend cap
Месячный лимит ключаВы, на странице API-ключей. Бюджет текущего календарного месяцаThis key has reached its monthly budget
Дневной лимит ключаВы, на странице API-ключей. У новых ключей нет лимита, пока вы его не зададитеThis key has reached its daily spend cap
Дневной лимит командыВладельцы, администраторы и управляющие бюджетом команды на странице команды. Только для принадлежащих команде ключейWorkspace daily budget has been reached
Месячный лимит командыТе же ролиWorkspace monthly budget has been reached
Дневной лимит платформыМы. Это наш защитный механизм; вы не можете повысить лимитPlatform quota for today is exhausted, please try again later

Дневные лимиты обновляются в 00:00 UTC; месячные следуют календарному месяцу UTC и обновляются 1-го числа. Общий лимит за всё время не сбрасывается. При достижении лимита платформы повторите после 00:00 UTC или обратитесь в поддержку, если это повторяется.

Нерассчитанный резерв входит в каждый лимит — общий, месячный и дневной — до расчёта задачи, независимо от того, на какой день или месяц это приходится. Деньги ещё не потрачены, но потратить их дважды тоже нельзя. Лимиты команд описаны в разделе Консоль и команды.

Пустое поле лимита имеет разный смысл в разных настройках

  • Создание или редактирование ключа: пустое поле означает без лимита, как и 0. У новых ключей нет лимита, пока вы его не зададите. Очистка поля существующего ключа удаляет лимит; чтобы сохранить его, оставьте число.
  • Лимиты команды: пустое поле сохраняет текущее значение; 0 означает отсутствие лимита.

Лимиты защищают вас. Неконтролируемый цикл, расходующий большую сумму за несколько часов, — обычный инцидент в этой отрасли. Почти всегда он происходит на аккаунте без настроенного лимита.

Платёжный журнал

Страница Оплата в консоли перечисляет все движения баланса с понятными подписями: Пополнение, В резерве, Списано, Возвращено. При скачивании списка через Экспорт CSV колонка kind содержит один из стабильных кодов:

ВидЗначение
topupОплаченные вами деньги, добавленные в баланс
bonusДополнительная сумма предложения по пополнению, учитываемая отдельно от оплаты
trialСредства пробной кампании, отдельно от пополнений и бонусов
holdОценочная сумма, зарезервированная при принятии задачи; не списание
settleИтоговая плата за задачу, включая отказ по содержанию, оплачиваемый по условиям модели; остаток резерва возвращается
refundПолный резерв возвращён из-за ошибки задачи или тайм-аута
adjustРучная корректировка нашей командой; всегда содержит сведения об операторе и причину
chargebackСредства изъяты из баланса после спора по платежу
forfeitОстаток баланса, от которого вы отказались при закрытии аккаунта
grant_expireНеиспользованные промо-средства удалены после истечения срока
grant_revokeНеиспользованные промо-средства отозваны

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

Бонус учитывается отдельно от вашей оплаты, потому что возврат платежа (деньги, возвращённые на карту) касается только оплаченной суммы; бонус не имеет денежной стоимости. Это не связано с записями refund выше, которые возвращают резерв неудавшейся задачи в баланс.

Движения средств хранятся 10 лет отдельно от содержимого задач. Они остаются доступными для сверки и споров после удаления промптов и результатов. См. Хранение данных.

Счета и отчёты об использовании

В разделе Оплата → Счета консоли вы можете самостоятельно оформить два документа и скачать их в PDF:

ДокументЧто охватываетЭто платёжный документ?
Счёт об оплатеОдно уже оплаченное пополнение, на списанную суммуДа. Его подают для возмещения расходов
Отчёт об использованииФактические расходы за один завершённый месяцНет. Эти деньги были оплачены при пополнении; подача обоих документов означала бы запрос возмещения одной суммы дважды

Один раз введите реквизиты вверху раздела Оплата → Счета. Обязательны имя или название компании, первая строка адреса, город и страна; налоговый номер (VAT, GST и подобный) необязателен. Данные печатаются точно как введены: вы их указываете, а мы ничего не проверяем, включая налоговый номер. Для печати поддерживаются только латиница, греческий алфавит и кириллица, поэтому японское или корейское название компании укажите в зарегистрированном латинском написании. Выданный документ сохраняет реквизиты на момент создания; последующие изменения затрагивают только новые документы.

  • Для каждого оплаченного пополнения и каждого завершённого месяца можно выдать документ один раз. Если он уже существует, скачайте его, не создавая новый.
  • Для исправления реквизитов выберите Перевыпустить: старый документ помечается аннулированным, а замена с новым номером относится к тому же пополнению или месяцу. Аннулировать без замены используйте только если документ относится не к тому пополнению или месяцу.
  • Выписки по счёту ниже на той же странице — другое: фиксированный ежемесячный снимок всех движений баланса для вашего учёта. Это не подтверждение оплаты и не налоговый документ.

Налог указан как нулевой: мы — американский поставщик, не собираем и не перечисляем за вас VAT, GST или налог с продаж. Каждый документ содержит уведомление о самостоятельном начислении налога получателем (reverse charge), поэтому учёт налога, причитающегося в вашей стране, остаётся вашей обязанностью. Выданный счёт никогда не редактируется: его аннулируют и перевыпускают с записью причины и замены.

Единицы оплаты

У модели ровно одна единица оплаты.

ЕдиницаЗначениеКакое поле input задаёт количество
per_imageЗа сгенерированное изображениеполе, объявленное моделью; по умолчанию 1
per_secondЗа секунду результата. Некоторые эндпоинты округляют длительность вверх до целого блока — см. Оплата длительности целыми блокамиПрочитайте текущий quantityField и схему; стандартное поле длительности — duration_seconds. Не предполагайте, что отсутствие длительности выбирает самый короткий тариф.
per_requestЗа вызов, независимо от параметров—
per_1k_tokensПо токенам. Единица API — per_1k_tokens; сайт и price.perMillionTokens каталога показывают те же цены за миллион токенов. У входных, кешированных входных, записываемых в кеш и выходных токенов могут быть свои цены—

Угадывать имя поля не нужно: quantityField эндпоинта каталога сообщает его для каждой модели; пустая строка означает одну единицу на вызов.

У модели могут быть разные цены для разных категорий. Разрешение, длительность, настройки аудио и референсные медиафайлы могут влиять на расчёт в зависимости от схемы. pricing[].variant определяет категорию карточки цены; в теле запроса нет поля variant. Не предполагайте, что эту метку всегда можно передать как resolution, и не считайте все модели по формуле «начальная цена × длительность». Отправьте полный набор входных данных в jobs/quote, чтобы получить точную оценку и верхнюю границу списания.

Всегда читайте количество и цену из актуального каталога

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

Оплата длительности целыми блоками

Большинство моделей per_second оплачиваются по точной длительности результата. Некоторые — по фиксированным блокам: перед расчётом измеренная длительность округляется вверх до следующего целого блока. При блоке 8 секунд ролики на 6 и 8 секунд стоят одинаково, а ролик на 9 секунд — два блока. Так работают не все модели с посекундной оплатой: правило действует только на объявляющих его эндпоинтах, и каждый объясняет это на своей странице.

Есть ещё общая черта, из-за которой округление видно в расчёте: длительность берётся из видео, которое вы передаёте, а не из выбранного вами duration_seconds. Поэтому до чтения ролика никто не знает длительность результата. Их quantityField пуст, и показанная до отправки сумма соответствует наихудшему случаю — самому длинному ролику, принимаемому эндпоинтом:

{
  "estimatedCost": "0.96",
  "maxCharge": "0.96",
  "quantity": "32",
  "unit": "per_second"
}

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

Резерв будет больше итогового списания

Для таких эндпоинтов это ожидаемое поведение, а не завышенное списание. Между принятием и расчётом баланс показывает верхнюю границу в резерве: до чтения ролика длительность результата неизвестна. При расчёте оплачивается фактическая длительность, округлённая вверх до блока, а разница автоматически возвращается в баланс. Журнал отражает оба движения, поэтому hold и settle всегда можно сопоставить.

Из этого следуют два момента, которые нужно учитывать:

  • Планируйте бюджет по расчёту, а не по своему ролику. До завершения расчёта задачи резерв соответствует верхней границе и входит в лимиты расходов, как любой другой резерв.
  • Короткий ролик всё равно стоит целый блок. Сокращение с 9 до 8 секунд может вдвое уменьшить цену эндпоинта с 8-секундным блоком; сокращение с 8 до 5 ничего не меняет.

Точные единицы и цены — на странице цен и странице каждой модели.

Скидки и предложения для клиентов

Предложения могут распространяться на всех или на один аккаунт, на все модели или на выбранные. Постоянные действуют до отключения; временные — только между фактическими началом и окончанием. Цены отдельного аккаунта действуют после входа или при расчёте через его API-ключ и никогда не публикуются как цена другого клиента.

Предложения не суммируются. Автоматически применяется самая низкая доступная вам цена. Для стандартной суммы $10 публичное предложение 10% и скидка аккаунта 20% дают $8, а не составную скидку до $7.20. После окончания или отключения предложения новые расчёты используют лучшее из оставшихся подходящих либо стандартную цену, если таких нет.

Предложения на главной, в каталоге и на страницах моделей помогают сравнивать варианты. Фактическую оценку получайте через jobs/quote со своими учётными данными, моделью и полными входными данными. Обратный отсчёт не фиксирует цену: обновляйте расчёт после изменения предложения, входных данных или цены. Принятая задача сохраняет зафиксированную цену, даже если предложение закончится во время выполнения; итоговое списание не может превышать резерв при принятии.

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

Промо-средства и кредитные линии

GET /api/v1/chat/credit сохраняет available, held и total и может включать детализацию funding. Старые ответы могут не содержать funding; отсутствие данных не означает ноль. Используйте client.getBalance() в SDK или spicyapi balance --json в CLI.

  • funding.prepaidAvailableUsd содержит предоплаченные или прежние доступные средства без ограничений; grantAvailableUsd суммирует активные промо-средства. Каждая запись grants показывает выделенную, доступную, зарезервированную и потраченную суммы, статус, начало, истечение и modelSlugs. Пустой список моделей означает все модели; иначе средства оплачивают только перечисленные. Список содержит до 100 выделений средств: сначала с остатком или резервом, затем от новых к старым. grantsHasMore указывает дополнительные записи. Не заменяйте общий итог аккаунта суммой видимого списка.
  • funding.credit описывает одобренную кредитную линию с последующей оплатой. limitUsd — её предел, availableUsd — неиспользованный доступный кредит, usedUsd — рассчитанная непогашенная основная задолженность, heldUsd — резерв принятых задач, expiresAt — срок истечения. Кредитный лимит не является пополнением, промо-средствами или денежным балансом. Истечение срока, отключение или превышение лимита ограничивают новые запросы; существующий долг остаётся к оплате.
  • Промо-средства нельзя вывести. Скидки определяют цену запроса; промо-средства и кредит — способ её финансирования. Выделение промо-средств не уменьшает цену в карточке модели. Действуют область моделей и срок; неиспользованные суммы могут истечь или быть отозваны. Ошибки задач и неиспользованные резервы возвращают средства в исходный источник; это не возобновляет просроченные или отозванные промо-средства.
  • Положительный funding.cashShortfallUsd — недостаток денег после возврата внешнего платежа. Промо-средства и кредит его не покрывают; новые вызовы остаются заблокированы до покрытия. Отрицательное available, напротив, может отражать использование одобренного кредита. Не делайте вывод об отказе по знаку суммы и не прибавляйте её напрямую к кредитному лимиту. Сервер проверяет источники средств, допустимость модели, сроки и лимиты расходов.

Суммы остаются точными десятичными строками USD, даты используют RFC3339. При отображении дат указывайте часовой пояс. Страница оплаты в консоли показывает финансирование и промо-средства; изменения действуют только после ручного одобрения администратором. По вопросам промо-средств или кредитных линий откройте обращение в разделе Поддержка консоли или напишите на support@spicyapi.ai. Публичный API не позволяет увеличить собственный лимит или выделить себе промо-средства.

Использование текущего API-ключа

Для графика расходов по дням и моделям всего аккаунта (или команды) используйте Оплата → Использование в консоли. Эндпоинт API ниже показывает только данные вызывающего его ключа:

curl 'https://api.spicyapi.ai/api/v1/usage?from=2026-09-01&to=2026-09-06' \
  -H "Authorization: Bearer $SPICY_API_KEY"

Даты используют UTC и интервал [from,to), поэтому пример включает 1–5 сентября. Без дат возвращаются последние семь дней, включая сегодня; максимальный период — 92 дня. Результаты принадлежат только текущему API-ключу. Параметра для другого ключа или отчёта всего аккаунта нет; для баланса кошелька используйте chat/credit.

data.totalCalls считает все задачи; data.totalSpend включает только окончательные списания. days и models группируют те же задачи по дате создания и модели с точными десятичными строками USD. Незавершённые резервы не входят в сумму, а поздний расчёт может обновить прошлые даты. Скрытая история задач остаётся включённой; даты без вызовов пропускаются. Не складывайте результаты двух группировок.

Используйте client.getUsage({ from, to }) в SDK или spicyapi usage --from 2026-09-01 --to 2026-09-06 в CLI. У эндпоинта свой более строгий лимит частоты — см. Ограничения частоты запросов.

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