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

# معالج تسجيل 10DLC مع مسودات الحفظ والاستئناف

> سجّل علامتك وحملتك في TCR عبر معالج Orbit: احفظ مسودات جزئية عبر الجلسات، تحقق من هاتف المالك الفرد بـ OTP، افحص المسودة المحفوظة قبل الإرسال، وقدّمها ذرّيًا.

# معالج تسجيل 10DLC

المعالج هو الطريقة الموصى بها لإتمام [تسجيل علامة TCR والحملة](/guides/10dlc-registration). فهو يحوّل المسار الخطي أحادي الحمولة إلى عملية موجَّهة قابلة للاستئناف:

* **احفظ واستأنف** — تبقى المسودة محفوظة عبر الجلسات وعلامات التبويب والأسابيع. أغلق التبويب أو عد غدًا؛ تستكمل من حيث توقفت.
* **انتقل بين الخطوات بلا تسلسل** — يتتبع المعالج `brand` و`campaign` و`review` كخطوات مستقلة. املأ عينات الحملة بينما قسم العلامة غير مكتمل بعد، وتُحافظ حمولة التقدم على العددين.
* **تحقق قبل الدفع** — يشتعل التحقيق الميداني عند كل حفظ، وممر تدقيق قبل الإرسال يقيّم المسودة المحفوظة مقابل أنماط رفض TCR المعروفة قبل أن تُدفع رسوم التسجيل upstream.

<Note>
  يكتب المعالج في تخزين مسودات مؤسستك وحدها فقط. فهو لا يحجز ولا يبوّب ولا يوجّه أي حركة رسائل.
</Note>

تعيش جميع نقاط نهاية المعالج تحت `/api/v1/compliance/10dlc/wizard`. مصادَق بمفتاح API الخاص بك، تمامًا كما في [نقاط نهاية العلامة والحملة](/guides/10dlc-registration).

## الأدوار وحدود المعدل

* القراءات (`GET /wizard`، و`GET /wizard/draft`) — أي دور مُصادَق في المؤسسة.
* الكتابات (`PUT /wizard/draft`، و`DELETE /wizard/draft`، و`POST /wizard/phone/send`، و`POST /wizard/phone/confirm`، و`POST /wizard/preflight`، و`POST /wizard/submit`) — دور المالك أو الإداري.
* بروفايل الكتابة: 10 طلبات في الدقيقة، مطابقة نقطتي نهاية العلامة/الحملة القديمتين. فحص المعالج قبل الإرسال: 30 طلبًا في الدقيقة، مطابقة نقطة النهاية ad-hoc لما قبل الإرسال.

***

## GET `/10dlc/wizard` — حمولة التقدم

يعيد كائن التقدم المحسوب الذي تستخدمه لوحة التحكم في بانر "الاستكمال من حيث توقفت". دائمًا `200 OK` — المؤسسة الجديدة تحصل على شكل المسودة الفارغة مع `state: "not_started"`.

```bash theme={null}
curl https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

**الاستجابة:**

```json theme={null}
{
  "data": {
    "state": "in_progress",
    "current_step": "campaign",
    "brand": {
      "completed_fields": 10,
      "total_fields": 10,
      "missing_fields": []
    },
    "campaign": {
      "completed_fields": 4,
      "total_fields": 6,
      "missing_fields": ["message_flow", "optout_message"]
    },
    "next_action": "fill_campaign"
  },
  "meta": {
    "request_id": "req_wiz001",
    "timestamp": "2026-09-02T10:00:00Z"
  }
}
```

`state` واحدة من `not_started` و`in_progress` و`brand_pending` و`campaign_pending` و`ready` و`rejected`. `current_step` واحدة من `brand` و`campaign` و`review`. `next_action` تلميح قراءة آلة: من `fill_brand` و`fill_campaign` و`review_and_submit` و`amend_brand` و`amend_campaign` و`done`. عند تقديم العلامة أو الحملة، تحمل الاستجابة أيضًا `brand_id` و`campaign_id` وأي سبب رفض upstream.

يُعيد `GET /10dlc/wizard/draft` المسودة المحفوظة كاملة (حقول العلامة، وحقول الحملة، والخطوة الحالية) لتعويم النموذج مسبقًا.

***

## PUT `/10dlc/wizard/draft` — حفظ جزئي

يحفظ أي مجموعة فرعية من حقول العلامة و/أو الحملة. كل حقل اختياري — لا تُتحقق إلا الحقول التي ترسلها، ويبقى الباقي بالقيم المحفوظة سابقًا. يتم تحديث `current_step` مستقلًا حتى يهبط الاستئناف على الشاشة الصحيحة.

```bash theme={null}
curl -X PUT https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/draft \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "brand": {
      "entity_type": "PRIVATE_PROFIT",
      "display_name": "Acme Corp",
      "company_name": "Acme Corporation Inc.",
      "email": "compliance@acme.com"
    },
    "current_step": "brand"
  }'
```

رجوع بحفظ فاشل التحقق يُعطي `422` ويترك المسودة الدائمة بلا تغيير — حالة الحفظ السابقة تبقى.

**حقول العلامة:** `entity_type`، و`display_name`، و`company_name`، و`ein`، و`phone`، و`street`، و`city`، و`state`، و`postal_code`، و`country`، و`email`، و`website`، و`vertical`.

**حقول الحملة:** `usecase`، و`description` (40–4096 حرفًا)، و`sample_message` (1–10 رسائل)، و`message_flow` (40 حرفًا على الأقل)، و`help_message` (20 على الأقل)، و`optout_message` (20 على الأقل)، و`is_political`، و`cv_token`.

<Tip>
  احفظ بعد كل حقل مطلوب إن شئت — يكلف كل حفظ أقل من وحدة معدل كتابة واحدة، والمسودة هي شبكة الأمان. لا يُكتب `brand_id` الحملة يدويًا أبدًا: يملؤه المعالج من نتيجة تقديم العلامة.
</Tip>

***

## التحقق من هاتف المالك الفرد (OTP)

العلامات الأمريكية بـ `entity_type: "SOLE_PROPRIETOR"` — وتلك فقط — تستبدل رقم هاتف محمول مُتحقق مقام EIN: يثبّت TCR هوية المالك الفرد على رقم هاتف يثبت المسجل سيطرته عليه. كل نوع كيان أمريكي آخر يودع EIN بدلًا منه.

تحقق من الرقم قبل الإرسال:

```bash theme={null}
# 1. Dispatch the challenge to the draft's brand.phone
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/phone/send \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

**الاستجابة:**

```json theme={null}
{
  "data": {
    "verification_id": "vf_abc123",
    "status": "pending",
    "channel": "sms",
    "expires_at": "2026-09-02T10:10:00Z"
  },
  "meta": {
    "request_id": "req_wiz002",
    "timestamp": "2026-09-02T10:00:00Z"
  }
}
```

```bash theme={null}
# 2. Confirm the code from the SMS
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/phone/confirm \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"code": "483921"}'
```

**الاستجابة:**

```json theme={null}
{
  "data": {
    "status": "verified",
    "phone": "+14155551234",
    "verified_at": "2026-09-02T10:04:12Z"
  },
  "meta": {
    "request_id": "req_wiz003",
    "timestamp": "2026-09-02T10:04:12Z"
  }
}
```

الدليل مفاتيحٌ لسلسلة الهاتف المحفوظة على المسودة بالضبط. إذا عدّلت `brand.phone` بعد التحقق لا يحتسب الدليل القديم بعد الآن ويفشل الإرسال بـ `422` حتى تشغّل تحديًا جديدًا على الرقم الجديد. استدعاء `/phone/send` على رقم مُتحقق بالفعل يعيد `409 ALREADY_VERIFIED`؛ واستدعاء `/phone/confirm` دون تحدٍّ معلّق يعيد `404`.

***

## POST `/10dlc/wizard/preflight` — افحص المسودة المحفوظة

يقيّم **المسودة الدائمة للمعالج** مقابل كتالوج أنماط رفض TCR المعروفة، حتى ترى شاشة "المراجعة والإرسال" النتائج على المسودة التي ستودعها بالضبط — لا فرصة لانحراف تدقيق كما يحدث في نقطة النهاية ad-hoc [preflight](/guides/10dlc-registration#preflight-your-submission) عندما تفحص حمولة مبناة يدويًا.

جسم الطلب اختياري: `expected_msg_per_day_per_number` (لقاعدة فئة السعة) و`brand_vetting_score` (0–100) إذا كنت تحصل على واحد بالفعل.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/preflight \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{}'
```

شكل الاستجابة — `score` و`verdict` و`findings[]` — مطابقٌ لل[مدقق ما قبل الإرسال في صفحة التسجيل](/guides/10dlc-registration#what-the-10dlc-linter-checks). وكذلك لتلك النقطة، حكم `pass` يعني "لم تُطابق أنماط رفض معروفة"، لا "سيقبل TCR".

***

## POST `/10dlc/wizard/submit` — علامة + حملة ذرّيًا

يُتحقق المسودة كاملة، ثم يقدّم العلامة والحملة في نداء واحد. يصل تحقق العلامة عادة خلال 1–48 ساعة؛ تلازمها الحملة مباشرة بعدها.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/submit \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

**الاستجابة (`201 Created`):**

```json theme={null}
{
  "data": {
    "state": "brand_pending",
    "current_step": "review",
    "brand_id": "BXXXXXX",
    "campaign_id": "CXXXXXX",
    "next_action": "done"
  },
  "meta": {
    "request_id": "req_wiz004",
    "timestamp": "2026-09-02T10:05:00Z"
  }
}
```

تعيد إخفاقات التحقق `422` قبل سداد أي رسوم، مع `details.section` يخبرك أالحقول المفقودة أو غير الصالحة في قسم `brand` أو قسم `campaign`.

**دلالات الإخفاق — الحارس الذرّي:**

* **العلامة مرفوضة upstream** — لا حملة تُقدَّم. تُحفَظ المسودة مع سبب رفض العلامة مطبعًا، وتقلب `next_action` إلى `amend_brand`. عدّل حقول العلامة وأعد الإرسال.
* **الحملة مرفوضة upstream** — `brand_id` المقبول يُحفَظ، وتبقى الحالة عند `brand_pending`، ويُطبع سبب رفض الحملة. إعادة الإرسال تتخطى مرحلة العلامة متغاضية، فلا تُدفع رسوم العلامة ثانية أبدًا؛ الحملة وحدها تدفع مجددًا.
* **خمسينية upstream أو مزود غير موجود** — المسودة محفوظة حرفيًا وتعيدها كما هي.

تنقل الحالة إلى `ready` حين تعود العلامة والحملة كلاهما `APPROVED` من مراجعة شركات الاتصالات.

***

## DELETE `/10dlc/wizard/draft` — إعادة ضبط

```bash theme={null}
curl -X DELETE https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/draft \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

يعيد `204 No Content`. يعيد المعالج إلى المسودة الفارغة (`state: "not_started"`). هذا **لا** يمسح معرّفي العلامة أو الحملة المعتمدين على الملف — فهو فقط يعيد ضبط حالة عمل المعالج، لذا هو آمن كتنظيف بعد الموافقة أو "بدء من جديد".

***

## ترتيب دورة الحياة الكاملة

1. `PUT /10dlc/wizard/draft` — املأ العلامة + الحملة تدريجيًا.
2. `(SOLE_PROPRIETOR only)` `POST /10dlc/wizard/phone/send` → `POST /10dlc/wizard/phone/confirm`.
3. `POST /10dlc/wizard/preflight` — أصلح النتائج حتى يمر الحكم.
4. `POST /10dlc/wizard/submit` — الإرسال الذرّي.
5. `GET /10dlc/wizard` — اسْتَجْمِ الحالة حتى `ready` (أو `GET /10dlc/campaigns/:id/status` لخريطة بكل شركة اتصالات، كما في [صفحة التسجيل](/guides/10dlc-registration#step-3-wait-for-approval)).
6. `DELETE /10dlc/wizard/draft` — تنظيف اختياري بعد الموافقة.

<Warning>
  تبقى نقطتا النهاية القديمتان أحاديتا الوجذ (`POST /10dlc/brand` و`POST /10dlc/campaign`) متاحتين لخطوط المعالجة المبرمجة. المعالج هو مسار المشغل الموصى به؛ النقطتان المباشرتان يشترطان حمولة مكتملة في طلب واحد.
</Warning>
