NezhaGateNezhaGate
POST https://nezhagate.com/v1/videos/generations

Асинхронная генерация видео с оплатой по фактическим видеотокенам. Черновик и улучшение — отдельные платные задания. Учитываются токены референсных видео. Проверяйте возвращённый ID задания шлюза; не отправляйте запрос повторно после тайм-аута клиента. Контент проходит проверку. Режим без модерации не предлагается. Примерно 95% публичных международных тарифов BytePlus в USD, с округлением до одного десятичного знака. MP4 для обычного использования; MOV может требовать скачивания и совместимого плеера.

Попробовать в песочнице →

Создайте готовое видео или проверьте черновик перед финальным1080p. Выберите процесс, чтобы увидеть нужные параметры и пример.

Что вы хотите сделать?

Создать готовое видео

Параметры этого шага
ПараметрТипОписание
modelОбязательноstring
promptНеобязательноstringТекстовый промпт. Используйте либо prompt, либо content. Обязателен, кроме улучшения черновика.
contentНеобязательноarrayБлоки text/image_url/video_url/audio_url. HTTPS-ссылки: до 30 изображений, 10 видео и 10 аудио. ID материалов поставщика не принимаются.
durationНеобязательноinteger4–30 секунд; по умолчанию 5. Не передавайте при улучшении.
resolutionНеобязательноstring
ratioНеобязательноstringadaptive / 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16
output_formatНеобязательноstringmp4 / mov. MP4 для обычного использования; MOV может требовать скачивания и совместимого плеера.
Дополнительно: черновик через стандартную модель

Для seedance-2.5-token укажите draft: true и resolution: 480p. Обычное480p без draft: true не подходит для улучшения.

Пример запроса

Аутентификация
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

Чтобы начать, создайте API-ключ в консоли.

cURL · POST /v1/videos/generations

Ответ

202 · JSON
Полный пример вызова · Python 3 · 480p → 1080p

Черновик → 1080p

Улучшить можно только завершённый Token-черновик своего аккаунта. Посекундные модели , обычные видео 480p и внешние ID не подходят.

Создайте черновик 480p и дождитесь succeeded. Передайте его ID NezhaGate как draft_task_id стандартной Token-модели: она создаст итоговое видео 1080p по исходному заданию. Это не увеличение произвольного MP4. Не передавайте повторно prompt, content, duration, ratio, seed или generate_audio. Черновик и итог оплачиваются отдельно.

Python 3, без дополнительных библиотек. Задайте NEZHAGATE_API_KEY и запустите скрипт один раз: создание черновика, опрос и улучшение выполняются автоматически. Черновик и итог оплачиваются отдельно. Не запускайте весь скрипт повторно для проверки уже созданной задачи.

Python 3 · 480p → 1080p
import json
import os
import time
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen

BASE_URL = "https://nezhagate.com"
API_KEY = os.environ["NEZHAGATE_API_KEY"]


def request(path, payload=None):
    data = json.dumps(payload).encode() if payload is not None else None
    req = Request(BASE_URL + path, data=data, headers={
        "Authorization": "Bearer " + API_KEY,
        "Content-Type": "application/json",
    })
    with urlopen(req, timeout=60) as response:
        return json.load(response)


def submit(payload):
    # Do not automatically retry a POST: its outcome may be unknown.
    job = request("/v1/videos/generations", payload)
    job_id = job["id"]
    print("Submitted:", job_id, flush=True)
    return job_id


def wait_for(job_id):
    deadline = time.monotonic() + 1800
    while time.monotonic() < deadline:
        try:
            job = request("/v1/videos/jobs/" + job_id)
        except HTTPError as exc:
            if exc.code != 429 and exc.code < 500:
                raise
            time.sleep(10)
            continue
        except (URLError, TimeoutError):
            time.sleep(10)
            continue
        progress = job.get("progress", {})
        print(job_id, job["status"], progress.get("phase", ""), flush=True)
        if job["status"] == "succeeded":
            return job
        if job["status"] == "failed":
            raise RuntimeError(json.dumps(job.get("error"), ensure_ascii=False))
        time.sleep(5)
    raise TimeoutError("Keep polling this job; do not resubmit: " + job_id)


if __name__ == "__main__":
    # Two separately billed tasks. Save the printed IDs to resume polling.
    draft_id = submit({
        "model": "seedance-2.5-token-draft",
        "prompt": "A sunrise over the sea",
        "duration": 5,
        "resolution": "480p",
    })
    draft = wait_for(draft_id)
    print("Draft video:", draft["data"][0]["url"])

    final_id = submit({
        "model": "seedance-2.5-token",
        "draft_task_id": draft_id,
        "resolution": "1080p",
    })
    final = wait_for(final_id)
    print("Final video:", final["data"][0]["url"])

Люди и референсы

API: загрузите файлы в публичное HTTPS-хранилище и передайте image_url, video_url или audio_url в content. Ссылки должны оставаться доступными во время задачи. NezhaGate импортирует материалы в библиотеку и ждёт статуса Active для всех, включая референсы реальных людей. Загрузка файла ещё не означает готовность. Отдельный вызов API библиотеки не нужен.

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

ШагОписание
1. Загрузить файлЗагрузите изображение персонажа в публичное HTTPS-хранилище. JSON не принимает локальные пути или двоичные файлы.
2. Передать референсПередайте image_url в content и укажите персонажа как @Image1 в промпте.
3. Импорт и проверкаNezhaGate автоматически импортирует материал и ждёт проверки. Создавать группы или передавать ID asset:// не нужно.
4. Проверить результатОпрашивайте progress той же задачи. Отклонённый референс возвращает failed и error без отправки генерации.
  • До 30 изображений, 10 видео и 10 аудио, всего 50. Суммарно до 30с видео и до 30с аудио. Веб-загрузка: 16 МБ/изображение, 50 МБ/видео, 15 МБ/аудио. JSON API принимает HTTPS URL, не локальные пути и не байты файлов. Оригиналы менее 30 МБ; стороны 301–5999 пикселей, соотношение 0.4–2.5. Материалы с лицами требуют подготовки. MP4 для обычного использования; MOV может требовать скачивания и совместимого плеера.
  • data[0].source_url — Исходная ссылка возвращается видеосервисом и может истечь. Сохраните видео заранее или скачайте размещённый у нас оригинал.
cURL · Люди и референсы
curl https://nezhagate.com/v1/videos/generations \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "model": "seedance-2.5-token",
  "content": [
    {
      "type": "text",
      "text": "The character from @Image1 walks by the sea."
    },
    {
      "type": "image_url",
      "image_url": {
        "url": "https://example.com/reference.jpg"
      }
    }
  ],
  "duration": 5,
  "resolution": "720p"
}'

Опрос статуса задачи

Опрашивайте GET /v1/videos/jobs/{id} каждые 3–5 секунд с тем же Bearer API-ключом. Доступ есть только у владельца. Логика status прежняя: queued / processing — продолжать; succeeded — читать data[0].url; failed — читать error. progress добавлен для Token. Обрабатывайте отсутствие полей и будущие неизвестные этапы.

cURL · GET /v1/videos/jobs/{id}
curl https://nezhagate.com/v1/videos/jobs/img_example -H 'Authorization: Bearer YOUR_API_KEY'
progress.phaseОписание
queuedОжидание обработки
preparingПодготовка референсов
reviewingПроверка референсов
submittingОтправка запроса
provider_queuedОжидание генерации
generatingГенерация видео
deliveringСохранение видео
succeededГотово
material_failedРеференс отклонён или не импортирован
submission_failedОшибка отправки или исход не подтверждён
generation_failedОшибка генерации
delivery_failedОшибка сохранения
failedОшибка задачи
  • phase — этап, не процент и не оценка времени. ready / total — число уникальных готовых / необходимых референсов; для текста и улучшения допустим ноль. label и detail — английские подписи, не условия программы. terminal отражает конечный статус; failed_stage равен null до ошибки. При восстановлении этапы могут пропускаться или повторяться.
  • submitted=true подтверждает ID генерации, false означает, что отправка не началась, null — отправка началась, исход неизвестен. Не повторяйте запрос автоматически при null или таймауте. reservation_released=true подтверждает освобождение резерва с нулевой стоимостью; false не доказывает списание. updated_at — время обновления записи задачи, не отдельного этапа; job_id — ID NezhaGate.
  • Отказ по параметрам, балансу или первичной проверке промпта возвращает HTTP-ошибку до создания задачи, без ID для опроса. Первичная проверка не гарантирует окончательного одобрения. Ошибка импорта/проверки референсов останавливает генерацию и возвращает failed и error. При временных сетевых ошибках увеличьте интервал и опрашивайте тот же ID. Промежуточные webhook-события не добавлены.
200 · JSON
{
  "id": "img_example",
  "object": "video.generation.job",
  "status": "processing",
  "created": 1792800000,
  "model": "seedance-2.5-token",
  "progress": {
    "phase": "reviewing",
    "label": "Reviewing references",
    "detail": "References ready: 3 / 5",
    "ready": 3,
    "total": 5,
    "terminal": false,
    "failed_stage": null,
    "submitted": false,
    "reservation_released": false,
    "updated_at": "2026-10-24T05:00:00+00:00",
    "job_id": "img_example"
  }
}

Требования к контенту

Каждая задача Seedance проходит проверку контента: промпт, файлы-референсы и готовый ролик — и изображение, и звук. Задача, не прошедшая проверку, завершается с content_policy, деньги не списываются.

Когда идёт проверка

При отправке проверяются промпт и референсы; после генерации ролика ещё раз проверяются изображение и звук. Поэтому отказ может прийти через несколько секунд после отправки или только после окончания рендера (это может занять больше получаса). Задача, завершившаяся со status failed и error.code content_policy, не прошла проверку; с вебхуком придёт событие video.failed.

Без оплаты

Отклонённая задача ничего не стоит: сумма, зарезервированная при отправке, полностью возвращается по завершении задачи, а в журнале вызовов она отмечена как неоплаченная.

Звук

Звук (реплики, закадровый текст, пение и эффекты) модель генерирует по промпту, и он проверяется вместе с изображением: реплики, закадровый текст и тексты песен из промпта озвучиваются или поются. Если в ролике не нужны голоса, не пишите в промпте реплики и тексты песен. Если не прошёл звук, error.param равен audio, а в message сказано, был ли это сгенерированный звук или ваше аудио-референс.

Что чаще всего отклоняется

  • Сексуальный контент, обнажённость или сексуальные намёки, в том числе изображения, созданные или смонтированные с помощью ИИ
  • Кровь, жестокость, самоповреждение и насильственные травмы, например огнестрельные ранения и кровотечение
  • Огнестрельное оружие, взрывчатка и наркотики
  • Любой сексуализированный контент с несовершеннолетними; несовершеннолетние рядом с алкоголем, табаком, наркотиками или в опасных ситуациях тоже отклоняются
  • Политики, знаменитости, спортсмены, бизнесмены и другие публичные лица — внешность или голос, включая двойников
  • Персонажи и объекты, защищённые авторским правом, например персонажи Disney или Marvel
  • Контент с ненавистью или дискриминацией, фейковые новости

Длинные сценарии

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

Реальные люди

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

После отказа

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

Код ошибки: content_policy · status: failed

Коды ошибок

У всех ошибок одна структура: error.message / error.type / error.code / error.param; ориентируйтесь на code. Ниже — самые частые ошибки; полный список — в разделе Коды ошибок.

HTTPcodeОписание
401invalid_api_keyНет ключа, или он недействителен либо отключён (missing_api_key, invalid_api_key).
402insufficient_quotaНедостаточно средств или ключ исчерпал свой бюджет (insufficient_quota).
400invalid_requestНеверный параметр или неизвестная модель (например, model_not_found); error.param указывает на поле.
—content_policyНе прошло проверку контента: промпт, референс или сгенерированные изображение или звук признаны нарушением. Деньги не списаны; то же самое будет отклонено снова, поэтому перепишите промпт или замените референс. Для видеозадач возвращается в error, когда status равен failed.
429rate_limit_exceededПревышен лимит запросов в минуту для этого ключа или дневная квота бесплатной модели, либо заняты все линии модели (rate_limit_exceeded). Подождите столько секунд, сколько указано в Retry-After, а если его нет — несколько секунд, и повторите.
502upstream_*Ошибка или таймаут на стороне поставщика, и переключение линий не помогло; причина в code, например upstream_timeout или upstream_unavailable. Запрос не оплачивается, его можно повторить.

Полный список кодов ошибок →