TL;DR
Make(旧Integromat)APIは、開発者がワークフローの自動化、シナリオの管理、およびインテグレーションのプログラムによる実行を可能にします。OAuth 2.0とAPIキー認証を使用し、シナリオ、実行、ウェブフック、チーム向けのRESTfulエンドポイントを提供します。料金プランに応じて、レート制限は1分あたり60〜600リクエストです。このガイドでは、認証設定、シナリオ管理、ウェブフックトリガー、実行監視、および本番環境での自動化戦略について説明します。
はじめに
Make(Integromat)は、100カ国以上で100万人以上のユーザーのために、毎月20億回以上のオペレーションを処理しています。自動化ツールを構築したり、クライアントのワークフローを管理したり、1000以上のアプリと統合したりする開発者にとって、Make APIとの連携は選択肢ではなく、スケーラブルな自動化に不可欠です。
現実として、50以上のクライアントの自動化を管理しているエージェンシーは、手動でのシナリオ更新、実行監視、クライアントレポート作成に毎週15~25時間を費やしています。堅固なMake API連携は、シナリオのデプロイ、実行追跡、エラー処理、ホワイトラベルレポート作成を自動化します。
このガイドでは、Make API連携の完全なプロセスを順を追って説明します。OAuth 2.0とAPIキー認証、シナリオ管理、ウェブフックトリガー、実行監視、チーム管理、および本番環境デプロイ戦略を学びます。このガイドを読み終える頃には、本番環境に対応したMake連携が完成しているでしょう。
ボタン
Make APIとは?
Makeは、自動化ワークフローをプログラムで管理するためのRESTful APIを提供します。このAPIは以下の処理を行います。
- シナリオの作成、更新、削除
- シナリオの実行(手動トリガー)
- 実行履歴と監視
- ウェブフック管理
- チームとユーザー管理
- 接続とアプリ管理
- 組織とワークスペース設定
主な機能
| 機能 | 説明 |
|---|---|
| RESTful API | JSONベースのエンドポイント |
| OAuth 2.0 + APIキー | 柔軟な認証 |
| ウェブフック | リアルタイム実行通知 |
| レート制限 | プランに応じて1分あたり60〜600リクエスト |
| シナリオ管理 | 完全なCRUD操作 |
| 実行制御 | 実行の開始、停止、監視 |
| チームAPI | ユーザーと権限の管理 |
MakeのプランとAPIアクセス
| プラン | APIアクセス | レート制限 | 最適な用途 |
|---|---|---|---|
| フリー | 制限あり | 60/分 | テスト、学習 |
| コア | フルAPI | 120/分 | 中小企業 |
| プロ | フルAPI + 優先 | 300/分 | 成長中のチーム |
| チーム | フルAPI + 管理者 | 600/分 | エージェンシー、エンタープライズ |
| エンタープライズ | カスタム制限 | カスタム | 大規模組織 |
APIアーキテクチャの概要
MakeはRESTful API構造を使用しています。
https://api.make.com/api/v2/
APIバージョン
| バージョン | ステータス | ユースケース |
|---|---|---|
| v2 | 現在 | すべての新しい連携 |
| v1 | 非推奨 | 従来の連携(移行が必要) |
はじめに: 認証設定
ステップ1: Makeアカウントの作成
APIにアクセスする前に:
- Make.comにアクセス
- アカウントを登録
- 「設定」>「開発者設定」に移動
- API認証情報を生成
ステップ2: 認証方法の選択
Makeは2つの認証方法をサポートしています。
| 方法 | 最適な用途 | セキュリティレベル |
|---|---|---|
| APIキー | 内部連携、スクリプト | 高い(安全に保管) |
| OAuth 2.0 | マルチテナントアプリ、クライアント連携 | より高い(ユーザーごとにスコープされたトークン) |
ステップ3: APIキーの取得(最も簡単な方法)
内部使用のためのAPIキーを生成します。
- 「設定」>「開発者設定」に移動
- 「APIキーを作成」をクリック
- コピーして安全に保管
# .envファイル
MAKE_API_KEY="your_api_key_here"
MAKE_ORGANIZATION_ID="your_org_id"
ステップ4: OAuth 2.0の設定(マルチテナントアプリ向け)
クライアント連携のためにOAuthを設定します。
- 「設定」>「開発者設定」>「OAuthアプリ」に移動
- 「OAuthアプリを作成」をクリック
- リダイレクトURIを設定
- クライアント認証情報を取得
const MAKE_CLIENT_ID = process.env.MAKE_CLIENT_ID;
const MAKE_CLIENT_SECRET = process.env.MAKE_CLIENT_SECRET;
const MAKE_REDIRECT_URI = process.env.MAKE_REDIRECT_URI;
// 認証URLを構築
const getAuthUrl = (state) => {
const params = new URLSearchParams({
client_id: MAKE_CLIENT_ID,
redirect_uri: MAKE_REDIRECT_URI,
scope: 'read write execute',
state: state,
response_type: 'code'
});
return `https://www.make.com/oauth/authorize?${params.toString()}`;
};
ステップ5: コードをアクセストークンに交換
OAuthコールバックを処理します。
const exchangeCodeForToken = async (code) => {
const response = await fetch('https://www.make.com/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: MAKE_CLIENT_ID,
client_secret: MAKE_CLIENT_SECRET,
redirect_uri: MAKE_REDIRECT_URI,
code: code
})
});
const data = await response.json();
return {
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiresIn: data.expires_in
};
};
// コールバックを処理
app.get('/oauth/callback', async (req, res) => {
const { code, state } = req.query;
try {
const tokens = await exchangeCodeForToken(code);
// トークンを安全に保存
await db.integrations.create({
userId: req.session.userId,
accessToken: tokens.accessToken,
refreshToken: tokens.refreshToken,
tokenExpiry: Date.now() + (tokens.expiresIn * 1000)
});
res.redirect('/success');
} catch (error) {
console.error('OAuth error:', error);
res.status(500).send('認証に失敗しました');
}
});
ステップ6: 認証済みAPIコールの実行
再利用可能なAPIクライアントを作成します。
const MAKE_BASE_URL = 'https://api.make.com/api/v2';
const makeRequest = async (endpoint, options = {}) => {
const apiKey = options.useOAuth ? await getOAuthToken() : process.env.MAKE_API_KEY;
const response = await fetch(`${MAKE_BASE_URL}${endpoint}`, {
...options,
headers: {
'Authorization': `Token ${apiKey}`,
'Content-Type': 'application/json',
...options.headers
}
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Make APIエラー: ${error.message}`);
}
return response.json();
};
// 使用例
const scenarios = await makeRequest('/scenarios');
console.log(`${scenarios.data.length}個のシナリオが見つかりました`);
シナリオ管理
シナリオのリスト表示
すべてのシナリオを取得します。
const listScenarios = async (filters = {}) => {
const params = new URLSearchParams({
limit: filters.limit || 50,
offset: filters.offset || 0
});
if (filters.folder) {
params.append('folder', filters.folder);
}
const response = await makeRequest(`/scenarios?${params.toString()}`);
return response;
};
// 使用例
const scenarios = await listScenarios({ limit: 100 });
scenarios.data.forEach(scenario => {
console.log(`${scenario.name} - ${scenario.active ? 'アクティブ' : '一時停止中'}`);
console.log(` 最終実行日時: ${scenario.lastRunDate || 'なし'}`);
});
シナリオ詳細の取得
単一のシナリオを取得します。
const getScenario = async (scenarioId) => {
const response = await makeRequest(`/scenarios/${scenarioId}`);
return response;
};
// 使用例
const scenario = await getScenario('12345');
console.log(`名前: ${scenario.name}`);
console.log(`モジュール数: ${scenario.modules.length}`);
console.log(`スケジュール: ${scenario.schedule?.cronExpression || '手動'}`);
シナリオの作成
新しいシナリオを作成します。
const createScenario = async (scenarioData) => {
const scenario = {
name: scenarioData.name,
blueprint: scenarioData.blueprint, // シナリオのJSONブループリント
active: scenarioData.active || false,
priority: scenarioData.priority || 1,
maxErrors: scenarioData.maxErrors || 3,
autoCommit: scenarioData.autoCommit || true,
description: scenarioData.description || ''
};
const response = await makeRequest('/scenarios', {
method: 'POST',
body: JSON.stringify(scenario)
});
return response;
};
// 使用例 - ブループリントから作成
const newScenario = await createScenario({
name: 'Lead Sync to CRM',
blueprint: {
// シナリオのブループリントJSON
// Makeエディタからエクスポートするか、プログラムで構築
modules: [
{
id: 1,
app: 'webhooks',
action: 'customWebhook',
parameters: { /* ... */ }
},
{
id: 2,
app: 'salesforce',
action: 'createRecord',
parameters: { /* ... */ }
}
],
connections: [
{ from: 1, to: 2 }
]
},
active: true,
description: 'Sync webhook leads to Salesforce'
});
console.log(`シナリオが作成されました: ${newScenario.id}`);
シナリオの更新
シナリオの設定を変更します。
const updateScenario = async (scenarioId, updates) => {
const response = await makeRequest(`/scenarios/${scenarioId}`, {
method: 'PATCH',
body: JSON.stringify(updates)
});
return response;
};
// 使用例 - シナリオの一時停止
await updateScenario('12345', { active: false });
// 使用例 - スケジュールの更新
await updateScenario('12345', {
schedule: {
cronExpression: '0 */6 * * *', // 6時間ごと
timezone: 'America/New_York'
}
});
シナリオの削除
シナリオを削除します。
const deleteScenario = async (scenarioId) => {
await makeRequest(`/scenarios/${scenarioId}`, {
method: 'DELETE'
});
console.log(`シナリオ ${scenarioId} が削除されました`);
};
実行管理
シナリオ実行のトリガー
シナリオを手動で実行します。
const executeScenario = async (scenarioId, inputData = null) => {
const response = await makeRequest(`/scenarios/${scenarioId}/execute`, {
method: 'POST',
body: inputData ? JSON.stringify(inputData) : undefined
});
return response;
};
// 使用例 - 入力なしで実行
const execution = await executeScenario('12345');
console.log(`実行が開始されました: ${execution.id}`);
// 使用例 - 入力データで実行
const executionWithData = await executeScenario('12345', {
lead: {
email: 'prospect@example.com',
name: 'John Doe',
company: 'Acme Corp'
}
});
実行履歴の取得
実行ログを取得します。
const getExecutionHistory = async (scenarioId, filters = {}) => {
const params = new URLSearchParams({
limit: filters.limit || 50,
from: filters.from,
to: filters.to,
status: filters.status // '成功', 'エラー', '実行中'
});
const response = await makeRequest(`/scenarios/${scenarioId}/executions?${params.toString()}`);
return response;
};
// 使用例 - 過去24時間のエラー実行を取得
const failedExecutions = await getExecutionHistory('12345', {
from: new Date(Date.now() - 86400000).toISOString(),
status: 'error',
limit: 100
});
failedExecutions.data.forEach(exec => {
console.log(`実行 ${exec.id}: ${exec.error?.message}`);
});
実行詳細の取得
単一の実行を取得します。
const getExecution = async (executionId) => {
const response = await makeRequest(`/executions/${executionId}`);
return response;
};
// 使用例
const execution = await getExecution('98765');
console.log(`ステータス: ${execution.status}`);
console.log(`期間: ${execution.duration}ms`);
console.log(`実行されたモジュール数: ${execution.modulesExecuted}`);
実行中の実行の停止
実行をキャンセルします。
const stopExecution = async (executionId) => {
await makeRequest(`/executions/${executionId}`, {
method: 'DELETE'
});
console.log(`実行 ${executionId} が停止されました`);
};
ウェブフック管理
ウェブフックの作成
受信ウェブフックを設定します。
const createWebhook = async (webhookData) => {
const webhook = {
name: webhookData.name,
scenarioId: webhookData.scenarioId,
type: 'custom', // 'カスタム' または 'RAW'
hookType: 'HEAD', // 'HEAD' または 'GET'
security: {
type: 'none' // 'なし', '基本', 'トークン'
}
};
const response = await makeRequest('/webhooks', {
method: 'POST',
body: JSON.stringify(webhook)
});
return response;
};
// 使用例
const webhook = await createWebhook({
name: 'Lead Capture Webhook',
scenarioId: '12345',
type: 'custom',
hookType: 'HEAD',
security: { type: 'none' }
});
console.log(`ウェブフックURL: ${hook.url}`);
ウェブフックのリスト表示
すべてのウェブフックを取得します。
const listWebhooks = async () => {
const response = await makeRequest('/webhooks');
return response;
};
// 使用例
const webhooks = await listWebhooks();
webhooks.data.forEach(webhook => {
console.log(`${webhook.name}: ${webhook.url}`);
});
ウェブフックの削除
ウェブフックを削除します。
const deleteWebhook = async (webhookId) => {
await makeRequest(`/webhooks/${webhookId}`, {
method: 'DELETE'
});
console.log(`ウェブフック ${webhookId} が削除されました`);
};
チームとユーザー管理
チームメンバーのリスト表示
組織内のユーザーを取得します。
const listTeamMembers = async (organizationId) => {
const response = await makeRequest(`/organizations/${organizationId}/users`);
return response;
};
// 使用例
const members = await listTeamMembers('org-123');
members.data.forEach(member => {
console.log(`${member.email} - ${member.role}`);
});
チームメンバーの追加
ユーザーを組織に招待します。
const addTeamMember = async (organizationId, email, role) => {
const response = await makeRequest(`/organizations/${organizationId}/users`, {
method: 'POST',
body: JSON.stringify({
email: email,
role: role // 'ビューアー', 'ビルダー', 'マネージャー', '管理者'
})
});
return response;
};
// 使用例
await addTeamMember('org-123', 'newuser@example.com', 'builder');
ユーザーロールの更新
ユーザー権限を変更します。
const updateUserRole = async (organizationId, userId, newRole) => {
await makeRequest(`/organizations/${organizationId}/users/${userId}`, {
method: 'PATCH',
body: JSON.stringify({ role: newRole })
});
console.log(`ユーザー ${userId} のロールが ${newRole} に更新されました`);
};
ユーザーロール
| ロール | 権限 |
|---|---|
| ビューアー | シナリオの表示、編集不可 |
| ビルダー | シナリオの作成/編集 |
| マネージャー | チーム、請求の管理 |
| 管理者 | 組織へのフルアクセス |
レート制限
レート制限の理解
Makeはプランごとにレート制限を適用します。
| プラン | 1分あたりのリクエスト数 | バースト制限 |
|---|---|---|
| フリー | 60 | 100 |
| コア | 120 | 200 |
| プロ | 300 | 500 |
| チーム | 600 | 1000 |
| エンタープライズ | カスタム | カスタム |
レート制限ヘッダー
| ヘッダー | 説明 |
|---|---|
X-RateLimit-Limit |
1分あたりの最大リクエスト数 |
X-RateLimit-Remaining |
残りのリクエスト数 |
X-RateLimit-Reset |
リセットまでの秒数 |
レート制限処理の実装
const makeRateLimitedRequest = async (endpoint, options = {}, maxRetries = 3) => {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
const response = await makeRequest(endpoint, options);
const remaining = response.headers.get('X-RateLimit-Remaining');
if (remaining < 10) {
console.warn(`レート制限が低い: 残り ${remaining} 件`);
}
return response;
} catch (error) {
if (error.message.includes('429') && attempt < maxRetries) {
const delay = Math.pow(2, attempt) * 1000;
console.log(`レート制限されています。${delay}ms後に再試行します...`);
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
};
本番環境デプロイチェックリスト
本番稼働前に:
- [ ] 内部連携にはAPIキーを、クライアント連携にはOAuthを使用する
- [ ] 認証情報を安全に保管する(暗号化されたデータベース)
- [ ] レート制限とリクエストキューイングを実装する
- [ ] 実行監視とアラートを設定する
- [ ] エラー通知を設定する(メール、Slack)
- [ ] 失敗した実行に対してリトライロジックを実装する
- [ ] 包括的なロギングを追加する
- [ ] 重要なシナリオのバックアップ/エクスポートを作成する
実際の使用例
エージェンシーのクライアント管理
あるマーケティングエージェンシーが100以上のクライアント自動化を管理しています。
- 課題: クライアントアカウント間の手動シナリオ更新
- 解決策: Make APIを備えた集中ダッシュボード
- 結果: 70%の時間短縮、一貫したデプロイ
主な実装:
- マルチアカウントOAuth連携
- シナリオの一括デプロイ
- クライアント使用状況レポート
Eコマースの注文処理
オンラインストアが注文処理を自動化しています。
- 課題: 倉庫システムへの手動注文入力
- 解決策: ウェブフックでトリガーされるMakeシナリオ
- 結果: 手動入力ゼロ、99.9%の精度
主な実装:
- ShopifyウェブフックからMakeへ
- シナリオが注文を処理し、倉庫を更新
- リトライロジックによるエラー処理
結論
Make APIは、包括的なワークフロー自動化機能を提供します。主要なポイント:
- 内部使用にはAPIキー、マルチテナントアプリにはOAuth 2.0
- シナリオ、実行、ウェブフックに対する完全なCRUD操作
- 組織管理のためのチーム管理
- レート制限はプランによって異なる(1分あたり60〜600リクエスト)
- 本番環境では実行監視が不可欠
- ApidogはAPIテストとチームコラボレーションを効率化
ボタン
Make APIで認証するにはどうすればよいですか?
内部連携には開発者設定からAPIキーを、マルチテナントアプリケーションにはOAuth 2.0を使用します。
プログラムでシナリオをトリガーできますか?
はい、/scenarios/{id}/execute エンドポイントを使用して、オプションの入力データでシナリオ実行を手動でトリガーできます。
Makeのレート制限は何ですか?
レート制限は、1分あたり60リクエスト(フリー)から1分あたり600リクエスト(チーム/エンタープライズ)までです。
実行ログを取得するにはどうすればよいですか?
/scenarios/{id}/executions を使用して、日付とステータスでフィルタリングされた実行履歴を取得します。
API経由でウェブフックを作成できますか?
はい、/webhooks エンドポイントを使用して、シナリオのウェブフックを作成、リスト表示、削除できます。
