Пошаговое руководство «Изображение в видео»
Начните с одного изображения на своём компьютере и закончите скачанным видеофайлом. На каждом шаге показаны CLI, TypeScript SDK и обычный HTTP.
В этом руководстве одно изображение с вашего компьютера превращается в короткий видеоролик, который вы скачиваете и оставляете себе. Мы пройдём весь путь по порядку: выберем модель, загрузим изображение, проверим цену, запустим генерацию, дождёмся её, скачаем результат и разберёмся, что делать, если что-то пошло не так. Собирать всё это по кусочкам из справочных разделов не придётся.
На каждом шаге одно и то же действие показано тремя способами. Выберите один и пользуйтесь им до конца:
| Способ | Выбирайте его, если | Что понадобится |
|---|---|---|
| CLI | Хотите вводить команды и не писать код | Node.js 22.13 или новее |
| TypeScript SDK | Пишете программу на Node.js и хотите видеть, какие вызовы она делает | Node.js 22.13 или новее |
| HTTP (curl) | Хотите увидеть API в чистом виде, например чтобы потом перенести всё на другой язык программирования | Терминал bash с curl и jq (macOS, Linux или WSL в Windows) |
Хотите просто поручить всё ИИ-ассистенту? См. раздел Всё то же самое через ИИ-ассистента.
Что у вас получится
- Результат: короткий видеофайл, обычно в формате MP4, который начинается с вашего изображения и движется так, как описано в вашей фразе.
- Время: в первый раз заложите около 20 минут, большая часть из них уйдёт на чтение. Сама генерация обычно занимает несколько минут; некоторым моделям и настройкам нужно больше.
- Где всё выполняется: в SpicyAPI. Ваш компьютер только отправляет изображение и инструкции, а потом скачивает готовый файл.
Сколько это стоит и как узнать цену до оплаты
Цены указаны в долларах США. Они зависят от выбранной модели и от ваших настроек, например от длительности и разрешения видео, поэтому конкретной суммы на этой странице нет. Цену можно увидеть в трёх местах, и ни одно из них ничего не стоит:
- Актуальный каталог (шаг 1) показывает все модели, доступные вашему аккаунту, с ценами вашего аккаунта. Видео обычно оплачивается
per_second, то есть за каждую секунду результата. Если у модели указано несколько цен, каждая относится к своей настройке, например к разрешению. - Расчёт стоимости (шаг 3) даёт точную цену именно вашего запроса. Он ничего не запускает и не резервирует деньги.
- Подтверждение: CLI ещё раз показывает цену и ничего не запускает, пока вы не введёте
y.
Что происходит с вашими деньгами:
- Платный здесь только шаг 4 и ещё повторный запуск задачи, завершившейся ошибкой. Просмотр моделей, загрузка, расчёт стоимости, ожидание и скачивание бесплатны.
- Когда генерация запускается, рассчитанная сумма резервируется на вашем балансе (это резерв). Больше этой суммы видео стоить не может.
- Если видео создано успешно, с вас списывается плата за то, что фактически получилось, но никогда не больше резерва, а остаток возвращается на баланс.
- При ошибке или истечении срока задачи резерв обычно освобождается полностью. Некоторые отказы по содержанию оплачиваются по принятой цене, только если это исключение прямо указано на странице модели. Окончательную сумму проверяйте по
settledиcost. - Новые аккаунты не получают бесплатных средств, поэтому сначала пополните баланс. См. Оплата.
Как это устроено
ваше изображение ──загрузка──▶ адрес spicy:// (действует один день)
│
ваш текст + настройки ───────────────────┴──▶ расчёт стоимости (бесплатно) ──▶ запуск задачи (деньги в резерве)
│
queued ──▶ running ──▶ succeeded / failed / expired
│
ссылка на скачивание (около 20 минут) ──▶ ваш файлЗадача — это одно задание на генерацию. SpicyAPI выполняет его в фоне, поэтому запуск задачи и получение результата — два отдельных действия. У каждой задачи есть ID, который начинается с job_. Сохраните его: именно по нему задачу потом находят. Остальные термины с этой страницы объяснены в Глоссарии.
Перед началом
Подготовьте аккаунт, баланс и API-ключ
Сначала пройдите Подготовку аккаунта. В итоге у вас должны быть:
- аккаунт SpicyAPI с деньгами на балансе;
- API-ключ, который начинается с
sk-spicy-; - этот ключ, сохранённый в переменной окружения
SPICY_API_KEY. Переменная окружения — это именованное значение, которое терминал передаёт запускаемым в нём программам, поэтому ключ не приходится писать ни в команде, ни в коде.
Проверьте, что ключ задан в том окне терминала, в котором вы работаете, но не выводите его целиком:
echo "${SPICY_API_KEY:0:9}"Вы должны увидеть sk-spicy-. Если ничего не выводится или появляется ошибка, в этом окне ключ не задан; вернитесь к разделу Подготовка аккаунта.
Положите изображение в рабочую папку
Создайте папку для этого руководства и откройте в ней терминал. Все команды на этой странице запускаются из этой папки, и все файлы, которые они создают, появляются в ней же.
mkdir -p ~/spicy-video
cd ~/spicy-videoСкопируйте изображение в эту папку и назовите его start-frame.jpg (или start-frame.png, если это PNG; тогда везде, где на этой странице написано start-frame.jpg, используйте это имя).
Каким должно быть исходное изображение:
- Формат и размер: JPEG, PNG, WebP или GIF, до 10 MiB (около 10 мегабайт). У модели могут быть свои, более строгие ограничения — вы увидите их на шаге 1.
- Файл действительно должен быть в этом формате. SpicyAPI проверяет содержимое файла, а не только его имя. Фотографии с телефона часто сохраняются в HEIC, и если просто переименовать такой файл в
.jpg, он не станет JPEG. Сначала откройте его и экспортируйте или сохраните как JPEG. - Форма кадра: изображение становится первым кадром. Для горизонтального видео берите широкое изображение, для вертикального — высокое; у некоторых моделей есть ещё настройка
aspect_ratio. - Права: используйте изображение, которое вам разрешено использовать.
Подготовьте выбранный инструмент
CLI — это программа spicyapi, которая запускается в терминале. Установите её один раз (подробная инструкция, включая установку Node.js: CLI: перед началом):
npm install -g @spicyapi/cli
spicyapi --versionЕсли установка завершается ошибкой EACCES, пропустите её и везде, где на этой странице написано spicyapi, вводите npx @spicyapi/cli.
Затем проверьте, что ключ работает и на балансе есть деньги:
spicyapi balanceВы должны увидеть available, held и total в долларах США. Значение available должно быть больше нуля.
Семь шагов
Замените MODEL_ID_FROM_CATALOG настоящим ID модели
MODEL_ID_FROM_CATALOG — это заполнитель, а не модель. На шаге 1 вы выберете настоящий ID модели из актуального каталога (spicyapi models list, listModels() в SDK или GET /api/v1/models). Подставляйте его везде, где на этой странице стоит заполнитель. Если отправить сам заполнитель, вернётся только ошибка «not found».
Работаете в Windows? Выберите вкладку CLI или SDK
Вкладка HTTP написана для bash. Windows PowerShell по-своему обрабатывает кавычки, переносы строк (\) и $(...), поэтому там эти команды в исходном виде не сработают. В Windows пользуйтесь вкладкой CLI или SDK либо запускайте HTTP-команды в WSL (подсистема Windows для Linux, Windows Subsystem for Linux).
1. Выберите модель и изучите её настройки
Что сделать: получите список моделей для генерации видео из изображения, доступных вашему аккаунту, выберите одну и посмотрите, какие настройки она принимает.
Получите список моделей:
spicyapi models list --modality video --task image-to-video --jsonВы должны увидеть список в формате JSON. Здесь он сокращён, а суммы заменены на …:
{
"total": 1,
"items": [
{
"model": "MODEL_ID_FROM_CATALOG",
"displayName": "Example video model",
"modality": "video",
"tasks": ["image-to-video"],
"enabled": true,
"available": true,
"quantityField": "duration_seconds",
"maxOutputDurationSeconds": 10,
"taskTimeoutSeconds": 1800,
"pricing": [
{ "variant": "720p", "unit": "per_second", "price": "…", "currency": "USD" },
{ "variant": "1080p", "unit": "per_second", "price": "…", "currency": "USD" }
]
}
]
}Выберите модель, у которой и enabled, и available равны true, и скопируйте её значение model. Затем посмотрите её настройки:
spicyapi models get MODEL_ID_FROM_CATALOG --jsonВ ответе будут те же поля, а также inputSchema (настройки) и examples (входные данные, которые сервер уже проверил).
На что смотреть в списке:
| Поле | Что оно сообщает |
|---|---|
model | ID модели, который понадобится на всех следующих шагах |
enabled, available | Берите модель, только если оба значения равны true |
pricing | По записи на каждый уровень цены: variant (настройка, к которой относится цена, часто разрешение), unit (для видео обычно per_second) и price в долларах США. Если действует скидка, появляются regularPrice и offerLabel |
quantityField | Настройка, от которой зависит, за сколько единиц вы платите, обычно duration_seconds. Пустое значение означает одну единицу на видео |
maxOutputDurationSeconds | Максимальная длительность видео, которую допускает модель |
taskTimeoutSeconds | Сколько может длиться генерация, прежде чем остановится в состоянии expired (без оплаты) |
Как читать настройки. inputSchema — это список настроек модели, записанный в формате JSON Schema:
requiredперечисляет настройки, которые нужно отправить обязательно. У моделей этого типа среди них всегда естьimage_url, а большинство требует ещё иprompt.propertiesперечисляет все настройки, которые принимает модель. У каждой естьtype,description(описание простым языком, на английском) и частоenum(единственные допустимые значения),minimumиmaximum, а такжеdefault(значение, которое используется, если настройку не передать).- Внутри каждой настройки в
x-uiлежат подсказки для отображения.x-ui.affects_price: trueозначает, что от этой настройки зависит цена. - Некоторые модели добавляют условия на верхнем уровне, например «если отправляете A, отправьте и B». Как их читать, объясняет Контракт Spicy Schema.
examplesсодержит полные входные данные, которые сервер уже проверил, — с них безопасно начинать.
Настройки, которые встречаются чаще всего. Имена одинаковы у всех моделей, но каждая модель принимает только часть из них, и у каждой свои допустимые значения:
| Настройка | Что делает | Влияет на цену? |
|---|---|---|
image_url | Исходное изображение, которое становится первым кадром. Принимает адрес spicy:// из шага 2 или публичную ссылку https:// | Нет |
prompt | Что должно происходить: движение, работа камеры, настроение. Описывайте движение, а не пересказывайте то, что и так видно на изображении | Обычно нет |
duration_seconds | Длительность видео в секундах. Допустимые значения перечислены в enum или лежат между minimum и maximum; некоторые модели принимают особое значение, которое объясняется в description этой настройки | Да у большинства моделей: видео обычно оплачивается посекундно, так что более длинный ролик стоит дороже |
resolution | Размер кадра, например 720p или 1080p | Обычно да: у более высоких разрешений, как правило, своя, более высокая цена |
aspect_ratio | Форма кадра, например 16:9, 9:16 или 1:1. Некоторые модели предлагают adaptive — пропорции берутся из изображения | Смотрите x-ui.affects_price |
generate_audio | Дополнительно создать звуковую дорожку, подходящую к изображению | У некоторых моделей |
last_image_url | Изображение для последнего кадра; см. Первый и последний кадр | Проверьте расчётом стоимости |
negative_prompt | Чего в видео быть не должно | Обычно нет |
seed | Число, с которым результаты разных запусков проще сравнивать; одинаковых видео оно не гарантирует | Нет |
Отправляйте только те настройки, которые указаны у этой модели
У каждой модели свой список. Если настройки нет в properties этой модели, если имя написано с ошибкой или значение не входит в enum, весь запрос отклоняется с кодом 400. Ничего не списывается, но не копируйте входные данные от другой модели, не проверив их.
Что произошло: вы прочитали актуальный каталог для вашего аккаунта, включая ваши цены. Ничего не списано. Обращения к каталогу расходуют лимит запросов аккаунта, поэтому повторять это перед каждым видео не нужно; возвращайтесь к этому шагу, когда смените модель или получите 400.
2. Загрузите изображение
Что сделать: загрузите start-frame.jpg и скопируйте полученный адрес spicy://. Загрузка бесплатна.
spicyapi files upload start-frame.jpgВы должны увидеть:
fileId: fil_01k3m8x9q2z4v7n5p6r8s0t1w3
status: ready
bytes: 402118
contentType: image/jpeg
sha256: a91f4c2e5b7d16809e3f2a4c8d0b61e7c4a890e5d2f71b3c609ae8427d15f0c6
uri: spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3
expiresAt: 2026-09-18T09:12:11ZСкопируйте значение uri в точности так, как оно выведено.
Что произошло: изображение сохранено в закрытом виде, только для вашего аккаунта, проверено (его настоящий формат должен совпадать с заявленным типом) и получило адрес spicy://. Это не веб-ссылка: пользоваться адресом может только ваш аккаунт и только во входных данных задачи. Адрес действует один день (см. expiresAt); после этого загрузите изображение заново.
Изображение уже есть в интернете?
Если изображение уже лежит по публичному адресу https://, который открывается без входа в аккаунт, этот шаг можно пропустить и указать этот адрес в image_url. Адрес должен оставаться доступным всё время, пока генерируется видео.
Если загрузка не удалась:
| Что вы видите | Что это значит | Что делать |
|---|---|---|
Unsupported file type, или CLI либо SDK сообщает, что не может определить тип | Файл не в формате JPEG, PNG, WebP или GIF | Преобразуйте изображение или дайте ему правильное расширение |
File exceeds the 10 MB limit | Изображение больше 10 MiB | Экспортируйте версию поменьше |
The uploaded file does not match the upload ticket | Содержимое файла не соответствует типу, который указан в его имени или в запросе, например фотография HEIC, переименованная в .jpg | Экспортируйте её как настоящий JPEG или PNG и загрузите снова |
The upload ticket has expired | Между получением билета и подтверждением прошло больше 20 минут или около того | Начните загрузку заново |
3. Опишите видео и проверьте цену
Что сделать: запишите настройки в файл input.json и запросите расчёт стоимости.
Запишите input.json. Начните с двух настроек, которые принимает любая модель для генерации видео из изображения. В prompt напишите свою фразу, а значение image_url замените на uri, скопированный на шаге 2:
{
"prompt": "The camera slowly pushes in while rain runs down the window and neon light flickers",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3"
}Для настроек, которые вы не передали, используется значение default модели. Чтобы задать их самостоятельно, добавляйте только настройки из properties вашей модели и только с допустимыми значениями. Например, если у вашей модели есть duration_seconds и resolution и она допускает такие значения:
{
"prompt": "The camera slowly pushes in while rain runs down the window and neon light flickers",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
"duration_seconds": 5,
"resolution": "720p"
}Сохраните файл в рабочей папке:
Подставьте свой текст и uri, а затем вставьте все строки сразу:
cat > input.json <<'EOF'
{
"prompt": "The camera slowly pushes in while rain runs down the window and neon light flickers",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3"
}
EOFКавычки должны быть обычными прямыми ("), а не типографскими, и после последней настройки не должно быть запятой.
Получите расчёт стоимости:
spicyapi tasks quote --model MODEL_ID_FROM_CATALOG --input-file input.jsonВы должны увидеть (суммы заменены на …):
quoteId: eyJ2IjoxLCJtIjoi…
model: MODEL_ID_FROM_CATALOG
estimatedCost: …
maxCharge: …
currency: USD
quantity: 5
unit: per_second
expiresAt: 2026-09-17T08:05:00ZЧто произошло: SpicyAPI сверил входные данные с настройками модели и рассчитал стоимость именно этого запроса. Ничего не запущено и ничего не списано. estimatedCost — ориентировочная стоимость, то есть сумма, которая будет зарезервирована, если запустить генерацию сейчас, а maxCharge — максимальная сумма списания. quantity и unit показывают, за что вы платите, например за 5 секунд.
Расчёт стоимости действует пять минут и только для этих входных данных. Чтобы сравнить цены, измените длительность или разрешение и рассчитайте стоимость снова. При расчёте выполняются те же проверки, что и при запуске задачи, поэтому проблемы бесплатно обнаруживаются уже здесь: 400 означает, что входные данные не соответствуют настройкам модели (исправьте input.json, сверившись с шагом 1), а 40201 — что баланса не хватит. Остальные коды перечислены на шаге 7.
Хотите пробный запуск без своего изображения?
examples модели из шага 1 — это полные входные данные, которые сервер уже проверил. Можно без изменений положить один из примеров в input.json, рассчитать его стоимость и запустить генерацию, чтобы увидеть весь процесс в работе, прежде чем брать своё изображение.
4. Запустите генерацию
Этот шаг платный
При запуске генерации рассчитанная сумма резервируется на вашем балансе. Как только SpicyAPI принял задачу, её нельзя отменить: она выполняется до конца и оплачивается, если завершится успешно. При ошибке или истечении срока задачи резерв обычно освобождается полностью. Некоторые отказы по содержанию оплачиваются по принятой цене, только если это исключение прямо указано на странице модели. Окончательную сумму проверяйте по settled и cost.
Ключ идемпотентности простыми словами. Это метка для одного видео, что-то вроде номера заказа. Если соединение оборвалось и вы не уверены, запустилось ли видео, отправьте тот же запрос ещё раз с той же меткой: SpicyAPI вернёт уже запущенную задачу, а не запустит вторую и не возьмёт за неё деньги. Метка действует 24 часа с тем же API-ключом. Для другого видео нужна новая метка: та же метка с другими входными данными отклоняется с кодом 409. Подробнее — в разделе Идемпотентность.
Что сделать:
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.jsonCLI снова рассчитывает стоимость, показывает цену и ждёт вашего ответа:
Estimated charge: USD …; maximum charge: USD …. Quote expires: 2026-09-17T08:05:00Z.
Idempotency-Key: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
Create a billable task with model MODEL_ID_FROM_CATALOG? … Continue? [y/N]Введите y и нажмите Enter. Любой другой ответ отменяет запуск, и ничего не списывается. Прежде чем отвечать, скопируйте куда-нибудь значение Idempotency-Key: при каждом запуске CLI создаёт новую метку, а именно эта понадобится, если соединение оборвётся.
Вы должны увидеть:
idempotencyKey: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
taskId: job_01k3m8x9q2z4v7n5p6r8s0t1w3
state: queued
estimatedCost: …
deadlineAt: 2026-09-17T08:35:00ZСкопируйте taskId.
Что произошло: SpicyAPI принял генерацию — теперь это задача — и зарезервировал estimatedCost на вашем балансе. Больше этой суммы видео стоить не может. state: queued означает, что задача ждёт своей очереди. deadlineAt — самый поздний момент, к которому она может завершиться; если к этому времени она не готова, то завершается в состоянии expired, и ничего не списывается. deadlineAt — это не срок хранения ваших файлов.
Передать расчёт стоимости — значит сказать «примите запрос, только если цена та, которую мне показали». Если за это время цена или входные данные изменились, запрос отклоняется с кодом 40901, а другая сумма не резервируется. CLI делает это за вас.
Если соединение оборвалось и вы так и не увидели ID задачи, не запускайте генерацию заново с новой меткой: так будет создано и оплачено второе видео. Повторите запрос с той же меткой:
- CLI:
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key <the value you copied>(вместо<the value you copied>подставьте скопированное значениеIdempotency-Key). См. Как вернуться к задаче после прерванного ожидания. - SDK: снова выполните
node generate.mjs --yes; скрипт возьмёт метку изidempotency-key.txt. - HTTP: снова выполните блок «Запуск видео»; он возьмёт метку из
idempotency-key.txt.
Если шаг 4 был отклонён, ничего не создано и ничего не списано; причина и способ всё исправить — на шаге 7.
5. Дождитесь видео
Что сделать: проверяйте задачу, пока она не завершится. Видео обычно создаётся несколько минут.
spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000 --jsonПодставьте свой ID задачи. С --wait-timeout-ms 1800000 команда ждёт до 30 минут вместо 10 по умолчанию.
Вы должны увидеть, когда всё закончится (в сокращённом виде):
{
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "MODEL_ID_FROM_CATALOG",
"state": "succeeded",
"output": {
"assets": [
{
"key": "tasks/2026/09/17/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4",
"url": "https://…",
"expiresAt": "2026-09-17T08:40:00Z",
"mime": "video/mp4",
"durationSeconds": 5,
"width": 1280,
"height": 720,
"bytes": 4839211
}
]
},
"cost": "…",
"settled": true
}В следующий раз шаги 4 и 5 можно объединить, добавив --wait к tasks create.
Что произошло: ваш инструмент каждые несколько секунд спрашивал SpicyAPI о задаче. Состояния идут так: queued (ожидание), running (идёт генерация), затем одно конечное состояние — succeeded, failed или expired. После успеха файл копируется в собственное хранилище SpicyAPI, на это уходит ещё несколько секунд; до тех пор в результате стоит pending: true. Сумма cost окончательная, когда settled равно true.
- Закрытие терминала или Ctrl + C не отменяет задачу. Останавливается только ожидание. Сохраните ID задачи и выполните этот шаг позже.
- Не проверяйте чаще, чем раз в несколько секунд. Проверка задачи использует отдельный лимит чтения аккаунта и не расходует квоту запуска задач; см. Лимиты запросов.
- В приложении или на сервере лучше не спрашивать самим, а дать SpicyAPI сообщить о завершении задачи: см. Уведомление вместо ожидания.
6. Скачайте и сохраните видео
Что сделать: получите свежую ссылку на скачивание и сохраните файл на компьютер.
Получите свежую ссылку:
spicyapi files download-url job_01k3m8x9q2z4v7n5p6r8s0t1w3key: tasks/2026/09/17/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4
url: https://…
expiresAt: 2026-09-17T08:52:00ZВставьте url в браузер, чтобы скачать файл, или сохраните его из терминала (кавычки оставьте: в ссылке есть символы &):
curl -L -o my-video.mp4 "PASTE_THE_URL_HERE"В Windows PowerShell вводите curl.exe вместо curl. Если задача создала несколько файлов, команда spicyapi tasks get <task-id> --json покажет их все, а --key выберет нужный.
Что произошло: к каждому результату прилагается прямая ссылка на скачивание. Она действует около 20 минут и не требует API-ключа; никогда не добавляйте к ней свой ключ. Когда срок её действия истечёт, снова запросите задачу (или воспользуйтесь files download-url), чтобы получить новую ссылку.
Сохраните собственную копию
SpicyAPI хранит сгенерированные файлы не дольше примерно 14 дней (меньше, если в настройках хранения вашего аккаунта задан более короткий срок), а затем удаляет их навсегда. Загруженным изображением можно пользоваться один день, а текст промпта по умолчанию стирается через 30 дней. Запись о задаче и её стоимости сохраняется. Чтобы удалить файлы и промпт завершённой задачи раньше, воспользуйтесь spicyapi tasks purge, purgeTask() или POST /api/v1/jobs/purge; это удаляет только содержимое и деньги не возвращает. См. Хранение и удаление данных.
7. Если что-то пошло не так
Проблемы бывают двух видов, и справляются с ними по-разному.
Запрос отклонён. Команда или вызов сразу возвращает ошибку. Ничего не создано и ничего не списано. Сообщение объясняет причину, а у ошибки есть code и ID запроса (req_…), который нужно назвать, если вы обратитесь в поддержку.
| Код | Что это значит | Что делать |
|---|---|---|
400 или более точный код, начинающийся с 400 | Входные данные не соответствуют настройкам модели: не передана обязательная настройка, передана неизвестная или написанная с ошибкой, значение недопустимо, адрес spicy:// истёк или чужой, модель сейчас не может выполнить такое сочетание настроек или указан некорректный адрес обратного вызова | Сравните input.json с настройками из шага 1 и исправьте его. Если истёк адрес, загрузите изображение заново |
401 | API-ключ не передан, введён с ошибкой или отозван | Проверьте SPICY_API_KEY, как в разделе Перед началом |
40201 | Баланса не хватает на резерв | Пополните баланс в разделе «Биллинг» консоли |
40202 | Достигнут лимит расходов ключа (дневной, месячный или общий) | Повысьте его на странице «Ключи API» или дождитесь его сброса |
403, 40301 | Этому ключу нельзя пользоваться этой моделью, или запрос пришёл оттуда, откуда он не разрешён | Проверьте «Разрешённые модели» и «Разрешённые IP» ключа на странице «Ключи API» |
404 | Для вашего аккаунта нет модели с таким ID (или вы отправили заполнитель), либо для этого ключа нет задачи с таким ID | Скопируйте ID заново в точности; пользуйтесь тем же ключом, которым создана задача |
409 | Этот ключ идемпотентности уже использован для другого запроса | Для нового видео возьмите новую метку |
40901 | Срок расчёта стоимости истёк (пять минут) или цена изменилась | Снова рассчитайте стоимость, затем снова запустите генерацию |
429 | Слишком много запросов за короткое время | Подождите столько секунд, сколько указано в ошибке, и продолжайте медленнее |
50301 | Модель сейчас не может принять новую работу | Попробуйте позже или выберите другую модель |
Задача завершилась ошибкой. Задача была принята, но завершилась в состоянии failed или expired, а не succeeded. У задачи есть errorCode, который указывает причину, и errorMessage с более подробным описанием словами. При ошибке или истечении срока задачи резерв обычно освобождается полностью. Некоторые отказы по содержанию оплачиваются по принятой цене, только если это исключение прямо указано на странице модели. Окончательную сумму проверяйте по settled и cost.
Посмотрите их:
spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3Посмотрите на state, errorCode и errorMessage.
Затем решайте, что делать, по errorCode, а не по формулировке сообщения:
errorCode | Что это значит | Что делать |
|---|---|---|
rate_limited, upstream_unavailable, upstream_failed | Генерация была перегружена или временно недоступна | Запустите ещё раз после небольшой паузы |
timeout (или состояние expired) | Видео не успело создаться вовремя | Попробуйте ещё раз; если это повторится, выберите меньшую длительность или более низкое разрешение и запустите новую задачу |
generation_failed | Генерация прошла, но ничего не создала | С теми же входными данными ошибка обычно повторяется. Измените промпт или изображение и запустите новую задачу |
invalid_asset | Изображение не удалось использовать, например потому что срок загрузки истёк или файл не читается | Загрузите изображение заново и запустите новую задачу с новым адресом |
invalid_request, unsupported_combination | Настройки не приняты | Измените настройки и запустите новую задачу |
content_rejected | Выбранная модель отклонила этот запрос по своей собственной политике | Измените промпт или изображение либо выберите другую модель |
Любое другое значение обрабатывайте так же, как upstream_failed. Полный список — на странице Ошибки и повторы.
Повторный запуск задачи, завершившейся ошибкой. Повтор создаёт новую задачу с той же моделью и теми же входными данными по текущей цене модели. Он платный, как шаг 4, и использует исходные входные данные: если в них была загрузка, срок которой уже истёк, вместо повтора загрузите изображение заново и запустите новую задачу.
spicyapi tasks retry job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait --wait-timeout-ms 1800000Команда просит подтверждения, но, в отличие от tasks create, не показывает перед этим цену. Чтобы узнать цену, выполните команду tasks quote из шага 3.
Повторить можно только задачи в состоянии failed или expired. Если нужен другой вариант видео, которое создано успешно, вернитесь к шагу 3 с новой меткой. Отменить уже принятую задачу нельзя. Подробнее — в разделе Необратимость и повтор.
Всё то же самое через ИИ-ассистента
Если вы пользуетесь ИИ-ассистентом с поддержкой MCP, например Claude Code, Cursor или Codex, MCP-сервер SpicyAPI позволит ему выполнить все семь шагов за вас. Настройте его один раз по инструкции MCP-сервер: настройте клиент, а затем попросите своими словами, например:
Загрузи в SpicyAPI изображение /Users/me/spicy-video/start-frame.jpg. Найди модели для генерации видео из изображения, доступные моему ключу, и рассчитай стоимость пятисекундного ролика на двух самых дешёвых. Потом, когда я подтвержу, сгенерируй видео на более дешёвой, дождись результата и дай мне ссылку на скачивание.
В Windows указывайте путь в виде C:\Users\me\spicy-video\start-frame.jpg.
Что при этом происходит:
spicyapi_upload_fileзагружает изображение и получает его адресspicy://. Это бесплатно, но файл действительно отправляется, поэтому указывайте точный путь к нужному файлу. По умолчанию читать можно только файлы внутри вашей домашней папки; см. Локальные файлы.spicyapi_models_listиspicyapi_model_getнаходят модель и её настройки, аspicyapi_task_quoteрассчитывает стоимость вариантов. Всё это бесплатно.spicyapi_task_createостанавливается и спрашивает вас, показывая модель, ориентировочную стоимость, максимальную сумму списания и срок действия расчёта. Пока вы не подтвердите, ничего не списывается, и ассистент не может подтвердить за вас.spicyapi_task_waitждёт не больше пяти минут за раз, поэтому ради длинного видео ассистенту, возможно, придётся подождать несколько раз. Затем он даёт вам ссылку на скачивание, которая действует около 20 минут.
Больше примеров и описание каждого инструмента: MCP-сервер.
Больше возможностей
Первый и последний кадр
Некоторые модели для генерации видео из изображения принимают ещё и last_image_url — второе изображение, которым должно закончиться видео. Чтобы проверить, поддерживает ли это ваша модель, найдите last_image_url в properties из шага 1. Если его там нет, модель эту настройку не поддерживает, и запрос с ней отклоняется с кодом 400.
Загрузите оба изображения, как на шаге 2, и укажите оба адреса в input.json:
{
"prompt": "The flower slowly opens as morning light spreads across the table",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
"last_image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w4"
}Как модель использует последнее изображение, объясняет description этой настройки. Перед запуском снова рассчитайте стоимость, чтобы узнать, меняет ли второе изображение цену.
Несколько видео
- Используйте загрузку повторно. Один адрес
spicy://можно указывать в нескольких задачах, пока не наступит егоexpiresAt, если только в вашем аккаунте не настроено удаление загрузок сразу после завершения задачи. - Одна метка на одно видео. Дайте каждому видео свой ключ идемпотентности, например
campaign-clip-1,campaign-clip-2. Тогда при повторном запуске скрипта вы получите уже запущенные видео, а не заплатите за них дважды. - Не запускайте всё сразу. Под каждую выполняющуюся задачу зарезервированы деньги, лимит расходов отклоняет задачи сверх него с кодом
40202, а каждая проверка состояния расходует лимит запросов. Начните с двух задач одновременно.
Готовые скрипты: Пакет задач с ограниченной параллельностью (SDK) и Запуск CLI из скрипта.
Уведомление вместо ожидания
Для сайта или фонового сервиса держать программу запущенной только ради вопроса «ну что, готово?» расточительно. Вместо этого укажите для задачи адрес обратного вызова — публичный веб-адрес на вашем собственном сервере. SpicyAPI обратится к нему один раз, когда задача завершится, и передаст те же сведения о задаче, что показаны на шаге 5.
Что понадобится:
- сервер, доступный из интернета по адресу
https://на стандартном порту (localhostне принимается); - ключ подписи вебхука из консоли, чтобы ваш сервер мог проверять, что каждый вызов действительно пришёл от SpicyAPI;
- код, который проверяет подпись, быстро отвечает и правильно справляется, если одно и то же уведомление придёт дважды.
Формат, подпись и расписание повторных доставок описаны на странице Webhook, а в SDK есть минимальный обработчик. Предусмотрите запасной вариант: время от времени проверяйте задачи, у которых deadlineAt давно прошёл, а уведомления так и не было.
Добавьте адрес обратного вызова при расчёте стоимости и запуске задачи:
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --callback-url https://your-app.example.com/hooks/spicyCLI учитывает этот адрес и в собственном расчёте стоимости, поэтому проверка цены по-прежнему сходится.
Что дальше
Каталог моделей и схемы
Как устроены актуальный каталог и настройки каждой модели
Загрузка медиа и результатов
Подробно о загрузке файлов, в том числе из браузера
Webhook
Узнавайте о завершении задачи и проверяйте каждый вызов
Ошибки и повторы
Все коды ошибок и когда повтор может помочь
Оплата
Резерв, окончательное списание, лимиты расходов и ваш баланс
Хранение и удаление данных
Сколько хранятся файлы и промпты и как удалить их раньше
Интеграция в рабочей среде
Что добавить, прежде чем на интеграцию начнут полагаться настоящие пользователи
Частые вопросы
Короткие ответы на вопросы, которые задают чаще всего
Переход с OpenAI или OpenRouter
Как подключить существующий код с библиотеками OpenAI к SpicyAPI: базовый URL, ключ, ID модели, отличия полей запроса и настройки, которые нужно убрать после OpenRouter.
Руководство: генерация и редактирование изображений
Как ведут себя эндпоинты изображений как класс — две формы запроса, три способа записать размер вывода, что референсная картинка добавляет к счёту, веса адаптеров и как читать отказ.

