تُصادَق كل طلبات Joryio REST API باستخدام مفتاح API. يرتبط كل مفتاح بمساحة عمل واحدة، ويحمل قائمة صريحة من الصلاحيات، ويمكن تقييده بمجموعة عناوين IP.
جميع نقاط النهاية في هذه الصفحة نسبية إلى عنوان الأساس: https://api-eu1.joryio.com. راجع نظرة عامة على API.
إنشاء مفتاح
- افتح لوحة Joryio وانتقل إلى Settings ← API Keys.
- انقر Create API Key.
- امنح المفتاح اسمًا ووصفًا اختياريًا يراه زملاؤك.
- أضف اختياريًا قائمة سماح IP: قائمة CIDR أو عناوين IP مفردة مفصولة بفواصل أو مسافات. اتركها فارغة للسماح بأي IP.
- حدّد الصلاحيات التي يحتاجها المفتاح. اختر أصغر مجموعة تحقق الغرض؛ راجع كتالوج النطاقات أدناه.
- انقر Create key.
تظهر قيمة المفتاح الكاملة مرة واحدة فقط، مباشرة بعد الإنشاء، ولا تظهر مجددًا. انسخها إلى مدير الأسرار لديك، مثل 1Password أو Vault أو AWS Secrets Manager، قبل إغلاق النافذة. إن فقدتها، احذف المفتاح وأنشئ آخر؛ لا يستطيع Joryio استعادة القيمة الأصلية.
صيغة المفتاح هي jry_live_<random> لمفاتيح الإنتاج وjry_test_<random> لمفاتيح الاختبار. تظهر بادئة المفتاح المرئية، مثل jry_live_abc123، في قائمة المفاتيح في لوحة التحكم وسجلات الخادم، لتعرف أي مفتاح نفذ أي إجراء من دون كشف قيمته الكاملة.
استخدام مفتاح
أرسل المفتاح كـ bearer token في رأس Authorization مع كل طلب:
GET /users/by-user-id/user_123
Host: api-eu1.joryio.com
Authorization: Bearer jry_live_98f31a72…
Content-Type: application/json
كتالوج النطاقات
تأخذ الصلاحيات شكل <resource>:<verb>. الأفعال المستخدمة:
| الفعل | المعنى | مثال |
|---|
read | سرد السجلات الحالية أو جلبها | users:read, campaigns:read |
write | إنشاء السجلات أو تحديثها | users:write, segments:write |
send | تشغيل إجراء تسليم/إرسال | campaigns:send |
delete | إزالة السجلات نهائيًا | users:delete, campaigns:delete |
track | إرسال أحداث التحليلات | events:track |
activate | بدء سير عمل حي أو إيقافه مؤقتًا أو استئنافه | canvas:activate |
alias | إرفاق معرّفات بديلة أو فصلها | users:alias |
merge | دمج ملفَّي مستخدم | users:merge |
export | تصدير السجلات بالجملة | users:export |
فيما يلي الكتالوج العام الكامل، ويُعاد أيضًا من GET /api-keys/permissions:
Events
| النطاق | ما يسمح به |
|---|
events:track | إرسال أحداث مخصصة من خوادمك أو SDK. |
events:read | الاستعلام عن الأحداث التي تم تتبعها. |
Users
| النطاق | ما يسمح به |
|---|
users:read | البحث عن ملفات المستخدمين وسماتهم بالمعرّف. |
users:write | إنشاء سمات وخصائص المستخدم أو تحديثها. |
users:delete | إزالة ملفات المستخدمين نهائيًا (GDPR / حق المحو). |
users:alias | إرفاق أو فصل المعرّفات الخارجية وأسماء البريد البديلة لمستخدم. |
users:merge | دمج ملفَّي مستخدم في ملف واحد. |
users:export | تصدير ملفات المستخدمين بالجملة للتحليل دون اتصال. |
Campaigns
| النطاق | ما يسمح به |
|---|
campaigns:read | سرد الحملات وعرض إعداداتها. |
campaigns:write | إنشاء مسودات الحملات أو تعديلها عبر API. |
campaigns:send | تشغيل إرسال حملة إلى مستخدم أو شريحة محددة. |
campaigns:delete | إزالة الحملات نهائيًا من مساحة العمل. |
Segments
| النطاق | ما يسمح به |
|---|
segments:read | سرد الشرائح وعرض أعداد العضوية. |
segments:write | إنشاء تعريفات الشرائح أو تحديثها. |
segments:delete | حذف الشرائح وسجلها نهائيًا. |
رحلات المستخدمين
| النطاق | ما يسمح به |
|---|
canvas:read | سرد رحلات المستخدمين وفحص مخطط خطواتها. |
canvas:write | إنشاء مسودات رحلات المستخدمين أو تعديلها. |
canvas:activate | بدء رحلة مستخدم حية أو إيقافها مؤقتًا أو استئنافها. |
canvas:delete | إزالة رحلات المستخدمين وسجلها. |
القوالب
| النطاق | ما يسمح به |
|---|
templates:read | جلب محتوى قوالب Email وSMS وPush. |
templates:write | إنشاء قوالب الرسائل القابلة لإعادة الاستخدام أو تعديلها. |
templates:delete | حذف القوالب نهائيًا من Brand Studio. |
الاشتراكات
| النطاق | ما يسمح به |
|---|
subscriptions:read | عرض حالة قبول المستخدم للاشتراك عبر القنوات. |
subscriptions:write | اشتراك المستخدمين أو إلغاء اشتراكهم في المجموعات والقنوات. |
Apps ومفاتيح SDK
| النطاق | ما يسمح به |
|---|
apps:read | سرد التطبيقات ومفاتيح SDK المسجلة لمساحة العمل. |
apps:write | إضافة مفاتيح SDK لتطبيقات الجوال والويب أو تدويرها أو إزالتها. |
مكتبة الأصول
| النطاق | ما يسمح به |
|---|
assets:read | جلب الصور والخطوط والوسائط المشتركة الأخرى. |
assets:write | رفع الملفات أو إعادة تسميتها أو حذفها من مكتبة الأصول. |
الكيانات
| النطاق | ما يسمح به |
|---|
entities:read | الاستعلام عن سجلات الكيانات، كالمنتجات والمقالات والأماكن. |
entities:write | إنشاء سجلات الكيانات وخصائصها أو تحديثها. |
التحليلات
| النطاق | ما يسمح به |
|---|
analytics:read | جلب المقاييس المجمعة والمسارات وبيانات التقارير. |
قابلية التسليم
| النطاق | ما يسمح به |
|---|
email_suppression:read | فحص قائمة حظر Email، مثل الارتدادات والشكاوى والإدخالات اليدوية. |
email_suppression:write | إضافة إدخالات إلى قائمة حظر Email أو إزالتها. |
sms_suppression:read | فحص قائمة حظر SMS، مثل ردود STOP والإخفاقات. |
sms_suppression:write | إضافة أرقام الهاتف إلى قائمة حظر SMS أو إزالتها. |
حدود التكرار
| النطاق | ما يسمح به |
|---|
touching_rules:read | فحص قواعد حدود التكرار وعداداتها الحالية. |
touching_rules:write | إنشاء قواعد حدود التكرار أو تعديلها أو إزالتها. |
WhatsApp
| النطاق | ما يسمح به |
|---|
whatsapp:read | قراءة إعدادات WhatsApp Business. |
whatsapp:write | تحديث إعدادات حساب WhatsApp Business. |
وكلاء AI
| النطاق | ما يسمح به |
|---|
ai_agents:read | سرد وكلاء AI وإعداداتهم. |
ai_agents:write | إنشاء وكلاء AI أو تعديلهم وإعدادات موفريهم. |
قائمة سماح IP
يمكنك تثبيت المفتاح على مجموعة ثابتة من عناوين IP المصدر. عندما تكون قائمة السماح فارغة، تُقبل الطلبات من أي IP، وهو الإعداد الافتراضي. وعند وجود إدخالات، لا يمر إلا الطلب الذي يطابق عنوان IP مصدره إدخالًا واحدًا على الأقل.
الصيغة المقبولة
- عنوان IPv4 عادي:
203.0.113.42
- نطاق IPv4 CIDR:
10.0.0.0/24 أو 192.168.1.0/16
- عنوان IPv6: مطابقة تامة فقط؛ لا يوجد CIDR لـ IPv6 بعد.
اجمع إدخالات متعددة بفواصل في لوحة التحكم:
10.0.0.0/24, 203.0.113.42, 2001:db8::1
حل عنوان IP المصدر
يُستخرج IP العميل من رأس موثوق لشبكة الحافة، يُضبط من جديد مع كل طلب عند الحافة ولا يمكن أن تبقى قيمة يرسلها العميل، ثم يُستخدم عنوان اتصال الوكيل الموثوق كبديل. لا يُستخدم عمدًا إدخال X-Forwarded-For الذي يتحكم به العميل في أقصى اليسار، فلا يمكن تزوير قائمة السماح. تُطبّع عناوين IPv6 المعيّنة بـ IPv4، مثل ::ffff:203.0.113.42، إلى صيغة IPv4 قبل المطابقة.
شكل الطلب المرفوض
عندما يأتي طلب من IP غير موجود في قائمة السماح، يعيد API الخطأ 401 Unauthorized:
{
"statusCode": 401,
"message": "Request IP is not allowed for this API key",
"timestamp": "2026-05-12T08:14:00.000Z",
"path": "/users"
}
يُسجل الرفض على الخادم مع بادئة المفتاح وIP المخالف لتتمكن من مراجعته.
نقاط نهاية إدارة المفاتيح
تُدار المفاتيح من لوحة التحكم (Settings ← API Keys) أو عبر API:
| الطريقة | نقطة النهاية | الوصف |
|---|
| GET | /api-keys/permissions | سرد جميع النطاقات القابلة للمنح |
| POST | /api-keys | إنشاء مفتاح (?environment=live أو test؛ النص: name وdescription? وpermissions[] وipAllowlist? وexpiresAt?)؛ تُعاد قيمة المفتاح الكاملة مرة واحدة |
| GET | /api-keys | سرد مفاتيح مساحة العمل |
| GET | /api-keys/:apiKeyId | جلب بيانات مفتاح واحد |
| PUT | /api-keys/:apiKeyId | تحديث الاسم أو الوصف أو الصلاحيات أو قائمة سماح IP أو انتهاء الصلاحية |
| POST | /api-keys/:apiKeyId/revoke | تعطيل مفتاح، فيتوقف عن المصادقة فورًا |
| POST | /api-keys/:apiKeyId/rotate | إنشاء قيمة مفتاح جديدة مع الصلاحيات نفسها؛ تُعاد القيمة الجديدة مرة واحدة |
| DELETE | /api-keys/:apiKeyId | حذف مفتاح نهائيًا (يعيد 204) |
لا يمكن لأي مستدعٍ أن يمنح مفتاحًا نطاقات لا يحملها هو بنفسه.
حقول استجابة القائمة
يعيد GET /api-keys كائن { "apiKeys": [...] }، ويكون لكل مفتاح الشكل التالي؛ لا تظهر قيمة المفتاح الكاملة أو تجزئته مطلقًا:
{
"apiKeys": [
{
"id": "7c2e4f6a-1b3d-4e5f-8a9b-0c1d2e3f4a5b",
"name": "ServerSide Updates",
"description": "Used by our backend to send events.",
"keyPrefix": "jry_live_98f31a72",
"permissions": ["events:track", "users:write"],
"lastUsedAt": "2026-05-12T08:14:00.000Z",
"expiresAt": null,
"isActive": true,
"createdAt": "2026-02-19T12:00:00.000Z",
"updatedAt": "2026-02-19T12:00:00.000Z"
}
]
}
تُضبط ipAllowlist الخاصة بالمفتاح عند الإنشاء أو التحديث، وتُطبق على كل طلب لكنها لا تُضمّن في استجابة القائمة.
الأخطاء الشائعة
| الحالة | الرسالة | ما يجب التحقق منه |
|---|
401 | Invalid API key format | الرأس مفقود أو غير صالح أو لا يبدأ بـ jry_. |
401 | Invalid or expired API key | أُلغي المفتاح أو حُذف أو مرّ expiresAt الخاص به. |
401 | Request IP is not allowed for this API key | لم يطابق IP المصدر أي إدخال في قائمة السماح. راجع قائمة سماح IP. |
403 | This API key does not have the required permissions: ... | المفتاح صالح لكنه لا يحمل النطاق المطلوب لنقطة النهاية. |
403 | ORG_HARD_SUSPENDED: organization is suspended. Read-only access only. | أُوقفت المؤسسة المالكة؛ تواصل مع الدعم. |
تدوير مفتاح
استدعِ POST /api-keys/:apiKeyId/rotate أو استخدم لوحة التحكم: يحصل المفتاح على قيمة سرية جديدة وبادئة keyPrefix جديدة، وتُعاد القيمة مرة واحدة في الاستجابة، مع الاحتفاظ بالاسم والنطاقات والمعرّف. تفشل فورًا كل الأنظمة التي ما زالت تستخدم القيمة القديمة؛ لذلك انشر القيمة الجديدة أولًا حيثما أمكن، واستخدم keyPrefix في سجلات الوصول للعثور على التكاملات التي ما زالت تستخدم المفتاح القديم. ولتدوير بلا توقف، أنشئ مفتاحًا ثانيًا بالنطاقات نفسها، وانقل المستدعين إليه ثم احذف المفتاح القديم.