Retour à la documentation

API de génération vidéo

Créez des tâches Veo 3.1 texte-vers-vidéo et image-vers-vidéo avec votre clé API, puis suivez-les avec le même endpoint /api/status que pour les images.

Nano AI API URL de base: https://nanobnana.com

Authentification

Envoyez votre clé API comme jeton Bearer dans chaque requête. Utilisez la même clé pour créer une tâche et pour consulter son statut. Vous pouvez créer des clés sur la page API Keys de votre tableau de bord.

http
Authorization: Bearer YOUR_API_KEY

Modèles et crédits

Renseignez le champ model avec l’une des valeurs ci-dessous. Toute autre valeur est refusée avec HTTP 400 et rien n’est débité.

valeur de modelModèleTexte vers vidéo (crédits)Image vers vidéo (crédits)
veo3_fastVeo 3.1 Fast (par défaut)2535
veo3Veo 3.1 Quality180180

veo3-fast est accepté comme alias de veo3_fast. Sans model, veo3_fast est utilisé. Le tarif image vers vidéo s’applique dès que image_urls contient au moins une URL.

Créer une tâche vidéo

Valide la requête, débite les crédits et renvoie un task_id. La vidéo est générée de façon asynchrone : interrogez /api/status ou indiquez callback_url pour recevoir le résultat.

Corps de la requêteJSON
prompt:string

Description textuelle de la vidéo à générer.

model:facultatifstring

veo3_fast (alias veo3-fast) ou veo3. Toute autre valeur renvoie HTTP 400. Valeur par défaut veo3_fast.

image_urls:facultatifstring[]

URL publiques d’images pour l’image vers vidéo. Avec 1 image, la vidéo se construit autour de cette image. Avec 2 images, elles deviennent la première et la dernière image. imageUrls (camelCase) est accepté comme alias. Si les deux champs sont envoyés, image_urls est utilisé.

aspect_ratio:facultatifstring

16:9, 9:16 ou Auto. Auto recadre la vidéo selon l’image envoyée. Valeur par défaut 16:9.

translation:facultatifboolean

Si true, le prompt est traduit en anglais avant la génération. Valeur par défaut true.

watermark:facultatifstring

Texte du filigrane ajouté à la vidéo.

callback_url:facultatifstring

URL publique qui reçoit une requête POST avec le résultat final à la fin de la tâche.

Champs non pris en charge

duration, resolution et image_url (au singulier) ne font pas partie de cette API et sont ignorés. La durée de la vidéo dépend du modèle. Envoyez les images dans un tableau image_urls.

bash
curl -X POST "https://nanobnana.com/api/video/generate" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "The camera slowly pushes in as the city lights turn on at dusk",
    "model": "veo3_fast",
    "image_urls": ["https://example.com/first-frame.jpg"],
    "aspect_ratio": "16:9"
  }'
{
  "code": 200,
  "message": "success",
  "data": {
    "task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv"
  }
}

Vérifier le statut d’une tâche

Les identifiants de tâches vidéo commencent par veo et se terminent par bksv. /api/status les reconnaît automatiquement et renvoie l’URL de la vidéo une fois la tâche terminée.

Paramètres de requête
task_id:string

Le task_id renvoyé par POST /api/video/generate.

model:facultatifstring

Indiquez veo3 pour forcer la recherche vidéo si le task_id ne suit pas le format veo…bksv.

bash
curl "https://nanobnana.com/api/status?task_id=veo24223f74e4f445ec9c4403b532cc328fbksv" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "code": 200,
  "message": "success",
  "data": {
    "task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv",
    "request": {
      "prompt": "The camera slowly pushes in as the city lights turn on at dusk",
      "model": "veo3_fast",
      "image_urls": [
        "https://example.com/first-frame.jpg"
      ],
      "aspect_ratio": "16:9"
    },
    "response": null,
    "status": "IN_PROGRESS",
    "status_code": 3,
    "status_text": "IN_PROGRESS",
    "consumed_credits": 35,
    "created_at": "2026-10-04 17:05:12",
    "model": "veo3"
  },
  "model": "veo3"
}

Valeurs du statut

  • IN_PROGRESS · status_code: 3 — la vidéo est encore en cours de génération. Continuez à interroger.
  • COMPLETED · status_code: 1 — la vidéo est prête. response contient l’URL de la vidéo.
  • FAILED · status_code: 2 — la génération a échoué. error_message en donne la raison et les crédits sont remboursés automatiquement.

Facturation et remboursements

  • Les crédits sont débités à la création de la tâche, avant le début de la génération.
  • Si la requête de création ne renvoie pas HTTP 200, aucune tâche n’existe et les crédits débités sont remboursés immédiatement. La réponse indique le nombre de crédits remboursés.
  • Si une tâche créée se termine ensuite en FAILED, ses crédits sont remboursés automatiquement et consumed_credits passe à 0 dans la réponse de statut.

Exemple d’interrogation

La génération d’une vidéo prend généralement quelques minutes. Interrogez toutes les 10 secondes tant que status_code vaut 3, et arrêtez-vous à 1 ou 2.

javascript
async function waitForVideo(taskId) {
  while (true) {
    const res = await fetch(`https://nanobnana.com/api/status?task_id=${taskId}`, {
      headers: { Authorization: 'Bearer YOUR_API_KEY' }
    });
    const payload = await res.json();
    if (!res.ok) throw new Error(payload.message);

    const task = payload.data;
    if (task.status_code === 1) return task.response[0];
    if (task.status_code === 2) throw new Error(task.error_message || 'Video generation failed');

    await new Promise((resolve) => setTimeout(resolve, 10000));
  }
}

Callback

Si vous indiquez callback_url, nous envoyons une requête POST avec ce JSON quand la tâche se termine ou échoue. L’URL doit être accessible depuis Internet.

{
  "code": 200,
  "message": "success",
  "data": {
    "request": {
      "prompt": "The camera slowly pushes in as the city lights turn on at dusk",
      "model": "veo3_fast",
      "image_urls": [
        "https://example.com/first-frame.jpg"
      ],
      "aspect_ratio": "16:9"
    },
    "response": [
      "https://example.com/generated-video.mp4"
    ],
    "status": "COMPLETED",
    "created_at": "2026-10-04 17:05:12"
  }
}

Erreurs courantes

{
  "code": 400,
  "message": "prompt is required",
  "data": null
}