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

# Enregistrement 10DLC pour la conformité des messages A2P aux États-Unis

> Enregistrez votre marque et vos campagnes pour la conformité 10-Digit Long Code (10DLC) aux États-Unis via Orbit afin de débloquer le débit A2P et la délivrabilité opérateur.

# Enregistrement 10DLC

10DLC (10-Digit Long Code) est le système imposé par les opérateurs américains pour envoyer des messages SMS Application-to-Person (A2P) avec des numéros de téléphone standard à 10 chiffres. Toutes les entreprises envoyant des SMS vers des numéros américains doivent s'enregistrer via 10DLC pour garantir la délivrabilité et la conformité.

## Vue d'ensemble

Les opérateurs américains (T-Mobile, AT\&T, Verizon) exigent l'enregistrement 10DLC pour la messagerie A2P. Le trafic non enregistré s'expose à :

* **Filtrage agressif** — messages silencieusement bloqués
* **Frais plus élevés** — surcoûts par message pour les expéditeurs non enregistrés
* **Faible débit** — limité à \~1 message/seconde contre 75+ une fois enregistré

Orbit gère le processus d'enregistrement via The Campaign Registry (TCR).

<Tip>
  **Flux recommandé :** utilisez l'[assistant d'enregistrement 10DLC](/guides/10dlc-wizard) — il enregistre un brouillon reprenable, vous permet de remplir les sections marque et campagne dans n'importe quel ordre, vérifie le téléphone d'un propriétaire unique par OTP, et soumet les deux de manière atomique. Les endpoints linéaires ci-dessous restent disponibles pour les pipelines scriptés.
</Tip>

***

## Étapes d'enregistrement

### Étape 1 : Enregistrer votre marque

Créez une identité de marque qui représente votre organisation.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/brand \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "entity_type": "PRIVATE_PROFIT",
    "display_name": "Acme Corp",
    "company_name": "Acme Corporation Inc.",
    "ein": "12-3456789",
    "phone": "+14155551234",
    "street": "1 Market St",
    "city": "San Francisco",
    "state": "CA",
    "postal_code": "94105",
    "country": "US",
    "email": "compliance@acme.com",
    "website": "https://acme.com",
    "vertical": "TECHNOLOGY"
  }'
```

`entity_type` doit être l'une de `PRIVATE_PROFIT`, `PUBLIC_PROFIT`, `NON_PROFIT`, `GOVERNMENT`, ou `SOLE_PROPRIETOR`. `display_name`, `company_name`, `phone`, `street`, `city`, `state`, `postal_code`, et `email` sont requis ; `ein` et `website` sont optionnels.

**Réponse (`201 Created`) :**

```json theme={null}
{
  "data": {
    "brandId": "BXXXXXX",
    "status": "PENDING"
  },
  "meta": {
    "request_id": "req_abc123",
    "timestamp": "2026-03-08T12:00:00Z"
  }
}
```

La vérification de la marque est généralement terminée en 24 à 48 heures.

### Étape 2 : Créer une campagne

Enregistrez le cas d'usage spécifique de votre messagerie.

<Tip>
  Avant de soumettre — exécutez le [linter de pré-soumission](#preflight-your-submission) sur la charge utile de votre marque + campagne. Il détecte les rejets déterministes de TCR (formulation d'opt-out manquante, liens raccourcis, écho du cas d'usage) tant que leur correction est encore gratuite. Chaque soumission rejetée coûte de nouveaux frais de vérification et relance le délai de révision de 1 à 5 jours ouvrés.
</Tip>

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/campaign \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "brand_id": "BXXXXXX",
    "usecase": "CUSTOMER_CARE",
    "description": "Sending order updates and support responses to customers who opted in on our website checkout form.",
    "sample_message": [
      "Your order #12345 has shipped! Track at https://acme.com/track/12345",
      "Hi! Your support ticket #567 has been resolved. Reply STOP to unsubscribe."
    ],
    "message_flow": "Customers opt in via a web form at checkout and confirm consent. They can reply STOP at any time to opt out.",
    "help_message": "Reply HELP for assistance or contact support@acme.com.",
    "optout_message": "You have been unsubscribed and will receive no further messages."
  }'
```

`description` doit contenir au moins 40 caractères, `message_flow` au moins 40, et `help_message` comme `optout_message` au moins 20. `sample_message` est un tableau de 1 à 10 messages représentatifs. Les campagnes à caractère politique (`usecase` valant `POLITICAL_ADVOCACY` ou `POLLING_AND_VOTING`, ou `is_political: true`) exigent en outre un jeton Campaign Verify `cv_token`.

**Réponse (`201 Created`) :**

```json theme={null}
{
  "data": {
    "campaignId": "CXXXXXX",
    "status": "PENDING"
  },
  "meta": {
    "request_id": "req_def456",
    "timestamp": "2026-03-08T12:05:00Z"
  }
}
```

### Étape 3 : Attendre l'approbation

La révision de la campagne prend 1 à 5 jours ouvrés. Vous pouvez vérifier le statut :

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

**Réponse :**

```json theme={null}
{
  "data": {
    "campaignId": "CXXXXXX",
    "status": "APPROVED",
    "brandId": "BXXXXXX",
    "mnoStatuses": {
      "10017": "APPROVED",
      "10035": "APPROVED",
      "10095": "REVIEW"
    },
    "provider": "telnyx"
  },
  "meta": {
    "request_id": "req_ghi789",
    "timestamp": "2026-03-09T09:00:00Z"
  }
}
```

Le `status` de premier niveau est la décision au niveau CSP. `mnoStatuses` est la carte d'approbation par opérateur (les clés sont les identifiants d'opérateurs MNO — par ex. `10017` T-Mobile, `10035` AT\&T, `10095` Verizon) ; une campagne peut être `APPROVED` au niveau CSP tout en étant encore en `REVIEW` chez un opérateur individuel.

**Statuts :**

| Statut     | Description                                       |
| ---------- | ------------------------------------------------- |
| `PENDING`  | Soumise, en attente de la révision opérateur      |
| `APPROVED` | Approuvée — vous pouvez commencer à envoyer       |
| `FAILED`   | Rejetée — voir `rejectionReason` pour les détails |

### Étape 4 : Commencer l'envoi

Une fois approuvée, les messages envoyés depuis les numéros enregistrés bénéficient du débit et de la délivrabilité 10DLC complets.

<Tip>
  Si une soumission revient avec le statut `FAILED`, qu'un score de vérification plafonne votre niveau, ou que vous avez besoin de la capacité qu'une campagne approuvée offre réellement — le [guide des rejets 10DLC et de la re-vérification](/guides/10dlc-rejections-and-revet) couvre le décodeur, la re-vérification et les endpoints de débit.
</Tip>

***

## Pré-soumission de votre envoi

La plupart des rejets TCR sont déterministes — la même poignée de motifs de contenu et de complétude fait échouer les premières soumissions à répétition. Chaque rejet consomme de nouveaux frais de vérification (4 à 15 \$ par re-soumission) et relance le délai de révision de 1 à 5 jours ouvrés. Orbit fournit un linter de pré-soumission qui évalue la charge utile de votre marque + campagne contre le catalogue des motifs de rejet connus **avant** que vous ne soumettiez, et renvoie des constats par champ — chacun avec une sévérité, le fragment de texte exact incriminé, et une suggestion de réécriture concrète.

`POST /api/v1/compliance/10dlc/preflight`

Le linter est un moteur de règles pur : rien n'est envoyé à TCR, rien n'est stocké, et aucune application n'est créée. N'importe quel rôle de l'organisation peut l'appeler — aucun scope `numbers:write` requis.

Envoyez les objets marque et campagne exactement comme vous prévoyez de les soumettre, plus un `brand_vetting_score` (0–100) optionnel lorsque vous en possédez déjà un :

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/preflight \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "brand": {
      "display_name": "Acme Corp",
      "entity_type": "PRIVATE_PROFIT",
      "ein": "12-3456789",
      "email": "compliance@acme.com",
      "website": "https://acme.com"
    },
    "campaign": {
      "usecase": "MARKETING",
      "description": "Acme sends weekend promotional offers to customers who opt in on our checkout page.",
      "sample_message": [
        "Acme: 20% off today. Shop at https://bit.ly/acme-sale"
      ],
      "message_flow": "Customers opt in at checkout. They can reply STOP at any time to opt out.",
      "help_message": "Reply HELP for assistance or email support@acme.com.",
      "optout_message": "You are unsubscribed. Reply STOP to opt out.",
      "expected_msg_per_day_per_number": 5000
    },
    "brand_vetting_score": 45
  }'
```

**Réponse (`200 OK`) :**

```json theme={null}
{
  "data": {
    "score": 61,
    "verdict": "block",
    "findings": [
      {
        "ruleId": "R-CAMP-SAMPLE-SHORTENER",
        "severity": "error",
        "field": "campaign.sample_message[0]",
        "message": "Public URL shortener detected. Carriers auto-reject shortener domains in sample messages.",
        "match": "bit.ly",
        "suggestion": "Replace the shortener with a link on your own domain (e.g. acme.com/sale)."
      },
      {
        "ruleId": "R-CAMP-SAMPLES-COUNT",
        "severity": "warn",
        "field": "campaign.sample_message",
        "message": "Only one sample message provided. TCR vets 2-10 distinct samples covering your real traffic.",
        "suggestion": "Add distinct samples (welcome, reminder, confirmation) so TCR sees the full campaign."
      },
      {
        "ruleId": "R-CAMP-SAMPLE-CTA-STOP",
        "severity": "warn",
        "field": "campaign.sample_message[0]",
        "message": "Sample message does not reference STOP. Carriers expect opt-out wording in at least one sample.",
        "match": "Acme: 20% off today.",
        "suggestion": "Append \"Reply STOP to unsubscribe.\" to the sample."
      },
      {
        "ruleId": "R-CAMP-THROUGHPUT-TIER",
        "severity": "warn",
        "field": "campaign.expected_msg_per_day_per_number",
        "message": "Declared throughput exceeds the daily cap your vetting tier qualifies for.",
        "suggestion": "Lower the declared volume or raise your vetting score to qualify for a higher tier."
      }
    ],
    "engine": "tcr-preflight/v1"
  },
  "meta": {
    "request_id": "req_pf001",
    "timestamp": "2026-08-28T09:00:00Z"
  }
}
```

**Forme de la réponse.** `score` vaut de `0` à `100` (`100` = aucun motif connu détecté ; chaque constat déduit selon sa sévérité). `verdict` est l'agrégat — `block` dès qu'un constat `error` est présent, `warn` en dessous d'un score de 75, sinon `pass`. Chaque entrée `findings[]` porte un `ruleId` stable, une `severity` (`error` | `warn` | `info`), le chemin en notation pointée du `field` concerné, un résumé lisible, un `match` optionnel contenant le texte exact incriminé (pour le surlignage dans votre interface), et une `suggestion` — une réécriture qui résout le constat. `engine` est la version du moteur de règles (`tcr-preflight/v1`), afin de corréler les scores dans le temps.

<Note>
  Un verdict `pass` signifie « aucun motif de rejet connu détecté » — pas « TCR approuvera ». Le linter détecte la majorité déterministe des rejets ; votre soumission passe malgré tout par la révision opérateur normale. C'est un conseiller, jamais un gardien : vous décidez du moment de la soumission.
</Note>

### Ce que le linter 10DLC vérifie

Le catalogue encode les motifs sur lesquels TCR et les opérateurs rejettent. Règles clés :

| ID de règle                               | Sévérité | Ce qu'elle détecte                                                                                                                 |
| ----------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `R-BRAND-EIN`                             | error    | Le format de l'EIN ne correspond pas à la forme d'un identifiant fiscal américain valide                                           |
| `R-BRAND-EMAIL-DOMAIN`                    | warn     | E-mail sur un domaine de fournisseur gratuit que les opérateurs dévaluent (gmail.com, etc.)                                        |
| `R-BRAND-WEBSITE`                         | warn     | Site web manquant ou n'étant pas une URL publique de marque                                                                        |
| `R-CAMP-DESC-LEN` / `R-CAMP-DESC-GENERIC` | error    | Description trop courte, ou simple reprise textuelle du nom du cas d'usage                                                         |
| `R-CAMP-SAMPLES-COUNT`                    | warn     | Trop peu de messages d'exemple — le linter signale aussi le texte générique comme `Hi {{firstName}}` (`R-CAMP-SAMPLE-PLACEHOLDER`) |
| `R-CAMP-SAMPLE-SHAFT`                     | error    | Contenu SHAFT-C dans les exemples (sexe, haine, alcool, armes à feu, tabac, cannabis) — catégories à rejet automatique             |
| `R-CAMP-SAMPLE-BLOCKLIST`                 | error    | Expressions de la liste de blocage de contenu des opérateurs (MEF / UCC §3.4) — catalogue partagé avec le linter de codes courts   |
| `R-CAMP-SAMPLE-SHORTENER`                 | error    | Raccourcisseurs d'URL publics (bit.ly, t.co, tinyurl.com …) — rejet automatique par les opérateurs                                 |
| `R-CAMP-SAMPLE-CLICK-HERE`                | warn     | « click here » vague sans nom de destination                                                                                       |
| `R-CAMP-SAMPLE-CTA-STOP`                  | warn     | Aucun exemple ne mentionne l'opt-out STOP                                                                                          |
| `R-CAMP-HELP` / `R-CAMP-OPTOUT`           | error    | `help_message` / `optout_message` sans l'ensemble de mots-clés canonique                                                           |
| `R-CAMP-FLOW`                             | error    | `message_flow` manquant ou générique (le flux d'opt-in que TCR vérifie le plus sévèrement)                                         |
| `R-CAMP-AI-USECASE`                       | warn     | Campagne pilotée par IA dont la description omet la déclaration du cas d'usage IA                                                  |
| `R-CAMP-THROUGHPUT-TIER`                  | warn     | Volume quotidien déclaré supérieur au plafond auquel votre `brand_vetting_score` donne droit                                       |

Corrigez chaque constat par ordre de sévérité, relancez le linter jusqu'à obtenir une réponse propre (`verdict: "pass"`), puis soumettez la même charge utile via l'[Étape 2](#step-2-create-a-campaign).

***

## Types de cas d'usage

Passez l'une de ces valeurs dans le champ `usecase` lors de la création d'une campagne (Étape 2). Les codes TCR sont en **majuscules** — envoyez-les exactement comme indiqué ; une valeur en minuscules est rejetée à l'enregistrement.

| Cas d'usage                   | Description                                                                                | Débit                               |
| ----------------------------- | ------------------------------------------------------------------------------------------ | ----------------------------------- |
| `CUSTOMER_CARE`               | Support compte, réponses de service et alertes                                             | Défini par le score de vérification |
| `MARKETING`                   | Promotions, offres et démarchage commercial                                                | Défini par le score de vérification |
| `ACCOUNT_NOTIFICATION`        | Changements de compte, facturation et notifications de sécurité                            | Défini par le score de vérification |
| `DELIVERY_NOTIFICATION`       | Mises à jour de commandes, d'expédition et de livraison                                    | Défini par le score de vérification |
| `TWO_FACTOR_AUTH`             | Codes à usage unique et défis 2FA                                                          | Défini par le score de vérification |
| `POLLING_AND_VOTING`          | Sondages et enquêtes (les campagnes politiques nécessitent aussi un jeton Campaign Verify) | Défini par le score de vérification |
| `PUBLIC_SERVICE_ANNOUNCEMENT` | Annonces d'intérêt public                                                                  | Défini par le score de vérification |
| `CHARITY`                     | Messagerie d'organismes à but non lucratif enregistrés 501(c)(3)                           | Réduit (voie 501(c)(3))             |
| `EMERGENCY`                   | Messagerie de sécurité et d'alerte publique                                                | Priorité opérateur                  |
| `MIXED`                       | Plusieurs cas d'usage dans une même campagne (le défaut)                                   | Plafond quotidien réduit            |

***

## Niveaux de débit

Le débit 10DLC est accordé sous forme de plafond de segments de messages **par jour et par numéro**, et non d'un débit par seconde. Votre niveau est déterminé par votre score de vérification de marque (0–100) et votre type d'entité enregistré. Le plafond quotidien de chaque niveau s'applique à chaque numéro affecté à la campagne, de sorte que le débit total de la campagne évolue avec le nombre de numéros affectés.

| Niveau              | Éligibilité                                             | Plafond quotidien par numéro |
| ------------------- | ------------------------------------------------------- | ---------------------------- |
| Sole Proprietor     | Type d'entité `SOLE_PROPRIETOR`                         | \~1 000 msg/jour             |
| Low Volume Standard | Référence de base (toute marque, y compris non évaluée) | \~30 000 msg/jour            |
| Standard            | Score de vérification de 50 ou plus                     | \~200 000 msg/jour           |
| Top Tier            | Score de vérification de 75 ou plus                     | \~2 000 000 msg/jour         |

Les plafonds reflètent les valeurs par défaut de T-Mobile ; AT\&T et Verizon s'en écartent d'environ 10 %. Le niveau le plus élevé auquel votre score de vérification donne droit vous est accordé. Une marque sans score bascule par défaut sur la référence Low Volume Standard.

<Tip>
  Améliorez votre score de vérification en fournissant des informations de marque complètes et exactes, y compris l'EIN, le site web et le symbole boursier (si coté). Un score de 75 ou plus débloque le plafond quotidien Top Tier.
</Tip>

***

## Exigences de conformité

1. **Consentement d'opt-in.** Vous devez disposer du consentement explicite de chaque destinataire avant l'envoi.
2. **Gestion de l'opt-out.** Traitez immédiatement les demandes STOP. Orbit traite automatiquement STOP, CANCEL et UNSUBSCRIBE.
3. **Contenu des messages.** Les messages d'exemple doivent être représentatifs du trafic réel.
4. **Usage cohérent.** N'envoyez que des messages correspondant au cas d'usage de votre campagne enregistrée.

***

## Enregistrement via le tableau de bord

Vous pouvez également effectuer l'intégralité de l'enregistrement 10DLC via le tableau de bord Orbit :

1. Accédez à **Settings > Compliance > 10DLC**
2. Cliquez sur **Register Brand** et renseignez les informations de votre entreprise
3. Une fois la marque approuvée, cliquez sur **Create Campaign**
4. Sélectionnez votre cas d'usage, ajoutez des messages d'exemple et affectez des numéros
5. Soumettez pour révision opérateur

***

## Configuration du flux de règles par pays

<Note>
  Cette section s'adresse aux **opérateurs de plateforme / déploiements auto-hébergés**. Les clients SaaS sur `api.orbit.devotel.io` n'ont pas besoin de les définir — Orbit maintient les règles par pays 10DLC à jour pour vous.
</Note>

Orbit maintient à jour son jeu de règles canonique US-10DLC par pays (types d'expéditeurs, posture de débit, exigence d'enregistrement) en tirant les données du **flux partenaire iconectiv TCR**. Le connecteur réside dans `@devotel/compliance/country-rule-feeds` et s'exécute à deux endroits :

* **À la demande** — l'action d'administration « Refresh from upstream »
  (`POST /api/v1/compliance/country-rules/sync?provider=iconectiv`).
* **Hebdomadaire** — le déclenchement d'actualisation automatique dans le
  planificateur compliance-sync du worker de webhooks.

Le connecteur est **optionnel et fonctionne en mode fail-open** : lorsque ses identifiants ne sont pas définis, il consigne une erreur et s'abstient, laissant les règles par pays existantes en place. Il s'agit d'un flux de métadonnées en lecture seule — jamais d'un chemin de transport de messages, de sorte que les SMS sortants quittent toujours via le softswitch Devotel.

| Variable                 | Requis       | Description                                                                                                                                                                                                                              |
| ------------------------ | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DEVOTEL_TCR_API_KEY`    | pour le flux | Clé API partenaire iconectiv TCR. Le connecteur s'abstient si non définie.                                                                                                                                                               |
| `DEVOTEL_TCR_PARTNER_ID` | pour le flux | Identifiant partenaire iconectiv TCR (segment de chemin sur l'API partenaire). Le connecteur s'abstient si non défini.                                                                                                                   |
| `DEVOTEL_TCR_FEED_URL`   | optionnel    | URL de base de remplacement pour l'API partenaire. Par défaut : `https://csp-api.campaignregistry.com`.                                                                                                                                  |
| `DEVOTEL_TCR_OPTOUT_URL` | optionnel    | URL complète de remplacement de l'endpoint du registre TCR Universal Opt-Out qui alimente la récupération des opt-out DNC. Par défaut : `<feed_url>/v1/partner/<partner_id>/universalOptOuts`. Lecture seule — jamais un chemin d'envoi. |

`DEVOTEL_TCR_API_KEY` et `DEVOTEL_TCR_PARTNER_ID` doivent tous deux être définis pour que le flux s'exécute ; si l'un des deux manque, le connecteur n'a aucun effet. Enregistrez Devotel comme partenaire TCR sur [iconectiv.com](https://iconectiv.com/) pour obtenir ces identifiants.

***

## Dépannage

| Problème                     | Solution                                                                                                               |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Marque rejetée               | Vérifiez que votre EIN correspond exactement aux registres de l'IRS                                                    |
| Campagne rejetée             | Assurez-vous que les messages d'exemple correspondent au cas d'usage sélectionné et incluent une formulation d'opt-out |
| Score de vérification faible | Fournissez des informations de marque complètes (site web, symbole boursier, dénomination sociale complète)            |
| Messages toujours filtrés    | Confirmez que le statut de la campagne est `approved` et que des numéros sont affectés                                 |

<Warning>
  L'envoi de SMS à volume élevé sans enregistrement 10DLC peut entraîner un filtrage opérateur, un blocage des messages et une éventuelle suspension du numéro.
</Warning>
