API REFERENCE / V1

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.com

Video 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_TOKEN
Keep API keys on your server. Never embed them in public web pages, shipped mobile apps or source control. Cloud studio authenticates your KinoAPI account and keeps generation-key secrets out of the browser.

Your 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/models

The 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

ModelCurrent integration
seedance-2.5Text/image input · 480p/720p · 4–30s or Auto
seedance-2.5-videoVideo input · 480p/720p · adaptive + Auto (-1)
seedance-2.0-pro480p/720p/1080p/4k · 4–15s
seedance-2.0-fast
seedance-2.0-mini
seedance-1.5-pro
480p/720p · 4–15s
seedream-5.0-pro1K / 2K
seedream-5.0-lite2K / 3K / 4K

Create a video task

POST /v1/video/generations
FieldTypeMeaning
modelstringRequired. An enabled model ID.
promptstringYour text prompt. Seedance 2.5 limit: 16 KiB, measured as UTF-8 bytes.
durationintegerFixed output duration for text/image input. Use metadata.duration = -1 for Auto.
metadataobjectResolution, ratio, duration, references and other model parameters.

Generation metadata

KeyValues / rule
resolution2.5: 480p or 720p. Do not inherit 4K from the 2.0 Pro model.
ratioadaptive, 16:9, 9:16, 1:1, 4:3, 3:4, 21:9
durationUse -1 for Auto; video input requires this value.
generate_audioboolean
contentAn array of typed image/video/audio reference objects.
Put resolution and ratio inside metadata. Do not rely on top-level resolution/ratio fields. Never silently trim a prompt or change its parameters when recovering an error.

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"
StatusWhat to do
queued / running / IN_PROGRESSWait and poll with a 3–5 second interval and backoff.
SUCCESS / succeeded / completedRead data.result_url or url and download promptly.
FAILURE / failed / cancelledRead 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/generations

Synchronous 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.

Initial cloud studio status polling and result caching require an open or refreshed workspace. Upstream generation continues after the page closes, but important content should be downloaded promptly. Project revisions are not independent off-site backups.

Storage, retention and deletion details

Errors, moderation and limits

ProblemResponse
401 / 403Check the key, account and model access.
400Correct the reported model/input/parameter mismatch; preserve the prompt.
429Back off; do not increase polling frequency.
Insufficient or overdue balanceCheck account and upstream availability. Do not repeatedly resubmit.
Network timeoutSubmission may have succeeded. Investigate existing task IDs before retrying.
Safety rejectionReview 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.

Acceptable-use policy · info@kino-api.com

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 ↗

Create your own