The Doro API generates images and videos with the same engines as the site. You send the request, follow its progress and download the result. Every response is JSON.
Create a key in your account and send it on every call, in the Authorization: Bearer header. The key is shown only once; keep it like a password and never put it in code that runs in a browser. Once revoked, it stops immediately.
curl https://dorovisual.com/v1/saldo \ -H "Authorization: Bearer doro_xxxxxxxxxxxx_..."
Prepaid balance only, in US dollars only: you top up in USD (minimum US$ 10) and each generation deducts its price. No monthly fee, and the balance never expires.
Credits from the site's plans don't pay for the API. Even subscribers use the dollar balance here.
The amount is reserved when the generation is created. If it fails, is rejected or cancelled, the full amount goes back to your balance. Without enough balance, the response is 402 and nothing is created or charged.
You pay for the real unit of usage: per second of video and per image, by resolution. Use /v1/estimativa to get the exact price before generating.
| Engine | motor | Resolution | Price (USD) |
|---|---|---|---|
| Seedance 2.0 | seedance_2_0 | 720p | US$ 0.92 per second |
| Omni Flash 1.1 | omni_flash_1_1 | 720p | US$ 0.36 per second |
| Omni Flash 1.1 | omni_flash_1_1 | 1080p | US$ 0.51 per second |
| Hailuo 3 | hailuo_h3 | 768P | US$ 0.27 per second |
| Hailuo 3 | hailuo_h3 | 2K | US$ 0.43 per second |
| Hailuo 3 Max | hailuo_h3_max | 480P | US$ 0.19 per second |
| Hailuo 3 Max | hailuo_h3_max | 768P | US$ 0.27 per second |
| Kling 2.5 Turbo | kling_2_5 | — | US$ 0.23 per second |
| Kling 3.0 | kling_3_0 | — | US$ 0.53 per second |
| Kling 3.0 Omni | kling_3_0_omni | — | US$ 0.43 per second |
| Grok Imagine 1.5 | grok_imagine_1_5 | 480p | US$ 0.27 per second |
| Grok Imagine 1.5 | grok_imagine_1_5 | 720p | US$ 0.45 per second |
| Grok Imagine 1.5 | grok_imagine_1_5 | 1080p | US$ 0.77 per second |
| FLUX 3 Video | flux_3_video | 720p | US$ 0.53 per second |
| FLUX 3 Video | flux_3_video | 1080p | US$ 0.89 per second |
| FLUX 3 Video Draft | flux_3_video_draft | — | US$ 0.19 per second |
| Wan 3.0 | wan_3_0 | 480p | US$ 0.17 per second |
| Wan 3.0 | wan_3_0 | 720p | US$ 0.31 per second |
| Wan 3.0 | wan_3_0 | 1080p | US$ 0.61 per second |
| Seedance 2.5 | seedance_2_5 | 480p | US$ 0.69 per second |
| Seedance 2.5 | seedance_2_5 | 720p | US$ 1.43 per second |
| Seedance 2.5 | seedance_2_5 | 1080p | US$ 3.51 per second |
| Engine | motor | Resolution | Price (USD) |
|---|---|---|---|
| Nano Banana Pro | nano_banana_pro | 1K | US$ 0.45 per image |
| Nano Banana Pro | nano_banana_pro | 2K | US$ 0.45 per image |
| Nano Banana Pro | nano_banana_pro | 4K | US$ 0.90 per image |
| GPT Image 2.5 Sunburst | gpt_image_2_5_sunburst | — | US$ 0.71 per image |
| GPT Image 2.5 Flare | gpt_image_2_5_flare | — | US$ 0.71 per image |
| Nano Banana 2 | nano_banana_2 | 1K | US$ 0.31 per image |
| Nano Banana 2 | nano_banana_2 | 2K | US$ 0.41 per image |
| Nano Banana 2 | nano_banana_2 | 4K | US$ 0.51 per image |
| Muse Image | muse_image | — | US$ 0.11 per image |
| Seedream 5.0 Pro | seedream_5_pro | 1.5K | US$ 0.31 per image |
| Seedream 5.0 Pro | seedream_5_pro | 2K | US$ 0.51 per image |
| Seedream 5.0 Lite | seedream_5_lite | — | US$ 0.21 per image |
| FLUX 3 | flux_3 | 1K | US$ 0.31 per image |
| FLUX 3 | flux_3 | 2K | US$ 0.81 per image |
| Recraft V4 | recraft_v4 | — | US$ 0.21 per image |
| Recraft V4 Pro | recraft_v4_pro | — | US$ 0.81 per image |
Base: this site's address. Money amounts are whole US cents.
/v1/motoresLists the engines, accepted parameters (values and defaults), accepted references and the price per unit in dollars. Filter with ?tipo=imagem or ?tipo=video.
curl https://dorovisual.com/v1/motores -H "Authorization: Bearer $DORO_KEY"
/v1/estimativaTells you what a generation costs in dollars, without creating anything.
curl https://dorovisual.com/v1/estimativa -H "Authorization: Bearer $DORO_KEY" \
-H "Content-Type: application/json" \
-d '{"motor": "seedance_2_0", "params": {"duracao": 5, "resolucao": "720p"}}'
/v1/geracoesCreates a generation and returns 201 with it in "criando". Fields: motor, prompt, params (optional; missing ones use the default) and webhook_url (optional). It is always charged to the dollar balance.
curl https://dorovisual.com/v1/geracoes -H "Authorization: Bearer $DORO_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-123" \
-d '{"motor": "nano_banana_pro", "prompt": "a red fox in the snow, golden hour",
"params": {"resolucao": "2K", "proporcao": "16:9", "quantidade": 1},
"webhook_url": "https://example.com/doro/aviso"}'
With reference images, send multipart/form-data: the same fields as text (params as JSON) and each image in the referencias field (PNG, JPEG or WebP, up to 10 MB each).
curl https://dorovisual.com/v1/geracoes -H "Authorization: Bearer $DORO_KEY" \
-F motor=seedance_2_0 -F prompt="the fox starts to run" \
-F 'params={"duracao": 5}' -F [email protected]
{"geracao": {"id": "3f1c…", "motor": "Seedance 2.0", "tipo": "video", "estado": "criando",
"cobranca": "saldo", "valor": {"moeda": "USD", "centavos": 460}, "arquivos": [],
"estornado": false, "criado_em": "2026-10-06T12:00:00+00:00", "pronto_em": null}}
/v1/geracoes/<id>The generation status: criando, pronta, falhou or cancelada. When ready, "arquivos" lists the address of each file. "estornado": true when the amount has been refunded.
curl https://dorovisual.com/v1/geracoes/3f1c… -H "Authorization: Bearer $DORO_KEY"
/v1/geracoes/<id>/arquivos/<n>Redirects (302) to a temporary download link for the file. Use -L in curl to follow it.
curl -L -o resultado.mp4 https://dorovisual.com/v1/geracoes/3f1c…/arquivos/0 \ -H "Authorization: Bearer $DORO_KEY"
/v1/geracoes/<id>/cancelarCancels while the generation hasn't started and refunds the amount. After that, 409 nao_cancelavel.
/v1/geracoes?pagina=1Your account's generations through the API, newest first, 50 per page.
/v1/saldoYour dollar balance, in cents.
{"saldo": {"USD": 2000}}
Send the Idempotency-Key header (letters, digits, . _ : -, up to 128) on POST /v1/geracoes. Repeating the same key returns the same generation without charging again: safe to retry after a network error.
With webhook_url (https, port 443, public address), Doro sends a JSON POST when the generation finishes: {"evento": "geracao.terminada", "geracao": {...}}, the same body as the status call. 2xx responses count as delivered; up to 3 attempts. Redirects are not followed.
Doro-Signature: t=1760000000,v1=5f2b…
# Python
import hmac, hashlib
t, v1 = (p.split("=", 1)[1] for p in header.split(","))
esperado = hmac.new(segredo.encode(), f"{t}.".encode() + corpo, hashlib.sha256).hexdigest()
assert hmac.compare_digest(esperado, v1)
Check the Doro-Signature header: HMAC-SHA256 of your account secret (in the keys area) over "<t>.<body>". Reject notices with a t that is too old.
Per key: 3 generations in progress at once and 60 per hour; per account: 6 in progress and 120 per hour; and 120 calls per minute per key. Above that, 429 with the Retry-After header.
Every error is JSON: {"erro": "<code>"}, with "campo" on 400. The code text never changes; use it in your handling.
| HTTP | erro | |
|---|---|---|
| 400 | parametro | A field is outside what is accepted (its name comes in "campo"). |
| 401 | chave_invalida | Key missing, wrong or revoked. |
| 402 | sem_saldo | Your dollar balance doesn't cover the generation. Nothing was created. |
| 404 | nao_encontrada | It doesn't exist, or it isn't from your account. |
| 409 | nao_cancelavel | The generation has already started and can no longer be cancelled. |
| 429 | limite | Limit reached ("motivo" says which). Wait for Retry-After. |
| 503 | indisponivel | The engine is unavailable right now. Nothing was charged; try again. |
| 500 | interno | Our error. The "codigo" helps support find the case. |
We use cookies to understand how people find the site. None of it is needed to buy — declining changes nothing in your order. Learn more