A real prompt, a real clip, and the async workflow to turn it into a repeatable short-form pipeline.

Short-form video is a volume game: TikTok, Reels, and Shorts all reward posting cadence, and hand-shooting b-roll for every post doesn't scale. Seedance 2.5's text-to-video endpoint turns a single prompt into a finished, vertically-framed clip with synced audio in one API call - no camera, no editing timeline, no separate voiceover pass.
This guide walks through a real clip we generated end-to-end via the hiapi API: the exact prompt, the async workflow that produced it, verified pricing, and a batch-ready pattern for producing a short-form set instead of one-off clips. For the full parameter reference across all three seedance-2.5 endpoints, see the complete API guide.
Short-form platforms don't need cinematic length - they need a steady supply of 6-15 second clips that loop cleanly and hook in the first second. seedance-2.5/text-to-video fits that brief directly:
Here's a clip we generated for this guide: a close-up of latte art being poured, framed vertically for a coffee-shop short.
The exact prompt we submitted, unedited:
A barista's steady hand pours steamed milk from a stainless steel pitcher into a white ceramic cup of espresso, the stream folding into a rosetta swirl of latte art forming in real time, warm golden-hour light raking across the counter, a croissant and pastry soft-blurred in the background, close-up vertical framing, gentle steam, ambient cafe sound.
Parameters: aspect_ratio: "9:16", resolution: "720p", duration: 8. The output above is the real, unedited task result - 8.06 seconds, with the pour sound and ambient cafe hum baked in by the model, not added afterward.
seedance-2.5/text-to-video runs through hiapi's async task API - submit, poll, download. There's no synchronous video endpoint; every clip is a background job.
import time
import requests
API_KEY = "YOUR_HIAPI_KEY"
BASE = "https://api.hiapi.ai/v1"
def generate_clip(prompt: str, aspect_ratio: str = "9:16",
resolution: str = "720p", duration: int = 8) -> str:
submit = requests.post(
f"{BASE}/tasks",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"model": "seedance-2.5/text-to-video",
"input": {
"prompt": prompt,
"aspect_ratio": aspect_ratio,
"resolution": resolution,
"duration": duration,
},
},
timeout=30,
)
task_id = submit.json()["data"]["taskId"]
while True:
poll = requests.get(
f"{BASE}/tasks/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=30,
).json()["data"]
if poll["status"] == "success":
return poll["output"][0]["url"] # temporary link - download now
if poll["status"] == "fail":
raise RuntimeError(poll)
time.sleep(5)
clip_url = generate_clip(
"A barista's steady hand pours steamed milk from a stainless steel pitcher "
"into a white ceramic cup of espresso, the stream folding into a rosetta "
"swirl of latte art forming in real time, warm golden-hour light raking "
"across the counter, a croissant and pastry soft-blurred in the background, "
"close-up vertical framing, gentle steam, ambient cafe sound."
)
# the output URL expires (it carries an expireAt timestamp) - download and
# persist it to your own storage immediately, don't leave it as a hot link
video_bytes = requests.get(clip_url, timeout=60).content
open("clip.mp4", "wb").write(video_bytes)
The task response never echoes your original prompt back - only model, status, output, and timestamps - so keep your own record of what you submitted if you need to reproduce or vary a clip later.
Checked live against hiapi's pricing endpoint - seedance-2.5/text-to-video bills per second of output, with two resolution tiers and no 1080p option:
| Resolution | Price per second | 8-second clip |
|---|---|---|
| 480p | $0.1395 | ~$1.12 |
| 720p | $0.3019 | ~$2.42 |
720p costs roughly 2.2x the 480p rate per second - worth generating drafts at 480p and only paying the 720p rate once a prompt is dialed in. Full parameter and pricing detail lives on the seedance-2.5/text-to-video model page; rates are current as of 2026-08 and can change, so check that page before budgeting a large batch.
A single clip is a demo; a content calendar needs a batch. Treat each clip as an idempotent job keyed by prompt, so a re-run after a crash doesn't double-bill:
import hashlib
PROMPTS = [
"A barista pours steamed milk into an espresso cup, rosetta latte art forming, golden-hour light, close-up vertical framing.",
"Steam rising off a fresh pour-over coffee dripping through a paper filter, morning light through a cafe window, vertical framing.",
"A hand tapping a bag of coffee beans onto a wooden scale, beans settling, soft cafe ambience, close-up vertical framing.",
]
def job_key(prompt: str) -> str:
return hashlib.sha1(prompt.encode()).hexdigest()[:12]
results = {}
for prompt in PROMPTS:
key = job_key(prompt)
if key in results: # already generated this run
continue
results[key] = generate_clip(prompt, resolution="480p", duration=6)
# persist each result immediately - see download step above
Generate the set at 480p first, review which clips actually work for the campaign, then only re-run the winners at 720p. That two-pass habit is the single biggest lever on cost when you're producing volume instead of a one-off.
If you've used Seedance 2.0, the text-to-video tier on 2.5 keeps the same submit-poll-download task shape - nothing changes on the integration side. The practical differences worth knowing before you migrate a pipeline: 2.5 adds native audio sync to every clip by default, and its resolution ladder is simpler (480p/720p only, versus 2.0's extra tiers). If your workflow depends on a resolution 2.5 doesn't offer, check the model's own page for current specs before assuming parity.
Does seedance-2.5/text-to-video support 1080p? No - as of 2026-08 the model exposes only 480p and 720p. If you need 1080p output, check the model catalog for a model that supports it before building a pipeline around this endpoint.
Is the audio real, or do I need to add it separately? It's generated by the model as part of the task - the pour sound and ambient cafe hum in the demo clip above weren't added in post. You can still layer your own audio afterward if you need brand-specific music or voiceover.
How long does a clip take to generate? Task completion time scales with duration and resolution; budget roughly one to a few minutes per clip and always poll rather than assuming a fixed wait.
Can I reuse a prompt across aspect ratios for different platforms?
Yes - aspect_ratio is a separate parameter from the prompt, so the same prompt can be resubmitted at 9:16 for TikTok/Reels and 16:9 for YouTube without rewriting the scene description.
What happens if the output URL expires before I download it?
You'll need to resubmit the task - the output[0].url is a temporary link tied to an expireAt timestamp, not permanent storage. Download and persist every clip immediately after the task reports success.
seedance-2.5/text-to-video is a prompt-in, clip-out endpoint for short-form content - pick 480p for drafts and social filler, 720p when the clip is the final asset.Ready to try it? Head to the seedance-2.5/text-to-video model page for the full parameter reference, or browse hiapi's full video model catalog to compare it against image-to-video options like Kling 3.0 Turbo for your next short-form batch.