n8n × PopNow

n8n에서 AI 이미지와 영상 만들기

설치할 것이 없습니다. n8n 기본 HTTP Request 노드가 PopNow API를 직접 호출하므로 n8n Cloud와 자체 호스팅 모두에서 동작합니다. 워크플로를 붙여 넣고 키만 넣으면 실행됩니다.

네 단계로 설정하기

  1. n8n에서 Header Auth 자격 증명을 추가합니다. Name은 Authorization, Value는 Bearer와 공백 한 칸, 그 뒤에 sk-popnow-(으)로 시작하는 키입니다.
  2. 아래 워크플로를 복사해 빈 캔버스에 Ctrl + V(Mac은 Cmd + V)로 붙여 넣습니다.
  3. Create task 노드를 열어 자격 증명을 고르고, 모델과 프롬프트를 바꿉니다.
  4. 실행합니다. 마지막 노드가 파일 URL을 주니, 뒤에 Google Drive, Slack, S3 노드를 붙여 파일을 보관하세요.

워크플로

작업을 만들고, 기다리고, 확인하고, 끝날 때까지 반복한 뒤 파일 링크를 다음 노드로 넘깁니다.

  1. Start
  2. Create task
  3. Wait 5 seconds
  4. Check task
  5. Done?
  6. File URL

↺ Done? → Wait 5 seconds

popnow-workflow.json
{
  "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"
  }
}

그대로 쓰는 n8n JSON입니다. 모델과 input은 이 페이지에서 가져와 그대로 검증을 통과합니다.

바꿀 곳

지출 관리하기. 콘솔에서 n8n용 키에 일일 한도와 허용 모델을 따로 정해 두세요. 반복이 멈추지 않아도 한도에서 멈춰 잔액을 다 쓰지 않습니다.

model
모델 이름입니다. API 섹션의 각 모델 페이지에 복사 버튼과 함께 나와 있습니다.
input
그 모델의 프롬프트와 옵션입니다. 모델의 API 페이지에 모든 필드의 범위와 기본값이 있습니다.
callBackUrl
선택 사항입니다. n8n Webhook 노드를 가리키면 대기 반복이 필요 없습니다. 완료된 작업을 그곳으로 보내 드립니다.
Idempotency-Key
실행 ID가 들어가 있어서, 노드를 다시 시도해도 같은 실행에 두 번 청구되지 않습니다.

처음 쓰기 좋은 모델

자동화에 알맞은 빠르고 합리적인 모델입니다. 링크를 열면 모델 이름, 파라미터, 가격을 볼 수 있습니다.

n8n 질문

PopNow 커뮤니티 노드가 필요한가요?

아닙니다. 이 워크플로는 n8n에 기본으로 들어 있는 Manual Trigger, HTTP Request, Wait, If, Edit Fields 노드만 씁니다. n8n Cloud와 자체 호스팅 모두에서 동작합니다.

앞 노드의 이미지를 쓰려면 어떻게 하나요?

이미지 필드에 공개 https 링크를 넘기세요. 파일이 n8n 안에만 있다면 먼저 API로 업로드한 뒤 돌려받은 popnow:// 참조를 쓰세요.

한 번 실행하는 데 얼마인가요?

웹사이트와 같은 크레딧으로 호출마다 청구됩니다. Nano Banana 이미지는 몇 크레딧이고, 영상은 초 단위로 청구됩니다. 실패한 작업은 환불됩니다.

한 번 실행하는 데 얼마나 걸리나요?

이미지는 보통 1분 안에, 영상은 몇 분 안에 끝납니다. 대기 반복은 5초마다 확인하며, callBackUrl을 쓰면 기다릴 필요가 없습니다.