Build the next frame.
Generate video with Seedance 2.5 and images with Seedream. KinoAPI is an independent relay: plain HTTPS, JSON and one account balance. The cloud studio offers the same integration in a visual canvas.
https://api.kino-api.comVideo is asynchronous: create → poll → download. Image generation returns the result synchronously.
Authentication
Create an account, add balance in the wallet, then create a key in API Keys. Use a separate key per environment and revoke unused keys. Manage keys ↗
Authorization: Bearer sk-YOUR_TOKENYour first Seedance 2.5 request
Set KINO_API_KEY in your server environment. This request creates a paid generation task; the example uses four seconds at 720p.
curl https://api.kino-api.com/v1/video/generations \
-H "Authorization: Bearer $KINO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "A quiet ocean at dawn, cinematic light",
"duration": 4,
"metadata": {
"resolution": "720p",
"ratio": "16:9"
}
}'Save the returned task_id (or id). Some responses are wrapped in data. Do not submit again just because the connection times out.
{
"task_id": "task_EXAMPLE",
"status": "queued",
"model": "seedance-2.5"
}Models & current parameters
GET /v1/modelsThe returned list reflects your key’s current availability. The model guide lists the supported KinoAPI configuration; not every combination is independently verified. Full model guide
| Model | Current integration |
|---|---|
seedance-2.5 | Text/image input · 480p/720p · 4–30s or Auto |
seedance-2.5-video | Video input · 480p/720p · adaptive + Auto (-1) |
seedance-2.0-pro | 480p/720p/1080p/4k · 4–15s |
seedance-2.0-fastseedance-2.0-miniseedance-1.5-pro | 480p/720p · 4–15s |
seedream-5.0-pro | 1K / 2K |
seedream-5.0-lite | 2K / 3K / 4K |
Create a video task
POST /v1/video/generations| Field | Type | Meaning |
|---|---|---|
model | string | Required. An enabled model ID. |
prompt | string | Your text prompt. Seedance 2.5 limit: 16 KiB, measured as UTF-8 bytes. |
duration | integer | Fixed output duration for text/image input. Use metadata.duration = -1 for Auto. |
metadata | object | Resolution, ratio, duration, references and other model parameters. |
Generation metadata
| Key | Values / rule |
|---|---|
resolution | 2.5: 480p or 720p. Do not inherit 4K from the 2.0 Pro model. |
ratio | adaptive, 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 |
duration | Use -1 for Auto; video input requires this value. |
generate_audio | boolean |
content | An array of typed image/video/audio reference objects. |
Poll the task and download
GET /v1/video/generations/{task_id}curl https://api.kino-api.com/v1/video/generations/task_EXAMPLE -H "Authorization: Bearer $KINO_API_KEY"| Status | What to do |
|---|---|
| queued / running / IN_PROGRESS | Wait and poll with a 3–5 second interval and backoff. |
| SUCCESS / succeeded / completed | Read data.result_url or url and download promptly. |
| FAILURE / failed / cancelled | Read fail_reason. Confirm the final state and refund in task logs. |
{
"data": {
"status": "SUCCESS",
"result_url": "https://media.uptoken.cc/example.mp4",
"quota": 12345
}
}This response is illustrative, not a price quote. Result URLs may expire. API-only calls do not automatically save files in cloud studio.
Reference images and videos
Provide HTTPS media that the upstream can retrieve, or supported data URIs. Use only media you have permission to process. The cloud studio checks file types and applies a 30 MB reference allowance.
Image reference
{
"model": "seedance-2.5",
"prompt": "The camera slowly approaches the scene",
"duration": 4,
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://YOUR_HOST/reference.jpg"
},
"role": "reference_image"
}
]
}
}Video reference
{
"model": "seedance-2.5-video",
"prompt": "Keep the motion and reimagine the light",
"metadata": {
"resolution": "720p",
"ratio": "adaptive",
"duration": -1,
"content": [
{
"type": "video_url",
"video_url": {
"url": "https://YOUR_HOST/reference.mp4"
},
"role": "reference_video"
}
]
}
}A video reference sent with seedance-2.5 is rejected. seedance-2.5-video without a video reference is also rejected. The gateway validates the price class before routing both aliases to the same upstream model.
Generate an image
POST /v1/images/generationsSynchronous JSON response: one successful image per request. Allow a generous timeout. Use size tiers from the model guide, such as 2K.
{
"model": "seedream-5.0-pro",
"prompt": "A sculptural amber glass bottle on volcanic stone",
"size": "2K",
"watermark": false
}{
"created": 1789000000,
"data": [
{
"url": "https://media.uptoken.cc/example.jpg"
}
]
}The URL format above is an example. Download the actual returned URL promptly; do not send your API Authorization header to media hosts.
Billing and cloud storage
Seedance 2.5 uses actual token billing: $15.61875/M without video input, $9.345/M with video input. Existing Seedance 2.0/1.5 models use published per-second rates. Seedream uses per-successful-image pricing. All prices
Confirmed upstream failures are refunded automatically. Unknown or pending tasks are not confirmed failures. Studio edits do not trigger a paid request; generation requires confirmation.
Cloud projects, prompts and references are saved under the authenticated account. Media storage starts at 512 MB per account; references are limited to 30 MB and generated copies to 100 MB each. Caching can fail independently of generation.
Errors, moderation and limits
| Problem | Response |
|---|---|
| 401 / 403 | Check the key, account and model access. |
| 400 | Correct the reported model/input/parameter mismatch; preserve the prompt. |
| 429 | Back off; do not increase polling frequency. |
| Insufficient or overdue balance | Check account and upstream availability. Do not repeatedly resubmit. |
| Network timeout | Submission may have succeeded. Investigate existing task IDs before retrying. |
| Safety rejection | Review the acceptable-use policy. Do not attempt to bypass screening. |
Prompt screening occurs before generation and blocks requests when the safety service is unavailable. Burst limits apply per key; identical prompts may be rejected in a short window. Contact support for throughput requirements.
Node.js: submit once, poll safely
Run on your server using Node.js 22 or newer. This example does not automatically retry paid submissions and preserves the task ID for later polling.
const BASE = "https://api.kino-api.com";
const key = process.env.KINO_API_KEY;
if (!key) throw new Error("Set KINO_API_KEY on the server");
const headers = {
Authorization: `Bearer ${key}`,
"Content-Type": "application/json"
};
async function api(path, options = {}) {
const response = await fetch(BASE + path, {
...options, headers, signal: AbortSignal.timeout(240_000)
});
const body = await response.json();
if (!response.ok || body.error) {
throw new Error(body.error?.message || `HTTP ${response.status}`);
}
return body.data ?? body;
}
// Submit ONCE. A timeout is not proof of failure; do not auto-retry.
const created = await api("/v1/video/generations", {
method: "POST",
body: JSON.stringify({
model: "seedance-2.5",
prompt: "A quiet ocean at dawn, cinematic light",
duration: 4,
metadata: { resolution: "720p", ratio: "16:9" }
})
});
const id = created.task_id ?? created.id;
if (!id) throw new Error("Missing task ID; check your task log");
console.log("Save this task ID:", id);
const deadline = Date.now() + 20 * 60_000;
let completed = false;
while (Date.now() < deadline) {
await new Promise(resolve => setTimeout(resolve, 5000));
const task = await api(`/v1/video/generations/${encodeURIComponent(id)}`);
const status = String(task.status).toLowerCase();
if (["success", "completed", "succeeded"].includes(status)) {
console.log("Download promptly:", task.result_url ?? task.url);
completed = true;
break;
}
if (["failure", "failed", "cancelled"].includes(status)) {
throw new Error(task.fail_reason || "Generation failed");
}
}
if (!completed) console.log("Still pending. Resume polling this ID:", id);Python integration can use standard HTTPS or the KinoAPI package. Check installed package behavior against this reference before using new model parameters. PyPI ↗