Librería Node.js para el envío SMS
La Librería Node.js de la API SMS está diseñada para técnicos y clientes que quieran conectar sus aplicaciones con la plataforma de mensajería SMS de LabsMobile.
Las funcionalidades de esta librería son:
- El envío de mensajes SMS de forma individual o masivo en tiempo real
- Envío programado de mensajes SMS
- Envío de mensajes SMS Unicode, SMS Concatenados y SMS Certificados
- Consulta de saldo de créditos de una cuenta
- Consulta de precios por país
- Consulta HLR de estado y disponibilidad de un número móvil
Esta documentación explica detalladamente el proceso de integración y automatización de estas funcionalidades.
Requisitos
- Una versión compatible de Node.js. Esta librería es compatible con Node.js v16.19.0 y versiones superiores.
- Instalar npm compatible con la versión Node.js instalada.
- Instalar esta librería
labsmobile-sms
vía npm. - Una cuenta de LabsMobile asociada con un nombre de usuario (correo electrónico de registro). Crea una cuenta aquí.
- Token API utilizado como contraseña y generado desde la sección Configuración API de tu cuenta.
- Validación de esta documentación. Más información en la Documentación API SMS HTTP/POST
A tener en cuenta
Para obtener más detalles sobre la librería Node.js, consulta el repositorio oficial en Github.
Autenticación
El método de autenticación utilizado es Auth Basic HTTP a través de unas credenciales (username
de la cuenta y un tokenapi
) que se incluyen en la configuración e inicialización de la librería.
Antes de llamar a cualquier función de esta librería es necesario inicializar las credenciales como se muestra en los ejemplos de código.
Recomendación Se pueden generar tokens API desde la Configuración API de la cuenta. Recomendamos cambiar el token frecuentemente y utilizar diferentes tokens para cada uso, conexión o integración.
Configuración y filtros
A continuación se detallan variables de configuración y aspectos de seguridad importantes en una integración con la API de envío SMS http/GET:
- Dirección IP desde donde se enviarán los mensajes. Si se activa esta opción, sólo se admitirán peticiones de la lista de dirección IPs introducida. Esta funcionalidad es opcional, por defecto se aceptarán mensajes de cualquier IP.
- Remitente por defecto (por defecto
LABSMOBILE
). Sólo algunos operadores permiten la asignación dinámica y con valor alfanumérico del campo remitente. - Límite de mensajes diario, por defecto 100.000 sms/día.
- Límite de mensajes por batch, por defecto 10.000 sms/petición.
- Filtro por países, para que sólo se procesen mensajes de una lista de países.
- Filtro anti-duplicados, para evitar enviar mensajes iguales a un mismo destinatario.
Todos estos parámetros se pueden activar y modificar en la Configuración API y Preferencias de la cuenta.
Importante Se establece un máximo de 10 peticiones por segundo. Malos usos, abusos o un mayor volumen de peticiones provocarán un bloqueo temporal o permanente de la cuenta y/o dirección IP.
Recomendación Recomendamos activar las Recargas automáticas para que siempre existan créditos disponibles en la cuenta y no se interrumpa el servicio de envío SMS.
Instalación de composer y la librería SMS de LabsMobile
Para instalar npm es necesario seguir las indicaciones según el sistema operativo.
- Instalación de npm. Más información en docs.npmjs.com
La librería PHP de LabsMobile se puede instalar de dos formas:
- Utilizar la siguiente instrucción desde la línea de comandos, estando dentro del directorio del proyecto
npm i labsmobile-sms
- Crear un archivo denominado package.json. En dicho archivo, incluir:
"dependencies": { "labsmobile-sms": "1.0.1" }
Es indispensable importar las clases necesarias del espacio de nombres labsmobile-sms. Estas clases proporcionan las funciones y clases para interactuar con la API de LabsMobile.
Se deben indicar las credenciales de autenticación en las variables username
y token
al inicializar la clase LabsMobileClient
.
Envío de mensajes SMS
Función para el envío básico y múltiple de mensajes SMS.
FUNCIÓN
sendSMS(
Para realizar un envío de mensajes SMS se deben seguir estos pasos:
- Inicializar la clase
LabsMobileModelTextMessage
con los parámetros obligatorios (los números de destino y el texto del mensaje). - Incluir los parámetros opciones como la programación, modo simulado, etc.
- Finalmente llamar a la función
sendSMS()
para realizar el envío efectivo. - Por último se recomienda examinar el resultado de la petición.
- Ampliar todo
PARÁMETROS
A continuación se describen todos los parámetros posibles en el envío SMS.
numbers string | array obligatorio
Números de teléfono de los destinatarios a los que se envía el mensaje. Los números deben cumplir el formato internacional E.164 y separados por comas (",") si se incluyen más de un número de destino.
Ejemplo:
LabsMobileModelTextMessage("34609362742", message)
message string obligatorio
Texto del mensaje a enviar. Si se envían SMS estándar sólo son válidos los caracteres del alfabeto GSM 3.38 7bit . Se pueden enviar también SMS Concatenados y SMS Unicode con los correspondientes parámetros.
Ejemplo:
LabsMobileModelTextMessage(
numbers, "Hello world, this is my first message"). scheduled YYYY-MM-DD HH:MM:SS
Programación del envío para el día y hora indicados. Si no se especifica este campo, se enviará el mensaje de forma inmediata. Formato:
YYYY-MM-DD HH:MM:SS
.Importante: El valor de este campo se debe expresar en el uso horario GMT.
Ejemplo:
bodySms.scheduled = "2024-04-12 10:00:00"
tpoa string
Campo remitente del mensaje SMS. Puede tener un valor numérico (longitud máxima 16 dígitos) o alfanumérico (capacidad máxima 11 caracteres).
La asignación y personalización del remitente sólo está disponible en algunos países y operadores. En caso contrario, el remitente será un valor numérico (shortcode o longcode) estático.
Ejemplo:
bodySms.tpoa = "MyBrand"
subid string
Identificador de la petición. Longitud máxima de 20 caracteres.
Si no se incluye un valor en el parámetro
subid
, la plataforma asignará un identificador único de 13 caracteres que se mostrará en el resultado de la petición.Ejemplo:
bodySms.subid = "5aa3ea8028ce5"
label string
Campo de información libre para identificar y asignar atributos. Longitud máxima de 255 caracteres.
Posibles usos: usuario, aplicación, agrupación o campaña, etc.
Ejemplo:
bodySms.label = "A05-enero-2024"
test 0 | 1
Activación del modo simulado de envío para pruebas y monitorización.
Si se asigna un valor
1
a este parámetro, los mensajes no se enviarán a los destinatarios y no se descontará ningún crédito. Los mensajes enviados en modo simulado se podrán consultar en el Histórico y otras herramientas.Ejemplo:
bodySms.test = 1
ackurl url
Url a la que se enviarán las notificaciones de confirmación de entrega y error de los mensajes enviados.
Se puede establecer una URL por defecto en la Configuración API de la cuenta y en ese caso no es necesario incluir este parámetro.
Ejemplo:
bodySms.ackurl = "https://clientserver.com/receive_ack"
clickurl url
Url a la que se enviarán las notificaciones de eventos de click en los enlaces de los mensajes enviados.
Se puede establecer una URL por defecto en la Configuración API de la cuenta y en ese caso no es necesario incluir este parámetro.
Ejemplo:
bodySms.clickurl = "https://clientserver.com/receive_click"
shortlink 0 | 1
Activación del reemplazo automático de enlaces.
Si su valor es
1
se reemplazarán todas las Urls del mensaje con un link corto (formato:labsmo.bi/XXXXXXX
o dominio personalizado).Se puede activar esta prestación de forma permanente para todos los mensajes en las Preferencias de la cuenta y en ese caso no es necesario incluir este parámetro.
Ejemplo:
bodySms.shortlink = 1
long 0 | 1
Activación de los SMS Concatenados en esta petición.
Si este campo tiene valor
1
el mensaje puede contener más de 160 caracteres. Más información sobre Cómo calcular el precio de un SMS.Ejemplo:
bodySms.long = 1
ucs2 0 | 1
Activación de los SMS Unicode en esta petición.
Si este campo tiene valor
1
el mensaje puede contener cualquier carácter, símbolo o emoji. La capacidad se reduce a 70 caracteres y se pueden enviar SMS concatenados y unicode. Más información sobre Cómo calcular el precio de un SMS.Ejemplo:
bodySms.ucs2 = 1
crt email
Envío de un SMS Certificado en esta petición.
Se enviará a la dirección que contenga este parámetro un e-mail con el documento PDF de certificación.
Ejemplo:
bodySms.crt = "info@client.es"
crt_name string
Nombre de la entidad o compañía que envía el SMS certificado. Sólo tiene efecto si se envía conjuntamente con el parámetro
crt
.Ejemplo:
bodySms.crtName = "My Company SL"
crt_id string
Identificador fiscal de la entidad o compañía que envía el SMS certificado. Sólo tiene efecto si se envía conjuntamente con el parámetro
crt
.Ejemplo:
bodySms.crtId = "ESB65213332"
nofilter 0 | 1
Si este campo tiene valor
1
no se aplicará el filtro de mensajes duplicados.Se puede activar o desactivar esta prestación de forma permanente para todos los mensajes en las Preferencias de la cuenta y en ese caso no es necesario incluir este parámetro.
Ejemplo:
bodySms.nofilter = 1
RESULTADO
El resultado se obtiene en formato
JSON
con los siguientes elementos:code integer
Código identificador que indica si se ha podido procesar la petición de forma exitosa o si se ha producido un error. Posibles valores en la el apartado Errores.
Ejemplo:
"code": "0"
message string
Descripción que indica si se ha podido procesar la petición de forma exitosa o si se ha producido un error. Posibles valores en la el apartado Errores.
Ejemplo:
"message": "Message has been success
fully sent." subid string
Identificador de la petición API.
Ejemplo:
"subid": "6615686480e47"
Envío básico a un único destinatarioconst LabsMobileClient = require("labsmobile-sms/src/LabsMobileClient"); const LabsMobileModelTextMessage = require("labsmobile-sms/src/LabsMobileModelTextMessage"); const ParametersException = require("labsmobile-sms/src/Exception/ParametersException"); const RestException = require("labsmobile-sms/src/Exception/RestException"); async function sendSmsTest() { try { const username = "myusername"; const token = "mytoken"; const message = "Your verification code is 123"; const phone = ["12015550123"]; const clientLabsMobile = new LabsMobileClient(username, token); const bodySms = new LabsMobileModelTextMessage(phone, message); bodySms.scheduled = "2024-12-02 09:00:00"; bodySms.long = 1; const response = await clientLabsMobile.sendSms(bodySms); console.log(response); } catch (error) { if (error instanceof ParametersException) { console.log(error.message); } else if (error instanceof RestException) { console.log(`Error: ${error.status} - ${error.message}`); } else { throw new Error("Error: " + error); } } } sendSmsTest()
Envío masivo a múltiples destinatariosconst LabsMobileClient = require("labsmobile-sms/src/LabsMobileClient"); const LabsMobileModelTextMessage = require("labsmobile-sms/src/LabsMobileModelTextMessage"); const ParametersException = require("labsmobile-sms/src/Exception/ParametersException"); const RestException = require("labsmobile-sms/src/Exception/RestException"); async function sendSmsTest() { try { const username = "myusername"; const token = "mytoken"; const message = "Don't miss our Sale! Use code XXXX123 for 20% off."; const phone = ["12015550123","12015550124","12015550125"]; const clientLabsMobile = new LabsMobileClient(username, token); const bodySms = new LabsMobileModelTextMessage(phone, message); bodySms.scheduled = "2024-12-02 09:00:00"; bodySms.ucs2 = 1; bodySms.long = 1; const response = await clientLabsMobile.sendSms(bodySms); console.log(response); } catch (error) { if (error instanceof ParametersException) { console.log(error.message); } else if (error instanceof RestException) { console.log(`Error: ${error.status} - ${error.message}`); } else { throw new Error("Error: " + error); } } } sendSmsTest()
Resultado positivo{ "subid": "65f33a88ceb3d", "code": "0", "message": "Message has been successfully sent." }
Resultado erróneo{ "subid": "65f7f7041385d", "code": "35", "message": "The account has no enough credit for this sending" }
Consulta de saldo
Función para obtener el saldo de créditos disponibles de una cuenta.
FUNCIÓN
getCredit()
Esta función no tiene parámetros y devuelve el siguiente resultado.
RESULTADO
El resultado de cualquier petición se obtiene en formato
JSON
con los siguientes elementos:code integer
Código identificador que indica si se ha podido procesar la petición de forma exitosa o si se ha producido un error. Posibles valores en la el apartado Errores.
Ejemplo:
"code": "0"
message string
Descripción del error en la petición. Si la petición se ha procesado correctamente este campo no aparece.
Ejemplo:
"message": "Unauthorized"
credits float
Número de créditos disponibles en el saldo de la cuenta.
Ejemplo:
"credits": "1023.10"
const LabsMobileClient = require("labsmobile-sms/src/LabsMobileClient"); const ParametersException = require("labsmobile-sms/src/Exception/ParametersException"); const RestException = require("labsmobile-sms/src/Exception/RestException"); async function getCreditTest() { try { const username = "myusername"; const token = "mytoken"; const clientLabsMobile = new LabsMobileClient(username, token); const response = await clientLabsMobile.getCredit(); console.log(response); } catch (error) { if (error instanceof ParametersException) { console.log(error.message); } else if (error instanceof RestException) { console.log(`Error: ${error.status} - ${error.message}`); } else { throw new Error("Error: " + error); } } } getCreditTest()
{"code":0,"credits":"10"}
Gestión de envíos programados
Función para cancelar o enviar mensajes programados.
Para indicar los parámetros se debe inicializar la clase LabsMobileModelScheduledSendings()
con los siguientes parámetros y posteriormente llamar a la función scheduledSendings()
.
FUNCIÓN
scheduledSendings(new
PARÁMETROS
subid string obligatorio
Identificador de la solicitud de envío programado. Si este parámetro tiene como valor
*
afectará a todos los envíos programados pendientes de la cuenta.Ejemplo:
scheduledSendings(
"5aa3ea8e5cdb6", cmd) cmd string obligatorio
Comando a ejecutar. Valores posibles:
cancel
send
, para eliminar o ejecutar en ese momento los envíos programados seleccionados.Ejemplo:
scheduledSendings(
subid, "send") RESULTADO
El resultado se obtiene en formato
JSON
con los siguientes elementos:code integer
Código identificador que indica si se ha podido procesar la petición de forma exitosa o si se ha producido un error. Posibles valores en la el apartado Errores.
Ejemplo:
"code": "0"
message string
Descripción que indica si se ha podido procesar la petición de forma exitosa o si se ha producido un error. Posibles valores en la el apartado Errores.
Ejemplo:
"message": "Scheduled messages success
fully cancelled."
const LabsMobileClient = require("labsmobile-sms/src/LabsMobileClient"); const LabsMobileModelScheduledSendings = require("labsmobile-sms/src/LabsMobileModelScheduledSendings"); const ParametersException = require("labsmobile-sms/src/Exception/ParametersException"); const RestException = require("labsmobile-sms/src/Exception/RestException"); async function scheduledSendingsTest() { try { const username = "myusername"; const token = "mytoken"; const subid = "mysubid"; const cmd = "XXXXXX"; // send or cancel const clientLabsMobile = new LabsMobileClient(username, token); const scheduledSendings = new LabsMobileModelScheduledSendings(subid, cmd); const response = await clientLabsMobile.scheduledSendings( scheduledSendings ); console.log(response); } catch (error) { if (error instanceof ParametersException) { console.log(error.message); } else if (error instanceof RestException) { console.log(`Error: ${error.status} - ${error.message}`); } else { throw new Error("Error: " + error); } } } scheduledSendingsTest()
{ "code": 0, "message": "Scheduled messages successfully sent." }
{ "code": 0, "message": "Scheduled messages successfully cancelled." }
{ "code": 52, "message": "Scheduled messages not found." }
Consulta de precios
Función para consultar los precios de un SMS estándar en créditos de cada país.
Para indicar los parámetros se debe inicializar la clase LabsMobileModelCountryPrice()
con los siguientes parámetros y posteriormente llamar a la función getpricesCountry()
.
FUNCIÓN
getpricesCountry(new
PARÁMETROS
countries array
Lista de países de los para los que se quiere obtener la tarifa actualizada en créditos y otros detalles. Formato: códigos ISO de los países. Si este campo no se envía o es nulo, se devuelve la información de todos los países.
Ejemplo:
getpricesCountry(["ES","FR",
"US","MX"]) - Ampliar todo
RESULTADO
El resultado se obtiene en formato
JSON
con los siguientes elementos: isocode float
Código ISO que identifica al país.
Ejemplo:
"isocode": "FR"
prefix float
Prefijo telefónico del país.
Ejemplo:
"prefix": "33"
name float
Nombre descriptivo del país en inglés.
Ejemplo:
"name": "France"
credits float
Número de créditos disponibles en el saldo de la cuenta.
Ejemplo:
"credits": 0.89
code integer
Código identificador que indica el error producido. Posibles valores en la el apartado Errores. Si la petición se ha procesado correctamente este campo no aparece.
Ejemplo:
"code": "401"
message string
Descripción del error en la petición. Si la petición se ha procesado correctamente este campo no aparece.
Ejemplo:
"message": "Unauthorized"
const LabsMobileClient = require("labsmobile-sms/src/LabsMobileClient"); const LabsMobileModelCountryPrice = require("labsmobile-sms/src/LabsMobileModelCountryPrice"); const ParametersException = require("labsmobile-sms/src/Exception/ParametersException"); const RestException = require("labsmobile-sms/src/Exception/RestException"); async function getpricesCountryTest() { try { const username = "myusername"; const token = "mytoken"; const countries = ["CO", "ES"]; const clientLabsMobile = new LabsMobileClient(username, token); const countriesPrice = new LabsMobileModelCountryPrice(countries); const response = await clientLabsMobile.getpricesCountry(countriesPrice); console.log(response); } catch (error) { if (error instanceof ParametersException) { console.log(error.message); } else if (error instanceof RestException) { console.log(`Error: ${error.status} - ${error.message}`); } else { throw new Error("Error: " + error); } } } getpricesCountryTest()
{ "CO": { "isocode": "CO", "prefix": "57", "name": "Colombia", "credits": 0.043 }, "ES": { "isocode": "ES", "prefix": "34", "name": "Spain", "credits": 1 } }
Consulta HLR Lookup
Función para consultar el estado y disponibilidad de uno o varios números móviles.
Para indicar los parámetros se debe inicializar la clase LabsMobileModelHlrRequest()
con los números a consultar y posteriormente llamar a la función hlrRequest()
.
FUNCIÓN
hlrRequest(new
PARÁMETROS
numbers string | list obligatorio
Números móviles que se incluirán en la solicitud de HLR. Los números se deben incluir en formato internacional E.164 con el código de país y sin "+" ó "00". Puede contener un único número o una lista de números separados por comas con un máximo de 100 números.
Ejemplo:
LabsMobileModelHlrRequest(
array( "573058156414", "528130939475" ,"51918213400")) - Ampliar todo
RESULTADO
El resultado de cualquier petición HLR se obtiene en formato
JSON
con los valores que se detallan a continuación: result string
Resultado satisfactorio o erróneo de la solicitud. Valores:
ok
ko
numbers array
Información resultante por número incluido en la petición. El formato y datos obtenido se detallan en RESULTADO POR NÚMERO.
error string
Descripción en caso de error. Sin valor en caso de que la solicitud se realice correctamente. Valores:
requiredfields
internalerror
numberslimit
nocredits
invalidauth
count integer
Número de peticiones procesadas.
credits float
Número de créditos que se han consumido por todas las comprobaciones de la petición HLR.
- Ampliar todo
RESULTADO POR NÚMERO
msisdn string
Número móvil en formato internacional E.164 sin "+" ni "00".
status string
Indica la disponibilidad del número.
Valores del estado de un númeroactive
Disponible y activo recientemente. absent
Válido pero sin conexión a la red reciente. not_active
Incorrecto o sin suscripción activa. not_mobile
El formato no corresponde a un número móvil. unknown
Estado incorrecto o sin información. Normalmente, indica una incidencia temporal. format string
Indica si se trata de un número con un formato válido. Valores:
valid
error
type string
Tipo de número telefónico. Valores:
mobile
fixed
fixedormobile
tollfree
premium
shared
voip
personal
pager
uan
voicemail
unknown
country_name string
Nombre del país al que pertenece el número.
country_code string
Prefijo telefónico del país al que pertenece el número.
country_iso string
Código ISO del país al que pertenece el número.
network string
Nombre de la red actual del operador. En el caso de que el estado sea diferente a
active
se devuelve la red correspondiente al prefijo o formato del número.mcc string
Código MCC (Mobile Country Code) del país según la codificación E.212 ITU-T .
mnc string
Código MNC (Mobile Network Code) de red u operador móvil según la codificación E.212 ITU-T . En el caso de que el estado sea diferente a
active
se devuelve código de la red correspondiente al prefijo o formato del número.
const LabsMobileClient = require("labsmobile-sms/src/LabsMobileClient"); const LabsMobileModelHlrRequest = require("labsmobile-sms/src/LabsMobileModelHlrRequest"); const ParametersException = require("labsmobile-sms/src/Exception/ParametersException"); const RestException = require("labsmobile-sms/src/Exception/RestException"); async function hlrRequestTest() { try { const username = "myusername"; const token = "mytoken"; const numbers = []; const clientLabsMobile = new LabsMobileClient(username, token); const hlr = new LabsMobileModelHlrRequest(numbers); const response = await clientLabsMobile.hlrRequest(hlr); console.log(response); } catch (error) { if (error instanceof ParametersException) { console.log(error.message); } else if (error instanceof RestException) { console.log(`Error: ${error.status} - ${error.message}`); } else { throw new Error("Error: " + error); } } } hlrRequestTest()
{ "result":"ok", "error":"", "numbers":[ { "msisdn":"573051155514", "status":"active", "country_name":"Colombia", "country_code":"57", "country_iso":"CO", "network":"Colombia Movil SA(TIGO)", "mcc":"732", "mnc":"103", "format":"valid", "type":"mobile" }], "count":1, "credits":0.1 }
Errores
A continuación se describen los códigos de error HTTP que puede devolver una petición.
Código HTTP | Descripción |
---|---|
200 OK | Petición procesada correctamente. |
400 Bad Request | Error en los parámetros de la petición. Se detalla y especifica el error en el código devuelto en el formato JSON. |
401 Unauthorized | Error en las credenciales o método de autenticación. |
402 Payment Required | Error por falta de créditos en la cuenta. |
403 Forbidden | Petición bloqueada por el filtro IP o por infringir alguna política de uso de la plataforma. |
500 Internal Server Error | Error temporal o incidencia en el servicio |
Esta es la lista completa de códigos de respuesta en el formato JSON:
Código JSON | Descripción |
---|---|
0 | Message has been successfully sent |
10 | Missing XML data in request |
11 | Badly formed XML in request |
20 | The message element must be present in the request |
21 | The message element cannot be empty |
23 | There are no recipients |
24 | Too many recipients |
27 | This message contained one or more invalid character(s) |
28 | Subid is exceeding maximum length |
30 | There was an error while sending the message |
35 | The account has no enough credit for this sending |
39 | The value of the scheduled field is not a valid datetime format |
41 | Scheduled messages cannot be send in test mode |
51 | Compulsary fields not defined. |
52 | Scheduled messages not found. |
Recursos de soporte
Recomendamos consultes y tengas en cuenta los siguientes recursos de soporte en tu integración:
- Guía técnica de un proceso de validación o autenticación OTP por SMS
- Todas las versiones y funcionalidades de la API de LabsMobile
- Tutorial primeros pasos de una integración API
- Crea una cuenta de prueba
- Recomendaciones y buenas prácticas en cualquier integración
- Plugins, módulos y extensiones
- ¿Necesitas ayuda? Contacta con nuestros técnicos