دليل لوحتك
صفحة واحدة، ثلاثة مسارات: ابدأ هنا، ومرّر الثاني إلى من يتولى الحالات، وأرسل الثالث إلى من يكتب الكود.
لمن ينشر الموقع
ثلاث ودجات قابلة للتضمين بسطر سكربت واحد: نموذج الاتصال، وفتح الحالات، ولوحة العميل النهائي.
الودجات →لمن يتولى الدمج
واجهة REST API ببيانات اعتماد خاصة، وWebhooks موقعة، ومزامنة تزايدية.
مرجع API →ما هي اللوحة
لوحة دعم متعددة العلامات التجارية: أنت تخدم عملاءك أنت، تحت علامتك أنت، على بنيتنا التحتية نحن.
لوحة الدعم هي قائمة انتظار واحدة لحالات عمليتك: يفتح عملاؤك الحالات من موقعك (الودجات) أو عبر API أو بالبريد الإلكتروني، ويتولاها فريقك من لوحة تحكم خاصة على dash.elportaldelcliente.com. كل حالة تدخل وتتقدّم وتتصعّد دون أن يكون أحد مستيقظًا — لكنها لا تُغلق دون اسم يقف خلفها.
لوحتك مستأجر معزول: حالاتك وعملاؤك النهائيون ووكلاؤك لا يختلطون بأحد سواك. العزل جزء من تصميم النظام، لا إعداد يمكن نسيانه. إن لمس فريقنا حالة من حالاتك بصفته دعمًا من المستوى الأخير، يُسجَّل الوصول ويمكنك الاطلاع عليه.
دليل البدء
من الصفر إلى التشغيل، في خمس خطوات.
- أنشئ حسابك على dash.elportaldelcliente.com.
- فعّل خطة. تُدفع من رصيد حسابك (المحفظة نفسها للمنظومة كلها)؛ وإن نقصك رصيد، تعرض عليك الشاشة شحن المبلغ الناقص بالضبط.
- ادعُ وكلاءك من تبويب «الوكلاء»: البريد الإلكتروني والدور (وكيل أو مدير). ستتلقى رابط دخول لتسليمه لهم.
- شغّل ودجة من «الودجات وAPI»: سجّل نطاق موقعك كمصدر مصرّح به، وانسخ السكربت وألصقه في موقعك.
- هل تتكامل برمجيًا؟ أصدر بيانات اعتمادك
tab_live_من التبويب نفسه واتبع مرجع API في هذه الصفحة.
ACME) فتُرقَّم حالاتك ACME-1044. الحالات الصادرة من قبل لا يُعاد ترقيمها.لوحة التحكم
لوحة تحكم المستأجر على dash.elportaldelcliente.com، تبويبًا تبويبًا.
| التبويب | الوظيفة |
|---|---|
الملخص | وضع اشتراكك وانتهاؤه وتجديده والتجديد التلقائي. ومن هنا يتم الإلغاء أيضًا. |
الوكلاء | الدعوة عبر البريد بدور وكيل أو مدير؛ وتغيير الأدوار؛ وسحب الوصول. صاحب الحساب يظل محميًا. |
الودجات وAPI | بادئة الحالات، والمصادر المصرّح بها (CORS)، والودجات الثلاث مع سكربتها، وبيانات اعتماد API. |
وصول المزوّد | سجل التدقيق: كل وصول من فريقنا إلى حالاتك، بمن وماذا ومتى. |
الوكلاء الذين تدعوهم يرون حالات لوحتك ويتولونها؛ ويدير المديرون فوق ذلك الاشتراك والفريق والتكاملات.
ودجات لموقعك
ثلاث ودجات، سطر سكربت واحد لكل منها. بلا iframes من أطراف ثالثة، وبلا ملفات تعريف ارتباط للتتبع.
من تبويب «الودجات وAPI» في لوحة تحكمك: شغّل الودجة، وسجّل نطاق موقعك كمصدر مصرّح به وانسخ السكربت المولَّد. تقبل المعلمة data-color لون علامتك التجارية.
<script src="https://api.elportaldelcliente.com/api/tablero/widget/tablero.js"
data-tenant="su-tablero" data-widget="contacto" data-color="#a177ff"></script>
| data-widget | الوظيفة | المتطلبات |
|---|---|---|
contacto | نموذج اتصال: الاسم والبريد والرسالة. ينشئ حالة في لوحتك. | ودجة مشغّلة + مصدر مصرّح به |
abrir-caso | فتح حالات بموضوع: يعيد رقم الحالة إلى الزائر. | ودجة مشغّلة + مصدر مصرّح به |
tablero | لوحة العميل النهائي: يرى حالاته ويفتحها ويرد عليها من موقعك. | ما سبق + رمز العميل (أدناه) |
حماية الودجات
تقبل الودجات المجهولة 10 محاولات لكل زائر (IP) كل 10 دقائق لكل لوحة. إذا كانت الودجة مطفأة، أو المصدر غير مصرّح به، أو الاشتراك منتهيًا، ترد الودجة بـ 404 widget no disponible — بشكل متعمد لا يمكن تمييزه، حتى لا تنكشف إعدادات لوحتك.
ودجة «اللوحة»: التعرف على عميلك
تعرض ودجة اللوحة لكل عميل نهائي حالاته هو فقط. لذلك يستبدل خادمك رمزًا مؤقتًا لكل عميل: استدعِ POST /v1/clientes/:ref/token-widget ببيانات اعتماد API (من جانب الخادم، وليس من المتصفح أبدًا) وسلّم الرمز إلى الودجة.
curl -X POST https://api.elportaldelcliente.com/api/tablero/v1/clientes/cli-842/token-widget \
-H "Authorization: Bearer $TABLERO_KEY"
HTTP/1.1 201
{"success":true,"data":{"token":"tabw_…","expires_at":"2026-08-18 21:15:00"}}
window.TableroPortal.setToken(token);
tabw_ يعيش 15 دقيقة ولا يُجدَّد. عند انتهائه تتلقى الودجة 401 token_vencido: استبدل رمزًا آخر. لا تكشف أبدًا بيانات اعتمادك tab_live_ في المتصفح — الرمز المؤقت وُجد لهذا الغرض بالضبط.بيانات اعتماد API
بيانات اعتماد Bearer واحدة لكل تكامل، بنطاق مقيّد وقابلة للإلغاء.
تُصدر بيانات الاعتماد من لوحة تحكمك («الودجات وAPI» ← «بيانات اعتماد API»). لها الشكل tab_live_… وتُعرض مرة واحدة فقط: احفظها في مدير أسرارك. نحن لا نخزّن سوى الـ hash الخاص بها.
curl -H "Authorization: Bearer tab_live_…" \
https://api.elportaldelcliente.com/api/tablero/v1/
عند إصدارها يمكنك تقييد نطاقاتها (scopes). بيانات اعتماد بلا نطاقات صريحة تصل إلى لوحتك كاملة:
| Scope | يتيح |
|---|---|
casos.read | قراءة الحالات وردودها |
casos.write | إنشاء الحالات والرد وتغيير الوضع/الأولوية |
clientes.read | قراءة عملائك النهائيين |
clientes.write | إنشاء/تعطيل العملاء النهائيين وإصدار رموز الودجات |
departamentos.manage | قراءة الأقسام وإدارتها (بما فيها صناديق بريد IMAP) |
webhooks.manage | قراءة Webhooks وإدارتها |
accesos.read | قراءة سجل تدقيق وصول المزوّد |
- بحد أقصى 5 بيانات اعتماد نشطة لكل لوحة. ألغِ ما لم تعد تستخدمه.
- بيانات الاعتماد تحدد هوية لوحتك: لا ترسل أبدًا
tenant_idفي المتن — ترفضه الواجهة بالرمز 400. - مع اشتراك منتهٍ تواصل بيانات الاعتماد القراءة (GET)؛ وكل كتابة ترد بـ
402 suscripcion_vencida. - بيانات الاعتماد الملغاة ترد بـ 401 فورًا على جميع المسارات.
tab_live_ لا توضع أبدًا في المتصفح ولا في تطبيق جوال ولا في مستودع كود. للمتصفح يوجد الرمز المؤقت tabw_.مرجع API
REST فوق HTTPS، وJSON في الاتجاهين، وردود بالشكل {success, data}.
الاصطلاحات: المتون تُرسل بـ Content-Type: application/json؛ والتواريخ UTC بصيغة YYYY-MM-DD HH:MM:SS؛ والقوائم المقسّمة إلى صفحات تعيد total وpage وlimit. ما ليس لك يرد بـ 404، وليس 403 أبدًا: الواجهة لا تؤكد وجود موارد الغير.
https://api.elportaldelcliente.com/api/tablero/v1
الجذر: الهوية والخطة والاستخدام
GET / هو العقد الذي لا يستطيع الكذب: يعيد من أنت، وما نطاقات بيانات الاعتماد هذه، وخطتك بحدودها، ووضع اشتراكك، وكم استهلكت.
curl -H "Authorization: Bearer $TABLERO_KEY" \
https://api.elportaldelcliente.com/api/tablero/v1/
{"success":true,"data":{
"tenant":{"slug":"su-tablero","nombre":"Su Marca"},
"scopes_de_esta_credencial":["casos.read","casos.write"],
"plan":{"id":"tablero-base","nombre":"BASE","limites":{"max_agentes":5,"max_departamentos":5,"max_articulos_kb":100}},
"suscripcion":{"estado":"active","current_period_end":"2027-08-18"},
"uso":{"agentes":3,"departamentos":2},
"recursos":["/casos","/clientes","/departamentos","/accesos","/webhooks"],
"version":"v1"}}
العملاء النهائيون
العميل النهائي هو عميل لك أنت (وليس حسابًا في منظومتنا). يُعرَّف بـ external_ref: المعرّف الذي يحمله ذلك العميل في نظامك أنت.
| الطريقة | المسار | Scope | الوظيفة |
|---|---|---|---|
| GET | /clientes | clientes.read | سرد العملاء (حتى 500، الأحدث أولًا) |
| POST | /clientes | clientes.write | إنشاء أو تحديث حسب external_ref (عملية upsert آمنة عند التكرار) |
| GET | /clientes/:ref | clientes.read | قراءة عميل عبر external_ref الخاص به |
| DELETE | /clientes/:ref | clientes.write | تعطيل (لا حذف: يُحتفظ بسجل حالاته) |
| POST | /clientes/:ref/token-widget | clientes.write | إصدار رمز مؤقت لودجة «اللوحة» (15 دقيقة) |
curl -X POST https://api.elportaldelcliente.com/api/tablero/v1/clientes \
-H "Authorization: Bearer $TABLERO_KEY" \
-H "Content-Type: application/json" \
-d '{"external_ref":"cli-842","email":"[email protected]","name":"Maria Rojas"}'
POST /clientes عملية upsert حسب external_ref — تكرار الاستدعاء لا يكرر العملاء. أما عند إنشاء الحالات، فإعادة محاولة بسبب الشبكة تنشئ حالة جديدة: أعد المحاولة فقط عندما لا يصلك رد.الحالات
المورد المركزي. للحالة وضع وأولوية وعميل نهائي اختياري ومحادثة من الردود. الملاحظات الداخلية للوكلاء لا تُكشف أبدًا عبر API.
| الطريقة | المسار | Scope | الوظيفة |
|---|---|---|---|
| GET | /casos | casos.read | السرد بمرشحات: الوضع والعميل وupdated_since وlimit (من 1 إلى 100) وpage |
| POST | /casos | casos.write | إنشاء حالة (subject إلزامي؛ cliente_ref وpriority وdepartment_id وbody/body_html اختيارية) |
| GET | /casos/:id | casos.read | التفاصيل مع المحادثة الكاملة (الردود مرتبة). يقبل معرف الحالة أو رقمها (مثل SOLC-1051) على حد سواء |
| POST | /casos/:id/respuestas | casos.write | الرد بصفة فريقك، أو بصفة العميل عبر en_nombre_de |
| PATCH | /casos/:id | casos.write | تغيير status و/أو priority |
إنشاء حالة مرتبطة بعميل نهائي:
curl -X POST https://api.elportaldelcliente.com/api/tablero/v1/casos \
-H "Authorization: Bearer $TABLERO_KEY" \
-H "Content-Type: application/json" \
-d '{"subject":"No puedo entrar al panel","cliente_ref":"cli-842","priority":"high",
"body":"Al iniciar sesion la pagina queda en blanco."}'
HTTP/1.1 201
{"success":true,"data":{"id":"…","numero":"SOLC-1051"}}
السرد بمرشحات، والمزامنة التزايدية عبر updated_since (ISO 8601): في هذا الوضع يكون الترتيب حسب updated_at تصاعديًا، وهو مصمم للتقدم صفحة صفحة دون فقدان تغييرات. احفظ أعلى updated_at عالجته واستخدمه مؤشرًا للجولة التالية.
curl -H "Authorization: Bearer $TABLERO_KEY" \
"https://api.elportaldelcliente.com/api/tablero/v1/casos?estado=open&cliente=cli-842&limit=50&page=1"
# مزامنة تزايدية (الترتيب: updated_at تصاعديًا)
curl -H "Authorization: Bearer $TABLERO_KEY" \
"https://api.elportaldelcliente.com/api/tablero/v1/casos?updated_since=2026-08-18T00:00:00Z&limit=100"
estado خارج القائمة الصالحة (أو أي معامل غير معروف) تُرجع 400 مع التفاصيل — لا يُتجاهل أبدًا بصمت ولا تُعاد القائمة كاملة دون تحذير.الرد على حالة. دون en_nombre_de يوقَّع الرد باسم فريقك (author_type: agent)؛ ومع en_nombre_de يوقَّع باسم ذلك العميل النهائي (author_type: client):
curl -X POST https://api.elportaldelcliente.com/api/tablero/v1/casos/$CASO_ID/respuestas \
-H "Authorization: Bearer $TABLERO_KEY" \
-H "Content-Type: application/json" \
-d '{"body":"Ya lo revisamos: intente de nuevo.","autor_nombre":"Soporte Acme"}'
# ...أو باسم العميل النهائي:
-d '{"body":"Sigue igual desde mi lado.","en_nombre_de":"cli-842"}'
| الحقل | القيم |
|---|---|
status | open · pending · resolved · closed |
priority | low · medium · high · urgent |
author_type | client · agent |
الأقسام
قوائم انتظار داخلية للوحتك (مبيعات، فوترة، دعم تقني…). يمكن لكل قسم أن يملك صندوق بريد IMAP خاصًا به: تستطلعه اللوحة وتحوّل الرسائل الواردة إلى حالات.
| الطريقة | المسار | Scope | الوظيفة |
|---|---|---|---|
| GET | /departamentos | departamentos.manage | سرد الأقسام (يتضمن إعدادات البريد، دون كلمة المرور) |
| POST | /departamentos | departamentos.manage | إنشاء (name إلزامي؛ صندوق IMAP اختياري؛ خاضع لحد الخطة) |
| PUT | /departamentos/:id | departamentos.manage | تعديل أي حقل؛ email_password فارغ يحذف بيانات الاعتماد |
| DELETE | /departamentos/:id | departamentos.manage | أرشفة (الحالات القائمة لا تُمس) |
الصندوق يتحدث IMAP دائمًا (email_protocol: imap)؛ كلمة المرور تُشفَّر في حال السكون ولا تُعاد أبدًا. مع email_polling_enabled: 1 يجري الاستطلاع تلقائيًا.
تدقيق الوصول
كل وصول من فريقنا إلى حالات لوحتك يُسجَّل. هذا هو سجل التدقيق نفسه الموجود في تبويب «وصول المزوّد»، قابلًا للقراءة عبر API:
curl -H "Authorization: Bearer $TABLERO_KEY" \
https://api.elportaldelcliente.com/api/tablero/v1/accesos
Webhooks
نظامك يعلم في اللحظة نفسها: كل حدث يُرسل موقَّعًا إلى عنوان HTTPS الخاص بك.
| الحدث | يُطلق عندما |
|---|---|
caso.creado | تولد حالة في لوحتك — عبر API أو ودجة أو بريد وارد |
caso.respondido | يرد أحدهم: فريقك (من لوحة التحكم أو API)، أو عميلك النهائي (ودجة أو API أو بريد) |
caso.estado_cambiado | يتغير وضع حالة (بيد فريقك، أو عبر API، أو من نظامنا) |
سجّل ما تحتاجه عبر POST /webhooks: عنوان https، والأحداث التي تريدها، وسر من 16 حرفًا على الأقل نوقّع به كل تسليم.
curl -X POST https://api.elportaldelcliente.com/api/tablero/v1/webhooks \
-H "Authorization: Bearer $TABLERO_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://su-sistema.com/hooks/tablero",
"eventos":["caso.creado","caso.respondido","caso.estado_cambiado"],
"secret":"un-secreto-de-al-menos-16-caracteres"}'
كل تسليم هو POST يحمل الحدث ولحظة الإصدار والحد الأدنى من البيانات للتفاعل. يغطي التوقيع timestamp.body:
POST /hooks/tablero
Content-Type: application/json
X-Tablero-Evento: caso.respondido
X-Tablero-Timestamp: 1765432100
X-Tablero-Firma: 3f1a… # HMAC-SHA256(secret, timestamp + "." + body)
{"evento":"caso.respondido","emitido_at":"2026-08-18T20:15:00.000Z",
"data":{"caso_id":"…","numero":"SOLC-1051","respuesta_id":"…","autor_tipo":"agent"}}
التحقق من التوقيع
ارفض كل تسليم لا يجتاز توقيعه التحقق أو يبعد طابعه الزمني أكثر من 5 دقائق عن الساعة. وقارن بوقت ثابت.
// Node.js
const crypto = require('node:crypto');
function verificarFirma(rawBody, headers, secret) {
const ts = headers['x-tablero-timestamp'];
const sig = headers['x-tablero-firma'];
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const esperado = crypto.createHmac('sha256', secret)
.update(ts + '.' + rawBody).digest('hex');
return sig.length === esperado.length &&
crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(sig));
}
# Python
import hashlib, hmac, time
def verificar_firma(raw_body: bytes, headers: dict, secret: str) -> bool:
ts = headers.get("x-tablero-timestamp", "")
sig = headers.get("x-tablero-firma", "")
if abs(time.time() - float(ts or 0)) > 300:
return False
esperado = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body,
hashlib.sha256).hexdigest()
return hmac.compare_digest(esperado, sig)
دلالات التسليم (اقرأها قبل أن تثق)
- محاولة واحدة لكل حدث، دون إعادة. إن لم يرد نظامك بـ 2xx خلال 10 ثوانٍ، يضيع ذلك التسليم — الوضع الفعلي يظل قابلًا لإعادة القراءة عبر API.
- شبكة أمانك هي المزامنة التزايدية: جولة دورية على
GET /casos?updated_since=…تسترد أي حدث ضائع. GET /webhooksيعرضfail_countوlast_ok_atوlast_error_atلكل Webhook: راجعها عند التصحيح.- تُطلق الأحداث أيًا كانت القناة: API أو الودجات أو لوحة فريقك أو فريقنا أو البريد الوارد من عميلك النهائي.
الأخطاء
أخطاء JSON بـ success:false؛ ورمز HTTP هو الحكم.
{"success":false,"error":"…"}
| HTTP | المعنى |
|---|---|
400 | طلب غير صالح: حقل إلزامي ناقص أو قيمة لا تجتاز التحقق |
401 | بيانات اعتماد غائبة أو غير صالحة أو ملغاة |
402 | اشتراك منتهٍ: قراءة فقط حتى التجديد (suscripcion_vencida) |
403 | بيانات الاعتماد لا تملك النطاق الذي تتطلبه نقطة النهاية |
404 | غير موجود بالنسبة إليك: موارد الغير والمسارات غير الموجودة ترد بالمثل |
409 | تعارض: بلوغ حد الخطة أو slug مستخدم من قبل |
429 | محاولات كثيرة جدًا (الودجات المجهولة: 10 لكل IP كل 10 دقائق) |
500 | خطأ من جانبنا؛ إن استمر، راسلنا بالساعة الدقيقة |
رسائل error نص مقروء للبشر وقد تتغير. فرّع كودك حسب رمز HTTP وهذه المعرّفات (slugs) الثابتة:
| Slug ثابت | المعنى |
|---|---|
suscripcion_vencida | 402 في الكتابات مع اشتراك منتهٍ |
token_vencido | 401 من ودجة «اللوحة» عندما ينتهي الرمز tabw_: استبدل غيره |
saldo_insuficiente | 402 من لوحة التحكم عند التفعيل/التجديد دون رصيد كافٍ |
الخطط
خمس خطط سنوية، واللوحة نفسها. الفرق هو كم يتسع فيها من الأشخاص والبنية.
تُنشر الأسعار السارية في الصفحة الرئيسية وعبر API العامة (GET /api/public/tablero/plans). جميع الخطط تشمل حالات غير محدودة والودجات وAPI وWebhooks وتدقيق الوصول.
| الخطة | الوكلاء | الأقسام | مقالات قاعدة المعرفة |
|---|---|---|---|
| ZERO | 2 | 2 | 25 |
| BASE | 5 | 5 | 100 |
| PLUS | 10 | 10 | 250 |
| PRO | 20 | 15 | 500 |
| MAX | 50 | 25 | 1000 |
عند انتهاء اشتراكك توجد فترة سماح؛ بعدها تنتقل اللوحة إلى القراءة فقط (طلبات GET تظل ترد، والكتابات تعيد 402). بياناتك لا تُحذف.
الحدود التشغيلية
- الحالات: غير محدودة في جميع الخطط. تقبل القوائم
limitمن 1 إلى 100 لكل صفحة. - العملاء النهائيون والتدقيق: تعيد القوائم حتى 500 صف (الأحدث أولًا). استخدم
GET /clientes/:refللقراءات المفردة. - بيانات الاعتماد: حتى 5 نشطة لكل لوحة.
- الودجات المجهولة: 10 محاولات لكل زائر (IP) كل 10 دقائق.
- المرفقات: لا تقبل API الملفات بعد؛ مرفقات البريد الوارد تُحفظ مع الحالة.
لا تفرض الواجهة اليوم حصة صارمة للاستدعاءات؛ اعمل بإيقاع معقول (توقفات بين الصفحات، وإعادة محاولة بتراجع أُسي). إن احتاج تكامل ما إلى حجم مضمون، فلنتحدث أولًا.