> ## 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.

# اختبار قواعد مراقبة المعاملات عبر API

> اختبر قاعدة مراقبة معاملات افتراضية على سجل معاملاتك في Didit قبل تفعيلها: التطابقات وعدد التقييمات والجهات المتأثرة. للقراءة فقط ومجاني.



موجّه API لاختبار القواعد بأثر رجعي
        نسخ الموجّه إلى الحافظة



      
      

\<pre>

\`Backtest a hypothetical rule configuration against my recent transactions.

Endpoint:
POST https://verification.didit.me/v3/transactions/rules/backtest/

Authentication:
Use the x-api-key header with my Didit API key.

Request body (application/json):
\{
"conditions": [{"field": "currency", "operator": "eq", "value": "EUR"},
\{"field": "amount", "operator": "lt", "value": 10000}],
"aggregation": [{"metric": "count", "operator": "gte", "value": 20, "window": "30d",
               "filters": {"direction": "INBOUND", "transaction_type": "finance", "currency": "EUR", "subject_vendor_data": "__current__"}},
              \{"metric": "max", "field": "amount", "operator": "lt", "value": 10000, "window": "30d",
               "filters": {"direction": "INBOUND", "transaction_type": "finance", "currency": "EUR", "subject_vendor_data": "__current__"}}],
"evaluation_mode": "ALL",
"scope": {"transaction_types": ["finance"], "directions": ["INBOUND"]},
"period_days": 90          // 1-365, default 90
}

Response:
\{ "evaluated": 4820, "matched": 12, "affected_entities": 4, "period_days": 90 }

Behavior:
\- Read-only and free: no rule is created, no transaction is modified, no rule runs are recorded.
\- Evaluates the most recent transactions in the period, up to the backtest cap.
\- affected_entities counts distinct subjects (by vendor_data) among the matches.
\- Use it before switching a rule to ACTIVE; a surprising match count means the thresholds need tuning.
\- Copy the candidate rule EXACTLY: same conditions, aggregation, evaluation_mode and scope. Omitted conditions, aggregation and scope add no constraints of their own; dropping scope can include directions or transaction types the saved rule skips. Omitted evaluation_mode defaults to ALL (which can reduce matches for an ANY rule), and omitted period_days defaults to 90 days, not unlimited history.

Sandbox fixtures for this example: at least 20 inbound EUR finance transactions for the same subject within 30 days, each with raw amount below 10000. No normalized amount is required. Sandbox ingestion does not evaluate rules; call backtest explicitly.

Failure modes:
\- 400 - same condition/aggregation/scope validation as rule create.`

\</pre>



      
      

الصق في



## OpenAPI

````yaml ar/openapi-25.json POST /v3/transactions/rules/backtest/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API التحقق من الهوية. قم بالمصادقة باستخدام الرأس x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/transactions/rules/backtest/:
    post:
      tags:
        - Transactions
      summary: تكوين قاعدة الاختبار الرجعي
      description: >-
        تقييم إعداد قاعدة افتراضية مقابل معاملاتك الحديثة (الأحدث أولاً، حتى
        الحد الأقصى للاختبار الرجعي) دون إنشاء قاعدة أو تعديل أي معاملة. استخدمه
        قبل تفعيل قاعدة لمعرفة عدد المرات التي كانت ستنطبق فيها وعدد الأطراف
        المعنية التي كانت ستتأثر بها.
      operationId: backtestTransactionRules
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransactionRuleBacktestRequest'
            example:
              conditions:
                - field: currency
                  operator: eq
                  value: EUR
                - field: amount
                  operator: lt
                  value: 10000
              aggregation:
                - metric: count
                  operator: gte
                  value: 20
                  window: 30d
                  filters:
                    direction: INBOUND
                    transaction_type: finance
                    subject_vendor_data: __current__
                    currency: EUR
                - metric: max
                  field: amount
                  operator: lt
                  value: 10000
                  window: 30d
                  filters:
                    direction: INBOUND
                    transaction_type: finance
                    subject_vendor_data: __current__
                    currency: EUR
              evaluation_mode: ALL
              scope:
                transaction_types:
                  - finance
                directions:
                  - INBOUND
              period_days: 90
      responses:
        '200':
          description: إحصائيات الاختبار الرجعي.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionRuleBacktestResult'
              example:
                evaluated: 4820
                matched: 12
                affected_entities: 4
                period_days: 90
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            'https://verification.didit.me/v3/transactions/rules/backtest/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"conditions": [{"field": "currency", "operator": "eq", "value": "EUR"}, {"field": "amount", "operator": "lt", "value": 10000}], "aggregation": [{"metric": "count", "operator": "gte", "value": 20, "window": "30d", "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"}}, {"metric": "max", "field": "amount", "operator": "lt", "value": 10000, "window": "30d", "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"}}], "evaluation_mode": "ALL", "scope": {"transaction_types": ["finance"], "directions": ["INBOUND"]}, "period_days": 90}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.rules.backtest(
                conditions=[{
                    "field": "currency",
                    "operator": "eq",
                    "value": "EUR",
                }, {
                    "field": "amount",
                    "operator": "lt",
                    "value": 10000,
                }],
                aggregation=[{
                    "metric": "count",
                    "operator": "gte",
                    "value": 20.0,
                    "window": "30d",
                    "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"},
                }, {
                    "metric": "max",
                    "field": "amount",
                    "operator": "lt",
                    "value": 10000.0,
                    "window": "30d",
                    "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"},
                }],
                evaluation_mode="ALL",
                scope={
                    "transaction_types": ["finance"],
                    "directions": ["INBOUND"],
                },
                period_days=90,
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.transactions.rules.backtest({
              conditions: [{
                field: "currency",
                operator: "eq",
                value: "EUR",
              }, {
                field: "amount",
                operator: "lt",
                value: 10000,
              }],
              aggregation: [{
                metric: "count",
                operator: "gte",
                value: 20.0,
                window: "30d",
                filters: { direction: "INBOUND", transaction_type: "finance", subject_vendor_data: "__current__", currency: "EUR" },
              }, {
                metric: "max",
                field: "amount",
                operator: "lt",
                value: 10000.0,
                window: "30d",
                filters: { direction: "INBOUND", transaction_type: "finance", subject_vendor_data: "__current__", currency: "EUR" },
              }],
              evaluation_mode: "ALL",
              scope: {
                transaction_types: ["finance"],
                directions: ["INBOUND"],
              },
              period_days: 90,
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Backtest(ctx, didit.TransactionRuleBacktestRequest{\n\tConditions: didit.Some([]didit.TransactionRuleConditionParam{{\n\t\tField:    \"currency\",\n\t\tOperator: \"eq\",\n\t\tValue:    didit.Some[any](\"EUR\"),\n\t}, {\n\t\tField:    \"amount\",\n\t\tOperator: \"lt\",\n\t\tValue:    didit.Some[any](10000),\n\t}}),\n\tAggregation: didit.Some([]didit.TransactionRuleAggregationParam{{\n\t\tMetric:   didit.Some(didit.TransactionRuleAggregationMetric(\"count\")),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"gte\")),\n\t\tValue:    20.0,\n\t\tWindow:   didit.String(\"30d\"),\n\t\tFilters:  didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}, {\n\t\tMetric:   didit.Some(didit.TransactionRuleAggregationMetric(\"max\")),\n\t\tField:    didit.String(\"amount\"),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"lt\")),\n\t\tValue:    10000.0,\n\t\tWindow:   didit.String(\"30d\"),\n\t\tFilters:  didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}}),\n\tEvaluationMode: didit.Some(didit.TransactionRuleBacktestRequestEvaluationMode(\"ALL\")),\n\tScope: didit.Some(didit.TransactionRuleScopeParam{\n\t\tTransactionTypes: didit.Some([]string{\"finance\"}),\n\t\tDirections:       didit.Some([]didit.TransactionRuleScopeDirections{\"INBOUND\"}),\n\t}),\n\tPeriodDays: didit.Int(90),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.TransactionRuleAggregation;

            import me.didit.types.TransactionRuleBacktestRequest;

            import me.didit.types.TransactionRuleCondition;

            import me.didit.types.TransactionRuleScope;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().rules().backtest(TransactionRuleBacktestRequest.builder()
                    .conditions(List.of(
                            TransactionRuleCondition.builder()
                                    .field("currency")
                                    .operator(TransactionRuleCondition.Operator.of("eq"))
                                    .value("EUR")
                                    .build(),
                            TransactionRuleCondition.builder()
                                    .field("amount")
                                    .operator(TransactionRuleCondition.Operator.of("lt"))
                                    .value(10000)
                                    .build()))
                    .aggregation(List.of(
                            TransactionRuleAggregation.builder()
                                    .metric(TransactionRuleAggregation.Metric.of("count"))
                                    .operator(TransactionRuleAggregation.Operator.of("gte"))
                                    .value(20.0)
                                    .window("30d")
                                    .filters(Map.of("direction", "INBOUND", "transaction_type", "finance", "subject_vendor_data", "__current__", "currency", "EUR"))
                                    .build(),
                            TransactionRuleAggregation.builder()
                                    .metric(TransactionRuleAggregation.Metric.of("max"))
                                    .field("amount")
                                    .operator(TransactionRuleAggregation.Operator.of("lt"))
                                    .value(10000.0)
                                    .window("30d")
                                    .filters(Map.of("direction", "INBOUND", "transaction_type", "finance", "subject_vendor_data", "__current__", "currency", "EUR"))
                                    .build()))
                    .evaluationMode(TransactionRuleBacktestRequest.EvaluationMode.of("ALL"))
                    .scope(TransactionRuleScope.builder()
                            .transactionTypes(List.of("finance"))
                            .directions(List.of(TransactionRuleScope.Directions.of("INBOUND")))
                            .build())
                    .periodDays(90L)
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->transactions->rules->backtest([
                'conditions' => [[
                    'field' => 'currency',
                    'operator' => 'eq',
                    'value' => 'EUR',
                ], [
                    'field' => 'amount',
                    'operator' => 'lt',
                    'value' => 10000,
                ]],
                'aggregation' => [[
                    'metric' => 'count',
                    'operator' => 'gte',
                    'value' => 20.0,
                    'window' => '30d',
                    'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],
                ], [
                    'metric' => 'max',
                    'field' => 'amount',
                    'operator' => 'lt',
                    'value' => 10000.0,
                    'window' => '30d',
                    'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],
                ]],
                'evaluation_mode' => 'ALL',
                'scope' => [
                    'transaction_types' => ['finance'],
                    'directions' => ['INBOUND'],
                ],
                'period_days' => 90,
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.transactions.rules.backtest(
              conditions: [{
                field: "currency",
                operator: "eq",
                value: "EUR",
              }, {
                field: "amount",
                operator: "lt",
                value: 10000,
              }],
              aggregation: [{
                metric: "count",
                operator: "gte",
                value: 20.0,
                window: "30d",
                filters: { direction: "INBOUND", transaction_type: "finance", subject_vendor_data: "__current__", currency: "EUR" },
              }, {
                metric: "max",
                field: "amount",
                operator: "lt",
                value: 10000.0,
                window: "30d",
                filters: { direction: "INBOUND", transaction_type: "finance", subject_vendor_data: "__current__", currency: "EUR" },
              }],
              evaluation_mode: "ALL",
              scope: {
                transaction_types: ["finance"],
                directions: ["INBOUND"],
              },
              period_days: 90
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Transactions.Rules.BacktestAsync(new
            TransactionRuleBacktestRequest

            {
                Conditions = new TransactionRuleCondition[]
                {
                    new()
                    {
                        Field = "currency",
                        Operator = "eq",
                        Value = "EUR",
                    },
                    new()
                    {
                        Field = "amount",
                        Operator = "lt",
                        Value = 10000,
                    },
                },
                Aggregation = new TransactionRuleAggregation[]
                {
                    new()
                    {
                        Metric = new TransactionRuleAggregationMetric("count"),
                        Operator = new TransactionRuleAggregationOperator("gte"),
                        Value = 20.0,
                        Window = "30d",
                        Filters = new Dictionary<string, object> { ["direction"] = "INBOUND", ["transaction_type"] = "finance", ["subject_vendor_data"] = "__current__", ["currency"] = "EUR" },
                    },
                    new()
                    {
                        Metric = new TransactionRuleAggregationMetric("max"),
                        Field = "amount",
                        Operator = new TransactionRuleAggregationOperator("lt"),
                        Value = 10000.0,
                        Window = "30d",
                        Filters = new Dictionary<string, object> { ["direction"] = "INBOUND", ["transaction_type"] = "finance", ["subject_vendor_data"] = "__current__", ["currency"] = "EUR" },
                    },
                },
                EvaluationMode = new TransactionRuleBacktestRequestEvaluationMode("ALL"),
                Scope = new TransactionRuleScope
                {
                    TransactionTypes = new string[] { "finance" },
                    Directions = new TransactionRuleScopeDirections[] { "INBOUND" },
                },
                PeriodDays = 90,
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TransactionRuleBacktestRequest:
      type: object
      properties:
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/TransactionRuleCondition'
          default: []
        aggregation:
          type: array
          items:
            $ref: '#/components/schemas/TransactionRuleAggregation'
          default: []
        evaluation_mode:
          type: string
          enum:
            - ALL
            - ANY
          default: ALL
        scope:
          $ref: '#/components/schemas/TransactionRuleScope'
        period_days:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
      description: >-
        تكوين قاعدة افتراضية لتقييمها مقابل المعاملات الأخيرة. للقراءة فقط
        ومجاني: لا يتم إنشاء أو تعديل أي شيء. أرسل نفس الشروط، والتجميع
        (aggregation)، وevaluation_mode والنطاق (scope) الخاص بالقاعدة التي تنوي
        تفعيلها. الشروط والتجميع والنطاق المحذوفة لا تضيف أي قيود خاصة بها؛ وحذف
        النطاق قد يتضمن اتجاهات أو أنواع معاملات تتخطاها القاعدة المحفوظة.
        القيمة الافتراضية لـ evaluation_mode المحذوفة هي ALL (مما قد يقلل من
        التطابقات لقاعدة ANY)، والقيمة الافتراضية لـ period_days المحذوفة هي 90
        يوماً، وليس تاريخاً غير محدود.
    TransactionRuleBacktestResult:
      type: object
      properties:
        evaluated:
          type: integer
          description: المعاملات التي تم تقييمها (الأحدث أولاً، مع حد أقصى).
        matched:
          type: integer
          description: المعاملات التي كان التكوين سيتطابق معها.
        affected_entities:
          type: integer
          description: كيانات مميزة (حسب vendor_data) من بين التطابقات.
        period_days:
          type: integer
    TransactionRuleCondition:
      type: object
      required:
        - field
        - operator
      properties:
        field:
          type: string
          description: >-
            مسار حقل المعاملة للتقييم. الحقول الأساسية: amount، currency،
            direction، action_type، score، severity، transaction_type،
            payment_details، preferred_currency_amount (يرجع كبديل إلى
            amount_in_default_currency)، default_currency_code، subject_country،
            counterparty_country، subject_vendor_data، counterparty_vendor_data،
            subject_device_fingerprint، counterparty_device_fingerprint،
            subject_browser_family، subject_browser_version، subject_platform،
            subject_accept_language، subject_session_age_ms، subject_ip_country،
            counterparty_ip_country، subject_ip_address،
            counterparty_ip_address، subject_payment_method_type،
            subject_payment_method_country، subject_payment_method_fingerprint،
            subject_payment_method_account_id (وما يعادلها من
            counterparty_payment_method_*)، travel_rule_status،
            travel_rule_required، travel_rule_obligations_count،
            counterparty_dd_status (قرارك بشأن الطرف المقابل لـ Travel Rule:
            APPROVED أو RESTRICTED أو BLOCKED، وهو كيان يتبع علامته التجارية)،
            counterparty_risk_level (LOW أو MEDIUM أو HIGH؛ ويكون HIGH طالما كان
            فحص الطرف المقابل الخاص بك مُعلَّماً)، counterparty_jurisdiction
            (دولة VASP للطرف المقابل)، counterparty_responsiveness (RESPONSIVE
            أو UNRESPONSIVE أو UNKNOWN)،
            subject_days_since_previous_transaction، tags، و custom_values.<key>
            لأي مفتاح تم إرساله في custom_properties عند إنشاء المعاملة. تقبل
            حقول رموز الدول كلاً من ISO-2 أو ISO-3؛ وتتم تسوية كلا الجانبين إلى
            ISO-3 قبل المقارنة.
        operator:
          type: string
          enum:
            - eq
            - ne
            - gt
            - gte
            - lt
            - lte
            - in
            - not_in
            - contains
            - not_contains
            - contains_any
            - regex
            - fuzzy_match
            - exists
            - is_not_empty
            - is_not_null
            - not_exists
            - is_empty
            - is_null
          description: >-
            معامل المقارنة. يختبر in/not_in الانتماء (قد تكون القيمة قائمة أو
            قيمة فردية واحدة). يُعد contains/not_contains فحصاً لسلسلة فرعية غير
            حساس لحالة الأحرف مقابل قيمة نصية. يقبل contains_any قائمة من النصوص
            ويتطابق عندما يكون أي منها سلسلة فرعية غير حساسة لحالة الأحرف من
            قيمة الحقل. يطابق regex نمط القيمة مع الحقل. يقارن fuzzy_match مع
            سلسلة القيمة وفقاً لحد `score` المطلوب (0-100). لا تتطابق
            gt/gte/lt/lte أبداً عند فقدان أي من الطرفين. تُعد
            exists/is_not_empty/is_not_null (أسماء مستعارة)
            وnot_exists/is_empty/is_null (أسماء مستعارة) فحوصات وجود تتجاهل
            `value`.
        value:
          description: >-
            قيمة المقارنة. يعتمد شكلها على المعامل وvalue_type؛ احذفها لمعاملات
            فحص الوجود. يحتاج كل معامل آخر إلى قيمة ليست `null` أو قائمة فارغة،
            وإلا فسيتم رفض القاعدة بالرمز `400`. يحتاج `contains_any` إلى قائمة
            نصوص، بينما يحتاج كل من `contains` و`not_contains` و`regex` إلى نص
            فردي.
        value_type:
          type: string
          enum:
            - list
            - field
            - relative_date
          description: >-
            تفسير اختياري للقيمة. `list`: القيمة هي UUID لقائمة وتصبح مدخلات
            القائمة هي قيمة المقارنة. `field`: القيمة هي مسار حقل آخر، وتتم
            المقارنة حقلاً بحقل. `relative_date`: القيمة هي كائن تاريخ نسبي، مثل
            {"direction": "past", "unit": "days", "amount": 30}.
        score:
          type: number
          minimum: 0
          maximum: 100
          description: 'مطلوب عندما يكون المشغّل هو fuzzy_match: حد التشابه بين 0 و100.'
        group_index:
          type: integer
          description: >-
            منطق مجمّع اختياري. عندما يحمل أي شرط group_index، فإن الشروط التي
            تشترك في نفس الفهرس تشكّل مجموعة، ويحل التقييم المجمّع محل
            evaluation_mode.
        group_logic:
          type: string
          enum:
            - AND
            - OR
          default: AND
          description: كيفية دمج الشروط داخل المجموعة الواحدة.
        groups_logic:
          type: string
          enum:
            - AND
            - OR
          default: OR
          description: >-
            كيفية دمج نتائج المجموعات عبر المجموعات المختلفة. تُقرأ من الشرط
            الأول.
      description: >-
        يقرأ الشرط فقط المعاملة التي تخضع للتقييم - ولا يصفّي أبداً نافذة
        التجميع.
    TransactionRuleAggregation:
      type: object
      required:
        - value
      properties:
        metric:
          type: string
          enum:
            - count
            - sum
            - max
            - min
            - avg
            - distinct_count
          default: count
          description: >-
            كيفية تجميع المعاملات السابقة المتطابقة. يتم قبول unique_count كاسم
            بديل لـ distinct_count.
        field:
          type: string
          default: amount
          description: >-
            الحقل المجمّع حسب sum/max/min/avg/distinct_count. يُتجاهل بالنسبة لـ
            count.
        operator:
          type: string
          enum:
            - eq
            - ne
            - gt
            - gte
            - lt
            - lte
          default: eq
          description: المقارنة المطبقة على المقياس المحسوب.
        value:
          type: number
          description: الحد الذي تتم مقارنة المقياس المحسوب به.
        window:
          type: string
          pattern: ^\d+(m|h|d)$
          default: 1d
          description: >-
            نافذة الرجوع التي تنتهي عند txn_date الخاص بالمعاملة: <N>m (دقائق،
            وليس شهوراً)، أو <N>h (ساعات)، أو <N>d (أيام)، مثل 30m، أو 24h، أو
            7d، أو 30d.
        filters:
          type: object
          additionalProperties: true
          description: >-
            يُضيّق نطاق المعاملات السابقة التي يتم تجميعها. المفاتيح هي مسارات
            الحقول من كتالوج حقول الشروط؛ تشير القيمة "__current__" إلى قيمة
            الحقل نفسه في المعاملة الجاري تقييمها (على سبيل المثال، يحدد
            {"subject_vendor_data": "__current__"} نطاق النافذة لنفس الموضوع)،
            وتشير قيمة القائمة إلى الانتماء. لا يتم تجميع السجلات التي لا تحتوي
            على القيمة المجمعة معًا أبدًا: عندما لا تحتوي المعاملة الجاري
            تقييمها على قيمة لحقل "__current__" (لا يوجد طرف مقابل، ولا توجد
            بصمة للجهاز)، فإن التجميع لا يتطابق، أياً كان معامله. تقارن عوامل
            التصفية بالمساواة أو الانتماء فقط - لا توجد تصفية lt/gte، لذا لا
            يمكن التعبير عن نطاق مثل "المعاملات السابقة الأقل من 10,000" هنا. ضع
            النطاق في المقياس بدلاً من ذلك (المقياس max مع المعامل lt يحتفظ بكل
            معاملة في النافذة أقل من الحد).
      description: >-
        فحص معدل التكرار (velocity check) عبر المعاملات التاريخية للتطبيق داخل
        النافذة الزمنية. يجب أن يتطابق كل إدخال تجميعي حتى تتطابق القاعدة، بغض
        النظر عن evaluation_mode. يقيد التجميع النافذة الزمنية فقط؛ أما المعاملة
        قيد التقييم فتُقيّد بواسطة النطاق والشروط، لذا كرر direction أو currency
        أو transaction_type في كلا النصفين عندما تقتضي القاعدة ذلك.
    TransactionRuleScope:
      type: object
      properties:
        transaction_types:
          type: array
          items:
            type: string
          description: >-
            التقييد بأنواع المعاملات، مثل finance أو kyc أو travel_rule أو
            user_event. فارغ أو مفقود = لا يوجد تقييد.
        directions:
          type: array
          items:
            type: string
            enum:
              - INBOUND
              - OUTBOUND
          description: التقييد باتجاهات المعاملات (غير حساس لحالة الأحرف عند الكتابة).
        action_types:
          type: array
          items:
            type: string
          description: التقييد بقيم action_type الخاصة بك، مثل withdrawal أو deposit.
      description: أي معاملات تنطبق عليها القاعدة. يتم قبول هذه المفاتيح الثلاثة فقط.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

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