Saltearse al contenido

Enviar SMS a Contactos Específicos

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.

  • 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.
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
}
CampoTipoRequeridoDescripción
messagestringContenido del mensaje SMS
contactsstring[]Lista de números telefónicos
typeMessageTypeNoTipo de mensaje (por defecto SMS)
countrystringNoCódigo de país ISO 3166-1 alpha-2
{
"message": "Hola, este es un mensaje de prueba desde SendMe",
"contacts": ["3001234567", "3009876543"],
"type": "SMS",
"country": "CO"
}

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
}>;
}
{
"queueId": "sms-queue-12345",
"channel": "sms",
"messages": [
{
"id": "msg-uuid-1",
"recipient": "+573001234567"
},
{
"id": "msg-uuid-2",
"recipient": "+573009876543"
}
]
}

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": []
}
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;
}
// Uso
const 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}`);
  • 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 queueId retornado 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.