> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# قواعد الأحداث - السرعة والنسبة والتسلسل والارتباط

> قواعد السرعة والنسبة والتسلسل المرتب والارتباط عبر الكيانات على بيانات الأحداث في Didit، مكتوبة في منشئ القواعد نفسه لقواعد المعاملات.

تُقيَّم [الأحداث](https://docs.didit.me/ar/transaction-monitoring/events.md) بالمحرك نفسه الذي يقيّم المعاملات. هناك نموذج قواعد واحد، ومفردات شروط واحدة، ومجموعة واحدة من الإجراءات، والقاعدة تحدد ببساطة أنواع السجلات التي تنطبق عليها.

## تنطبق على

يحدد `scope.record_types` السجلات التي تُفعّل القاعدة عندها.

| `record_types` | تُطلَق عند |
| - | - |
| غير مُدرج أو `["transaction"]` | المعاملات فقط - **الافتراضي** |
| `["event"]` | الأحداث فقط |
| `["transaction", "event"]` | كلاهما |

> [!NOTE]
>
> عدم تضمينه يُبقي القاعدة مقتصرة على المعاملات. تعمل كل القواعد المكتوبة قبل وجود الأحداث بالسلوك نفسه تمامًا، ولا تبدأ القاعدة بمطابقة عمليات تسجيل الدخول لأن نطاقها كان فارغًا.

في الكونسول يظهر هذا على شكل محدد **تنطبق على** في خطوة المشغّل الخاصة بالقاعدة. عند اختيار الأحداث تظهر قائمة اختيار بعنوان **فئات الأحداث** تضيّق القاعدة أكثر، واتركها غير محددة لتقييم كل الفئات.

```json theme={null}
{
  "title": "Failed login burst",
  "scope": {
    "record_types": ["event"],
    "event_categories": ["security"]
  },
  "aggregation": [
    {
      "metric": "count",
      "operator": "gte",
      "value": 3,
      "window": "30m",
      "filters": {
        "subject_vendor_data": "__current__",
        "event.action_type": "login_failed"
      }
    }
  ],
  "actions": [
    { "type": "add_score", "value": 40 },
    { "type": "change_status", "value": "IN_REVIEW" }
  ]
}
```

`"__current__"` تعني "القيمة نفسها الموجودة في الحدث الذي يجري تقييمه"، وبهذه الطريقة تعبّر القاعدة عن *لكل كيان* أو *لكل جهاز* أو *لكل جولة* دون تسمية قيمة بعينها.

السجلات التي لا تحتوي على قيمة الكيان المجمّعة لا تُجمَّع معًا أبدًا. الحدث الذي لا يحمل بصمة جهاز ليس "الجهاز نفسه" لأحداث أخرى بلا بصمة، والحدث الذي لا يذكر كيانًا ليس "الكيان نفسه" لأحداث أخرى مجهولة. وعندما لا يملك الحدث الذي يجري تقييمه قيمة لحقل `"__current__"`، فإن هذا التجميع لا يتطابق مهما كان المُعامل.

## حقول الأحداث

تقرأ الشروط مسارات بفضاءات أسماء. ومفردات المعاملات التي تعرفها بالفعل (`action_type` و`subject_vendor_data` و`subject_ip_country` و`custom_values.<key>`) تنطبق أيضًا على الحدث.

| المجموعة | المسارات |
| - | - |
| الحدث | `event.category`, `event.action_type`, `event.occurred_at`, `event.amount`, `event.currency`, `event.direction`, `event.session_id`, `event.session_sequence`, `event.score`, `event.status`, `event.ingest_source`, `event.retention_class`, `event.subject_vendor_data`, `event.business_vendor_data` |
| الجهاز والشبكة | `event.device.fingerprint`, `event.device.persistent_device_id`, `event.device.bot_score`, `event.ip.address`, `event.ip.country`, `event.ip.asn_number`, `event.ip.asn_organization`, `event.ip.is_vpn_or_tor`, `event.ip.is_data_center`, `event.ip.proxy_type`, `event.ip.country_name`, `event.ip.city`, `event.ip.connection_type`, `event.ip.travel_distance_km`, `event.ip.travel_speed_kmh` |
| اللعب | `event.gameplay.game_id`, `event.gameplay.table_id`, `event.gameplay.round_id`, `event.gameplay.hand_id`, `event.gameplay.match_id`, `event.gameplay.market_id`, `event.gameplay.side`, `event.gameplay.role`, `event.gameplay.counterparty_vendor_data`, `event.gameplay.net_result_amount`, `event.bonus.bonus_id`, `event.affiliate.affiliate_code` |
| الدفع والنزاعات | `event.payment.reference_id`, `event.payment.payment_fingerprint`, `event.payment.instrument_reference_hash`, `event.payment.withdrawal_address_hash`, `event.dispute.dispute_id`, `event.dispute.chargeback_id` |
| الأمان والمقامرة المسؤولة | `event.security.changed_field`, `event.responsible_gambling.identity_match_ref` |
| بيانات قياس الروبوت والمساعدة | `event.bot.timing_variance_ms`, `event.bot.actions_per_minute`, `event.bot.pointer_entropy`, `event.bot.reaction_time_ms_p50`, `event.bot.assistance_indicator` |
| إشارات المستخدم | `subject.email.risk_score`, `subject.email.social_count`, `subject.email.is_disposable`, `subject.email.deliverability`, `subject.email.domain_reputation`, `subject.email.first_seen_days`, `subject.email.is_breached`, `subject.phone.risk_score`, `subject.phone.line_type`, `subject.phone.social_count`, `subject.phone.carrier`, `subject.phone.country`, `subject.phone.is_disposable` |
| أي شيء آخر | `event.payload.<key>`, `custom_values.<key>` |

تُخزَّن إشارات المستخدم مؤقتًا لدى المستخدم المراقَب ولا يُعاد حسابها مع كل حدث، لذلك يمكن للقاعدة قراءتها بسرعة الاستيعاب.

## التجميعات

### معدل التكرار

دوال الاختزال التي تستخدمها بالفعل على المعاملات - `count` و`sum` و`avg` و`min` و`max` و`distinct_count` - على `window` متحرك (`30m` و`24h` و`7d` و`30d`).

### النسبة

دالتا اختزال ضمن النافذة نفسها. بهذه الطريقة تُعبَّر نسب الرهان إلى الإيداع، والسحب إلى الإيداع، والمكافأة إلى الإيداع، ومعدلات عمليات ردّ المدفوعات.

```json theme={null}
{
  "metric": "ratio",
  "window": "24h",
  "filters": { "subject_vendor_data": "__current__" },
  "numerator":   { "metric": "sum", "field": "event.amount", "filters": { "event.action_type": "bet_placed" } },
  "denominator": { "metric": "sum", "field": "event.amount", "filters": { "event.action_type": "deposit_completed" } },
  "operator": "lte",
  "value": 0.1
}
```

إيداع 1,000، ورهان 20، ثم طلب سحب، فتكون النسبة 0.02، وهذا غسل أموال كلاسيكي بأدنى قدر من اللعب.

> [!NOTE]
>
> النسبة التي **لا تملك مقامًا** لا تتطابق أبدًا. عدم وجود إيداعات ليس نسبة صفرية، بل هو غياب للدليل، والإطلاق في تلك الحالة سيضع علامة على كل مستخدم جديد.

### التسلسل

خطوات مرتبة من الشروط داخل نافذة. تتطابق كل خطوة مع `action_type` أو `event_category` أو أي تصفية `match`، ويمكن أن تشترط `min_count` تكرارات قبل أن ينتقل التسلسل إلى الخطوة التالية.

```json theme={null}
{
  "metric": "sequence",
  "key": "ato_drain",
  "window": "24h",
  "steps": [
    { "event_category": "security", "action_type": "login_failed", "min_count": 3 },
    { "event_category": "security", "action_type": "mfa_changed" },
    { "event_category": "payment",  "action_type": "withdrawal_address_changed" },
    { "event_category": "payment",  "action_type": "withdrawal_requested" }
  ]
}
```

حشو بيانات الاعتماد، ثم الاستيلاء على المصادقة متعددة العوامل، ثم إعادة توجيه الصرف، ثم الاستنزاف. تُطلَق القاعدة على الحدث الذي يُكمل السلسلة، ويسرد الدليل المطابق معرّفات الأحداث لكل خطوة.

تُحفظ حالة التسلسل لكل قاعدة ولكل كيان، فتتقدم مع وصول الأحداث بدلًا من إعادة مسح الخط الزمني. ويُهمَل التقدم الأقدم من النافذة ولا يُحتسب.

### الارتباط

ربط عبر الموضوعات: يُجري الاختزال على كل حدث يشارك الحدث الحالي مجموعته.

```json theme={null}
{
  "metric": "correlation",
  "window": "7d",
  "pair": true,
  "group_by": ["subject_vendor_data", "event.gameplay.counterparty_vendor_data"],
  "filters": { "event.action_type": "p2p_settlement" },
  "correlate": {
    "metric": "sum",
    "field": "event.gameplay.net_result_amount",
    "filters": { "event.gameplay.role": "winner" }
  },
  "operator": "gte",
  "value": 500
}
```

`"pair": true` يطابق الطرفين كمجموعة غير مرتبة، فيقع A→B وB→A في المجموعة نفسها، وهذا ما يتيح لقاعدة واحدة أن ترى طرفي التواطؤ معًا. ينتمي إلى هذا النمط نفسه تفريغ الرقائق، والرهانات المتقابلة، والإحالة الذاتية للشركاء.

اجعل قاعدة الارتباط تحمل دائمًا `filters` تضيّقها. بدونها تنظر القاعدة في كل حدث داخل النافذة.

## القواعد الفورية وغير المتزامنة

تستطيع بعض القواعد أن تُجيب ضمن طلب الاستيعاب، بينما لا تستطيع قواعد أخرى ذلك.

| يعمل | أي القواعد |
| - | - |
| **ضمن الطلب** | السرعة والنسبة والتسلسلات المحدودة (نافذة تصل إلى 24 ساعة) |
| **خلال دقائق، بشكل غير متزامن** | قواعد الارتباط، والتسلسلات التي تتجاوز نافذتها 24 ساعة |

يُعاد الحدث الذي ما زالت قواعده معلّقة مع `"correlation_pending": true`. يتحدّث حالته ودرجته في مكانهما بعد اكتمال المرور غير المتزامن. إعادة التشغيل لا تغيّر النتيجة عند تكرارها، لذلك لا تُطبّق القاعدة درجتها أكثر من مرة.

هذا التقسيم مقصود: لا ينبغي لاستعلام حلقة عابرة للكيانات أن يجعل تسجيل الدخول ينتظر.

## الإجراءات

مفردات الإجراءات نفسها المستخدمة في قواعد المعاملات، وهي `add_score` و`change_status` و`add_tags` و`add_note` و`add_to_list` و`open_case`.

يوجد فرقان في الأحداث:

* `change_status` إلى `AWAITING_USER` نتيجة خاصة بالمعاملات فقط، لأنه لا يوجد مسار معالجة للأحداث، ويُطبَّق كـ `IN_REVIEW`.
* يربط `open_case` الحالة بـ**الكيان** لا بمعاملة، ويسجّل معرّف الحدث المطابق على الحالة.

## الأدلة

يخزّن كل تطابق ما رصده: نافذة التجميع، والقيمة المحسوبة، والقيمة المتوقعة، ومعرّفات الأحداث المختارة بالعينة، و**مصدر كل حقل مطابق**.

| المصدر | المعنى |
| - | - |
| `server` | اشتقّته Didit (عنوان IP، ووكيل المستخدم، والمصدر). موثوق ومعتمد. |
| `sdk` | أبلغ عنه SDK الخاص بـ Didit من الجهاز. |
| `customer` | وفّرته أنظمتك. |

لذلك يستطيع المحلّل أن يميّز عنوان IP الذي حدّده الخادم من تلميح أرسله العميل قبل أن يتخذ إجراءً بناءً على التطابق. تعرض وحدة التحكم المصدر بجانب كل حقل مطابق في الدرج الجانبي للحدث.

## أمثلة تطبيقية

> [accordion] غسل الأموال بالحد الأدنى من اللعب
>
> إيداع، ثم لعب بالرموز، ثم سحب سريع. الشرط `event.action_type eq withdrawal_requested`، بالإضافة إلى نسبة الرهان إلى الإيداع أعلاه عند `lte 0.1` خلال `24h`.

> [accordion] الاحتيال الودّي
>
> نسبة `count(chargeback_opened)` إلى `count(deposit_completed)` لكل كيان خلال `30d`، عند `gte 0.5`. يُجمَّع حسب `event.payment.payment_fingerprint` بدلًا من الكيان لاكتشاف أداة دفع واحدة عبر عدة حسابات.

> [accordion] استنزاف الحساب بالاستيلاء عليه
>
> التسلسل `ato_drain` أعلاه، مع `add_score 90` و`change_status DECLINED`.

> [accordion] إغراق الرقائق
>
> زوج الارتباط أعلاه. ارفع `value` إلى المبلغ المهم في جداولك، وأضف `event.gameplay.game_id` إلى `group_by` للإبقاء على الألعاب منفصلة.

> [accordion] اللعب الآلي والمساعدة الفورية
>
> شروط على `event.action_type eq bot_signal_observed` و`event.bot.timing_variance_ms lte 10` و`event.device.bot_score gte 90`، مع `add_tags`. اجمعها مع `distinct_count` للحقل `event.device.fingerprint` لكل IP لاكتشاف مزرعة كاملة بدل سكربت واحد.

> [accordion] التحايل على الاستبعاد الذاتي
>
> شرط على `event.action_type eq self_exclusion_match` و`event.payload.re_registration_attempt eq true`، مع التصعيد عبر `open_case`.

## التالي

> [card] [استقبال الأحداث](https://docs.didit.me/ar/transaction-monitoring/events.md)
>
> الغلاف، والفئات العشر، وعقد الدفعات.

> [card] [Rules API](https://docs.didit.me/ar/transaction-monitoring/rules-api.md)
>
> أنشئ القواعد وحدّثها واختبرها بأثر رجعي برمجياً.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.