home / skills / vm0-ai / vm0-skills / runway
This skill helps you generate AI videos from images, text, or existing videos using Runway API with curl.
npx playbooks add skill vm0-ai/vm0-skills --skill runwayReview the files below or copy the command above to add this skill to your agents.
---
name: runway
description: Runway AI API for video generation via curl. Use this skill to generate videos from images, text, or other videos.
vm0_secrets:
- RUNWAY_API_KEY
---
# Runway API
Use the Runway API via direct `curl` calls to **generate AI videos** from images, text, or video inputs.
> Official docs: `https://docs.dev.runwayml.com/`
---
## When to Use
Use this skill when you need to:
- **Generate video from images** (image-to-video)
- **Generate video from text prompts** (text-to-video)
- **Transform existing videos** (video-to-video)
- **Generate images from text** (text-to-image)
- **Upscale video resolution** (4X upscale)
- **Generate sound effects or speech**
---
## Prerequisites
1. Sign up at [Runway Developer Portal](https://dev.runwayml.com/)
2. Purchase credits ($10 for 1000 credits)
3. Create an API key in the dashboard
4. Store it in the environment variable `RUNWAY_API_KEY`
```bash
export RUNWAY_API_KEY="your-api-key"
```
### Pricing
- Credits are consumed per generation
- ~25 credits per 5-second video
---
> **Important:** When using `$VAR` in a command that pipes to another command, wrap the command containing `$VAR` in `bash -c '...'`. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.
> ```bash
> bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"'
> ```
## How to Use
All examples below assume you have `RUNWAY_API_KEY` set.
Base URL: `https://api.dev.runwayml.com/v1`
**Required headers for all requests:**
- `Authorization: Bearer ${RUNWAY_API_KEY}`
- `X-Runway-Version: 2024-11-06`
- `Content-Type: application/json`
---
### 1. Check Organization Credits
Check your credit balance:
```bash
bash -c 'curl -s -X GET "https://api.dev.runwayml.com/v1/organization" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06"'
```
---
### 2. Image to Video
Generate a video from an image:
Write to `/tmp/runway_request.json`:
```json
{
"model": "gen4_turbo",
"promptImage": "https://example.com/your-image.jpg",
"promptText": "A timelapse of clouds moving across the sky",
"ratio": "1280:720",
"duration": 5
}
```
Then run:
```bash
bash -c 'curl -s -X POST "https://api.dev.runwayml.com/v1/image_to_video" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06" --header "Content-Type: application/json" -d @/tmp/runway_request.json'
```
**Response:**
```json
{
"id": "task-id-here"
}
```
---
### 3. Text to Video
Generate a video from text only:
> **Note:** Text-to-video only supports duration values of 4, 6, or 8 seconds (not arbitrary values like image-to-video).
Write to `/tmp/runway_request.json`:
```json
{
"model": "veo3.1",
"promptText": "A serene forest with sunlight filtering through the trees",
"ratio": "1280:720",
"duration": 6
}
```
Then run:
```bash
bash -c 'curl -s -X POST "https://api.dev.runwayml.com/v1/text_to_video" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06" --header "Content-Type: application/json" -d @/tmp/runway_request.json'
```
---
### 4. Video to Video
Transform an existing video:
Write to `/tmp/runway_request.json`:
```json
{
"model": "gen4_aleph",
"videoUri": "https://example.com/source-video.mp4",
"promptText": "Add magical sparkles and fairy dust effects",
"ratio": "1280:720"
}
```
Then run:
```bash
bash -c 'curl -s -X POST "https://api.dev.runwayml.com/v1/video_to_video" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06" --header "Content-Type: application/json" -d @/tmp/runway_request.json'
```
---
### 5. Text to Image
Generate images from text:
Write to `/tmp/runway_request.json`:
```json
{
"model": "gen4_image_turbo",
"promptText": "A futuristic cityscape at sunset",
"ratio": "1920:1080",
"referenceImages": []
}
```
Then run:
```bash
bash -c 'curl -s -X POST "https://api.dev.runwayml.com/v1/text_to_image" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06" --header "Content-Type: application/json" -d @/tmp/runway_request.json'
```
---
### 6. Check Task Status
Poll for task completion. Replace `<your-task-id>` with the actual task ID:
```bash
bash -c 'curl -s -X GET "https://api.dev.runwayml.com/v1/tasks/<your-task-id>" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06"'
```
**Response when complete:**
```json
{
"id": "task-id",
"status": "SUCCEEDED",
"output": ["https://cdn.runwayml.com/generated-video.mp4"]
}
```
**Possible statuses:** `PENDING`, `RUNNING`, `SUCCEEDED`, `FAILED`
---
### 7. Cancel a Task
Cancel a running task. Replace `<your-task-id>` with the actual task ID:
```bash
bash -c 'curl -s -X DELETE "https://api.dev.runwayml.com/v1/tasks/<your-task-id>" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06"'
```
---
### 8. Video Upscale (4X)
Upscale video resolution:
Write to `/tmp/runway_request.json`:
```json
{
"model": "upscale_v1",
"videoUri": "https://example.com/low-res-video.mp4"
}
```
Then run:
```bash
bash -c 'curl -s -X POST "https://api.dev.runwayml.com/v1/video_upscale" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06" --header "Content-Type: application/json" -d @/tmp/runway_request.json'
```
---
### 9. Generate Sound Effects
Generate audio from text:
Write to `/tmp/runway_request.json`:
```json
{
"model": "eleven_text_to_sound_v2",
"promptText": "Thunder rumbling in the distance"
}
```
Then run:
```bash
bash -c 'curl -s -X POST "https://api.dev.runwayml.com/v1/sound_effect" --header "Authorization: Bearer ${RUNWAY_API_KEY}" --header "X-Runway-Version: 2024-11-06" --header "Content-Type: application/json" -d @/tmp/runway_request.json'
```
---
## Available Models
| Endpoint | Models |
|----------|--------|
| Image to Video | `gen4_turbo`, `gen3a_turbo`, `veo3.1`, `veo3` |
| Text to Video | `veo3.1`, `veo3.1_fast`, `veo3` |
| Video to Video | `gen4_aleph` |
| Text to Image | `gen4_image_turbo`, `gen4_image` |
| Video Upscale | `upscale_v1` |
---
## Aspect Ratios
Common ratios for video generation:
- `1280:720` (16:9 landscape)
- `720:1280` (9:16 portrait)
- `1024:1024` (1:1 square)
---
## Guidelines
1. **Poll for completion**: Video generation is async; poll `/tasks/{id}` until status is `SUCCEEDED`
2. **Use appropriate models**: `gen4_turbo` is faster, `gen4_aleph` for video-to-video
3. **Download promptly**: Output URLs may expire after some time
4. **Monitor credits**: Check `/organization` endpoint to track usage
5. **Handle rate limits**: API returns 429 when rate limited; add delays
This skill provides curl-based access to the Runway AI API for generating and transforming video, image, and audio assets from text, images, or existing video. It focuses on practical, reproducible curl examples and the minimal request/response workflow needed to create, poll, cancel, and download generated outputs. Use it when you want programmatic, shell-based control over Runway video generation without an SDK.
Requests are sent to the Runway REST endpoints (base URL https://api.dev.runwayml.com/v1) with an API key in the Authorization header and a version header. Create jobs by POSTing JSON payloads to endpoints like /image_to_video, /text_to_video, /video_to_video, /text_to_image, /video_upscale, or /sound_effect. The API returns a task id; poll /tasks/{id} until the status is SUCCEEDED, then download the output URL(s).
What headers are required for every request?
Include Authorization: Bearer ${RUNWAY_API_KEY}, X-Runway-Version: 2024-11-06, and Content-Type: application/json.
How do I check job progress and get the output URL?
Poll GET /v1/tasks/<task-id>. When status is SUCCEEDED, the output array contains downloadable URLs.
Are there duration limits for text-to-video?
Yes. Text-to-video only supports durations of 4, 6, or 8 seconds; image-to-video supports arbitrary durations like 5 seconds.