One request.
Your next video.
A simple asynchronous API for native 480p, 720p, and 1080p video. Quote, generate, poll, download.
Access & authentication
Create an account at Revana (sign in with Google), then open the API dashboard to create your key. The API base URL is https://api.revana.si/v1. New accounts start with zero credits; you can create keys and check quotes, but paid generation is not enabled yet.
Keep the key in your server environment. Use it for every /v1/ request, including MP4 downloads. Never embed keys in browser code. API keys are shown once and can be revoked from the dashboard. Payment funding is not available yet.
export SEEDROUTER_BASE_URL="https://api.revana.si/v1"
export SEEDROUTER_API_KEY="YOUR_API_KEY"From prompt to MP4.
1. Preview the quote
No generation is submitted. A compatible quote does not reserve balance or capacity.
curl "$SEEDROUTER_BASE_URL/route" \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt":"An orchid unfolding in soft light","resolution":"720p","duration":5}' {
"available": true,
"quoted_usd": 1.0,
"quoted_usd_per_output_second": 0.2,
"estimated_seconds": 380,
"reserved_usd": 1.695,
"routes": [
{"label":"Provider 1", "quoted_usd":1.0, "estimated_seconds":380},
{"label":"Provider 2", "quoted_usd":1.225, "estimated_seconds":180},
{"label":"Provider 3", "quoted_usd":1.375, "estimated_seconds":125},
{"label":"Provider 4", "quoted_usd":1.695, "estimated_seconds":190}
]
}2. Create the job
This call starts a paid generation using existing account credits. Reuse the same idempotency key and identical JSON when retrying this request.
curl "$SEEDROUTER_BASE_URL/videos" \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: orchid-720-v1" \
-d '{"prompt":"An orchid unfolding in soft light","resolution":"720p","duration":5,"audio":true,"max_cost_usd":1.60}' {"id":"vid_example","status":"queued","quoted_usd":1.0,"quoted_usd_per_output_second":0.2}3. Poll, then download
Save the returned ID. Poll every 10–15 seconds until a terminal status. Download only after succeeded.
JOB_ID="vid_replace_with_returned_id"
curl "$SEEDROUTER_BASE_URL/videos/$JOB_ID" \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"
# After status becomes succeeded:
curl --fail "$SEEDROUTER_BASE_URL/videos/$JOB_ID/content" \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" -o video.mp4Request parameters
Send JSON. Unknown fields are rejected. These parameters apply to quote and generation requests.
| Field | Type / default | Behavior |
|---|---|---|
prompt | Required string | 1–30,000 characters after trimming. |
resolution | Required enum | 480p, 720p, or 1080p. |
duration | Integer · default 5 | 4–30 output seconds. Edit mode derives output length from its source. |
aspect_ratio | Enum · default 16:9 | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive. Availability depends on input mode. |
mode | generate | edit | Defaults to generate. Edit requires a source video. |
audio | Boolean · default false | Keep the generated soundtrack when true; strip it when false. |
first_frame | HTTPS URL | Exact first-frame mode. Cannot combine with any reference array. |
end_frame | Optional HTTPS URL | Closing frame; requires first_frame. Use adaptive aspect ratio and no reference arrays. Supported routes only; 4–30 seconds at 480p, 720p, or 1080p. |
reference_images | URL array · default [] | Up to 30 images on compatible routes. |
reference_videos | URL array · default [] | Up to 10 videos, 2–30 seconds each, at most 30 seconds total. |
reference_audio | URL array · default [] | Up to 10 audio files, 2–30 seconds each, at most 30 seconds total. |
reference_video_seconds / reference_audio_seconds | Optional positive numbers | Duration hints; the deployed API probes actual media lengths. |
has_real_face | Boolean · default false | Declare real-person face inputs. Standard routing is not qualified for them. |
tier | standard | economy | Default standard. Economy 480p also requires the opt-in below. |
allow_unverified_provider | Boolean · default false | Explicit opt-in for Economy 480p with unverified model provenance. |
quality_mode | native | Native output only. Upscaling cannot be requested. |
max_cost_usd | Positive number | Required for customer generation when enabled; at most $100. The highest eligible displayed provider price is reserved. The successful provider’s saved quote is charged, including a 10% markup. More expensive routes are excluded by this cap. |
max_wait_s | Integer · 1–86400 | Filters routes by expected latency. This is not a job deadline or cancellation timer. |
Bring your references.
Upload media to directly downloadable HTTPS storage before submitting. Your computer’s local file paths are not accepted. URLs must remain accessible throughout generation. The service measures audio/video duration before routing.
Images + audio at 1080p
{
"prompt": "Use the character in the images walking through a sunny garden.",
"resolution": "1080p",
"duration": 5,
"reference_images": ["https://your-storage.example/character.jpg"],
"reference_audio": ["https://your-storage.example/ambience.mp3"],
"audio": true,
"max_cost_usd": 4
}Image and audio support does not guarantee acceptance of every combination. A 20-image plus audio test passed at 720p. Real-person identity matching and audio-only conditioning are not broadly qualified.
Edit existing footage
Set mode: "edit", place the source first in reference_videos, and omit duration. The source must be 4–30 seconds; output follows its duration and aspect ratio. This mode currently has one compatible route, so it has no fallback. Generative subject replacement is not a guarantee of exact face or identity preservation.
{
"prompt": "Replace the cat with the illustrated dog in the reference image.",
"resolution": "1080p",
"mode": "edit",
"reference_videos": ["https://your-storage.example/source.mp4"],
"reference_images": ["https://your-storage.example/dog.png"],
"max_cost_usd": 5
}Economy 480p
Include "tier": "economy" and "allow_unverified_provider": true. This route’s model provenance is unverified. It does not support exact first-frame requests or currently priced video-reference requests; compatible standard routes can take over.
Prepaid API credits
Add $10, $25, $50, $100, or $1,000 through Stripe Checkout in the dashboard when enabled. $1 paid adds $1 of API credit, and works for every model on Revana. There is no subscription or automatic recharge. Only confirmed payments add credits; refunds and disputes adjust the balance. Generations reserve the highest displayed route price and charge only the successful route’s quote once. Failed requests release their hold.
Jobs, retries, and cost control
Quotes return the compatible routes, cheapest first, numbered Provider 1, Provider 2, and so on. Each contains label, quoted_usd, and estimated_seconds. Primary and recovery routes have different tariffs. The final recovery route adds $0.12 once per job. reserved_usd is the highest enabled route price; quoted_usd is the starting price. Compatibility, availability, and max_cost_usd may leave fewer routes.
After a definitive failure, the next compatible route is attempted. Only the successful route is charged, and the rest of the hold is released. Status responses expose selected_provider, used_backup, and recovery_message, with route labels and provider names. A timeout or uncertain submission is reviewed before another paid generation, since the original may still complete.
| Status | Meaning |
|---|---|
| queued | Waiting for an available generation slot. |
| running | Submission, generation, or output processing is in progress. |
| succeeded | MP4 ready; result contains URL, dimensions, duration, codec, audio flags, and size. |
| failed | Terminal failure. Inspect error_code before taking further action. |
| needs_reconciliation | Submission, billing, or output outcome requires operator review. Do not resubmit with a new key. |
GET /v1/videos/:id also returns quoted_usd, cost_usd (null until available), timestamps, resolution, mode, duration, and a nullable result object. Customer cost is the successful provider’s saved quote on success and zero on failure. Unresolved jobs keep their hold pending review.
A repeated idempotency key with identical request JSON returns the existing job (HTTP 200). A new job returns HTTP 202. Reusing the key with different request values returns HTTP 409. Keep the same payload, including defaults, when retrying.
Fallback happens after definitive rejection or a failure with a known charge, provided the next compatible estimate fits the remaining cap. An ambiguous submission, timeout after acceptance, or unknown charge stops for review. References and requested resolution are never silently dropped.
There are no cancellation, webhook, or job-list endpoints in this version. Private beta processes two generation jobs concurrently; additional jobs queue.
Handle errors explicitly.
| HTTP status | Meaning |
|---|---|
| 400 | Invalid JSON, unknown/invalid fields, inaccessible media, or incompatible input combination. |
| 401 | Missing or incorrect bearer key. |
| 404 | Unknown endpoint or job ID. |
| 409 | Idempotency payload conflict, or MP4 requested before it is ready. |
| 413 | Request body exceeds 1 MiB. |
| 422 | No compatible generation route within the supplied constraints. |
| 500 | Internal server error. Retry submission only with the original idempotency key. |
A quote can return HTTP 200 with available: false and null price fields. Terminal job errors use generation_credit_unavailable, generation_failed, or review_required. Contact the operator for balance or reconciliation issues.
Endpoint reference
| Method | Path | Purpose |
|---|---|---|
| POST | /v1/route | Compatible quote; no generation. |
| POST | /v1/videos | Create or retrieve an idempotent generation job. |
| GET | /v1/videos/:id | Read job status and result metadata. |
| GET | /v1/videos/:id/content | Authenticated MP4 download. |
| GET | /v1 | API information and documentation link; no bearer key required. |