La API de FastSMS permite que cualquier aplicación cree, programe, consulte y cancele mensajes SMS. Es una API REST: las peticiones y las respuestas usan JSON.
https://www.sms.51x.mx/api/v1
Todas las peticiones se autentican con un token personal enviado en la cabecera
Authorization.
Authorization: Bearer TU_TOKEN Accept: application/json
Envía siempre la cabecera Accept: application/json.
Sin ella, una petición sin token válido no devuelve 401 sino una redirección
302 a la página de login, y los errores de validación también redirigen en
lugar de responder 422. Es la causa más común de «mi cliente HTTP recibe
HTML en vez de JSON».
Los tokens no caducan. Si uno se ve comprometido, revócalo a mano desde la pantalla de API Tokens.
Un token da acceso completo a todos los endpoints de mensajes de tu cuenta. Trátalo como una contraseña: nunca lo publiques en código de cliente ni en un repositorio.
Cada mensaje avanza por una máquina de estados. El campo
status de las respuestas
siempre contiene uno de estos seis valores.
programado --(llega la hora)--> por_enviar --(se asigna canal)--> en_cola --(el canal confirma)--> enviado
| | |
+-----------------------------+------------------------------+--> cancelado / error
| Valor | Etiqueta | Significado |
|---|---|---|
programado |
Programado | Creado con fecha y hora futuras. Espera a que llegue el momento. |
por_enviar |
Por enviar | Listo para salir, a la espera de que se le asigne un canal. |
en_cola |
En cola | Ya entregado a un canal de envío, pendiente de confirmación. |
enviado |
Enviado | El canal confirmó el envío. Estado final. |
cancelado |
Cancelado | Cancelado antes de salir. Estado final. |
error |
Error | Falló el envío; el motivo va en el campo error. Admite reintento. |
enviado significa que el canal confirmó haber enviado el SMS, no
que el destinatario lo haya recibido. enviado y cancelado son
estados finales: no se puede transicionar desde ellos.
Todas las rutas cuelgan de https://www.sms.51x.mx/api/v1
y requieren autenticación.
| Método | Ruta | Descripción |
|---|---|---|
| POST | /messages |
Crear un mensaje |
| POST | /messages/bulk |
Crear muchos mensajes de una vez |
| GET | /messages |
Listar tus mensajes (paginado) |
| GET | /messages/{msg_id} |
Consultar un mensaje |
| DELETE | /messages/{msg_id} |
Cancelar un mensaje no enviado |
/api/v1/messages
Crea un mensaje. Si no indicas fecha y hora, se envía cuanto antes.
| Campo | Tipo | Reglas |
|---|---|---|
mensaje |
string | Obligatorio. Texto del SMS. |
numero |
string | Obligatorio. Máximo 20 caracteres. |
nombre |
string | Opcional. Máximo 255 caracteres. Referencia interna del destinatario. |
fecha_envio |
string | Opcional. Formato AAAA-MM-DD. |
hora_envio |
string | Opcional. Formato HH:MM o HH:MM:SS. |
{
"nombre": "Ana López",
"numero": "5551234567",
"mensaje": "Tu cita es mañana a las 10:00"
}
{
"message": "Mensaje creado correctamente",
"msg_id": "9b1c7d4e-...-3f2a",
"status": "por_enviar"
}
El status inicial es programado si la fecha y hora indicadas
son futuras, y por_enviar en caso contrario. Guarda el msg_id:
es el identificador con el que consultarás o cancelarás el mensaje.
/api/v1/messages/bulk
Crea varios mensajes en una sola llamada. El array mensajes es obligatorio y
debe tener al menos un elemento; cada elemento acepta los mismos campos que
crear un mensaje.
fecha_envio y hora_envio en la raíz para programar
todo el lote de golpe. Si un elemento trae los suyos propios, los del elemento
tienen prioridad sobre los globales.
{
"fecha_envio": "2026-09-01",
"hora_envio": "09:00",
"mensajes": [
{
"nombre": "Ana",
"numero": "5551234567",
"mensaje": "Recordatorio de cita"
},
{
"numero": "5559876543",
"mensaje": "Tu paquete va en camino",
"hora_envio": "18:30"
}
]
}
{
"message": "2 mensajes creados",
"data": [
{
"msg_id": "9b1c7d4e-...-3f2a",
"numero": "5551234567",
"status": "programado"
},
{
"msg_id": "7a2e9f10-...-b5c8",
"numero": "5559876543",
"status": "programado"
}
]
}
/api/v1/messages
Devuelve tus mensajes, del más reciente al más antiguo, en páginas de 50.
| Parámetro | Descripción |
|---|---|
status |
Filtra por estado. Uno de programado, por_enviar,
en_cola, enviado, cancelado,
error. Un valor desconocido no da error: devuelve una página vacía.
|
page |
Número de página. Por defecto 1. |
GET /api/v1/messages?status=enviado&page=2
{
"current_page": 1,
"data": [ ... objetos mensaje ... ],
"first_page_url": "...",
"from": 1,
"last_page": 3,
"next_page_url": "...",
"path": "...",
"per_page": 50,
"prev_page_url": null,
"to": 50,
"total": 118
}
/api/v1/messages/{msg_id}
Consulta un mensaje por su msg_id (el UUID que devolvió la creación,
no un id numérico).
{
"msg_id": "9b1c7d4e-...-3f2a",
"nombre": "Ana López",
"numero": "5551234567",
"mensaje": "Tu cita es mañana a las 10:00",
"status": "enviado",
"status_label": "Enviado",
"fecha_envio": "2026-09-01",
"hora_envio": "09:00:00",
"sent_at": "2026-09-01 09:00:37",
"error": null
}
| Campo | Descripción |
|---|---|
msg_id | Identificador público del mensaje (UUID). |
nombre | Referencia que enviaste, o null. |
numero | Número de destino. |
mensaje | Texto del SMS. |
status | Estado actual (ver ciclo de vida). |
status_label | El mismo estado, legible para mostrar al usuario. |
fecha_envio | AAAA-MM-DD o null. |
hora_envio | HH:MM:SS o null. |
sent_at | Momento del envío confirmado, o null si aún no salió. |
error | Motivo del fallo cuando status es error; si no, null. |
/api/v1/messages/{msg_id}
Cancela un mensaje que todavía no ha salido. No borra el registro: lo pasa al estado
cancelado.
{
"message": "Mensaje cancelado",
"status": "cancelado"
}
{
"error": "No se puede cancelar un mensaje ya enviado o finalizado."
}
Solo se pueden cancelar mensajes en estado programado,
por_enviar, en_cola o error. Un mensaje ya
enviado o cancelado devuelve 422.
Para programar un mensaje, envía fecha_envio (AAAA-MM-DD) y
hora_envio (HH:MM o HH:MM:SS). Si los omites, el
mensaje entra en la cola de inmediato.
La salida tiene una granularidad de aproximadamente un minuto. Un proceso
programado revisa la cola cada minuto, asigna canal y pasa los mensajes a
en_cola. No esperes un envío instantáneo al milisegundo.
Un mensaje recién creado nunca aparece como enviado. El estado
enviado solo llega cuando el canal físico confirma el envío, lo que ocurre
segundos o minutos después. Consulta el msg_id más tarde para ver el
resultado final.
La API no limita la longitud del campo mensaje, pero la red SMS
sí: un mensaje largo se parte en varios segmentos y cada segmento se cobra por separado.
Conviene que lo controles desde tu aplicación.
| Codificación | Un segmento | Por segmento al concatenar |
|---|---|---|
| GSM-7 (texto básico, sin acentos ni emoji) | 160 caracteres | 153 caracteres |
| Unicode (acentos, ñ, emoji) | 70 caracteres | 67 caracteres |
Un solo carácter acentuado o un emoji cambia todo el mensaje a Unicode y reduce la capacidad de 160 a 70 caracteres. Como referencia, el panel de FastSMS corta en 5 segmentos: 765 caracteres en GSM-7, 335 en Unicode.
| Código | Cuándo ocurre |
|---|---|
401 |
Falta el token, es inválido o fue revocado. |
404 |
El msg_id no existe o no pertenece a tu cuenta. |
422 |
El cuerpo no pasó la validación, o intentaste cancelar un mensaje ya finalizado. |
302 |
No es un error de la API: olvidaste la cabecera
Accept: application/json y el servidor te redirigió al login.
|
422){
"message": "The numero field is required.",
"errors": {
"numero": ["The numero field is required."]
}
}
404){
"error": "Mensaje no encontrado"
}
El mismo envío, en tres lenguajes.
curl -X POST https://www.sms.51x.mx/api/v1/messages \
-H "Authorization: Bearer TU_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"nombre": "Ana",
"numero": "5551234567",
"mensaje": "Tu cita es manana a las 10:00"
}'