الخدمة 6

Webhook المحادثات

WEBHOOKPOST على URL تحدده إنصاف

هنا Velents هي التي ترسل POST إلى سيرفر إنصاف مع كل event في محادثة الـ chat widget.

التفعيل: أضف data-webhook إلى الـ embed snippet الموجود عندكم دون تغيير الباقي.

  • •القيمة يجب أن تكون JSON صحيحاً بين single quotes. الـ JSON الخاطئ يُتجاهل ويبقى الـ widget شغالاً.
  • •الـ objects والـ arrays المتداخلة في headers / body تُحذف، والأرقام والـ booleans تتحول إلى strings.
  • •التغيير يؤثر على المحادثات الجديدة فقط.
  • •الـ snippet عام (public)، فلا تضع أي secret في headers أو body.
  • •قيم data-var-* ترجع في conversation.values، ويمكنك ربط المحادثة بالمستخدم عندك من خلالها.
  • •طريقة الإرسال: POST JSON مع headers الخاصة بك + X-Velents-Authorization. كل event يُرسل مرة واحدة دون retry؛ أي رد غير 2xx يضيع. أرجع فوراً ونفّذ العمل async.

إعدادات data-webhook

الحقلالنوعمطلوبالشرح
linkHTTPS URLإجباريالـ URL نفسه. إن كان فارغاً يُستخدم webhook الـ agent إن وجد.
bodyobjectاختياريkeys تُدمج في الـ payload. القيم strings.
headersobjectاختياريheaders مع كل request. القيم strings.
eventsstring[]اختياريMessage أو Update أو Ended. فارغ = الكل.
embed snippet
<script src="https://assets.velents.ai/loader.global.js"
  data-auth-token="<token>"
  ...
  data-webhook='{
    "link": "https://your-server.com/velents/webhook",
    "body": {},
    "headers": { "X-Client-Id": "acme" },
    "events": ["Message", "Update", "Ended"]
  }'>
</script>

Events

event.typeيُرسل عندresult.messageresult.history
onMessageرسالة من العميل، أو رد لم تتغير معه الـ extracted dataالرسالةغير موجود
onUpdateرد تغيّرت معه الـ extracted dataالردالـ transcript كامل
onEndedانتهاء المحادثةسبب الإنهاءالـ transcript كامل

حقول الـ Payload

Fieldالشرح
agent.id, agent.publicid الـ AI agent والـ public id الخاص به.
conversation.idالـ key الذي تخزّن عليه كل شيء.
conversation.channel_idid القناة (web chat, WhatsApp, ...)، أو null لتجارب الـ dashboard.
conversation.created_by_id, agent_batch_idالمستخدم الذي أنشأ المحادثة، والـ batch إن بدأت من batch (أو null).
conversation.phoneهاتف العميل إن كانت القناة فيها هاتف، null على الـ web widget.
conversation.valuesقيم data-var-*.
result.messageالرسالة: message, media_url[], type (text / image / audio / document), role, timestamp, metadata.tool_calls[].
result.goalsالبيانات المستخرجة حتى الآن، غير موجود حتى يُستخرج شيء.
result.history[]الـ transcript، الأقدم أولاً، وكل عنصر فيه message و role و timestamp. في onUpdate و onEnded فقط.

حالات المحادثة (conversation.status)

Statusالمعنى
activeالـ AI يتولاها
human_pendingبانتظار موظف
human_responsesموظف يتولاها
payment_pendingمتوقفة لعدم وجود رصيد
completedالـ AI أغلقها
expiredأُغلقت دون أن تكتمل
endedأُغلقت
pending_safha, inactive, draft, WhatsAppInitحالات أخرى
payload
{
  "event": { "type": "onUpdate", "about": "conversation" },
  "agent": { "id": 12, "public": "boddy_acme_Agent_12" },
  "conversation": {
    "id": 991, "channel_id": 3, "created_by_id": 5, "agent_batch_id": null, "phone": null,
    "status": "active", "values": { "customer_name": "Sara" }, "created_at": "2026-10-17 10:00:00"
  },
  "result": {
    "message": {
      "message": "Sure, your order ships tomorrow.", "media_url": [], "type": "text",
      "role": "agent", "timestamp": "2026-10-17 10:00:05", "metadata": { "tool_calls": [] }
    },
    "goals": { "customer_name": "Sara", "order_number": "A-1043" },
    "history": [
      { "role": "customer", "message": "Where is my order A-1043?", "timestamp": "2026-10-17T10:00:01.123000" },
      { "role": "agent", "message": "Sure, your order ships tomorrow.", "timestamp": "2026-10-17T10:00:05.456000" }
    ]
  }
}