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

# Assistant d'enregistrement 10DLC avec brouillons enregistrables et reprenables

> Enregistrez votre marque et votre campagne TCR via l'assistant Orbit : enregistrez des brouillons partiels entre les sessions, vérifiez un téléphone de propriétaire unique par OTP, contrôlez le brouillon enregistré en amont, et soumettez de manière atomique.

# Assistant d'enregistrement 10DLC

L'assistant est la méthode recommandée pour effectuer l'[enregistrement de la marque et de la campagne TCR](/guides/10dlc-registration). Il transforme le flux linéaire en une seule étape en un processus guidé et reprenable :

* **Enregistrer et reprendre** — votre brouillon persiste entre les sessions, les onglets et les semaines. Fermez l'onglet ou revenez demain ; vous reprenez là où vous vous étiez arrêté.
* **Naviguer entre les étapes de manière non linéaire** — l'assistant suit `brand`, `campaign` et `review` comme des étapes indépendantes. Remplissez les exemples de la campagne alors que la section marque est encore incomplète, la charge utile de progression conserve les deux décomptes.
* **Valider avant de payer** — la validation par champ se déclenche à chaque enregistrement, et un passage de lint pré-soumission évalue le brouillon enregistré par rapport aux motifs de rejet TCR connus avant que les frais d'enregistrement amont ne soient facturés.

<Note>
  L'assistant écrit uniquement dans le stockage de brouillons de votre propre organisation. Il ne détient, ne bloque ni n'achemine aucun trafic de messages.
</Note>

Tous les endpoints de l'assistant se trouvent sous `/api/v1/compliance/10dlc/wizard`. Authentifiez-vous avec votre clé API, exactement comme pour les [endpoints marque et campagne](/guides/10dlc-registration).

## Rôles et limites de débit

* Lectures (`GET /wizard`, `GET /wizard/draft`) — tout rôle authentifié de l'organisation.
* Écritures (`PUT /wizard/draft`, `DELETE /wizard/draft`, `POST /wizard/phone/send`, `POST /wizard/phone/confirm`, `POST /wizard/preflight`, `POST /wizard/submit`) — rôle propriétaire ou administrateur.
* Profil d'écriture : 10 requêtes par minute, identique aux endpoints marque/campagne historiques. Pré-soumission de l'assistant : 30 requêtes par minute, identique à l'endpoint de pré-soumission ad hoc.

***

## GET `/10dlc/wizard` — charge utile de progression

Renvoie l'objet de progression calculé que le tableau de bord utilise pour sa bannière « Reprendre là où vous vous étiez arrêté ». Toujours `200 OK` — une organisation nouvelle reçoit la forme de brouillon vide avec `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"
```

**Réponse :**

```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` vaut l'un de `not_started`, `in_progress`, `brand_pending`, `campaign_pending`, `ready`, `rejected`. `current_step` vaut `brand`, `campaign`, ou `review`. `next_action` est un indice lisible par la machine : `fill_brand`, `fill_campaign`, `review_and_submit`, `amend_brand`, `amend_campaign`, ou `done`. Lorsque la marque ou la campagne a été soumise, la réponse porte également `brand_id`, `campaign_id`, ainsi que tout motif de rejet amont.

`GET /10dlc/wizard/draft` renvoie le brouillon complet enregistré (champs de la marque, champs de la campagne, étape courante) pour le pré-remplissage du formulaire.

***

## PUT `/10dlc/wizard/draft` — enregistrement partiel

Enregistre tout sous-ensemble de champs de la marque et/ou de la campagne. Chaque champ est optionnel — vous ne validez que les champs que vous envoyez, et les autres conservent leurs valeurs précédemment enregistrées. `current_step` se met à jour séparément afin qu'une reprise aboutisse sur le bon écran.

```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"
  }'
```

Un enregistrement qui échoue à la validation renvoie `422` et laisse le brouillon persisté intact — l'état précédemment enregistré est conservé.

**Champs de la marque :** `entity_type`, `display_name`, `company_name`, `ein`, `phone`, `street`, `city`, `state`, `postal_code`, `country`, `email`, `website`, `vertical`.

**Champs de la campagne :** `usecase`, `description` (40–4096 caractères), `sample_message` (1–10 messages), `message_flow` (min 40 caractères), `help_message` (min 20), `optout_message` (min 20), `is_political`, `cv_token`.

<Tip>
  Enregistrez après chaque champ requis si vous le souhaitez — chaque enregistrement coûte moins d'un jeton de débit d'écriture et le brouillon est votre filet de sécurité. Le `brand_id` de la campagne n'est jamais saisi à la main : l'assistant le remplit à partir du résultat de la soumission de la marque.
</Tip>

***

## Vérification du téléphone d'un propriétaire unique (OTP)

Les marques américaines avec `entity_type: "SOLE_PROPRIETOR"`, et seulement celles-ci, substituent un numéro de mobile vérifié à un EIN : TCR ancre l'identité du propriétaire unique sur un numéro de téléphone dont le déclarant prouve qu'il a le contrôle. Tout autre type d'entité américaine doit soumettre un EIN à la place.

Vérifiez le numéro avant la soumission :

```bash theme={null}
# 1. Envoyer le défi vers le brand.phone du brouillon
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"
```

**Réponse :**

```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. Confirmer le code reçu par 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"}'
```

**Réponse :**

```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"
  }
}
```

La preuve est liée à la chaîne de téléphone exacte enregistrée sur le brouillon. Si vous modifiez `brand.phone` après la vérification, l'ancienne preuve ne compte plus et la soumission échoue avec `422` jusqu'à ce que vous exécutiez un nouveau défi contre le nouveau numéro. Appeler `/phone/send` sur un numéro déjà vérifié renvoie `409 ALREADY_VERIFIED` ; appeler `/phone/confirm` sans défi en attente renvoie `404`.

***

## POST `/10dlc/wizard/preflight` — contrôler le brouillon enregistré

Évalue le **brouillon persisté de l'assistant** par rapport au catalogue des motifs de rejet TCR connus, afin que l'écran « Review & submit » voie les constats sur le brouillon exact qu'il s'apprête à soumettre — aucun risque de dérive de lint comme l'[endpoint de pré-soumission](/guides/10dlc-registration#preflight-your-submission) ad hoc en présente lorsqu'il contrôle une charge utile construite à la main.

Le corps de la requête est optionnel : `expected_msg_per_day_per_number` (pour la règle du niveau de débit) et `brand_vetting_score` (0–100) lorsque vous en possédez déjà un.

```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 '{}'
```

La forme de la réponse — `score`, `verdict`, `findings[]` — est identique au [linter de pré-soumission de la page d'enregistrement](/guides/10dlc-registration#what-the-10dlc-linter-checks). Comme pour cet endpoint, un verdict `pass` signifie « aucun motif de rejet connu détecté », et non « TCR approuvera ».

***

## POST `/10dlc/wizard/submit` — marque + campagne atomiques

Valide le brouillon complet, puis soumet la marque et la campagne en un seul appel. La vérification de la marque aboutit généralement en 1 à 48 heures ; la campagne suit immédiatement après.

```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"
```

**Réponse (`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"
  }
}
```

Les échecs de validation renvoient `422` avant toute facturation, avec `details.section` indiquant si les champs manquants ou invalides se trouvent dans la section `brand` ou `campaign`.

**Sémantique des échecs — la garantie atomique :**

* **Marque rejetée en amont** — aucune campagne n'est soumise. Le brouillon est conservé avec le motif de rejet de la marque horodaté, et `next_action` bascule sur `amend_brand`. Modifiez les champs de la marque et re-soumettez.
* **Campagne rejetée en amont** — le `brand_id` accepté est persisté, l'état reste à `brand_pending`, et le motif de rejet de la campagne est horodaté. Une re-soumission ignore entièrement l'étape de la marque, de sorte que les frais de marque ne sont jamais refacturés ; seule la campagne paie à nouveau.
* **5xx amont ou fournisseur indisponible** — le brouillon est conservé tel quel et vous pouvez réessayer à l'identique.

L'état bascule sur `ready` dès que la marque et la campagne reviennent toutes deux avec le statut `APPROVED` de la révision opérateur.

***

## DELETE `/10dlc/wizard/draft` — réinitialisation

```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"
```

Renvoie `204 No Content`. Réinitialise l'assistant au brouillon vide (`state: "not_started"`). Cela n'efface **pas** les identifiants de marque ou de campagne approuvés enregistrés — cela réinitialise uniquement l'état de travail de l'assistant, ce qui est sûr comme nettoyage post-approbation ou pour « recommencer ».

***

## Ordre complet du cycle de vie

1. `PUT /10dlc/wizard/draft` — remplir progressivement la marque + la campagne.
2. `(SOLE_PROPRIETOR uniquement)` `POST /10dlc/wizard/phone/send` → `POST /10dlc/wizard/phone/confirm`.
3. `POST /10dlc/wizard/preflight` — corriger les constats jusqu'à ce que le verdict passe.
4. `POST /10dlc/wizard/submit` — soumission atomique.
5. `GET /10dlc/wizard` — interroger l'état jusqu'à `ready` (ou `GET /10dlc/campaigns/:id/status` pour la carte par opérateur, comme sur la [page d'enregistrement](/guides/10dlc-registration#step-3-wait-for-approval)).
6. `DELETE /10dlc/wizard/draft` — nettoyage optionnel post-approbation.

<Warning>
  Les endpoints historiques en une seule étape (`POST /10dlc/brand`, `POST /10dlc/campaign`) restent disponibles pour les pipelines scriptés. L'assistant est le flux opérateur recommandé ; les endpoints directs exigent une charge utile entièrement remplie en une seule requête.
</Warning>
