# SMS salientes

URL canónica: https://texttree.ai/es-es/docs/sms-saliente/
URL de Markdown: https://texttree.ai/es-es/docs/sms-saliente.md
Tipo de página: docs
Translation status: draft
Legal status: english_controls

## Resumen

Envía SMS de producción a través de verificaciones de supresión, gasto, remitente y proveedor.

## Contenido de la página

Los envíos salientes pasan por la misma ruta de seguridad sin importar si se originan en la API, el compositor de mensajes, el creador de campañas o el motor de flujos de trabajo.

## Ejemplos de solicitud

### curl

```bash
curl https://api.texttree.ai/api/v1/messages \
  -H "Authorization: Bearer $TEXTREE_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "+15551234567",
    "body": "Your appointment is tomorrow at 9 AM.",
    "metadata": {
      "workflow": "appointment-reminder"
    }
  }'
```

### JavaScript

```js
const response = await fetch("https://api.texttree.ai/api/v1/messages", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.TEXTREE_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    phone_number: "+15551234567",
    body: "Your appointment is tomorrow at 9 AM.",
    metadata: { workflow: "appointment-reminder" },
  }),
});

const result = await response.json();
```

### Python

```py
import os
import requests

result = requests.post(
    "https://api.texttree.ai/api/v1/messages",
    headers={"Authorization": f"Bearer {os.environ['TEXTREE_ACCESS_TOKEN']}"},
    json={
        "phone_number": "+15551234567",
        "body": "Your appointment is tomorrow at 9 AM.",
        "metadata": {"workflow": "appointment-reminder"},
    },
    timeout=10,
).json()
```

### Elixir

```elixir
Mix.install([:req])

result =
  Req.post!(
    "https://api.texttree.ai/api/v1/messages",
    auth: {:bearer, System.fetch_env!("TEXTREE_ACCESS_TOKEN")},
    json: %{
      phone_number: "+15551234567",
      body: "Your appointment is tomorrow at 9 AM.",
      metadata: %{workflow: "appointment-reminder"}
    }
  ).body
```

Cada envío se verifica contra supresiones del espacio de trabajo, límites de gasto, reserva en el libro contable, disponibilidad
del remitente, validación del payload y preparación del proveedor antes de la ejecución con el proveedor. Los envíos de campañas
también verifican las supresiones específicas de la campaña antes de encolar un mensaje de TextTree y de nuevo si se
añade una supresión de campaña antes del despacho final.

El formulario de envío rápido del panel y la página Enviar usan la misma ruta de encolado que
la API. Los operadores pueden elegir un número remitente de marca conectado en la aplicación, o
dejar la selección del remitente en automático. Un remitente seleccionado debe seguir conectado al
espacio de trabajo cuando el trabajador despacha el mensaje; si no está disponible, el
trabajo termina con `sender_number_unavailable` y no recurre a otro
remitente.

La idempotencia del mensaje incluye el remitente seleccionado. Reutilizar una `idempotency_key`
con un destinatario, cuerpo, coste o remitente diferente es un conflicto de idempotencia.

## Comportamiento ante fallas

Si un envío es bloqueado, la API devuelve una falla estructurada y el registro del mensaje muestra el mismo
motivo en la línea de tiempo.

```json
{
  "error": {
    "code": "workspace_suppressed",
    "message": "Recipient is suppressed for this workspace.",
    "fix": "Respect the suppression or remove it only after your compliance process allows SMS again."
  }
}
```
