FastSMS

Documentación de la API

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.

URL base

https://sms.51x.mx/api/v1
El texto de cada mensaje y el número de destino se guardan cifrados en la base de datos. Solo se descifran para entregarlos al canal de envío y para responder a tus propias consultas.

Autenticación

Todas las peticiones se autentican con un token personal enviado en la cabecera Authorization.

Authorization: Bearer TU_TOKEN
Accept: application/json

Cómo obtener tu token

  1. Inicia sesión en tu cuenta de FastSMS.
  2. Entra en la pantalla API Tokens.
  3. Crea un token, ponle un nombre y cópialo en ese momento: solo se muestra una vez.

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.

Ciclo de vida de un mensaje

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.

Endpoints

Todas las rutas cuelgan de https://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
POST /api/v1/messages

Crea un mensaje. Si no indicas fecha y hora, se envía cuanto antes.

Cuerpo de la petición

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.

Petición

{
  "nombre": "Ana López",
  "numero": "5551234567",
  "mensaje": "Tu cita es mañana a las 10:00"
}

Respuesta 201 Created

{
  "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.

POST /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.

Puedes poner 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.

Petición

{
  "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"
    }
  ]
}

Respuesta 201 Created

{
  "message": "2 mensajes creados",
  "data": [
    {
      "msg_id": "9b1c7d4e-...-3f2a",
      "numero": "5551234567",
      "status": "programado"
    },
    {
      "msg_id": "7a2e9f10-...-b5c8",
      "numero": "5559876543",
      "status": "programado"
    }
  ]
}
GET /api/v1/messages

Devuelve tus mensajes, del más reciente al más antiguo, en páginas de 50.

Parámetros de consulta

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

Respuesta 200 OK

{
  "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
}
GET /api/v1/messages/{msg_id}

Consulta un mensaje por su msg_id (el UUID que devolvió la creación, no un id numérico).

Respuesta 200 OK — el objeto mensaje

{
  "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_idIdentificador público del mensaje (UUID).
nombreReferencia que enviaste, o null.
numeroNúmero de destino.
mensajeTexto del SMS.
statusEstado actual (ver ciclo de vida).
status_labelEl mismo estado, legible para mostrar al usuario.
fecha_envioAAAA-MM-DD o null.
hora_envioHH:MM:SS o null.
sent_atMomento del envío confirmado, o null si aún no salió.
errorMotivo del fallo cuando status es error; si no, null.
DELETE /api/v1/messages/{msg_id}

Cancela un mensaje que todavía no ha salido. No borra el registro: lo pasa al estado cancelado.

Respuesta 200 OK

{
  "message": "Mensaje cancelado",
  "status": "cancelado"
}

Respuesta 422 — ya no se puede

{
  "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.

Programación de envíos

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.

Longitud del mensaje y segmentos

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ódigos de error

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.

Error de validación (422)

{
  "message": "The numero field is required.",
  "errors": {
    "numero": ["The numero field is required."]
  }
}

No encontrado (404)

{
  "error": "Mensaje no encontrado"
}

Ejemplos de integración

El mismo envío, en tres lenguajes.

curl -X POST https://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"
  }'

¿Todo listo?

Crea tu token y envía tu primer mensaje.