Video Generation APIs for Developers
Compare Veo 3.1, Runway Dev and Sora for developer workflows, cost, audio, controls, exports and lifecycle risk.
For a new video-generation project, shortlist Google Veo 3.1 through the Gemini API and Runway Dev. Veo 3.1 is the clearest fit when native audio, scene extension and frame-specific control matter. Runway Dev is a strong fit when you need a multi-model catalog and professional ProRes or PNG-sequence exports. Treat the OpenAI Sora API as a lifecycle risk: OpenAI’s deprecation notice records removal of the Videos API and Sora 2 aliases and snapshots on September 24, 2026.
There is no official cross-vendor quality or latency benchmark in the reviewed documentation. Test representative prompts from your own workload before committing.
Quick comparison
| API | Best fit | Input and control | Audio | Output and export | Pricing signal | Main risk |
|---|---|---|---|---|---|---|
| Google Veo 3.1 via Gemini | Native-audio clips and controllable scenes | Text, image-based direction, frame-specific generation, extension and last-frame control | Native audio documented | Check current model and resolution terms in the Gemini documentation | $0.40 for Veo 3.1 Standard video with audio at 720p and 1080p, according to Google’s 2026 pricing page | Region, account and model-variant terms can change |
| Runway Dev | Multi-model production pipelines and editorial exports | Model catalog with video generation; verify each model’s input and duration limits | Check the selected model’s current capabilities | Gen-4.5 and Aleph list ProRes and PNG image-sequence output; Gen-4.5 lists 10-bit SDR and true HDR options | Credits; Runway says each generation costs credits and credits can be purchased for $0.01 each | Model-specific rates, limits and output support |
| OpenAI Videos API / Sora 2 | Existing integrations that have a confirmed migration path | Video creation reference includes sora-2 and sora-2-pro | Sora 2 Pro is described as producing synced audio | Use the generated-video content endpoint documented by OpenAI | Verify current pricing before use | OpenAI records removal of the Videos API and Sora 2 aliases and snapshots on 2026-09-24 |
Choose by capability
Text-to-video
All three vendors document text-driven video workflows, but availability and request schemas vary by model. Keep your application’s prompt, duration, aspect ratio and resolution in a provider-neutral job record so you can switch models without rewriting your product.
Image-to-video and reference direction
Veo 3.1 documents image-based direction and frame-specific generation. Use an input image when composition, character identity or product placement must remain stable. Runway’s catalog is model-specific, so confirm the selected model’s accepted reference inputs before sending production traffic.
Native audio
Veo 3.1 documentation covers native-audio video. Sora 2 Pro is described as producing synced audio, but its API lifecycle is time-limited. If audio is essential, include an explicit audio validation step in your evaluation rather than assuming every model variant supports it.
Extension and frame control
Veo 3.1 documents scene extension, frame-specific generation and last-frame control. These controls are useful for storyboards, transitions and continuity. Store the source clip and the exact frame or continuation parameters with each job so a retry is reproducible.
Professional exports
Runway’s model catalog states that Gen-4.5 and Aleph support professional ProRes and PNG image-sequence outputs, including 10-bit SDR and true HDR options for Gen-4.5. Confirm codec, bit depth and color-management requirements before selecting a model.
Implementation pattern that works across providers
- Create a job record containing provider, model, prompt, input asset references, duration, aspect ratio, resolution and a client request ID.
- Submit asynchronously when the provider supports jobs. Store the provider job ID and return your own job ID to callers.
- Poll with exponential backoff or consume webhooks where documented. Do not hold a web request open for the entire generation.
- Validate the result: HTTP status, media type, duration, dimensions, audio presence and file size.
- Persist the original request and model version so you can reproduce or compare outputs.
Google Veo 3.1 with the Gemini API
Google documents Veo 3.1 through the Gemini generateContent API, including video extension, frame-specific generation, image-based direction and last-frame control. The exact model identifier, request fields and regional availability should be read from the current Veo documentation at implementation time.
Request template
curl -X POST "$GEMINI_GENERATE_CONTENT_URL" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"parts": [{"text": "A slow camera move across a rainy city street at night"}]
}]
}'
Set GEMINI_GENERATE_CONTENT_URL to the current Veo 3.1 generateContent endpoint from Google’s documentation. Add the documented image, frame, extension, duration, resolution and audio fields only when your selected model and region support them.
import os, requests
url = os.environ["GEMINI_GENERATE_CONTENT_URL"]
response = requests.post(
url,
headers={
"x-goog-api-key": os.environ["GEMINI_API_KEY"],
"Content-Type": "application/json",
},
json={"contents": [{"parts": [{"text": "A paper boat crossing a sunlit stream"}]}]},
timeout=90,
)
response.raise_for_status()
print(response.json())
const url = process.env.GEMINI_GENERATE_CONTENT_URL;
const res = await fetch(url, {
method: 'POST',
headers: {
'x-goog-api-key': process.env.GEMINI_API_KEY,
'content-type': 'application/json'
},
body: JSON.stringify({
contents: [{ parts: [{ text: 'A paper boat crossing a sunlit stream' }] }]
})
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
console.log(await res.json());
Runway Dev
Runway’s documentation describes a multi-model developer API with credit billing. “Each generation you run on Runway Dev costs credits.” Credits can be purchased for $0.01 each, while model-specific video rates are listed in the pricing documentation.
curl -X POST "$RUNWAY_VIDEO_ENDPOINT" \
-H "Authorization: Bearer $RUNWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "YOUR_RUNWAY_MODEL",
"promptText": "A tracking shot through a glass greenhouse after rain",
"duration": 5
}'
Use the endpoint, model name and parameter names from the current Runway Dev documentation. Keep the returned generation ID and poll using the documented status endpoint.
import os, requests
r = requests.post(
os.environ["RUNWAY_VIDEO_ENDPOINT"],
headers={
"Authorization": f"Bearer {os.environ['RUNWAY_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": os.environ["RUNWAY_MODEL"],
"promptText": "A tracking shot through a glass greenhouse after rain",
"duration": 5,
},
timeout=90,
)
r.raise_for_status()
print(r.json())
const res = await fetch(process.env.RUNWAY_VIDEO_ENDPOINT, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.RUNWAY_API_KEY}`,
'content-type': 'application/json'
},
body: JSON.stringify({
model: process.env.RUNWAY_MODEL,
promptText: 'A tracking shot through a glass greenhouse after rain',
duration: 5
})
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
console.log(await res.json());
OpenAI Sora API lifecycle
OpenAI’s API reference documents video creation with sora-2 and sora-2-pro, plus a generated-video content endpoint. The official deprecations page says developers were notified on March 24, 2026 that the Videos API and Sora 2 aliases and snapshots would be removed on September 24, 2026. Do not start a new dependency without confirming a replacement endpoint and migration plan.
For an existing integration, inventory model IDs, response schemas, stored assets and retry logic. Build a provider adapter so a migration to Veo or Runway changes one boundary instead of every product feature.
Cost and performance planning
| Concern | Practical approach |
|---|---|
| Cost per usable second | Track successful seconds, rejected outputs and retries separately. A low list price can be offset by unusable clips or repeated generations. |
| Latency | Measure queue time, generation time and download time independently. Use asynchronous jobs and expose progress to callers. |
| Retries | Retry network failures with capped exponential backoff. Do not blindly retry safety refusals, invalid parameters or exhausted credits. |
| Throughput | Queue work, respect provider rate limits and cap concurrent generations per model. |
| Storage | Copy completed media to storage you control if provider URLs are temporary. Record checksums and metadata. |
| Evaluation | Run the same prompt families, reference images, durations and output checks across providers. Report quality and p50/p95 latency; official docs do not provide a common benchmark. |
Reliability and safety checklist
- Pin a model version where the provider supports versioned identifiers.
- Keep prompts and input assets immutable for retries.
- Validate MIME type instead of trusting a filename.
- Set request, polling and download timeouts separately.
- Redact API keys from logs and pass them through a secret manager.
- Handle moderation or safety responses as terminal job states.
- Record provider request IDs for support investigations.
- Check geography, account eligibility and current pricing before launch.
Troubleshooting
401 or 403 authentication errors
Check the key, project, billing status and authorization header format. Verify that the model is enabled for the account and region.
400 invalid model or parameter
Model catalogs change. Copy the current model identifier and field names from the provider’s documentation. Remove optional duration, frame or audio fields one at a time to isolate the unsupported option.
Job remains queued
Separate queue delay from generation time in telemetry. Reduce concurrency, apply documented rate limits and use polling backoff instead of rapid requests.
Output has no audio
Confirm that native audio is supported by the selected model and that the request explicitly enables it where required. Validate the downloaded file’s audio stream rather than relying on metadata returned by the API.
Continuation does not match the previous clip
Use the documented last-frame or extension controls, preserve the exact source clip and frame, and keep camera, subject and lighting instructions consistent.
Credits or quota exhausted
Estimate cost before submitting batches, enforce per-user budgets and surface remaining quota. Run low-cost previews before high-resolution or professional exports.
Or skip the browser setup
If your workflow needs still screenshots of generated-video pages, references or documentation, ScreenshotNeo is the first alternative to try: it removes cookie banners, newsletter popups and chat widgets before capture, bills only clean shots, and provides an MCP server for AI agents.
One GET request returns PNG, JPEG, WebP or PDF. See the ScreenshotNeo API docs for all options.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
Bot checks, blank pages and failed loads are never billed, and response headers identify the page verdict and whether it was billed. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.
FAQ
Which API should a new project shortlist?
Start with Veo 3.1 and Runway Dev, then evaluate both on your own prompts, references and latency targets.
Which API has the clearest published price?
Google publishes $0.40 for Veo 3.1 Standard video with audio at 720p and 1080p. Runway publishes credit and model-specific rates.
Is Sora still safe for a new dependency?
Confirm a replacement first. OpenAI’s deprecation notice records removal on September 24, 2026.
Is there a universal quality winner?
No official cross-vendor benchmark was found. Build a representative evaluation set and measure quality, latency and usable seconds.
