Enviar SMS a Contactos Específicos
POST /api/messages/sms/contacts
Sección titulada « /api/messages/sms/contacts»Envía mensajes SMS a una lista específica de números de teléfono. La operación es asíncrona: la API registra cada mensaje en la persistencia, programa la entrega en BullMQ y retorna un resumen del encolado.
Autenticación
Sección titulada «Autenticación»- Incluye el token bearer en
Authorization: Bearer <token>. - Solo los miembros que han aceptado los términos actuales pueden activar acciones de mensajería; de lo contrario, el servicio retorna
403 Forbidden.
Cuerpo de la petición
Sección titulada «Cuerpo de la petición»interface SmsContactsMessagePayload { message: string; // Cuerpo del texto, mantén bajo el límite de caracteres del proveedor contacts: string[]; // Lista de números telefónicos (E.164 recomendado) type?: MessageType; // Por defecto MessageType.SMS cuando se omite country?: string; // Código ISO 3166-1 alpha-2 opcional para normalización de números}| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
message | string | Sí | Contenido del mensaje SMS |
contacts | string[] | Sí | Lista de números telefónicos |
type | MessageType | No | Tipo de mensaje (por defecto SMS) |
country | string | No | Código de país ISO 3166-1 alpha-2 |
Ejemplo del cuerpo
Sección titulada «Ejemplo del cuerpo»{ "message": "Hola, este es un mensaje de prueba desde SendMe", "contacts": ["3001234567", "3009876543"], "type": "SMS", "country": "CO"}Respuesta
Sección titulada «Respuesta»La API responde con el contrato compartido MessageEnqueueResultDto:
interface MessageEnqueueResultDto { queueId: string; // Identificador del job de BullMQ, vacío cuando no se encoló nada channel: 'sms'; messages: Array<{ id: string; // UUID del mensaje persistido recipient: string; // Número telefónico normalizado por el backend }>;}Respuesta exitosa (201 Created)
Sección titulada «Respuesta exitosa (201 Created)»{ "queueId": "sms-queue-12345", "channel": "sms", "messages": [ { "id": "msg-uuid-1", "recipient": "+573001234567" }, { "id": "msg-uuid-2", "recipient": "+573009876543" } ]}Sin destinatarios válidos (200 OK)
Sección titulada «Sin destinatarios válidos (200 OK)»Cuando la petición no resuelve destinatarios válidos, el servicio responde con 200 OK, un queueId vacío y un array de messages vacío.
{ "queueId": "", "channel": "sms", "messages": []}Ejemplos de uso
Sección titulada «Ejemplos de uso»async function sendSmsToContacts(token: string, payload: SmsContactsMessagePayload) { const response = await fetch('/api/messages/sms/contacts', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify(payload), });
if (!response.ok) { throw new Error(`SMS enqueue failed: ${response.status}`); }
const data: MessageEnqueueResultDto = await response.json(); return data;}
// Usoconst result = await sendSmsToContacts('your-token', { message: '¡Bienvenido a SendMe! Tu cuenta ha sido activada.', contacts: ['3001234567', '3007654321'], country: 'CO'});
console.log(`SMS encolados: ${result.messages.length}`);console.log(`Queue ID: ${result.queueId}`);import axios from 'axios';
async function sendSmsToContacts(token: string, payload: SmsContactsMessagePayload) { const { data } = await axios.post<MessageEnqueueResultDto>( '/api/messages/sms/contacts', payload, { headers: { Authorization: `Bearer ${token}`, }, }, );
return data;}
// Usoconst result = await sendSmsToContacts('your-token', { message: 'Su código de verificación es: 123456', contacts: ['3001234567'], type: 'OTP'});curl -X POST "/api/messages/sms/contacts" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN" \ -d '{ "message": "Hola, este es un mensaje desde SendMe", "contacts": ["3001234567", "3009876543"], "country": "CO" }'Notas operacionales
Sección titulada «Notas operacionales»- El backend elimina destinatarios duplicados por lote y omite silenciosamente destinos inválidos.
- La validación del saldo se ejecuta antes del encolado; créditos insuficientes retornan una respuesta de error sin encolar mensajes.
- Usa el
queueIdretornado para correlacionar el estado de entrega dentro de la UI de administración o vía endpoints de estado dedicados. - Cada mensaje persiste metadatos del proveedor y puede ser auditado a través de los filtros del módulo de mensajería.