Skip to main content

Documentation Index

Fetch the complete documentation index at: https://runcrate.ai/docs/llms.txt

Use this file to discover all available pages before exploring further.

Generate production-quality AI videos using Veo 3, Kling v3, Seedance, and other models through a single API. This guide covers submitting jobs, polling for completion, downloading results, and building batch pipelines.

What you’ll build

A video generation pipeline that submits prompts to frontier video models, polls for completion, and downloads the MP4 results. Useful for marketing teams generating product videos, content creators building short-form video, or apps with AI video features.

Available models

ModelDurationsStrengths
Veo 3.04, 6, 8sPhotorealistic 4K, native audio, broadcast-ready color
Veo 3.0 Audio4, 6, 8sVideo with generated synchronized audio
Kling v33–15sBest human motion, motion transfer from reference video
Seedance2–12sMulti-input (up to 9 images + 3 videos + 3 audio files)
Hailuo 026, 10sFast generation, good for prototyping
Sora 24, 8, 12sRealistic physics simulation

Single video (Python SDK)

The easy way: submit, poll, and save in one call

from runcrate import Runcrate

client = Runcrate(api_key="rc_live_...")

job = client.models.generate_video_and_save(
    "product-hero.mp4",
    model="google/veo-3.0",
    prompt="Cinematic slow-motion shot of a premium headphone rotating on a matte black surface, "
           "studio lighting with soft reflections, shallow depth of field, 4K",
    duration=6,
    on_status=lambda j: print(f"  {j.status}..."),
)

print(f"Saved product-hero.mp4")

The manual way: full lifecycle control

from runcrate import Runcrate
import time

client = Runcrate(api_key="rc_live_...")

# Submit
job = client.models.generate_video(
    model="google/veo-3.0",
    prompt="Aerial drone shot tracking a car driving through autumn mountains at golden hour",
    duration=8,
)
print(f"Job {job.id} submitted")

# Poll
while job.status not in ("completed", "failed"):
    time.sleep(5)
    job = client.models.get_video_status(job.id)
    print(f"  Status: {job.status}")

if job.status == "failed":
    print(f"Failed: {job.error}")
else:
    # Download
    video_bytes = client.models.download_video(job.id)
    with open("drone-shot.mp4", "wb") as f:
        f.write(video_bytes)
    print("Saved drone-shot.mp4")

Batch video generation (Python SDK)

Generate multiple videos in parallel for a product catalog or social media campaign:
from runcrate import Runcrate
import time
from concurrent.futures import ThreadPoolExecutor

client = Runcrate(api_key="rc_live_...")

scenes = [
    {"file": "scene-1.mp4", "prompt": "Close-up of coffee being poured into a ceramic mug, steam rising, warm morning light", "duration": 4},
    {"file": "scene-2.mp4", "prompt": "Hands typing on a mechanical keyboard, shallow depth of field, office ambiance", "duration": 6},
    {"file": "scene-3.mp4", "prompt": "A person putting on wireless earbuds and walking through a city, cinematic tracking shot", "duration": 8},
]

def generate_scene(scene):
    print(f"Submitting: {scene['file']}")
    client.models.generate_video_and_save(
        scene["file"],
        model="google/veo-3.0",
        prompt=scene["prompt"],
        duration=scene["duration"],
        on_status=lambda j: print(f"  {scene['file']}: {j.status}"),
    )
    print(f"Done: {scene['file']}")

with ThreadPoolExecutor(max_workers=3) as pool:
    pool.map(generate_scene, scenes)

print("All scenes generated.")

TypeScript SDK

import Runcrate from '@runcrate/sdk';

const rc = new Runcrate({ apiKey: 'rc_live_...' });

// Submit a video job
const job = await rc.models.generateVideo({
  model: 'google/veo-3.0',
  prompt: 'A timelapse of a flower blooming in a garden, macro lens',
  duration: 6,
});

// Poll until done
let status = job;
while (status.status !== 'completed' && status.status !== 'failed') {
  await new Promise(r => setTimeout(r, 5000));
  status = await rc.models.getVideoStatus(job.id);
  console.log(`Status: ${status.status}`);
}

// Download
const videoBuffer = await rc.models.downloadVideo(job.id);
await Bun.write('flower-timelapse.mp4', videoBuffer);

curl

# Submit
curl https://api.runcrate.ai/v1/videos \
  -H "Authorization: Bearer rc_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/veo-3.0",
    "prompt": "A cinematic sunrise over misty mountains",
    "duration": 6
  }'

# Poll (replace VIDEO_ID)
curl https://api.runcrate.ai/v1/videos/VIDEO_ID \
  -H "Authorization: Bearer rc_live_YOUR_API_KEY"

# Download when completed
curl https://api.runcrate.ai/v1/videos/VIDEO_ID/download \
  -H "Authorization: Bearer rc_live_YOUR_API_KEY" \
  --output sunrise.mp4

Using MCP

“Generate a 6-second Veo 3 video of an aerial shot over a tropical island at sunset. Save it to my desktop.”
The agent calls the video generation API, polls until complete, and downloads the result.