Skip to main content

Try Without Signing Up

Use the demo API key to explore the API instantly. This key can only query existing sample tasks — it cannot create new content.
export KINOVI_API_KEY="zimg_demo_readonly_d2cb4bea56fcc21a9eb106e0"
Sample task IDs you can query:
Task IDTypeStatusDescription
demo_task_t2v_successVideosuccessCompleted text-to-video
demo_task_i2v_successVideosuccessCompleted image-to-video
demo_task_fail_text_moderationfailPrompt flagged by content moderation
demo_task_fail_face_detectedfailFace detected in uploaded image
demo_task_fail_server_errorfailServer error (safe to retry)
Try it now:
curl -s "https://kinovi.ai/api/v1/jobs/recordInfo?taskId=demo_task_t2v_success" \
  -H "Authorization: Bearer zimg_demo_readonly_d2cb4bea56fcc21a9eb106e0"
The demo key has 0 credits and cannot create tasks. To generate videos and images, sign up and get your own API key.

Full Demo Script

Copy the script below, paste your API key, and run it. The script creates a task, polls until completion, and prints the output URL.
import requests, time, sys

API_KEY = "YOUR_API_KEY"  # ← paste your API key here
BASE_URL = "https://kinovi.ai/api/v1"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 1. Create task
print("Creating video task...")
resp = requests.post(f"{BASE_URL}/jobs/createTask", headers=headers, json={
    "model": "seedance-20",
    "inputs": {
        "prompt": "A golden retriever running on a beach at sunset, waves crashing in the background, cinematic slow motion",
        "duration": "5",
        "aspectRatio": "16:9"
    }
})

data = resp.json()
if not resp.ok:
    print(f"Error: {data['message']}")
    sys.exit(1)

task_id = data["taskId"]
print(f"Task created: {task_id}")

# 2. Poll for completion
print("Generating", end="", flush=True)
start = time.time()

while time.time() - start < 300:
    resp = requests.get(f"{BASE_URL}/jobs/recordInfo?taskId={task_id}", headers=headers)
    result = resp.json()

    if result["status"] == "success":
        elapsed = int(time.time() - start)
        print(f"\n\nDone in {elapsed}s!")
        print(f"Output URL: {result['output'][0]['url']}")
        print(f"Resolution: {result['output'][0]['width']}x{result['output'][0]['height']}")
        sys.exit(0)

    if result["status"] == "fail":
        print(f"\n\nFailed: {result['error']['message']}")
        sys.exit(1)

    print(".", end="", flush=True)
    time.sleep(5)

print("\n\nTimeout after 300s. Task may still be processing.")
print(f"Check manually: GET {BASE_URL}/jobs/recordInfo?taskId={task_id}")
Run
pip install requests
python demo.py

What This Demo Does

StepAPI CallWhat Happens
Create taskPOST /jobs/createTaskSubmits a generation request, returns taskId
Poll statusGET /jobs/recordInfoCheck progress until success or fail
Get outputDirect URL from outputDownload the generated video or images

Try Different Models

To switch models, just change the model and inputs in the request body. The async flow (create → poll → get result) is the same for every model.
{
  "model": "midjourney-v7",
  "inputs": {
    "prompt": "A majestic snow leopard, hyperrealistic photography",
    "aspectRatio": "16:9"
  }
}
{
  "model": "nanobanana2",
  "inputs": {
    "prompt": "A futuristic cityscape at sunset, ultra detailed",
    "resolution": "2k"
  }
}
{
  "model": "seedance-20",
  "inputs": {
    "urls": ["https://example.com/first-frame.jpg"],
    "prompt": "Camera slowly zooms in, gentle wind blowing",
    "duration": "5",
    "aspectRatio": "16:9"
  }
}

Next Steps

Available Models

See all supported video and image models

Playground

Generate in the browser — no code needed