n8n で作る AI 画像・動画のワークフロー
組み込みの HTTP Request ノードと PopNow API で、n8n から AI の画像・動画・音声を生成します。取り込めるワークフロー JSON、認証情報の設定、ポーリングの流れ、Webhook、よくあるエラーの直し方まで。
PopNow の利用に n8n のコミュニティノードは必要ありません。組み込みの HTTP Request ノードを 2 つと、Wait、If があれば、タスクを作成し、完了を待ち、ファイルを後続の処理に渡せます。同じ形で画像・動画・音声のすべてのモデルを扱えるので、プロンプトの一覧表を文字から画像のモデルに流したり、新しい商品写真を短い動画にしたり、台本を 1 行ずつ音声にしたりできます。
このページは popnow.ai の n8n ページと対応しており、そちらでは選んだモデル向けの同じワークフローを作れます。セルフホストの n8n では、PopNow のコミュニティノードも入れられます。Settings > Community Nodes > Install を開き、n8n-nodes-popnow と入力してください(npm、GitHub)。

必要なもの
- n8n 1.x(クラウド版またはセルフホスト)。HTTP Request ノードはバージョン 4 以降が必要です。
- API コンソールで発行した PopNow の API キー。n8n には専用のキーを 1 本作り、1 日の利用上限を設定してください。ループが暴走しても残高を使い切らずに済みます。
- 独立した USD 残高の API 資金。初期残高は $0 で、API billing で入金します。以下のモデルでテストすると 1 回 $0.01 かかります。ウェブサイトのクレジットでは支払えません。
1. 認証情報を作る
n8n で Credentials → Add credential → Header Auth を開き、次のように入力します。
| 項目 | 値 |
|---|---|
| Name | PopNow |
| Header name | Authorization |
| Header value | Bearer sk-popnow-…(あなたのキー。前に Bearer という単語と半角スペースを付けます) |
何かを作り始める前にキーを確認するには、ターミナルで次を実行してください。残高が表示されるだけで、料金はかかりません。
curl "https://api.popnow.ai/api/v1/chat/credit" \
-H "Authorization: Bearer $POPNOW_API_KEY"availableUsd、heldUsd、totalUsd は API 残高の USD 十進数文字列として読み取ってください。
2. ワークフローを取り込む
JSON をコピーし、n8n のキャンバスの空いている場所をクリックして貼り付けます。次に Create task と Check task を開き、両方で PopNow の認証情報を選んでください。
ワークフローの流れは Start → Create task → Wait 5 s → Check task → Finished? です。タスクがまだ実行中なら Wait に戻ります。完了すると File URL が state、fileUrl、error を出力します。
各ノードの役割は次のとおりです。
| ノード | 設定 | 理由 |
|---|---|---|
| Create task | POST /api/v1/jobs/createTask、JSON 本文 { "model", "input" } | model は モデルにある任意のモデル ID、input はそのモデルのスキーマに従う必要があります |
| Create task | ヘッダー Idempotency-Key: {{ $execution.id }} | n8n がノードを再試行しても、料金を二重に払わず同じタスクが返ります。冪等性を参照 |
| Wait 5 s | 5 秒 | 画像は通常 1〜2 回のループで終わり、動画は 1〜3 分かかります |
| Check task | GET /api/v1/jobs/recordInfo?taskId=… | タスクの state と output を読みます |
| Finished? | state が最終状態で、まだコピー中のファイルがない | succeeded、failed、expired が最終状態です。タスクを参照 |
| File URL | data.output.assets[0].url | 約 20 分間有効な署名付きリンク。ファイルを残す必要があれば、次のノードでダウンロードしてください |
モデルや入力を変える
Create task の JSON 本文を編集します。各モデルのページに ID、フィールド、料金が載っています。よく使う入れ替え例は次のとおりです。
| 目的 | model | input |
|---|---|---|
| 画像内の文字をより正確に | google/nano-banana-2.1/text-to-image | prompt、aspect_ratio、resolution(1K で $0.048) |
| 写真を編集する | google/nano-banana-2.1/edit | prompt、image_urls |
| 写真から動画 | minimax/h3/image-to-video | prompt、image_url、duration_seconds(768p で 5 秒 $0.185) |
| ナレーション | google/gemini-3.8-flash-tts/text-to-speech | text、voice_id |
前のノードのデータを使うには、本文を式(expression)に切り替えます。例:
{{ JSON.stringify({ model: 'alibaba/z-image-turbo/text-to-image', input: { prompt: $json.prompt, aspect_ratio: '16:9' } }) }}前のノードのファイルには、公開された https の URL か、先にアップロードしたものが必要です。メディアに 3 回のアップロード手順があり、それぞれを 1 つの HTTP Request ノードに対応させられます。
ポーリングの代わりに Webhook を使う
長い動画ジョブでは、ループする代わりに PopNow から n8n を呼び出してもらいます。2 つ目のワークフローに Webhook トリガーノード(POST)を追加し、その本番用 URL をコピーして、Create task の本文に callBackUrl として渡します。
{
"model": "minimax/h3/image-to-video",
"input": { "image_url": "https://media.popnow.ai/movie/lighthouse.webp", "prompt": "The waves roll in slowly" },
"callBackUrl": "https://your-n8n.example.com/webhook/popnow"
}Webhook の URL は公開された HTTPS でなければならないので、ローカルの n8n にはトンネルが必要です。各配信には署名が付きます。Code ノードで署名を確認する方法は Webhook にあり、重複配信を無視するために request_id を保存すべき理由もそこに書いてあります。
n8n の外で同じ呼び出し
n8n に貼り付ける前に本文を確かめるのに便利です。
curl -X POST "https://api.popnow.ai/api/v1/jobs/createTask?wait=60" \
-H "Authorization: Bearer $POPNOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"model": "alibaba/z-image-turbo/text-to-image", "input": {"prompt": "A small red fox curled up in a teacup, soft morning light, studio photo", "aspect_ratio": "1:1"}}'import os, uuid, requests
res = requests.post(
"https://api.popnow.ai/api/v1/jobs/createTask",
params={"wait": 60},
headers={"Authorization": f"Bearer {os.environ['POPNOW_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={"model": "alibaba/z-image-turbo/text-to-image", "input": {"prompt": "A small red fox curled up in a teacup, soft morning light, studio photo", "aspect_ratio": "1:1"}},
timeout=90,
).json()
print(res["data"]["state"], res["data"].get("output", {}).get("assets", [{}])[0].get("url"))const res = await fetch('https://api.popnow.ai/api/v1/jobs/createTask?wait=60', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.POPNOW_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
model: 'alibaba/z-image-turbo/text-to-image',
input: { prompt: 'A small red fox curled up in a teacup, soft morning light, studio photo', aspect_ratio: '1:1' },
}),
});
const { data } = await res.json();
console.log(data.state, data.output?.assets?.[0]?.url);料金
ワークフローが API USD を使うのは Create task だけで、タスクの読み取りは無料です。失敗・期限切れのタスクは課金されず、同じ Idempotency-Key で再試行されたノードは二重に課金されません。大量に実行する前に、各モデルの料金を jobs/quote で確認し、ルールは API 残高と返金を参照してください。
よくあるエラー
| n8n の表示 | 原因 | 対処 |
|---|---|---|
Create task から返る 401 | 認証情報がない、または値に Bearer が付いていない | ヘッダーの値は Bearer sk-popnow-… にしてください |
msg にフィールド名が入った code: 400 | フィールドがモデルのスキーマにない、または値が範囲外 | モデルのページを確認してください。未知のフィールドは拒否されます |
code: 40201 | このタスクの確保に必要な API USD が足りない | API billing で入金するか、より安いモデルや設定を選んでください |
code: 40202 | キーの利用上限を超える | API コンソールでこのキーの上限を上げてください |
code: 429 | リクエストが多すぎる | 待ち時間を長くするか、並列で実行する数を減らしてください。レート制限を参照 |
| ループが終わらない | タスクがまだ実行中か、Finished? が誤ったフィールドを読んでいる | 動画は数分かかることがあります。Check task が Create task の taskId を読んでいるか確認してください |
fileUrl は最初は動くが、あとで 403 になる | 署名付きリンクは約 20 分で切れる | 同じ実行中にファイルをダウンロードするか、タスクを読み直して新しいリンクを取得してください |
state: failed | モデルが完了できなかった、またはコンテンツを断った | 課金はありません。errorCode を確認し、エラーを参照してください |
n8n 向けの PopNow コミュニティノードはありますか?
あります。n8n-nodes-popnow は npm に公開されており、GitHub でソースも公開しています。セルフホストの n8n では、Settings > Community Nodes > Install を開き、n8n-nodes-popnow と入力して確定します。シェルから入れる場合は、~/.n8n/nodes で npm install n8n-nodes-popnow を実行し、n8n を再起動してください。まだ検証済みのノードではないため、n8n Cloud からは入れられません。必須ではありません。組み込みの HTTP Request ノードで API の機能はすべて使え、n8n Cloud でも動き、このページのワークフローは貼り付けるだけで取り込めます。
n8n で複数の生成を同時に実行できますか?
はい。Create task に届いた各アイテムがそれぞれ独立したタスクになり、並列にレンダリングされます。レート制限に注意し、キーには利用上限を設定してください。
生成したファイルを Google Drive や S3 に保存するには?
File URL の後ろに HTTP Request ノードを追加し、fileUrl をファイル(レスポンス形式は File)としてダウンロードしてください。その後、Google Drive、S3、その他のストレージノードに渡します。

