الملخص
يمكّن Make API (Integromat سابقًا) المطورين من أتمتة سير العمل وإدارة السيناريوهات وتنفيذ عمليات التكامل برمجيًا. يدعم المصادقة عبر OAuth 2.0 أو مفتاح API، ويوفر نقاط نهاية REST للتحكم في السيناريوهات، والتنفيذ، وWebhooks، والفرق، مع حدود معدل حسب الخطة (60-600 طلب/دقيقة). هذا الدليل يوضح الخطوات العملية لإعداد المصادقة، إدارة السيناريوهات، التعامل مع Webhooks، مراقبة التنفيذ، واستراتيجيات أتمتة الإنتاج.
💡 Apidog يبسط اختبار تكامل API. اختبر نقاط نهاية Make، تحقق من تدفقات OAuth، راقب استجابات التنفيذ، وصحح مشكلات الأتمتة في مساحة عمل واحدة. استورد مواصفات API، حاكي الاستجابات، وشارك سيناريوهات الاختبار مع فريقك.
ما هو Make API؟
Make يوفر واجهة برمجة تطبيقات RESTful لإدارة الأتمتة برمجيًا عبر:
- إنشاء وتحديث وحذف السيناريوهات
- تنفيذ السيناريوهات يدويًا
- مراقبة سجل التنفيذ
- إدارة Webhooks
- إدارة الفريق والمستخدمين
- إدارة الاتصالات والتطبيقات
- إعدادات المؤسسة ومساحة العمل
الميزات الرئيسية
| الميزة | الوصف |
|---|---|
| RESTful API | نقاط نهاية قائمة على JSON |
| OAuth 2.0 + API Key | مصادقة مرنة |
| Webhooks | إشعارات التنفيذ الفوري |
| تحديد المعدل | 60-600 طلب/دقيقة حسب الخطة |
| إدارة السيناريوهات | عمليات CRUD كاملة |
| التحكم في التنفيذ | بدء/إيقاف/مراقبة السيناريوهات |
| API الفريق | إدارة المستخدمين والأذونات |
خطط Make والوصول إلى API
| الخطة | الوصول إلى API | حد المعدل | الأفضل لـ |
|---|---|---|---|
| مجاني | محدود | 60/دقيقة | الاختبار، التعلم |
| أساسي (Core) | API كامل | 120/دقيقة | الشركات الصغيرة |
| احترافي (Pro) | API كامل + أولوية | 300/دقيقة | الفرق المتنامية |
| فرق (Teams) | API كامل + مسؤول | 600/دقيقة | الوكالات، الشركات |
| مؤسسي (Enterprise) | حدود مخصصة | مخصص | المنظمات الكبيرة |
نظرة عامة على بنية API
يعتمد Make على بنية RESTful عبر:
https://api.make.com/api/v2/
إصدارات API
| الإصدار | الحالة | حالة الاستخدام |
|---|---|---|
| v2 | الحالي | جميع عمليات التكامل الجديدة |
| v1 | مهمل | عمليات التكامل القديمة (يجب الترحيل) |
البدء: إعداد المصادقة
الخطوة 1: إنشاء حساب Make
- زر Make.com
- سجل حساب جديد
- ادخل إلى الإعدادات > إعدادات المطور
- أنشئ بيانات اعتماد API
الخطوة 2: اختيار طريقة المصادقة
| الطريقة | الأفضل لـ | مستوى الأمان |
|---|---|---|
| مفتاح API | التكاملات الداخلية، السكريبتات | مرتفع (خزن بأمان) |
| OAuth 2.0 | تطبيقات العملاء، متعددة المستأجرين | أعلى (رموز وصول فردية) |
الخطوة 3: الحصول على مفتاح API (الأبسط)
للاستخدام الداخلي:
- من إعدادات المطور > مفاتيح API > أنشئ مفتاح جديد
- انسخ المفتاح وخزنه بأمان
# ملف .env
MAKE_API_KEY="your_api_key_here"
MAKE_ORGANIZATION_ID="your_org_id"
الخطوة 4: إعداد OAuth 2.0 للتطبيقات متعددة المستأجرين
- من إعدادات المطور > تطبيقات OAuth > أنشئ تطبيق جديد
- عيّن URI لإعادة التوجيه
- احصل على client_id و client_secret
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;
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: تبادل الكود مقابل رمز الوصول
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 } = 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);
res.status(500).send('فشل المصادقة');
}
});
الخطوة 6: إجراء استدعاءات 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: 'مزامنة العملاء المتوقعين مع CRM',
blueprint: {
modules: [
{
id: 1,
app: 'webhooks',
action: 'customWebhook',
parameters: { /* ... */ }
},
{
id: 2,
app: 'salesforce',
action: 'createRecord',
parameters: { /* ... */ }
}
],
connections: [
{ from: 1, to: 2 }
]
},
active: true,
description: 'مزامنة العملاء المتوقعين من Webhook إلى 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: 'جون دو',
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 // 'success', 'error', 'running'
});
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}`);
};
إدارة الـ Webhook
إنشاء Webhook
const createWebhook = async (webhookData) => {
const webhook = {
name: webhookData.name,
scenarioId: webhookData.scenarioId,
type: 'custom', // 'custom' or 'raw'
hookType: 'HEAD', // 'HEAD' or 'GET'
security: {
type: 'none' // 'none', 'basic', 'token'
}
};
const response = await makeRequest('/webhooks', {
method: 'POST',
body: JSON.stringify(webhook)
});
return response;
};
// استخدام
const webhook = await createWebhook({
name: 'Webhook لالتقاط العملاء المتوقعين',
scenarioId: '12345',
type: 'custom',
hookType: 'HEAD',
security: { type: 'none' }
});
console.log(`عنوان URL للـ Webhook: ${webhook.url}`);
سرد الـ Webhooks
const listWebhooks = async () => {
const response = await makeRequest('/webhooks');
return response;
};
// استخدام
const webhooks = await listWebhooks();
webhooks.data.forEach(webhook => {
console.log(`${webhook.name}: ${webhook.url}`);
});
حذف Webhook
const deleteWebhook = async (webhookId) => {
await makeRequest(`/webhooks/${webhookId}`, {
method: 'DELETE'
});
console.log(`تم حذف الـ Webhook ${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 // 'viewer', 'builder', 'manager', 'admin'
})
});
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}`);
};
أدوار المستخدمين
| الدور | الأذونات |
|---|---|
| مشاهد | عرض السيناريوهات فقط |
| منشئ | إنشاء وتعديل السيناريوهات |
| مدير | إدارة الفريق والفوترة |
| مسؤول | وصول كامل للمؤسسة |
تحديد المعدل
فهم حدود المعدل
| الخطة | الطلبات/دقيقة | حد الاندفاع |
|---|---|---|
| مجاني | 60 | 100 |
| أساسي (Core) | 120 | 200 |
| احترافي (Pro) | 300 | 500 |
| فرق (Teams) | 600 | 1000 |
| مؤسسي | مخصص | مخصص |
رؤوس حدود المعدل
| الرأس | الوصف |
|---|---|
X-RateLimit-Limit |
الحد الأقصى للطلبات |
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)
- [ ] تطبيق منطق إعادة المحاولة للتنفيذات الفاشلة
- [ ] إضافة تسجيل شامل
- [ ] إنشاء نسخ احتياطية أو تصدير للسيناريوهات الهامة
حالات الاستخدام الواقعية
إدارة عملاء الوكالات
- التحدي: تحديث يدوي للسيناريوهات عبر حسابات العملاء
- الحل: لوحة تحكم مركزية باستخدام Make API
- النتيجة: توفير 70% من الوقت، نشر متسق
التطبيق العملي:
- تكامل OAuth متعدد الحسابات
- نشر السيناريوهات بالجملة
- تقارير استخدام العملاء
معالجة طلبات التجارة الإلكترونية
- التحدي: إدخال الطلبات يدويًا إلى نظام المستودع
- الحل: سيناريو Make مدفوع بـ Webhook
- النتيجة: صفر إدخال يدوي، دقة 99.9%
التطبيق العملي:
- Webhook من Shopify إلى Make
- السيناريو يعالج الطلب ويحدث المستودع
- معالجة الأخطاء بمنطق إعادة المحاولة
الخلاصة
Make API يمنح إمكانيات قوية لأتمتة سير العمل. أهم النقاط:
- استخدم مفتاح API للاستخدام الداخلي وOAuth 2.0 للتطبيقات متعددة المستأجرين
- عمليات CRUD للسيناريوهات، التنفيذ، وWebhooks
- إدارة الفريق للتحكم المؤسسي
- حدود معدل حسب الخطة (60-600 طلب/دقيقة)
- مراقبة التنفيذ ضرورية للإنتاج
- Apidog يبسط اختبار API والتعاون بين الفرق
كيف يمكنني المصادقة باستخدام Make API؟
استخدم مفتاح API من إعدادات المطور للتكاملات الداخلية، أو OAuth 2.0 للتطبيقات متعددة المستأجرين.
هل يمكنني تشغيل السيناريوهات برمجيًا؟
نعم، استخدم نقطة النهاية /scenarios/{id}/execute لتشغيل السيناريوهات يدويًا مع بيانات إدخال اختيارية.
ما هي حدود معدل Make؟
تتراوح حدود المعدل من 60 طلبًا/دقيقة (الخطة المجانية) حتى 600 طلب/دقيقة (خطط الفرق/المؤسسات).
كيف أحصل على سجلات التنفيذ؟
استخدم /scenarios/{id}/executions لجلب سجل التنفيذ مع إمكانية التصفية حسب التاريخ والحالة.
هل يمكنني إنشاء Webhooks عبر API؟
نعم، استخدم نقطة النهاية /webhooks لإنشاء الـ Webhooks للسيناريوهات وسردها وحذفها.
Top comments (0)