---
title: "Edit a source video (seedance-2.5-spicy)"
method: POST
path: "/v1/seedance-2.5-spicy/video-to-video"
tags: ["Tasks"]
---

# Edit a source video (seedance-2.5-spicy)

`POST /v1/seedance-2.5-spicy/video-to-video`

## Request

- Base URL: `https://api.hotapi.ai`
- URL: `https://api.hotapi.ai/v1/seedance-2.5-spicy/video-to-video`
- Auth: HTTP bearer

Edit one 4–30s source video with optional image/audio references, preserving its aspect ratio and approximately its duration. duration_seconds must be -1 (default). Fixed charge = 2 × measured source seconds × resolution rate, before submission, without actual-output settlement. Supports MP4/MOV and 480p draft previews; finalize drafts at 1080p. Async: returns 202; poll GET /v1/tasks/{id}.

## Query parameters

- `webhook` string, uri

## Headers

- `idempotency-key` string

## Request body

- object: Edit one source video, with optional image/audio references. Output may be up to about 0.4s shorter than the source; billing uses the measured source duration. Supports 480p draft previews.
  - `reference_image_urls` string[]: 1–30 reference images (HTTPS URLs or base64) for subject/style consistency. Each side must be 300–6000px.
  - `reference_audio_urls` string[]: 1–10 HTTPS reference audio clips. Audio-only input is supported.
  - `reference_video_urls` string[], required: Exactly one 4–30s HTTPS source video. The fixed charge is twice its measured duration × the resolution rate: once for source input and once as the output billing basis. Not reconciled to actual output length.
  - `prompt` string, required: Describe the edit explicitly, for example: Edit @Video 1: replace the background with a snowy forest.
  - `duration_seconds` -1: Follow source duration. Only -1 is accepted; other generation modes still require an explicit 4–30s integer.
  - `resolution` union: Output resolution; omitted = cheapest tier (480p).
    - '480p'
    - '720p'
    - '1080p'
  - `ratio` 'adaptive': Preserve the source aspect ratio.
  - `generate_audio` boolean: Generate a synced audio track (default true). The provider moderates generated audio: for spicy content the audio track may be rejected after generation, failing the whole task (no video produced, fully refunded). If you don't need audio, pass false to receive a silent video and avoid these failures.
  - `draft` boolean: Render a 480p draft preview to validate the composition before committing to a final. Billed at the normal 480p rate (not a discount). Must be sent with resolution "480p" (or omitted); any other resolution is rejected. Finalize via seedance-2.5-spicy/draft-to-video.
  - `output_format` union: Output container format (Seedance 2.5 only). Omitted = mp4.
    - 'mp4'
    - 'mov'

## Response `200`

An async task. Creation returns 202 with status=queued; poll GET /v1/tasks/{id} (or await the webhook) until a terminal status.

- Task: An async task. Creation returns 202 with status=queued; poll GET /v1/tasks/{id} (or await the webhook) until a terminal status.
  - `id` string, required
  - `object` 'task', required
  - `status` union, required: Lifecycle status. Terminal states: succeeded | failed | cancelled | expired.
    - 'pending'
    - 'queued'
    - 'processing'
    - 'succeeded'
    - 'failed'
    - 'cancelled'
    - 'expired'
  - `model` string, required
  - `task_kind` string, required
  - `input` object, required: The normalized request input the task was created with.
  - `output` object: Result payload, present once status=succeeded. Contains hosted asset URLs (re-hosted on our CDN).
  - `error` object
    - `type` string, required
    - `code` string, required
    - `message` string, required
  - `estimated_credits_cost` integer, required: Credits charged up-front when the task was created (1000 credits = $1).
  - `reference_video_seconds` number: Input-video seconds measured and frozen at submission; reused for draft finalization billing. Zero when no reference video was supplied.
  - `actual_credits_cost` integer: Final credits charged after settlement (equals estimate today).
  - `webhook_url` string, uri
  - `api_key_id` string: The organization's API key that created the task; absent for dashboard/session-created tasks.
  - `created_at` integer, required: Unix seconds.
  - `queued_at` integer: Unix seconds.
  - `started_at` integer: Unix seconds.
  - `completed_at` integer: Unix seconds.
  - `expires_at` integer, required: Unix seconds; result + asset retention deadline.

## Other responses

- `202`: An async task. Creation returns 202 with status=queued; poll GET /v1/tasks/{id} (or await the webhook) until a terminal status.
- `400`: Standard error envelope returned by every error response (OpenAI-style).
- `401`: Standard error envelope returned by every error response (OpenAI-style).
- `402`: Standard error envelope returned by every error response (OpenAI-style).
- `404`: Standard error envelope returned by every error response (OpenAI-style).
- `429`: Standard error envelope returned by every error response (OpenAI-style).

---

[API](https://skmtc.dev/hotapi/apis/hotapi-gateway.md) · [All operations](https://skmtc.dev/hotapi/apis/hotapi-gateway/llms.txt) · [OpenAPI document](https://skmtc.dev/hotapi/apis/hotapi-gateway/revisions/9b6578b0c389?raw)
