このガイドでは、あらゆるワークフローからApiframeをn8nに接続して、AI画像(あるいは動画、音楽など)を生成する方法を解説します。
このガイドで扱う内容:
- 作成するものの概要
- 事前準備
- n8nでのApiframe認証情報の作成
- ワークフロー1 - シンプルな画像生成(
/v2/images/generate - ワークフロー2 -
/v2/jobs/{jobId} - ワークフロー3 - 推奨:Webhookを使ったリアルタイム取得
- 他のApiframeエンドポイントへのパターンの拡張
すべてのサンプルでは Midjourney のPOST /v2/images/generate エンドポイントを使用しますが、同じパターンはほとんどの他のエンドポイントやモデルでも利用できます。
I. これから作るもの
ここでは、小さなn8n連携を2つ作成します:
- オンデマンドで画像を生成する
- トリガー: 手動、Webhook、Googleスプレッドシートなど、何でもOK
- HTTP Request:
POST https://api.apiframe.ai/v2/images/generate - レスポンスとして
jobIdが返ってくるので、保存したりログ出力したりできます(レスポンスには status: "QUEUED" も含まれます)
- 最終的な画像を自動で取得する
- GET /v2/jobs/{jobId} を使って、タスク完了までApiframeをポーリングする
- または(推奨)タスク完了時にApiframeからn8nのWebhookを呼び出してもらう
画像URLがn8nに届いたら、その後は自由に処理できます。たとえばSlack に送る、Airtable に保存する、Google Driveなど。
II. 前提条件
必要なもの:
- Apiframe のアカウントと、APIキーが必要です。これは Apiframe のダッシュボードから取得できます(またはこちらをクリック)。この API キーは、
X-API-Keyヘッダーを通じてリクエストを認証するために使用します(APIキーは afk_ から始まります)。
- n8n のインスタンス(セルフホストまたはクラウド版)
- n8n の各種ノード(HTTP Request、Webhook、Set、IF など)に関する基本的な知識。HTTP Request ノードは、n8n で任意の REST API を呼び出すための汎用ノードです。
III. n8n に Apiframe 用の認証情報を作成する
一度だけ認証情報を設定し、その後はすべての HTTP Request ノードで再利用します。
- ステップ1:n8n で「Credentials → Create credential」に進みます。
- ステップ2:Header Auth(バージョンによっては「HTTP Header Auth」「API Key in Header」など)を選択します。
- ステップ3:次のように設定します:
- ヘッダー名:
X-API-Key - 値:Apiframe の API キー(afk_ から始まる、ダッシュボードに表示されているものをそのまま使用)
- ヘッダー名:
- ステップ4:Apiframe Auth のような名前を付けて保存します。
Apiframe は以下の形式を想定しています:
X-API-Key: afk_your_api_key_here
Content-Type: application/jsonIV. ワークフロー1 - POST /v2/images/generate を使った基本的な画像生成
次のようなシンプルなワークフローを作成します:
1. ワークフローを作成する
- n8n で新しいワークフロー(New workflow)を作成します。
- 次に、Manual Trigger ノード。
2. プロンプト用に「Set」ノードを追加する
- Manual Trigger の後ろにSet ノードを追加します。
- 「Values → Add Field → String」で:
- Name:
prompt - Value:例えば次のような値にします
a cinematic photo of a cyberpunk city at night, ultra detailed, 4k
- Name:
- (任意)もう一つ String フィールドを追加します:
- Name:
aspect_ratio - Value:
3:2
- Name:
これで Set ノードの出力 JSON はおおよそ次のようになります:
{
"prompt": "a cinematic photo of a cyberpunk city at night, ultra detailed, 4k",
"aspect_ratio": "3:2"
}
3. POST /v2/images/generate 用の HTTP Request ノードを追加する
- Set ノードの後ろにHTTP Request ノードを追加します。
- 次のように設定します:
- Method:
POST - URL:
https://api.apiframe.ai/v2/images/generate - 認証は「Generic Credential type」を選択し、「Header Auth」を選んでから、先ほど作成した「Apiframe Auth」の認証情報を指定します。
- Body については「Send body」をオンにし、JSON形式で model(例:"midjourney")、prompt、aspect_ratio などのモデル固有オプションをまとめた midjourneyParams オブジェクト、そして後で使うための任意の webhookUrl フィールドを追加します。
- Method:
{
"model": "midjourney",
"prompt": "a cinematic photo of a cyberpunk city at night, ultra detailed, 4k",
"midjourneyParams": {
"aspect_ratio": "3:2"
},
"webhookUrl": "https://your-n8n-domain.com/webhook/apiframe/midjourney-completed"
}
このノードを実行すると、Apiframe は次のようなレスポンスを返します:
{
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "QUEUED"
}これはタスクがキュー投入/処理中であることを意味します。画像は非同期で生成されるため、POST /v2/images/generate 自体から最終的な画像 URL は返されません。
ここからできることは次の通りです:
- この
jobId - DBやGoogleスプレッドシートに保存する
- 「Fetch」ワークフローに渡す
V. ワークフロー2 - GET /v2/jobs/{jobId} を使ったApiframeのポーリング
次に、GET /v2/jobs/{jobId} エンドポイントを使って、実際の画像URLを取得します。
Apiframe には、GET https://api.apiframe.ai/v2/jobs/{jobId} というエンドポイントが用意されており、URLパスの{jobId} にジョブIDを指定すると、最終結果 もしくは status: "PROCESSING" のレスポンスを返します。
ここではシンプルな「待機してからFetchする」フローを作ります。
1. Waitノードを追加する
先ほどの POST /v2/images/generate HTTP Requestノードの後に:
- 新しく Wait ノードを追加します。
- 待機時間を、例えば 2〜3秒 に設定します。
この待機時間によって、Apiframe が画像生成を完了する余裕ができます。生成時間はタスクの複雑さやシステム負荷によって変わります。
2. GET /v2/jobs/{jobId} 用の HTTP Request ノードを追加する
Waitノードの後ろに、もう一つ HTTP Request ノードを追加します:
- Method(メソッド):
GET - URL:
https://api.apiframe.ai/v2/jobs/{jobId} - 認証は、「Generic Credential type」を選択し、「Header Auth」を選んでから、先ほどと同じ 「Apiframe Auth」 を指定します。
- GET リクエストのため Body は不要です。URLの
{jobId}部分に、ワークフロー1で取得した jobId を指定します。
処理中(ジョブがまだ実行中):
{
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "PROCESSING",
"progress": 40
}完了(ジョブ完了、画像URLの準備が完了):
{
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "COMPLETED",
"result": {
"images": [
"https://.../image1.png",
"https://.../image2.png",
"https://.../image3.png",
"https://.../image4.png"
],
"gridUrl": "https://.../grid.png"
}
}3. 「まだ処理中」の場合の扱い方
開発用に手早くセットアップするなら、次のようにできます:
- 単純に待ち時間を長く取り、一度だけ取得する。
- または、Fetch の後ろにシンプルなIF ノードを追加する:
- 条件:
statusが次と等しい:"PROCESSING" - 「true」の場合:別の Wait + Fetch に分岐する
- 「false」の場合:そのまま最終処理ロジック(Slack や Airtable など)に進む
- 条件:
本番環境では、Apiframe はポーリングの代わりに Webhook を使うことを推奨しています。これにより不要なリクエストを避け、即時に更新を受け取れます。
次はそれをやってみましょう。
VI. ワークフロー3 - Webhook ベースの結果取得(推奨)
これはクリーンで「ほぼリアルタイム」なアーキテクチャです:
- ワークフローA:生成リクエストを送信(
webhookUrlとwebhookEventsを含める) - ワークフローB:Webhook を受信し、生成完了時に Apiframe から通知を受け取る
1. ワークフローBを作成する - Webhook 受信側
- n8n で新しいワークフローを作成し、名前を次のように付けます:
Apiframe – 画像生成完了. - 「Webhook」ノードを追加します。
Webhookノードを次のように設定します:
- HTTPメソッド:
POST - パス: 例えば次のようにします:
apiframe/midjourney-completed - レスポンスモード:
- 例えば「
When Last Node Finishes」(最後のノードが終了したとき)を選ぶと、必要であればデータを返せます。
- 例えば「
- HTTPメソッド:
「Production URL」をコピーします。これはApiframe側でwebhookUrlとして設定する値になります。
2. Webhook 署名(X-Webhook-Signature)を検証する
Apiframeは、Webhook呼び出し時にX-Webhook-Signatureヘッダー(リクエストボディ全体のHMAC-SHA256署名)とX-Webhook-Eventヘッダー(イベント名)を送信します。署名の検証に使うシークレットは、APIキーそのものではなく、APIキーをSHA-256でハッシュ化した値です。
- Webhookノードの設定で「Raw Body」を有効にし、その後ろに Code ノードを追加します。
- Code ノードで、次のようなスクリプトを使って署名を検証します:
- Code ノードに、次の JavaScript を貼り付けます(言語は JavaScript のままで問題ありません):
- Code ノードに、次の JavaScript を貼り付けます(言語は JavaScript のままで問題ありません):
const crypto = require('crypto');
// 署名用シークレットは、APIキー自体ではなく、APIキーをSHA-256でハッシュ化した値です。
const secret = crypto
.createHash('sha256')
.update('afk_your_api_key_here')
.digest();
// Webhookノードで「Raw Body」を有効にしておく必要があります。
const raw = $json.rawBody ?? JSON.stringify($json.body);
const expected = crypto
.createHmac('sha256', secret)
.update(raw)
.digest('hex');
const received = $json.headers['x-webhook-signature'] ?? '';
const a = Buffer.from(expected);
const b = Buffer.from(received);
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
throw new Error('Invalid webhook signature');
}
return $input.all();- 署名が一致しない場合、Code ノードは次のエラーをスローしてワークフローを停止します:
Invalid webhook signature - 右側: あなたが設定したシークレット(例:
my-super-secret - 署名が一致すれば、Code ノードはそのまま入力データ($input.all())を返すので、後続のノードで通常どおりペイロードを処理できます。
これにより、正規のApiframeからのWebhookだけが後続の処理に進むようになります。
3. Webhookペイロード内の画像URLへアクセスする
Webhookのボディは、先ほど紹介した「completed」ペイロードと同じ形式になります。
{
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "COMPLETED",
"result": {
"images": [
"https://.../image1.png",
"https://.../image2.png",
"https://.../image3.png",
"https://.../image4.png"
],
"gridUrl": "https://.../grid.png"
}
}画像URLにはこのようにアクセスできるので、次のようなノードに渡せます:
- Slackノード(URL付きメッセージを送信)
- Airtable / Notion(URLを保存)
- HTTP Request(自分のアプリのバックエンドへ送信)
4. Webhookを使うようにワークフローAを更新する
次に、ワークフローA(POST /v2/images/generate を呼び出しているほう)に戻り、HTTP Requestノードのボディを編集して、次を含めます:
webhookUrlwebhookEvents
HTTP Requestノード内のJSONボディの例:
{
"model": "midjourney",
"prompt": "a cinematic photo of a cyberpunk city at night, ultra detailed, 4k",
"midjourneyParams": {
"aspect_ratio": "3:2"
},
"webhookUrl": "https://your-n8n-domain.com/webhook/apiframe/midjourney-completed",
"webhookEvents": ["completed", "failed"]
}これでフローは次のようになります:
- ワークフローA →
POST /v2/images/generateに対してwebhookUrl+webhookEvents - Apiframeがバックグラウンドで画像を生成する
- 完了すると、Apiframeは最終的なURLを含めてあなたのWebhook(ワークフローB)を呼び出す
- ワークフローBがそれらを処理し、任意の場所へ転送する
ポーリングも余分なHTTPリクエストも不要で、イベントドリブンで動作します。
VII. このパターンを他のApiframeエンドポイントへ拡張する
便利なポイント:一度 n8n → Apiframe の配線ができてしまえば、同じパターンをあらゆる機能に再利用できます。
アイデア例:
- Variations(バリエーション生成):URLを
https://api.apiframe.ai/v2/images/midjourney/actionに切り替え、元のジョブのparentJobId、action(例: "variation")、新しいプロンプトを指定します。 - アップスケール: 同じ /v2/images/midjourney/action エンドポイントで、action の値だけを変えます。
- フェイススワップ: 2つの画像URL(ソースとターゲット)を
faceswapエンドポイントに送信します。 - Describe: 画像URLを渡すと、Apiframe がその画像用のプロンプトを返してくれる n8n ワークフローを構築します。
- その他のメディア:動画(POST /v2/videos/generate)や音楽(POST /v2/music/generate)を含め、Flux、Ideogram、Luma、Suno なども、すべて同じ REST パターンに従います:
POSTで JSON を送り、webhookUrlとwebhookEventsを含めれば Webhook を受け取れます。
これらのそれぞれは、n8n 上では単に別の HTTP Request ノード(さらに GET /v2/jobs/{jobId} も使うなら 2 つ)として実装でき、同じ「Apiframe Auth」認証情報を利用します。
VIII. まとめ
ここまでで、次のものが揃いました。
- 基本的な
POST /v2/images/generateワークフロー — n8n から Apiframe 経由で Midjourney をトリガー - ポーリング構成 —
GET /v2/jobs/{jobId}を使った素早い実験用セットアップ - Webhook ベースのアーキテクチャ — リアルタイムかつ本番運用レベルのパイプライン向け