rw-api-referencepor runwayml

Complete reference for Runway's public API: models, endpoints, costs, limits, and types

npx skills add https://github.com/runwayml/skills --skill rw-api-reference

Runway Public API Reference

PREREQUISITE: Run +rw-check-compatibility first to ensure the project has server-side capability.

Base URL: https://api.dev.runwayml.com

All requests require these headers:

Authorization: Bearer <RUNWAYML_API_SECRET>
X-Runway-Version: 2024-11-06

Models & Endpoints

Video Generation

ModelEndpointInputCost (credits/sec)
gen4.5POST /v1/image_to_video or POST /v1/text_to_videoText and/or Image12
gen4_turboPOST /v1/image_to_videoImage required5
gen4_alephPOST /v1/video_to_videoVideo + Text/Image15
act_twoPOST /v1/character_performanceImage/Video5
veo3POST /v1/image_to_video or POST /v1/text_to_videoText/Image40
veo3.1POST /v1/image_to_video or POST /v1/text_to_videoText/Image20-40
veo3.1_fastPOST /v1/image_to_video or POST /v1/text_to_videoText/Image10-15
seedance2POST /v1/text_to_video, POST /v1/image_to_video, or POST /v1/video_to_videoText, Image, and/or Video36

Video duration: 2-15 seconds (model-dependent). Aspect ratios are pixel-based: 1280:720, 720:1280, 1104:832, 960:960, 832:1104, 1584:672, etc.

Seedance 2 specifics:

  • Modes: text-to-video, image-to-video (first/last frame or image reference), video-to-video
  • Duration: required for TTV and ITV (in seconds)
  • Aspect ratios (pixel-based): 1280:720, 720:1280, 960:960, 1112:834, 834:1112, 1470:630, 992:432, 864:496, 752:560, 640:640, 560:752, 496:864
  • ITV supports two mutually exclusive modes: first/last frame (promptImage array with position) or image reference (references array)
  • VTV input requirements: max 15 seconds, max 32 MB, min 720p resolution, MP4 recommended

Image Generation

ModelEndpointCost (credits)
gen4_imagePOST /v1/text_to_image5 (720p), 8 (1080p)
gen4_image_turboPOST /v1/text_to_image2
gemini_2.5_flashPOST /v1/text_to_image5

Audio Generation

ModelEndpointUse CaseCost
eleven_multilingual_v2POST /v1/text_to_speechText to speech1 credit/50 chars
eleven_text_to_sound_v2POST /v1/sound_effectSound effects1-2 credits
eleven_voice_isolationPOST /v1/voice_isolationIsolate voice from audio1 credit/6 sec
eleven_voice_dubbingPOST /v1/voice_dubbingDub audio to other languages1 credit/2 sec
eleven_multilingual_sts_v2POST /v1/speech_to_speechVoice conversion1 credit/3 sec

Characters (Real-Time Avatars)

ModelDescriptionSession Max Duration
gwm1_avatarsReal-time conversational avatars powered by GWM-15 minutes

Endpoints:

MethodEndpointDescription
POST/v1/avatarsCreate a new Avatar
GET/v1/avatars/{id}Retrieve an Avatar
PATCH/v1/avatars/{id}Update an Avatar (name, voice, personality, documentIds)
DELETE/v1/avatars/{id}Delete an Avatar
POST/v1/realtime_sessionsCreate a new real-time session
GET/v1/realtime_sessions/{id}Retrieve session status (poll until READY)
POST/v1/realtime_sessions/{id}/consumeConsume session credentials for WebRTC (one-time use)

Avatar creation parameters:

ParameterTypeDescription
namestringDisplay name for the avatar
referenceImagestringURL or runway:// URI of the character image
voiceobject{ type: 'runway-live-preset', presetId: 'clara' }
personalitystringSystem prompt / personality instructions
documentIdsstring[]Optional. IDs of knowledge base documents to attach

Voice presets: clara (soft), victoria (firm), vincent (authoritative). Preview all at dev.runwayml.com.

Session statuses: NOT_READYREADYRUNNINGCOMPLETED (or FAILED / CANCELLED)

Documents (Knowledge Base)

MethodEndpointDescription
POST/v1/documentsCreate a document (plain text or Markdown)
GET/v1/documents/{id}Retrieve a document
DELETE/v1/documents/{id}Delete a document

Each Avatar supports up to 50,000 tokens of knowledge. Link documents to an Avatar via client.avatars.update(id, { documentIds: [...] }).


Request Body Reference (raw JSON)

Use these when calling the API directly (e.g. through use-runway-api's request command) rather than via an SDK. Only required + common fields shown — consult +rw-fetch-api-reference for the full schema.

POST /v1/text_to_image

{
  "model": "gen4_image",
  "promptText": "A serene Japanese garden with cherry blossoms",
  "ratio": "1920:1080"
}
  • model: gen4_image | gen4_image_turbo | gemini_2.5_flash (required)
  • promptText: string, up to ~1000 chars (required)
  • ratio: one of 1920:1080, 1080:1920, 1024:1024, 1360:768, 1080:1080, 1168:880, 1440:1080, 1080:1440, 1808:768, 2112:912 (required; 720p or 1080p variants depending on model)
  • referenceImages: optional [{ "uri": "https://...", "tag": "MyTag" }] — reference by @MyTag in promptText
  • seed: optional integer for reproducibility

POST /v1/text_to_video

{
  "model": "gen4.5",
  "promptText": "A golden retriever running through wildflowers at sunset",
  "ratio": "1280:720",
  "duration": 5
}
  • model: gen4.5 | veo3 | veo3.1 | veo3.1_fast | seedance2 (required)
  • duration: integer seconds, 2–10 (required; model-specific valid values — e.g. veo3 only accepts 8)
  • ratio: e.g. 1280:720, 720:1280, 1104:832, 832:1104, 960:960 (required)

POST /v1/image_to_video

{
  "model": "gen4.5",
  "promptImage": "https://example.com/cover.jpg",
  "promptText": "A slow dolly-in shot",
  "ratio": "1280:720",
  "duration": 5
}
  • model: gen4.5 | gen4_turbo | veo3 | veo3.1 | veo3.1_fast | seedance2 (required)
  • promptImage: HTTPS URL, data URI, or runway:// URI (required). Can also be [{ "uri": "...", "position": "first" | "last" }] for keyframes.
  • promptText: optional for most models, required for gen4_turbo when no image motion is obvious

POST /v1/video_to_video

{
  "model": "gen4_aleph",
  "videoUri": "https://example.com/source.mp4",
  "promptText": "Change the season to winter with snowfall",
  "ratio": "1280:720"
}

POST /v1/text_to_speech

{
  "model": "eleven_multilingual_v2",
  "text": "Hello, welcome to Runway.",
  "voice": { "type": "runway-preset", "presetId": "clara" }
}
  • voice: { type: "runway-preset", presetId: "clara" | "victoria" | "vincent" | ... } or a provider-specific voice object
  • languageCode: optional ISO code (auto-detected by default)

POST /v1/sound_effect

{
  "model": "eleven_text_to_sound_v2",
  "promptText": "Thunderclap followed by heavy rain",
  "duration": 5
}

POST /v1/voice_isolation

{
  "model": "eleven_voice_isolation",
  "audioUri": "https://example.com/noisy.mp3"
}

POST /v1/voice_dubbing

{
  "model": "eleven_voice_dubbing",
  "audioUri": "https://example.com/english.mp3",
  "targetLanguage": "es"
}

POST /v1/speech_to_speech

{
  "model": "eleven_multilingual_sts_v2",
  "audioUri": "https://example.com/source.mp3",
  "voice": { "type": "runway-preset", "presetId": "victoria" }
}

POST /v1/avatars

{
  "name": "Support Agent",
  "referenceImage": "https://example.com/portrait.jpg",
  "voice": { "type": "runway-live-preset", "presetId": "clara" },
  "personality": "You are a friendly support agent.",
  "documentIds": []
}

POST /v1/documents

{
  "avatarId": "<avatar-id>",
  "name": "FAQ",
  "content": "Q: What is your return policy?\nA: 30 days, no questions asked."
}

POST /v1/realtime_sessions

{
  "avatarId": "<avatar-id>"
}

Management Endpoints

MethodEndpointDescription
GET/v1/tasks/{id}Get task status and output
DELETE/v1/tasks/{id}Cancel/delete a task
POST/v1/uploadsCreate ephemeral upload
GET/v1/organizationOrganization info & credit balance
POST/v1/organization/usageCredit usage history (up to 90 days)

Task Lifecycle

All generation endpoints return a task object. The flow is:

  1. SubmitPOST /v1/<endpoint> → returns { "id": "task_xxx" }
  2. PollGET /v1/tasks/{id} → returns task with status
  3. Retrieve output — When status === "SUCCEEDED", the output array contains signed URLs

Task Statuses

StatusMeaning
PENDINGQueued, waiting to start
RUNNINGCurrently generating
SUCCEEDEDComplete — output URLs available
FAILEDGeneration failed — check failure field
THROTTLEDConcurrency limit hit — auto-queued

SDK Polling (Recommended)

The SDKs provide a waitForTaskOutput() method that handles polling automatically:

// Node.js — polls until complete (default 10 min timeout)
const task = await client.imageToVideo.create({
  model: 'gen4.5',
  promptImage: 'https://example.com/image.jpg',
  promptText: 'A sunset timelapse',
  ratio: '1280:720',
  duration: 5
}).waitForTaskOutput();

console.log(task.output); // Array of signed URLs
# Python
task = client.image_to_video.create(
    model='gen4.5',
    prompt_image='https://example.com/image.jpg',
    prompt_text='A sunset timelapse',
    ratio='1280:720',
    duration=5
).wait_for_task_output()

print(task.output)

Manual Polling (REST)

async function pollTask(taskId) {
  while (true) {
    const response = await fetch(`https://api.dev.runwayml.com/v1/tasks/${taskId}`, {
      headers: {
        'Authorization': `Bearer ${process.env.RUNWAYML_API_SECRET}`,
        'X-Runway-Version': '2024-11-06'
      }
    });
    const task = await response.json();

    if (task.status === 'SUCCEEDED') return task;
    if (task.status === 'FAILED') throw new Error(task.failure);

    await new Promise(r => setTimeout(r, 5000)); // poll every 5 seconds
  }
}

Output Handling

  • Successful tasks return an output array with signed URLs to generated content
  • Output URLs expire within 24-48 hours
  • Download and store outputs in your own storage — do not serve signed URLs to end users
  • Video outputs are MP4, image outputs are PNG/JPEG

Input Requirements

Size Limits

TypeVia URLVia Data URIVia Upload
Image16 MB5 MB200 MB
Video32 MB16 MB200 MB
Audio32 MB16 MB200 MB

Supported Formats

  • Images: JPEG, PNG, WebP (no GIF)
  • Video codecs: H.264, H.265/HEVC, AV1, VP8/VP9, Apple ProRes, Theora
  • Audio: MP3, AAC, FLAC, PCM, ALAC

URL Requirements

If providing assets via URL:

  • HTTPS only (no HTTP)
  • Domain names only (no IP addresses)
  • No redirects
  • Must support HTTP HEAD requests
  • Must return valid Content-Type and Content-Length headers
  • Max URL length: 2,048 characters

Rate Limits & Tiers

TierConcurrencyDaily GensMonthly CapUnlock
1 (default)1-250-200$100
23500-1,000$5001 day + $50
351,000-2,000$2,0007 days + $100
4105,000-10,000$20,00014 days + $1,000
52025,000-30,000$100,0007 days + $5,000
  • No requests-per-minute limit — only daily generation quotas
  • Exceeding concurrency → THROTTLED status (auto-queued, not rejected)
  • Exceeding daily limit → 429 Too Many Requests
  • Daily limits use a rolling 24-hour window

Error Handling

HTTP Errors

CodeMeaningAction
400Input validation failureFix input, do not retry
401Invalid API keyCheck key, do not retry
429Rate limitedRetry with exponential backoff + jitter
502/503/504Server overloadRetry with exponential backoff + jitter

Task Failure Codes

CodeMeaningRetry?
SAFETY.INPUT.*Input content moderationNo — not refundable
SAFETY.OUTPUT.*Output content moderationYes — try different prompt
INTERNAL.BAD_OUTPUTQuality issueYes
ASSET.INVALIDBad input formatFix input
INTERNALServer errorYes

The SDKs handle retries for transient errors automatically.


Data URI Support

Base64-encoded images can be passed instead of URLs:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

Useful for small images or when you don't want to host the file. Subject to the data URI size limits above.

NotebookLM Web Importer

Importe páginas da web e vídeos do YouTube para o NotebookLM com um clique. Confiado por mais de 200.000 usuários.

Instalar extensão do Chrome