TL;DR ā Switch in Under 15 Minutes
- Drop Runway's task-based polling pattern ā Railwail's POST /v1/videos blocks until complete
- Runway Gen-3 Alpha Turbo maps to gen-3-alpha-turbo on Railwail (mirrored)
- Plus Veo-3, WAN-2.5, AnimateDiff and Stable Video as alternatives
- EU hosting, EUR billing
- Same key unlocks the rest of the AI stack (text, image, audio)
Why Move Off Runway ML Direct?
Runway pioneered consumer-facing AI video and remains a strong choice for cinematic Gen-3 output. The API trade-offs: task-based async workflow with polling, USD-only billing, US hosting, and a narrow catalog (Runway models only). Railwail mirrors Gen-3 Alpha Turbo for compatibility and adds Veo-3 and WAN-2.5 as Google/Alibaba alternatives, all with synchronous calls and EU residency.
Step 1 ā Get a Railwail API Key
Sign up at railwail.com and generate a key.
Sponsored
Access 100+ AI Models with One API Key
GPT-4o, Claude, Gemini, Llama, Flux, DALL-E and more ā all through a single, OpenAI-compatible endpoint. No more juggling multiple providers.
Step 2 ā Replace Task-Based Polling
TypeScript / JavaScript
Before (Runway):
import { RunwayML } from "@runwayml/sdk";
const runway = new RunwayML({ apiKey: process.env.RUNWAYML_API_SECRET });
const task = await runway.imageToVideo.create({
model: "gen3a_turbo",
promptImage: "https://example.com/img.jpg",
promptText: "a slow zoom out",
duration: 5,
});
// Poll for completion
let result;
while (true) {
result = await runway.tasks.retrieve(task.id);
if (result.status === "SUCCEEDED") break;
if (result.status === "FAILED") throw new Error(result.failure);
await new Promise(r => setTimeout(r, 5000));
}
console.log(result.output[0]);After (Railwail):const res = await fetch("https://api.railwail.com/v1/videos", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RAILWAIL_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gen-3-alpha-turbo",
prompt: "a slow zoom out",
image_url: "https://example.com/img.jpg",
duration_seconds: 5,
}),
});
const json = await res.json();
console.log(json.video_url);Python
import os, requests
resp = requests.post(
"https://api.railwail.com/v1/videos",
headers={"Authorization": f"Bearer {os.environ['RAILWAIL_API_KEY']}"},
json={
"model": "gen-3-alpha-turbo",
"prompt": "a slow zoom out",
"image_url": "https://example.com/img.jpg",
"duration_seconds": 5,
},
timeout=300,
)
print(resp.json()["video_url"])cURL
curl https://api.railwail.com/v1/videos \
-H "Authorization: Bearer $RAILWAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gen-3-alpha-turbo",
"prompt": "a slow zoom out",
"image_url": "https://example.com/img.jpg",
"duration_seconds": 5
}'API Endpoint Mapping
Runway endpoint ā Railwail equivalent
| Runway ML | Railwail | Notes |
|---|---|---|
| POST /v1/image_to_video | POST /v1/videos (image_url + prompt) | I2V |
| POST /v1/text_to_video | POST /v1/videos (prompt only) | T2V |
| POST /v1/video_to_video | POST /v1/videos (init_video_url) | V2V |
| GET /v1/tasks/{id} | Synchronous ā not needed | Or pass webhook_url |
| DELETE /v1/tasks/{id} | Not exposed | Sync calls cannot be cancelled mid-flight |
Model Mapping
Runway model ā Railwail
| Runway | Railwail | Notes |
|---|---|---|
| gen3a_turbo | gen-3-alpha-turbo | Mirrored |
| gen-3-alpha | gen-3-alpha | Mirrored, higher quality |
| upscale_v1 | upscale-v1 | Video upscaling |
| N/A | veo-3 | Google Veo as alternative |
| N/A | wan-2.5-i2v | Alibaba WAN as alternative |
| N/A | stable-video-diffusion | Stability as alternative |
Sponsored
Test Any AI Model Instantly
Our built-in playground lets you compare models side by side. Find the perfect model for your use case in minutes, not days.
Pricing Comparison (May 2026)
Same video model, Railwail in EUR
| Model | Runway (USD) | Railwail (EUR) | Notes |
|---|---|---|---|
| gen-3-alpha-turbo 5s | $0.25 | EUR 0.23 | Identical |
| gen-3-alpha 5s | $0.50 | EUR 0.46 | Identical |
| veo-3 5s | N/A on Runway | EUR 0.40 | Alternative |
| wan-2.5-i2v 5s | N/A on Runway | EUR 0.28 | Cheaper alternative |
Why Railwail Over Runway ML Direct
- EU hosting and EUR billing
- Synchronous responses ā no task polling
- Multiple video models to A/B (Runway Gen-3, Veo-3, WAN-2.5)
- Same per-second pricing on Runway models
- Adds the rest of the AI stack (text, image, audio) to one key
- Per-key spend caps to prevent runaway video bills
FAQ
How long is the maximum video duration?
gen-3-alpha-turbo supports 5s or 10s. veo-3 supports up to 8s in the current API tier. For longer clips, generate multiple segments and concatenate.
Does the Runway Camera Motion control work?
Yes. Pass camera_motion: { type: 'pan-left', strength: 0.5 } as an extension parameter for Gen-3 models.
Can I do video-to-video?
Yes. Pass init_video_url to use an existing clip as the starting reference.
What about Runway's Video Upscaler?
Available as upscale-v1 via POST /v1/videos with mode: 'upscale' and source_video_url.
Webhook on completion supported?
Yes. Pass webhook_url in the request body. Railwail POSTs the completed response to that URL when ready.
Sponsored
Pay Only for What You Use
Transparent per-token pricing with no monthly minimums. Start with free credits and scale as you grow.
Next Steps
- Sign up at railwail.com
- Generate an API key
- Replace Runway SDK with synchronous fetch / requests to /v1/videos
- Optionally try veo-3 or wan-2.5-i2v as alternatives
- Read the reference at railwail.com/docs
- Compare pricing at railwail.com/pricing