Quickstart
One key, one request shape, every image and video model. Submit a job, poll it, get the file.
| Base URL | https://api.revana.si/v1 |
| Auth | Authorization: Bearer <key> |
| Submit | POST /v1/generations |
| Poll | GET /v1/generations/{id} |
| Format | JSON in, JSON out. Prices in USD. |
Authentication
Create a key from your account, then send it as a bearer token on every request. Keep it on your server; never ship it in a browser or mobile app.
Submit a generation
Send the model id and its input. The response comes back straight away with a generation id and status queued; the work happens in the background.
| Field | Type | Description |
|---|---|---|
model | string, required | A model id from the models page, e.g. veo-3.1-fast. |
input | object, required | The prompt and settings. Which fields a model accepts is listed on its page. |
Get the result
Poll every few seconds until status is succeeded or failed. Images usually take seconds; video takes from under a minute to several minutes depending on the model and length.
A finished generation:
Input fields
The same names are used across models. If a model doesn’t support a field or value, the request is rejected with 422 before anything is charged.
| Field | Type | Used for |
|---|---|---|
prompt | string | What to generate. Required for text-to-image and text-to-video. |
image_url | string (URL) | Start frame for image-to-video, or the image to edit for image-to-image. |
end_image_url | string (URL) | Last frame, for models with first + last frame. |
image_urls | string[] | Reference images, up to the model’s limit. |
resolution | string | 720p, 1080p, 2K... one of the model’s resolutions. |
duration | number | Video length in seconds, one of the model’s durations. |
aspect_ratio | string | 16:9, 9:16, 1:1... |
audio | boolean | Generate sound with the video, where the model supports it. May change the price. |
Generation object
| Field | Type | Description |
|---|---|---|
id | string | Generation id, used to poll. |
model | string | The model you asked for. |
status | string | See statuses. |
output | object | null | When succeeded: urls, a list of result files. Download them promptly; links expire. |
cost_usd | number | null | What was charged. Set once the generation succeeds; 0 when it fails. |
attempts | number | Routes tried, including fallbacks. Only the successful one is billed. |
error | object | null | When failed: code and message. |
created_at, completed_at | string | ISO 8601 timestamps. |
Statuses
| Status | Meaning |
|---|---|
queued | Accepted, waiting for a route. |
running | Generating. If a route fails, the job stays running while it moves to the next one. |
succeeded | Done. output.urls holds the files and cost_usd what you paid. |
failed | Every route failed or the input was refused. Nothing is charged. |
Billing
- You pay from prepaid USD credits, bought in packs from $10 to $5,000.
- When you submit, the job’s price is held from your balance. If it fails, the hold is released.
- Only the route that succeeds is charged. Failed attempts on other routes cost nothing.
- Each model’s price is on its page and in the price table.
Errors
Errors use HTTP status codes and a JSON body: {"error": {"code": "...", "message": "..."}}.
| HTTP | Code | When |
|---|---|---|
| 401 | unauthorized | Missing or invalid API key. |
| 402 | insufficient_credits | Your balance doesn’t cover the job. Top up and retry. |
| 404 | not_found | Unknown model id or generation id. |
| 422 | invalid_input | A field or value the model doesn’t support. |
| 429 | rate_limited | Too many requests. Back off and retry. |
| 5xx | server_error | Something broke on our side. Safe to retry. |
Model list
Every model, its options and prices are published as JSON at /data/models.json, the same file this site renders from.