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

# Registro 10DLC para el cumplimiento de mensajería A2P en EE. UU.

> Registre su marca y sus campañas para el cumplimiento de mensajería 10-Digit Long Code (10DLC) de EE. UU. a través de Orbit para desbloquear el rendimiento A2P y la entregabilidad ante los operadores.

# Registro 10DLC

10DLC (10-Digit Long Code) es el sistema exigido por los operadores de EE. UU. para enviar mensajes SMS de aplicación a persona (A2P) usando números de teléfono estándar de 10 dígitos. Todas las empresas que envíen SMS a números de EE. UU. deben registrarse a través de 10DLC para garantizar la entregabilidad y el cumplimiento.

## Descripción general

Los operadores de EE. UU. (T-Mobile, AT\&T, Verizon) exigen el registro 10DLC para la mensajería A2P. El tráfico no registrado enfrenta:

* **Filtrado agresivo** — mensajes bloqueados silenciosamente
* **Tarifas más altas** — recargos por mensaje para remitentes no registrados
* **Rendimiento bajo** — limitado a \~1 mensaje/segundo frente a 75+ cuando está registrado

Orbit gestiona el proceso de registro a través de The Campaign Registry (TCR).

<Tip>
  **Flujo recomendado:** use el [asistente de registro 10DLC](/guides/10dlc-wizard) — guarda un borrador reanudable, le permite completar las secciones de marca y campaña en cualquier orden, verifica el teléfono de un propietario único por OTP y envía ambos de forma atómica. Los endpoints lineales de abajo siguen disponibles para pipelines programados.
</Tip>

***

## Pasos de registro

### Paso 1: Registre su marca

Cree una identidad de marca que represente a su organización.

```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` debe ser uno de `PRIVATE_PROFIT`, `PUBLIC_PROFIT`, `NON_PROFIT`, `GOVERNMENT` o `SOLE_PROPRIETOR`. `display_name`, `company_name`, `phone`, `street`, `city`, `state`, `postal_code` y `email` son obligatorios; `ein` y `website` son opcionales.

**Respuesta (`201 Created`):**

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

La verificación de la marca suele completarse en 24–48 horas.

### Paso 2: Cree una campaña

Registre el caso de uso específico de su mensajería.

<Tip>
  Antes de enviar — ejecute el [linter de preflight](#preflight-your-submission) contra su carga útil de marca + campaña. Detecta los rechazos deterministas de TCR (falta el texto de exclusión, enlaces de acortadores, eco del caso de uso) mientras corregirlos todavía es gratis. Cada envío rechazado cuesta una nueva tarifa de verificación y reinicia el reloj de revisión de 1–5 días hábiles.
</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` debe tener al menos 40 caracteres, `message_flow` al menos 40, y tanto `help_message` como `optout_message` al menos 20. `sample_message` es un array de 1–10 mensajes representativos. Las campañas del vertical político (`usecase` de `POLITICAL_ADVOCACY` o `POLLING_AND_VOTING`, o `is_political: true`) requieren además un `cv_token` de Campaign Verify.

**Respuesta (`201 Created`):**

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

### Paso 3: Espere la aprobación

La revisión de la campaña tarda de 1 a 5 días hábiles. Puede consultar el estado:

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

**Respuesta:**

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

El `status` de nivel superior es la decisión a nivel CSP. `mnoStatuses` es el mapa de aprobación por operador (las claves son identificadores de operador MNO — por ejemplo `10017` T-Mobile, `10035` AT\&T, `10095` Verizon); una campaña puede estar `APPROVED` a nivel CSP mientras sigue en `REVIEW` en un operador individual.

**Estados:**

| Estado     | Descripción                                              |
| ---------- | -------------------------------------------------------- |
| `PENDING`  | Enviado, en espera de revisión del operador              |
| `APPROVED` | Aprobado — puede empezar a enviar                        |
| `FAILED`   | Rechazado — consulte `rejectionReason` para más detalles |

### Paso 4: Empiece a enviar

Una vez aprobada, los mensajes enviados desde números registrados reciben el rendimiento y la entregabilidad completos de 10DLC.

<Tip>
  Si una solicitud vuelve con `FAILED`, una puntuación de verificación limita su nivel, o necesita el margen que una campaña aprobada realmente tiene — la [guía de rechazos y re-verificación de 10DLC](/guides/10dlc-rejections-and-revet) cubre el decodificador, la re-verificación y los endpoints de rendimiento.
</Tip>

***

## Preflight de su envío

La mayoría de los rechazos de TCR son deterministas: el mismo puñado de
patrones de contenido y completitud hace tropezar una y otra vez a los
primeros envíos. Cada rechazo quema una nueva tarifa de verificación ($4–$15
por reenvío) y reinicia el reloj de revisión de 1–5 días hábiles. Orbit
incluye un linter de preflight que puntúa su carga útil de marca + campaña
contra el catálogo de patrones de rechazo conocidos **antes** de que usted
envíe, y devuelve hallazgos por campo — cada uno con una severidad, el
fragmento de texto exacto infractor y una sugerencia concreta de reescritura.

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

El linter es un motor de reglas puro: nada se envía a TCR, nada se almacena,
y no se crea ninguna solicitud. Cualquier rol de la organización puede
invocarlo — no se requiere el alcance `numbers:write`.

Envíe los objetos de marca y campaña exactamente como planea enviarlos,
más un `brand_vetting_score` opcional (0–100) cuando ya posea uno:

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

**Respuesta (`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"
  }
}
```

**Forma de la respuesta.** `score` va de `0` a `100` (`100` = ningún patrón
conocido coincidió; cada hallazgo resta según la severidad). `verdict` es el
agregado — `block` cuando hay cualquier hallazgo de tipo `error`, `warn` por
debajo de una puntuación de 75, en otro caso `pass`. Cada entrada de
`findings[]` lleva un `ruleId` estable, una `severity` (`error` | `warn` |
`info`), el `field` en notación de punto al que se aplica, un resumen legible,
un `match` opcional con el texto exacto infractor (para resaltarlo en su UI) y
una `suggestion` — una reescritura que resuelve el hallazgo. `engine` es la
versión del motor de reglas (`tcr-preflight/v1`), de modo que puede correlar
puntuaciones a lo largo del tiempo.

<Note>
  Un veredicto `pass` significa "ningún patrón de rechazo conocido coincidió"
  — no "TCR aprobará". El linter captura la mayoría determinista de los
  rechazos; su envío sigue pasando por la revisión normal del operador. Es un
  asesor, nunca una puerta: usted decide cuándo enviar.
</Note>

### Qué verifica el linter 10DLC

El catálogo codifica los patrones por los que TCR y los operadores rechazan. Reglas clave:

| ID de regla                               | Severidad | Qué detecta                                                                                                                                 |
| ----------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `R-BRAND-EIN`                             | error     | El formato del EIN no coincide con una forma válida de identificación fiscal de EE. UU.                                                     |
| `R-BRAND-EMAIL-DOMAIN`                    | warn      | Correo electrónico en un dominio de proveedor gratuito que los operadores descuentan (gmail.com, etc.)                                      |
| `R-BRAND-WEBSITE`                         | warn      | Sitio web ausente o que no es una URL pública y de marca                                                                                    |
| `R-CAMP-DESC-LEN` / `R-CAMP-DESC-GENERIC` | error     | Descripción demasiado corta, o que simplemente replica literalmente el nombre del caso de uso                                               |
| `R-CAMP-SAMPLES-COUNT`                    | warn      | Muy pocos mensajes de muestra — el linter también marca texto de marcador de posición como `Hi {{firstName}}` (`R-CAMP-SAMPLE-PLACEHOLDER`) |
| `R-CAMP-SAMPLE-SHAFT`                     | error     | Contenido SHAFT-C en las muestras (sexo, odio, alcohol, armas de fuego, tabaco, cannabis) — categorías de rechazo automático                |
| `R-CAMP-SAMPLE-BLOCKLIST`                 | error     | Frases de la lista de bloqueo de contenido de los operadores (MEF / UCC §3.4) — catálogo compartido con el linter de short code             |
| `R-CAMP-SAMPLE-SHORTENER`                 | error     | Acortadores de URL públicos (bit.ly, t.co, tinyurl.com …) — los operadores los rechazan automáticamente                                     |
| `R-CAMP-SAMPLE-CLICK-HERE`                | warn      | "click here" vago sin un nombre de destino                                                                                                  |
| `R-CAMP-SAMPLE-CTA-STOP`                  | warn      | Ninguna muestra menciona la exclusión STOP                                                                                                  |
| `R-CAMP-HELP` / `R-CAMP-OPTOUT`           | error     | `help_message` / `optout_message` sin el conjunto canónico de palabras clave                                                                |
| `R-CAMP-FLOW`                             | error     | `message_flow` ausente o genérico (el flujo de suscripción que TCR verifica con más rigor)                                                  |
| `R-CAMP-AI-USECASE`                       | warn      | Campaña impulsada por IA cuya descripción omite la divulgación del caso de uso de IA                                                        |
| `R-CAMP-THROUGHPUT-TIER`                  | warn      | El volumen diario declarado excede el tope que su `brand_vetting_score` habilita                                                            |

Corrija cada hallazgo en orden de severidad, vuelva a ejecutar el linter
hasta que la respuesta salga limpia (`verdict: "pass"`), y luego envíe la
misma carga útil a través del [Paso 2](#step-2-create-a-campaign).

***

## Tipos de caso de uso

Pase uno de estos valores en el campo `usecase` al crear una campaña
(Paso 2). Los códigos de TCR están en **mayúsculas** — envíelos exactamente
como se muestran; un valor en minúsculas se rechaza en el registro.

| Caso de uso                   | Descripción                                                                                | Rendimiento                              |
| ----------------------------- | ------------------------------------------------------------------------------------------ | ---------------------------------------- |
| `CUSTOMER_CARE`               | Soporte de cuentas, respuestas de servicio y alertas                                       | Fijado por la puntuación de verificación |
| `MARKETING`                   | Promociones, ofertas y contacto de ventas                                                  | Fijado por la puntuación de verificación |
| `ACCOUNT_NOTIFICATION`        | Cambios de cuenta, facturación y avisos de seguridad                                       | Fijado por la puntuación de verificación |
| `DELIVERY_NOTIFICATION`       | Actualizaciones de pedidos, envíos y entregas                                              | Fijado por la puntuación de verificación |
| `TWO_FACTOR_AUTH`             | Códigos de un solo uso y desafíos 2FA                                                      | Fijado por la puntuación de verificación |
| `POLLING_AND_VOTING`          | Encuestas y sondeos (las campañas políticas también necesitan un token de Campaign Verify) | Fijado por la puntuación de verificación |
| `PUBLIC_SERVICE_ANNOUNCEMENT` | Anuncios de interés público                                                                | Fijado por la puntuación de verificación |
| `CHARITY`                     | Mensajería de organizaciones sin fines de lucro 501(c)(3) registradas                      | Reducido (carril 501(c)(3))              |
| `EMERGENCY`                   | Mensajería de seguridad y alertas públicas                                                 | Prioridad del operador                   |
| `MIXED`                       | Varios casos de uso en una sola campaña (el valor predeterminado)                          | Tope diario reducido                     |

***

## Niveles de rendimiento

El rendimiento 10DLC se concede como un tope de segmentos de mensaje
**por día y por número**, no como una tasa por segundo. Su nivel lo fija su
puntuación de verificación de marca (0–100) y su tipo de entidad registrada.
El tope diario de cada nivel se aplica a cada número asignado a la campaña,
de modo que el rendimiento total de la campaña escala con el número de
números asignados.

| Nivel                    | Elegibilidad                                               | Tope diario por número |
| ------------------------ | ---------------------------------------------------------- | ---------------------- |
| Propietario único        | Tipo de entidad `SOLE_PROPRIETOR`                          | \~1.000 msg/día        |
| Estándar de bajo volumen | Línea base (cualquier marca, incluidas las sin puntuación) | \~30.000 msg/día       |
| Estándar                 | Puntuación de verificación de 50 o más                     | \~200.000 msg/día      |
| Nivel superior           | Puntuación de verificación de 75 o más                     | \~2.000.000 msg/día    |

Los topes reflejan los valores predeterminados de T-Mobile; AT\&T y Verizon
están dentro de aproximadamente un 10%. Se le concede el nivel más alto para
el que su puntuación de verificación le califica. Una marca sin puntuación
todavía usa de forma predeterminada la línea base Estándar de bajo volumen.

<Tip>
  Mejore su puntuación de verificación proporcionando información de marca completa y precisa, incluidos el EIN, el sitio web y el símbolo bursátil (si es pública). Una puntuación de 75 o más desbloquea el tope diario del Nivel superior.
</Tip>

***

## Requisitos de cumplimiento

1. **Consentimiento de suscripción.** Debe tener el consentimiento explícito de cada destinatario antes de enviar.
2. **Manejo de la exclusión.** Respete las solicitudes de STOP de inmediato. Orbit procesa automáticamente STOP, CANCEL y UNSUBSCRIBE.
3. **Contenido del mensaje.** Los mensajes de muestra deben ser representativos del tráfico real.
4. **Uso coherente.** Envíe solo mensajes que coincidan con el caso de uso de su campaña registrada.

***

## Registro desde el panel

También puede completar todo el registro 10DLC a través del panel de Orbit:

1. Navegue a **Settings > Compliance > 10DLC**
2. Haga clic en **Register Brand** y complete los datos de su empresa
3. Una vez aprobada la marca, haga clic en **Create Campaign**
4. Seleccione su caso de uso, agregue mensajes de muestra y asigne números
5. Envíe para la revisión del operador

***

## Configuración del feed de reglas por país

<Note>
  Esta sección es para **operadores de plataforma / despliegues autoalojados**. Los
  clientes SaaS en `api.orbit.devotel.io` no necesitan configurar estos valores — Orbit
  mantiene las reglas de país 10DLC actualizadas por usted.
</Note>

Orbit mantiene fresco su conjunto canónico de reglas para el 10DLC de EE. UU.
(tipos de remitente, postura de rendimiento, requisito de registro) extrayéndolo
del **feed de socios TCR de iconectiv**. El conector vive en
`@devotel/compliance/country-rule-feeds` y se ejecuta en dos lugares:

* **Bajo demanda** — la acción de administración "Refresh from upstream"
  (`POST /api/v1/compliance/country-rules/sync?provider=iconectiv`).
* **Semanalmente** — el tick de actualización automática en el programador de
  sincronización de cumplimiento del webhook-worker.

El conector es **opcional y fail-open**: cuando sus credenciales no están
configuradas, registra un error y se salta, dejando las reglas de país
existentes en su lugar. Es un feed de metadatos de solo lectura — nunca una
ruta de transporte de mensajes, de modo que el SMS saliente sigue saliendo por
el softswitch de Devotel.

| Variable                 | Requerida    | Descripción                                                                                                                                                                                                                                           |
| ------------------------ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DEVOTEL_TCR_API_KEY`    | para el feed | Clave API de socio TCR de iconectiv. El conector se salta cuando no está configurada.                                                                                                                                                                 |
| `DEVOTEL_TCR_PARTNER_ID` | para el feed | Identificador de socio TCR de iconectiv (segmento de ruta en la API de socios). El conector se salta cuando no está configurado.                                                                                                                      |
| `DEVOTEL_TCR_FEED_URL`   | opcional     | URL base alternativa para la API de socios. De forma predeterminada es `https://csp-api.campaignregistry.com`.                                                                                                                                        |
| `DEVOTEL_TCR_OPTOUT_URL` | opcional     | URL completa alternativa del endpoint del registro Universal Opt-Out de TCR que alimenta la extracción de exclusión DNC. De forma predeterminada es `<feed_url>/v1/partner/<partner_id>/universalOptOuts`. De solo lectura — nunca una ruta de envío. |

Tanto `DEVOTEL_TCR_API_KEY` como `DEVOTEL_TCR_PARTNER_ID` deben estar
configuradas para que el feed se ejecute; si falta cualquiera, el conector no
hace nada. Registre a Devotel como socio de TCR en
[iconectiv.com](https://iconectiv.com/) para obtener estas credenciales.

***

## Resolución de problemas

| Problema                             | Solución                                                                                                            |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| Marca rechazada                      | Verifique que su EIN coincida exactamente con los registros del IRS                                                 |
| Campaña rechazada                    | Asegúrese de que los mensajes de muestra coincidan con el caso de uso seleccionado e incluyan el texto de exclusión |
| Puntuación de verificación baja      | Proporcione información de marca completa (sitio web, símbolo bursátil, nombre legal completo)                      |
| Los mensajes siguen siendo filtrados | Confirme que el estado de la campaña sea `approved` y que los números estén asignados                               |

<Warning>
  Enviar SMS de alto volumen sin el registro 10DLC puede resultar en filtrado por el operador, bloqueo de mensajes y una posible suspensión del número.
</Warning>
