Jobs, queues, webhooks, idempotence
Ship against what exists
Buyers compare APIs on webhooks and retries. Here is the live contract, not a roadmap dressed as a feature list.
No video-completion webhook today. Generation endpoints are synchronous. Billing webhooks (Stripe, Mollie, Dodo) are internal payment events, not a public job API.
Comparison
| Concern | Nano Banana Video today | What you implement |
|---|---|---|
| Models | seedance2, veo3 (MiniMax H3), sora2 | Pass video_model |
| Queue / rate limit | 15 POSTs / 30 min, headers on every generation | Honor Retry-After |
| Job completion | URL in the POST response. Optional GET status | No subscriber URL to register |
| Webhooks | Not offered for video jobs | Keep your own queue if the HTTP call is too long for a browser |
| Errors | JSON error + HTTP status (400–429, 500) | Error catalog |
| Idempotence | Writes are not idempotent. Reads by video_id are safe to retry | Dedupe on your side before POST |
Recommended worker pattern
- Your user clicks Generate. Enqueue
{prompt, image_url, client_job_id}in your database. - A worker POSTs to Nano Banana. On 429, sleep Retry-After. On 200, store
video_idandvideo_url. - If the worker dies after a 200, GET /api/v1/video-status.php instead of POSTing again.
Status lookup
GET /api/v1/video-status.php
curl "https://nanobananavideo.com/api/v1/video-status.php?video_id=vid_a1b2c3d4" \ -H "Authorization: Bearer nb_YOUR_API_KEY"
When a completion webhook ships, this page will say so. Until then, treat sync + status as the contract.