DEV Community

Cover image for كيفية استخدام API تطبيق Make (Integromat)؟
Yusuf Khalidd
Yusuf Khalidd

Posted on • Originally published at apidog.com

كيفية استخدام API تطبيق Make (Integromat)؟

الملخص

يمكّن Make API (Integromat سابقًا) المطورين من أتمتة سير العمل وإدارة السيناريوهات وتنفيذ عمليات التكامل برمجيًا. يدعم المصادقة عبر OAuth 2.0 أو مفتاح API، ويوفر نقاط نهاية REST للتحكم في السيناريوهات، والتنفيذ، وWebhooks، والفرق، مع حدود معدل حسب الخطة (60-600 طلب/دقيقة). هذا الدليل يوضح الخطوات العملية لإعداد المصادقة، إدارة السيناريوهات، التعامل مع Webhooks، مراقبة التنفيذ، واستراتيجيات أتمتة الإنتاج.

جرّب Apidog اليوم

💡 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/
Enter fullscreen mode Exit fullscreen mode

إصدارات API

الإصدار الحالة حالة الاستخدام
v2 الحالي جميع عمليات التكامل الجديدة
v1 مهمل عمليات التكامل القديمة (يجب الترحيل)

البدء: إعداد المصادقة

الخطوة 1: إنشاء حساب Make

  1. زر Make.com
  2. سجل حساب جديد
  3. ادخل إلى الإعدادات > إعدادات المطور
  4. أنشئ بيانات اعتماد API

الخطوة 2: اختيار طريقة المصادقة

الطريقة الأفضل لـ مستوى الأمان
مفتاح API التكاملات الداخلية، السكريبتات مرتفع (خزن بأمان)
OAuth 2.0 تطبيقات العملاء، متعددة المستأجرين أعلى (رموز وصول فردية)

الخطوة 3: الحصول على مفتاح API (الأبسط)

للاستخدام الداخلي:

  1. من إعدادات المطور > مفاتيح API > أنشئ مفتاح جديد
  2. انسخ المفتاح وخزنه بأمان
# ملف .env
MAKE_API_KEY="your_api_key_here"
MAKE_ORGANIZATION_ID="your_org_id"
Enter fullscreen mode Exit fullscreen mode

الخطوة 4: إعداد OAuth 2.0 للتطبيقات متعددة المستأجرين

  1. من إعدادات المطور > تطبيقات OAuth > أنشئ تطبيق جديد
  2. عيّن URI لإعادة التوجيه
  3. احصل على 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()}`;
};
Enter fullscreen mode Exit fullscreen mode

الخطوة 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('فشل المصادقة');
  }
});
Enter fullscreen mode Exit fullscreen mode

الخطوة 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} سيناريو`);
Enter fullscreen mode Exit fullscreen mode

إدارة السيناريوهات

سرد السيناريوهات

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 || 'لم يتم تشغيله مطلقًا'}`);
});
Enter fullscreen mode Exit fullscreen mode

الحصول على تفاصيل السيناريو

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 || 'يدوي'}`);
Enter fullscreen mode Exit fullscreen mode

إنشاء سيناريو

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}`);
Enter fullscreen mode Exit fullscreen mode

تحديث سيناريو

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'
  }
});
Enter fullscreen mode Exit fullscreen mode

حذف سيناريو

const deleteScenario = async (scenarioId) => {
  await makeRequest(`/scenarios/${scenarioId}`, {
    method: 'DELETE'
  });
  console.log(`تم حذف السيناريو ${scenarioId}`);
};
Enter fullscreen mode Exit fullscreen mode

إدارة التنفيذ

تشغيل تنفيذ السيناريو

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'
  }
});
Enter fullscreen mode Exit fullscreen mode

الحصول على سجل التنفيذ

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}`);
});
Enter fullscreen mode Exit fullscreen mode

الحصول على تفاصيل التنفيذ

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}`);
Enter fullscreen mode Exit fullscreen mode

إيقاف التنفيذ الجاري

const stopExecution = async (executionId) => {
  await makeRequest(`/executions/${executionId}`, {
    method: 'DELETE'
  });
  console.log(`تم إيقاف التنفيذ ${executionId}`);
};
Enter fullscreen mode Exit fullscreen mode

إدارة الـ 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}`);
Enter fullscreen mode Exit fullscreen mode

سرد الـ 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}`);
});
Enter fullscreen mode Exit fullscreen mode

حذف Webhook

const deleteWebhook = async (webhookId) => {
  await makeRequest(`/webhooks/${webhookId}`, {
    method: 'DELETE'
  });
  console.log(`تم حذف الـ Webhook ${webhookId}`);
};
Enter fullscreen mode Exit fullscreen mode

إدارة الفريق والمستخدمين

سرد أعضاء الفريق

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}`);
});
Enter fullscreen mode Exit fullscreen mode

إضافة عضو فريق

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');
Enter fullscreen mode Exit fullscreen mode

تحديث دور المستخدم

const updateUserRole = async (organizationId, userId, newRole) => {
  await makeRequest(`/organizations/${organizationId}/users/${userId}`, {
    method: 'PATCH',
    body: JSON.stringify({ role: newRole })
  });
  console.log(`تم تحديث دور المستخدم ${userId} إلى ${newRole}`);
};
Enter fullscreen mode Exit fullscreen mode

أدوار المستخدمين

الدور الأذونات
مشاهد عرض السيناريوهات فقط
منشئ إنشاء وتعديل السيناريوهات
مدير إدارة الفريق والفوترة
مسؤول وصول كامل للمؤسسة

تحديد المعدل

فهم حدود المعدل

الخطة الطلبات/دقيقة حد الاندفاع
مجاني 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;
      }
    }
  }
};
Enter fullscreen mode Exit fullscreen mode

قائمة التحقق من النشر في الإنتاج

قبل الإطلاق، تأكد من:

  • [ ] استخدام مفتاح 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)