Tipo de página: docs
SMS salientes
Envía SMS de producción a través de verificaciones de supresión, gasto, remitente y proveedor.
Respuesta directa
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
agrega 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, costo 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."
}
}
```