n8n × PopNow
Générer des images et vidéos IA dans n8n
Rien à installer : le nœud HTTP Request intégré à n8n appelle directement l’API PopNow, sur n8n Cloud comme en auto-hébergement. Collez le workflow, ajoutez votre clé et lancez.
Configuration en quatre étapes
- Dans n8n, ajoutez un identifiant Header Auth. Name : Authorization. Value : Bearer, une espace, puis votre clé sk-popnow-.
- Copiez le workflow ci-dessous et collez-le sur un canevas vide avec Ctrl + V (Cmd + V sur Mac).
- Ouvrez le nœud Create task, choisissez l’identifiant, puis changez le modèle et le prompt.
- Lancez-le. Le dernier nœud renvoie l’URL du fichier ; ajoutez ensuite un nœud Google Drive, Slack ou S3 pour le conserver.
Le workflow
Créer la tâche, attendre, la vérifier, recommencer jusqu’à la fin, puis passer le lien du fichier au nœud suivant.
- Start
- Create task
- Wait 5 seconds
- Check task
- Done?
- File URL
↺ Done? → Wait 5 seconds
{
"name": "PopNow: generate and get the file",
"nodes": [
{
"id": "b1f0c1a2-0001-4c55-9a10-000000000001",
"name": "Start",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
0
],
"parameters": {}
},
{
"id": "b1f0c1a2-0002-4c55-9a10-000000000002",
"name": "Create task",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
220,
0
],
"parameters": {
"method": "POST",
"url": "https://api.popnow.ai/api/v1/jobs/createTask",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Idempotency-Key",
"value": "={{ $execution.id }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\n \"model\": \"google/nano-banana-2.1/text-to-image\",\n \"input\": {\n \"prompt\": \"A ceramic teapot on a linen cloth, soft window light, muted palette\",\n \"aspect_ratio\": \"16:9\",\n \"resolution\": \"1k\",\n \"output_format\": \"png\"\n }\n}",
"options": {}
}
},
{
"id": "b1f0c1a2-0003-4c55-9a10-000000000003",
"name": "Wait 5 seconds",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
440,
0
],
"parameters": {
"amount": 5
},
"webhookId": "4d3c2b1a-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
},
{
"id": "b1f0c1a2-0004-4c55-9a10-000000000004",
"name": "Check task",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
660,
0
],
"parameters": {
"url": "https://api.popnow.ai/api/v1/jobs/recordInfo",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "taskId",
"value": "={{ $('Create task').item.json.data.taskId }}"
}
]
},
"options": {}
}
},
{
"id": "b1f0c1a2-0005-4c55-9a10-000000000005",
"name": "Done?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
880,
0
],
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"id": "c0ffee00-0000-4000-8000-000000000001",
"leftValue": "={{ ['succeeded','failed','canceled','expired'].includes($json.data.state) && !($json.data.output?.assets ?? []).some(a => a.pending && !a.unavailable) }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
}
},
{
"id": "b1f0c1a2-0006-4c55-9a10-000000000006",
"name": "File URL",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1100,
-100
],
"parameters": {
"assignments": {
"assignments": [
{
"id": "c0ffee00-0000-4000-8000-000000000002",
"name": "state",
"value": "={{ $json.data.state }}",
"type": "string"
},
{
"id": "c0ffee00-0000-4000-8000-000000000003",
"name": "fileUrl",
"value": "={{ $json.data.output?.assets?.[0]?.url ?? '' }}",
"type": "string"
},
{
"id": "c0ffee00-0000-4000-8000-000000000004",
"name": "error",
"value": "={{ $json.data.errorMessage ?? '' }}",
"type": "string"
}
]
},
"options": {}
}
}
],
"connections": {
"Start": {
"main": [
[
{
"node": "Create task",
"type": "main",
"index": 0
}
]
]
},
"Create task": {
"main": [
[
{
"node": "Wait 5 seconds",
"type": "main",
"index": 0
}
]
]
},
"Wait 5 seconds": {
"main": [
[
{
"node": "Check task",
"type": "main",
"index": 0
}
]
]
},
"Check task": {
"main": [
[
{
"node": "Done?",
"type": "main",
"index": 0
}
]
]
},
"Done?": {
"main": [
[
{
"node": "File URL",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait 5 seconds",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}Du JSON n8n standard. Le modèle et l’input viennent de cette page : ils passent la validation tels quels.
Ce qu’il faut modifier
Maîtriser les dépenses. Dans la console, donnez à la clé n8n son propre plafond quotidien et ses modèles autorisés. Une boucle qui s’emballe s’arrête alors au plafond au lieu de vider votre solde.
model- Le nom du modèle. Chaque page de modèle de la section API l’affiche, avec un bouton de copie.
input- Le prompt et les options de ce modèle. Sa page API liste chaque champ, sa plage et sa valeur par défaut.
callBackUrl- Facultatif. Pointez-la vers un nœud Webhook n8n et supprimez la boucle d’attente : nous y envoyons la tâche terminée.
Idempotency-Key- Déjà réglée sur l’identifiant d’exécution : un nœud relancé ne paie jamais deux fois la même exécution.
De bons modèles pour commencer
Des choix rapides et bien placés en prix pour l’automatisation. Chaque lien affiche le nom du modèle, ses paramètres et son prix.
Questions sur n8n
Faut-il un nœud communautaire PopNow ?
Non. Le workflow n’utilise que des nœuds fournis avec n8n : Manual Trigger, HTTP Request, Wait, If et Edit Fields. Il fonctionne sur n8n Cloud comme en auto-hébergement.
Comment utiliser des images issues de nœuds précédents ?
Passez un lien https public dans le champ image. Si le fichier n’existe que dans n8n, envoyez-le d’abord via l’API et utilisez la référence popnow:// renvoyée.
Combien coûte une exécution ?
Les mêmes crédits que sur le site, à l’appel. Une image Nano Banana coûte quelques crédits ; la vidéo est facturée à la seconde. Les tâches échouées sont remboursées.
Combien de temps dure une exécution ?
Les images sont en général prêtes en moins d’une minute, les vidéos en quelques minutes. La boucle vérifie toutes les cinq secondes ; avec une callBackUrl, vous n’attendez pas du tout.

