Dépannage
Les solutions aux problèmes les plus fréquents, d’un 401 au premier appel jusqu’au webhook qui n’arrive jamais.
Trouvez le symptôme, appliquez la solution. Si rien ici ne vous aide, contactez le support avec le request_id.
Le premier appel échoue
401 « Missing credentials ». L’en-tête Authorization n’est pas arrivé. Vérifiez que la variable d’environnement est définie dans le shell ou le processus qui exécute la requête (echo ${POPNOW_API_KEY:0:10} doit afficher sk-popnow-) et qu’aucun proxy ni aucune bibliothèque HTTP ne supprime l’en-tête.
401 « Key format is not recognized ». La valeur n’est pas une clé PopNow — souvent autre chose resté dans le presse-papiers. Les clés commencent par sk-popnow-.
401 « Credentials are invalid or expired ». La clé a été révoquée, a expiré ou a été mal saisie. Créez-en une nouvelle dans la console API.
40310. L’adresse e-mail de votre compte n’est pas vérifiée. Ouvrez le lien de l’e-mail d’inscription ; la clé fonctionne aussitôt après.
40201 « Insufficient balance ». Le compte n’a pas assez de crédits pour la réservation de cette tâche. Les réservations vidéo peuvent être importantes ; vérifiez le prix avec jobs/quote et achetez des crédits.
La requête est refusée
400 qui cite un champ. L’input ne correspond pas au schéma du modèle : champ mal orthographié, valeur hors de la liste autorisée ou champ obligatoire manquant. Ouvrez la page de référence du modèle depuis Modèles et comparez.
400 « Invalid callback URL ». La callBackUrl doit être en HTTPS public, sur le port 443, sans nom d’utilisateur ni mot de passe. localhost et les adresses privées sont refusés.
40004. Le modèle fonctionne, mais ne peut pas servir cette combinaison de réglages pour l’instant. Modifiez le réglage cité dans msg (souvent la résolution, la durée ou le format d’image).
50301. Le modèle ne peut temporairement pas prendre de tâches. Réessayez plus tard ou choisissez un autre modèle.
413. Le corps JSON dépasse 2 Mio, généralement à cause d’images en ligne. Envoyez-les plutôt en fichiers.
La tâche échoue
invalid_asset. Un fichier de référence n’a pas pu être récupéré ou lu. Ouvrez l’URL dans une fenêtre de navigation privée : elle doit télécharger le fichier lui-même, sans connexion. Les pages de partage des services de stockage ne fonctionnent pas.
content_rejected. Le modèle a refusé le prompt ou une image de référence. Reformulez, changez de références ou essayez un autre modèle.
timeout ou expired. Le travail a duré plus longtemps que permis. Essayez une durée plus courte ou une résolution plus basse.
generation_failed. Le modèle a tourné sans rien produire. La même entrée échoue souvent de nouveau ; modifiez le prompt ou les réglages.
Les tâches en échec ou expirées ne consomment pas de crédits.
Le résultat
Le lien de téléchargement renvoie 403 ou « expired ». Les liens signés durent une vingtaine de minutes. Relisez la tâche avec recordInfo pour obtenir un nouveau lien.
Le lien de téléchargement échoue quand j’envoie ma clé API. N’envoyez pas d’Authorization au lien signé : le lien est lui-même l’autorisation.
recordInfo renvoie 404 pour une tâche que j’ai créée. Les tâches ne sont visibles que par la clé qui les a créées. Utilisez la même clé, ou retrouvez la tâche dans la console API.
Webhooks
Rien n’arrive. Vérifiez que l’URL est joignable depuis Internet en HTTPS, que votre pare-feu l’autorise et que votre gestionnaire répond 2xx en moins de 15 secondes. Les livraisons en échec sont listées dans la console API.
La signature ne correspond jamais. Hachez les octets bruts du corps, pas un objet JSON resérialisé ; utilisez data.taskId, l’en-tête X-Webhook-Timestamp et le secret que vous avez généré en dernier.
La même tâche arrive deux fois. C’est attendu après une nouvelle tentative. Ignorez les doublons grâce à request_id.
Envois
Le PUT renvoie 403 depuis le stockage. Un en-tête diffère du ticket. Envoyez Content-Type et Content-Length exactement tels quels, sans en-tête Authorization.
La validation renvoie 40003. Le fichier envoyé ne correspond pas à ce que vous avez déclaré. Demandez un nouveau ticket avec le bon contentType et les bons bytes.
La validation renvoie 409. Le ticket a expiré (au bout d’une vingtaine de minutes). Demandez-en un juste avant l’envoi.

