Skip to content
Immersive AI

Seedance 2.5 — a considered product film

Video Seedance 2.5 · 6 s by Henri Huotari · Oct 28, 2026

A six-second image-to-video film of the headphone concept, with a controlled camera slide, material highlights and preservation rules for the product and its wave mark. Includes the exact input still and returned video.

This file couldn't be loaded. The link may have expired.
This file couldn't be loaded. The link may have expired.
Input images
This file couldn't be loaded. The link may have expired.
Output result.mp4

Run it yourself

Set IMMERSIVE_API_KEY to an API key from your account. Create a free account to get one.

curl -X POST 'https://ai.im.inc/api/v1/video/generate' \
  -H "Authorization: Bearer $IMMERSIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "image": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/inputs/ce12b474-8360-4be8-966e-64bfc9ecd26c/input_image.png",
  "model": "bytedance/seedance-2-5",
  "prompt": "A six-second single-shot studio product film of these exact pink headphones on the pale circular plinth. No people appear. Preserve the headphone silhouette, attached ear cups, material detail and small white waveform emblem. A slow smooth camera slide to the right reveals real parallax and a little more of the nearer ear cushion. A soft white highlight travels gradually across the pink metal yoke while the diagonal sunlight and grounded contact shadow remain coherent. The object stays firmly planted and constant, no spinning or transformation. Quiet refined design-studio product cinematography, tactile surfaces, elegant warm-pink, charcoal and ivory palette, the entire product visible throughout. No cuts, no additional text, no added objects or floating components, no speech or vocals.",
  "duration": 6,
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "generate_audio": false
}'

# Set JOB_ID to the response's "id", then poll every few seconds until the job has finished:
curl "https://ai.im.inc/api/v1/video/$JOB_ID" \
  -H "Authorization: Bearer $IMMERSIVE_API_KEY"

# The finished response has the result at url.
const headers = { Authorization: `Bearer ${process.env.IMMERSIVE_API_KEY}` };

const response = await fetch("https://ai.im.inc/api/v1/video/generate", {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({
    "image": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/inputs/ce12b474-8360-4be8-966e-64bfc9ecd26c/input_image.png",
    "model": "bytedance/seedance-2-5",
    "prompt": "A six-second single-shot studio product film of these exact pink headphones on the pale circular plinth. No people appear. Preserve the headphone silhouette, attached ear cups, material detail and small white waveform emblem. A slow smooth camera slide to the right reveals real parallax and a little more of the nearer ear cushion. A soft white highlight travels gradually across the pink metal yoke while the diagonal sunlight and grounded contact shadow remain coherent. The object stays firmly planted and constant, no spinning or transformation. Quiet refined design-studio product cinematography, tactile surfaces, elegant warm-pink, charcoal and ivory palette, the entire product visible throughout. No cuts, no additional text, no added objects or floating components, no speech or vocals.",
    "duration": 6,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": false
  }),
});
const job = await response.json();

// Poll every few seconds while the job is still running.
const running = ["pending", "queued", "submitted", "starting", "processing", "running", "streaming", "in_queue", "in_progress"];
let result;
do {
  await new Promise((resolve) => setTimeout(resolve, 5000));
  result = await (await fetch(`https://ai.im.inc/api/v1/video/${job.id}`, { headers })).json();
} while (running.includes(String(result.status).toLowerCase()));

console.log(result.url);
import os
import time

import requests

headers = {"Authorization": f"Bearer {os.environ['IMMERSIVE_API_KEY']}"}

job = requests.post(
    "https://ai.im.inc/api/v1/video/generate",
    headers=headers,
    json={
        "image": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/inputs/ce12b474-8360-4be8-966e-64bfc9ecd26c/input_image.png",
        "model": "bytedance/seedance-2-5",
        "prompt": "A six-second single-shot studio product film of these exact pink headphones on the pale circular plinth. No people appear. Preserve the headphone silhouette, attached ear cups, material detail and small white waveform emblem. A slow smooth camera slide to the right reveals real parallax and a little more of the nearer ear cushion. A soft white highlight travels gradually across the pink metal yoke while the diagonal sunlight and grounded contact shadow remain coherent. The object stays firmly planted and constant, no spinning or transformation. Quiet refined design-studio product cinematography, tactile surfaces, elegant warm-pink, charcoal and ivory palette, the entire product visible throughout. No cuts, no additional text, no added objects or floating components, no speech or vocals.",
        "duration": 6,
        "resolution": "720p",
        "aspect_ratio": "16:9",
        "generate_audio": False,
    },
    timeout=300,
).json()

# Poll every few seconds while the job is still running.
running = {"pending", "queued", "submitted", "starting", "processing", "running", "streaming", "in_queue", "in_progress"}
while True:
    time.sleep(5)
    result = requests.get(f"https://ai.im.inc/api/v1/video/{job['id']}", headers=headers, timeout=60).json()
    if str(result.get("status", "")).lower() not in running:
        break

print(result["url"])
{
    "id": "a4msnxf67hrmw0d1g6htvacvc4",
    "url": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/outputs/ce12b474-8360-4be8-966e-64bfc9ecd26c/result.mp4",
    "status": "succeeded",
    "duration": "6.00",
    "model_name": "bytedance/seedance-2-5"
}

Your browser blocked the clipboard. Select the text and copy it by hand.

How the job runs

  1. POST returns the job's id and status right away.
  2. Poll GET /api/v1/video/{id} every few seconds while the job is running.
  3. When status is succeeded, download url. Failed jobs are refunded automatically.
Endpoint
POST /api/v1/video/generate
Model
bytedance/seedance-2-5
Output
Video · MP4