تتيح واجهة REST لأنظمتك قراءة جهات الاتصال والملاحظات والفرص وإنشاءها، وقراءة المسارات وطلبات المتاجر، وإرسال إنفاق الإعلانات اليومي، والاشتراك في الإشعارات الصادرة. تشرح هذه الصفحة القواعد المشتركة بين كل المسارات، أما المسارات نفسها ففي جهات الاتصال والمسارات والفرص وإنفاق الإعلانات والإشعارات الصادرة.
قبل أن تبدأ
تحتاج مفتاح API. ينشئ المالكون والمسؤولون المفاتيح من جهات الاتصال ثم أدوات ثم مفاتيح API، عندما تشمل الباقة واجهة API. راجع مفاتيح API.
العنوان الأساسي
كل المسارات تحت عنوان أساسي واحد:
https://rutbacrm.com/api/v1
كل المسارات في هذا الدليل نسبية إليه، فعبارة GET /contacts تعني GET https://rutbacrm.com/api/v1/contacts.
HTTPS إلزامي. والطلب عبر HTTP العادي يُرفض بالرد 403 HTTPS is required. ولا يُحوَّل، لأن المفتاح يكون قد عبر الشبكة دون حماية. وإن حدث ذلك فألغِ المفتاح وأنشئ غيره.
المصادقة
أرسل المفتاح رمزًا من نوع Bearer في ترويسة Authorization مع كل طلب:
curl https://rutbacrm.com/api/v1/me \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
يذكر الرد الشركة التي يخصها المفتاح، فهو اختبار أول مناسب:
{
"organization": {
"id": "ORGANIZATION_ID",
"name": "Your company"
}
}
المفتاح المفقود والخاطئ والملغى تلقى الرد نفسه، 401 مع {"message": "Invalid API key."}، فلا يكشف الرد هل المفتاح موجود أم لا.
الطلبات والردود
| القاعدة | التفاصيل |
|---|---|
| الصيغة | JSON فقط. يجب أن ترسل طلبات POST وDELETE الترويسة Content-Type: application/json، وإلا رُفضت بالرد 415 Send JSON.، حتى لو لم يكن فيها جسم |
| القبول | أرسل Accept: application/json |
| المعرفات | كل معرف سلسلة UUID، مثل 9d3c1f6e-2b7a-4c55-9a1e-3f0b8e2d7c41. والمعرف في المسار إن لم يكن UUID يرد 404 |
| التواريخ | التواريخ التي ترسلها بصيغة YYYY-MM-DD، والأوقات التي تصلك بصيغة ISO 8601 بتوقيت UTC |
| المبالغ | المبالغ التي ترسلها نصوص مثل "1250.50" بخانتين عشريتين على الأكثر. ومبلغ الفرصة المرسل رقمًا في JSON يُرفض |
| العملات | USD وEUR وGBP وTRY وSAR وAED |
| التخزين المؤقت | كل رد يحمل Cache-Control: no-store, private |
| المتصفحات | لا توجد ترويسات CORS. استدعِ الواجهة من خادم، لا من صفحة ويب |
الردود الناجحة تضع النتيجة داخل data، عدا GET /me ومسارات الإشعارات الصادرة التي تعيد حقولها في المستوى الأعلى.
المسارات
| الطريقة | المسار | صلاحية المفتاح | الدور | الغرض |
|---|---|---|---|---|
| GET | /me |
قراءة | أي دور | الشركة التي يخصها المفتاح |
| GET | /contacts |
قراءة | أي دور | عرض جهات الاتصال والبحث فيها |
| GET | /contacts/CONTACT_ID |
قراءة | أي دور | جهة واحدة مع وسومها وحقولها المخصصة |
| GET | /contacts/CONTACT_ID/orders |
قراءة | أي دور | طلبات المتجر الخاصة بالجهة |
| POST | /contacts |
كتابة | عضو فأعلى | إنشاء جهة |
| POST | /contacts/CONTACT_ID/notes |
كتابة | عضو فأعلى | إضافة ملاحظة |
| GET | /pipelines |
قراءة | أي دور | المسارات ومراحلها |
| POST | /deals |
كتابة | عضو فأعلى | فتح فرصة |
| POST | /ad-spend |
كتابة | مالك أو مسؤول | إرسال إنفاق الإعلانات اليومي |
| GET | /ad-conversions |
قراءة | مالك أو مسؤول | المبيعات من نقرات Google التي تنتظر الرفع |
| POST | /ad-conversions/confirm |
كتابة | مالك أو مسؤول | تعليم المبيعات المرفوعة بأنها أُرسلت |
| POST | /hooks |
كتابة | مالك أو مسؤول | الاشتراك في إشعار صادر |
| DELETE | /hooks/HOOK_ID |
كتابة | مالك أو مسؤول | إزالة إشعار صادر |
المقصود بالدور دور الشخص الذي أنشأ المفتاح. والمشاهدون يقرؤون فقط.
ويوجد أيضًا GET https://rutbacrm.com/api/v1/organizations/ORGANIZATION_ID/context، ويستخدمه التطبيق نفسه مع جلسة متصفح مسجلة الدخول. لا يقبل مفاتيح API، وليس مخصصًا للتكامل.
الصفحات
المسار GET /contacts وحده مقسم إلى صفحات، في كل صفحة 25 جهة:
{
"data": [],
"page": 1,
"pages": 4,
"total": 87
}
اطلب الصفحة التالية بإضافة ?page=2. أرقام الصفحات من 1 إلى 99999، والصفحة بعد الأخيرة تعيد قائمة data فارغة، فتوقف حين يساوي page قيمة pages. أما القوائم الأخرى فقصيرة وكاملة: حتى 20 مسارًا في كل منها حتى 12 مرحلة، وأحدث 10 طلبات للجهة.
البحث والتصفية
يقبل GET /contacts المعامل q، وهو بحث حتى 120 حرفًا يطابق كلمات في الاسم واسم الشركة والبريد والهاتف. تأتي النتائج بترتيب آخر تحديث، الأحدث أولًا. وتُستبعد من القائمة الجهات المؤرشفة والمدمجة والممحوة. ولا توجد تصفية أخرى: التصفية بالحالة والمسؤول والوسم موجودة في التطبيق لا في الواجهة.
حدود الطلبات
| الحد | النطاق | عند تجاوزه |
|---|---|---|
| 120 طلبًا في الدقيقة | لكل مفتاح، عبر كل المسارات. يبدأ العد من جديد مع بداية كل دقيقة | 429 مع {"message": "Too many requests."} |
| 600 طلب في الدقيقة | لكل عنوان مُرسِل، لكل مسار | 429 مع {"message": "Too Many Attempts."} وترويسة Retry-After |
الترويستان X-RateLimit-Limit وX-RateLimit-Remaining في كل رد تصفان حد العنوان المُرسِل، لا حد المفتاح. احتفظ بعدّ خاص بك لتبقى تحت 120 طلبًا في الدقيقة لكل مفتاح، أو وزّع العمل على مفاتيح مستقلة لأنظمة مستقلة. والطلبات المرفوضة في فحص المفتاح أو الباقة أو JSON لا تُحسب على المفتاح.
الأخطاء
الأخطاء بصيغة JSON وفيها message، وأخطاء التحقق تضيف كائن errors مفاتيحه أسماء الحقول. القائمة الكاملة لرموز الحالة وأسبابها في الأخطاء والحدود.
تكرار الطلب
لا توجد ترويسة لمنع التكرار (idempotency)، فخطط لإعادة المحاولة على هذا الأساس:
POST /contactsيحميك من التكرار: الجهة الثانية بالبريد نفسه أو الهاتف نفسه ترد409ما لم تؤكدها.POST /contacts/CONTACT_ID/notesوPOST /dealsينشئان سجلًا جديدًا مع كل استدعاء. فإن انتهت مهلة الطلب فتحقق قبل أن تعيد إرساله.POST /ad-spendآمن للتكرار: إرسال اليوم نفسه مرة أخرى يستبدل الرقم السابق أو يبقيه، ولا يضيف إليه.POST /ad-conversions/confirmآمن للتكرار: البيع المؤكد من قبل لا يُحسب مرة أخرى، ويذكر الرد عدد ما أُكّد للتو.
الإصدارات
الإصدار الحالي والوحيد هو v1، وهو جزء من العنوان الأساسي. لا توجد ترويسة للإصدار.
ما لا تفعله الواجهة
لا تستطيع الواجهة تعديل جهات الاتصال أو الفرص أو حذفها، ولا نقل الفرص بين المراحل، ولا إنشاء المهام، ولا إرسال الرسائل. ولا يوجد OAuth ولا ملف OpenAPI. ولتتفاعل مع ما يحدث في التطبيق استخدم الإشعارات الصادرة بدل السؤال المتكرر.
آخر تحديث 2026-11-08