BroadNet
Guía del desarrollador · API REST·OpenAPI 3.1

La API BroadNet.

Una única API REST para SMS, WhatsApp, RCS, Telegram, correo electrónico, Messenger, Instagram y notificaciones push. Cada solicitud se envía mediante HTTPS y se autentica con un token Bearer. Cada canal tiene su propio conjunto de rutas, y la API completa se describe en una especificación OpenAPI 3.1 descargable. Esta página cubre las llamadas con las que suelen comenzar la mayoría de las integraciones, empezando por un solo SMS.

Lectura de 12 minutos·Actualizado en septiembre de 2026.Centro de desarrolladores

Descripción general

La API BroadNet es una API REST sobre HTTPS. Te autenticas con un token Bearer, envías una solicitud JSON o multipart a un punto final de canal y recibes un ID de mensaje o un resumen del lote. El estado de entrega se envía a la URL del webhook configurada en tu cuenta. La API completa, con 329 rutas y 376 operaciones en ocho canales, se publica como una especificación OpenAPI 3.1. Los ejemplos de esta página utilizan curl, Node.js, Python, Java, C#, Go, Ruby y el SDK oficial TypeScript.

Entornos

Los ejemplos de esta página llaman a la URL base de producción. Las credenciales de prueba, y adónde enviar el tráfico de prueba, llegan con su acceso de prueba: solicítelo en /signup y le respondemos en un día hábil.

AmbienteURL base
Producciónhttps://api.broadnet.me

Autenticación

Cada solicitud incluye tu token de acceso en una cabecera HTTP. El token se emite por cuenta y proviene de tu cuenta BroadNet. Los ejemplos de esta página lo leen desde una variable de entorno llamada BROADNET_TOKEN.

HTTP
Authorization: Bearer $BROADNET_TOKEN

Si el token no existe o es inválido, la API responde con HTTP 401 y un cuerpo de error JSON en el formato de error estándar que se describe a continuación. No se realiza ninguna llamada que intercambie un nombre de usuario y una contraseña por un token.

Enviar un SMS

Envía un SMS con un cuerpo JSON. Los cuatro campos obligatorios son el remitente, el destinatario, el texto y la codificación.

POSThttps://api.broadnet.me/sms/sendSms

Campos obligatorios

CampoTipo de datosDescripción
senderIdstringTu ID de remitente aprobado, que se muestra al destinatario como remitente.
destinationNumberstringNúmero del destinatario con código de país, solo dígitos, sin signo más.
messagestringEl texto del mensaje.
messageTypestringCodificación: TEXTO para texto GSM-7, UNICODE para árabe, emojis y otros alfabetos.

Campos opcionales

CampoTipo de datosDescripción
charCountintegerRecuento de caracteres, tal como lo devuelve /sms/identify.
smsPartsintegerNúmero de segmentos, tal como lo devuelve /sms/identify.
charLimitintegerCaracteres por segmento, tal como los devuelve /sms/identify.
expiryHourintegerPeriodo de validez en horas.
isSchedulebooleanEstablezca este valor en verdadero para programar el mensaje en lugar de enviarlo ahora.
delaynumberRetraso antes de enviar.
gmtstringSe utiliza la diferencia horaria con respecto a GMT para la programación.
time—Hora de envío programada (con isSchedule).
repeat—Repita la configuración para los envíos programados.
peIdstringIdentificador de la entidad principal, cuando así lo requiera el organismo regulador.
templateIdstringIdentificador de plantilla registrada, cuando así lo exija el organismo regulador.
telemarketerIdstringIdentificación del teleoperador, cuando así lo exija el organismo regulador.
campaignNamestringSu etiqueta para reportar.
curl
curl -X POST https://api.broadnet.me/sms/sendSms \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "senderId": "BroadNet",
    "destinationNumber": "447700900123",
    "message": "Your verification code is 482913",
    "messageType": "TEXT"
  }'

# 200 OK → response body is the message ID, e.g. 2603121407537573731
Node.js 18+ · fetch
// Node.js 18+ (fetch)
const res = await fetch("https://api.broadnet.me/sms/sendSms", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BROADNET_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    senderId: "BroadNet",
    destinationNumber: "447700900123",
    message: "Your verification code is 482913",
    messageType: "TEXT",
  }),
});

console.log(await res.text()); // message ID
Python · requests
import os, requests

r = requests.post(
    "https://api.broadnet.me/sms/sendSms",
    headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
    json={
        "senderId": "BroadNet",
        "destinationNumber": "447700900123",
        "message": "Your verification code is 482913",
        "messageType": "TEXT",
    },
)

print(r.status_code, r.text)  # message ID
Java 11+ · java.net.http
// Java 11+ — java.net.http is built in, nothing to install
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class SendSms {
    public static void main(String[] args) throws Exception {
        String json = "{"
            + "\"senderId\": \"BroadNet\", "
            + "\"destinationNumber\": \"447700900123\", "
            + "\"message\": \"Your verification code is 482913\", "
            + "\"messageType\": \"TEXT\""
            + "}";

        HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.broadnet.me/sms/sendSms"))
            .header("Authorization", "Bearer " + System.getenv("BROADNET_TOKEN"))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(json))
            .build();

        HttpResponse<String> res = HttpClient.newHttpClient()
            .send(req, HttpResponse.BodyHandlers.ofString());

        System.out.println(res.statusCode() + " " + res.body()); // 200 + message ID
    }
}
C# · .NET 6+ HttpClient
// .NET 6+ console app (Program.cs) — HttpClient is built in, no NuGet package
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("BROADNET_TOKEN"));

// PostAsJsonAsync sends Content-Type: application/json
var res = await http.PostAsJsonAsync("https://api.broadnet.me/sms/sendSms", new
{
    senderId = "BroadNet",
    destinationNumber = "447700900123",
    message = "Your verification code is 482913",
    messageType = "TEXT",
});

var id = await res.Content.ReadAsStringAsync();
Console.WriteLine($"{(int)res.StatusCode} {id}"); // 200 + message ID
Go · net/http
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	body := []byte(`{
		"senderId": "BroadNet",
		"destinationNumber": "447700900123",
		"message": "Your verification code is 482913",
		"messageType": "TEXT"
	}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.broadnet.me/sms/sendSms", bytes.NewReader(body))
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("BROADNET_TOKEN"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	id, _ := io.ReadAll(res.Body)
	fmt.Println(res.StatusCode, string(id)) // 200 + message ID
}
Ruby · Net::HTTP
require "net/http"
require "json"

uri = URI("https://api.broadnet.me/sms/sendSms")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch('BROADNET_TOKEN')}"
req["Content-Type"]  = "application/json"
req.body = {
  senderId:          "BroadNet",
  destinationNumber: "447700900123",
  message:           "Your verification code is 482913",
  messageType:       "TEXT"
}.to_json

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
puts "#{res.code} #{res.body}" # 200 + message ID
TypeScript SDK · @broadnet/cpaas-sdk
// npm install @broadnet/cpaas-sdk axios
import { Configuration, SMSSMSApi } from "@broadnet/cpaas-sdk";

const sms = new SMSSMSApi(
  new Configuration({
    basePath: "https://api.broadnet.me",
    accessToken: process.env.BROADNET_TOKEN!,
  }),
);

const res = await sms.smsSendsmsPost({
  sMSSmsRequest: {
    senderId: "BroadNet",
    destinationNumber: "447700900123",
    message: "Your verification code is 482913",
    messageType: "TEXT",
  },
});

console.log(res.data); // message ID

Una llamada exitosa devuelve HTTP 200 y el ID del mensaje como cuerpo de la respuesta, sin sobre JSON :

200 OK
HTTP/1.1 200 OK

2603121407537573731

Codificación y segmentos

El campo messageType define la codificación, y esta, a su vez, determina cuántos caracteres caben en un segmento de SMS. Los mensajes más largos se dividen en segmentos y se vuelven a ensamblar en el terminal.

messageTypeMensaje únicoPor segmento (mensaje largo)Uso para
TEXT160153Solo caracteres GSM-7.
UNICODE7067Cualquier otro alfabeto: árabe, cirílico, emoji, caracteres acentuados fuera del GSM-7.

¿No sabes qué codificación usar? Consulta la API. El endpoint `identify` analiza un mensaje y devuelve su codificación, el número de caracteres, el número de segmentos y los caracteres por segmento, datos que puedes pasar directamente a la solicitud de envío.

curl · /sms/identify
curl -X POST https://api.broadnet.me/sms/identify \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "message": "Your verification code is 482913" }'
200 OK
{
  "message": "Your verification code is 482913",
  "messageType": "TEXT",
  "smscount": 1,
  "charCount": 32,
  "charLimit": 160
}

Inténtalo sin escribir código en el contador de caracteres SMS.

formatos de números de teléfono

Los números de destino constan del código del país seguido del número nacional, solo en dígitos. No añada signo más, prefijo 00, espacios, guiones ni paréntesis.

EjemploResultadoPor qué
447700900123VálidoCódigo de país 44 más el número nacional, solo dígitos.
+44 7700 900123RechazarContiene un signo más y espacios. Elimínalos primero.
07700900123RechazarFormato nacional con un cero inicial y sin código de país.

SMS masivos

Para enviar un mensaje a varios destinatarios, cargue un archivo de números en una solicitud de formulario multipart. La solicitud consta de dos partes. La primera, destinationNumberFile, es un archivo CSV o TXT con los números. La segunda, bulkRequest, es una cadena JSON con el remitente, el texto, la codificación y el nombre de la campaña.

POSThttps://api.broadnet.me/sms/sendbulk
curl · /sms/sendbulk
curl -X POST https://api.broadnet.me/sms/sendbulk \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -F destinationNumberFile=@recipients.csv \
  -F 'bulkRequest={"senderId":"BroadNet","message":"Your statement is ready","messageType":"TEXT","campaignName":"statements"}'
200 OK
{
  "status": "success",
  "bulkSessionId": "1_20260228105000887",
  "credits": "9966465.42850",
  "deductcredits": "0.60000",
  "bulkListInfo": {
    "total": 4,
    "validCount": 3,
    "invalidCount": 0,
    "duplicate": 1
  }
}

El objeto bulkListInfo indica cuántos números se aceptaron, cuántos no eran válidos y cuántos eran duplicados. Una vez que se está ejecutando un trabajo, puede gestionarlo mediante su ID de lote:

Método HTTPRuta del punto finalDescripción
GET/sms/listEnumera tus trabajos masivos con la cantidad de trabajos procesados y pendientes.
GET/sms/pause?batch_Id=…Pausar un trabajo en ejecución.
GET/sms/resume?batch_Id=…Reanudar un trabajo pausado.
DELETE/sms/abort?batch_Id=…Se cancela una tarea; los mensajes pendientes no se envían.
POST/sms/resendReenviar mensajes de un trabajo anterior.
POST/sms/send-nowLibere una tarea programada de inmediato.
POST/sms/auto-scheduleProgramar un trabajo masivo automáticamente.
curl · batch control
# List your bulk jobs (each entry's id is the batch_Id below)
curl https://api.broadnet.me/sms/list \
  -H "Authorization: Bearer $BROADNET_TOKEN"

# Pause, then resume, a running job
curl "https://api.broadnet.me/sms/pause?batch_Id=1024" \
  -H "Authorization: Bearer $BROADNET_TOKEN"
curl "https://api.broadnet.me/sms/resume?batch_Id=1024" \
  -H "Authorization: Bearer $BROADNET_TOKEN"

Búsqueda de números

Verifique el estado de un número (HLR y MNP) antes de enviarlo, por ejemplo, para limpiar una lista o gestionar números portados. Pase el número como parámetro de consulta destinationNumber. El parámetro opcional reqType selecciona el tipo de búsqueda.

POSThttps://api.broadnet.me/sms/lookup
curl · /sms/lookup
curl -X POST "https://api.broadnet.me/sms/lookup?destinationNumber=447700900123" \
  -H "Authorization: Bearer $BROADNET_TOKEN"

Estado de la entrega

El estado de entrega se envía a la URL del webhook configurada en su cuenta BroadNet a medida que cada mensaje avanza en su ciclo de vida. Los estados de los mensajes siguen este ciclo de vida:

  • SUBMITTED · Aceptado por BroadNet y puesto en cola para la red.
  • SENT · Entregado al operador o canal.
  • DELIVERED · Confirmado en el teléfono.
  • READ · Abierto por el destinatario, en canales que informan lecturas, como WhatsApp.
  • FAILED / REJECTED · No entregado.

También puedes consultar el estado. Para WhatsApp, el punto final bulk-insights devuelve el estado de cada destinatario en un lote. Para los envíos masivos de SMS, el punto final list devuelve el número de mensajes procesados y pendientes.

Errores

Un token Bearer faltante o no válido es rechazado en la pasarela API antes de que la solicitud llegue a la API. La pasarela devuelve HTTP 401 con un cuerpo JSON de dos campos, error y message:

401 Unauthorized
{
  "error": "Unauthorized",
  "message": "Missing Authorization token"
}

Los errores generados por la propia API, como un error de validación 400, devuelven un cuerpo JSON llamado ExceptionResponse, con cinco campos: status, error, message, errorCode y requestUri. Los valores que aparecen a continuación son marcadores de posición.

400 · ExceptionResponse
{
  "status": 400,
  "error": "Bad Request",
  "message": "…",
  "errorCode": "…",
  "requestUri": "/sms/sendSms"
}
EstadoSignificado
200Éxito.
400Solicitud incorrecta: error de validación o falta un campo obligatorio.
401Token Bearer faltante o no válido.
403El token es válido, pero no tiene permiso para llamar a esta operación.
500Error inesperado del servidor. Inténtalo de nuevo más tarde con un tiempo de espera.

Reintentar solo en caso de errores de red y respuestas 5xx, con retroceso exponencial. Corregir errores 4xx en lugar de reintentarlos. Si su cuenta también se vincula a través de SMPP, los envíos allí devuelven códigos de estado SMPP estándar, que se enumeran en el Guía del protocolo SMPP.

Otros canales de mensajería

El mismo token y la misma URL base funcionan para todos los canales. Estos son los puntos finales de envío; la especificación OpenAPI documenta sus campos y los puntos finales de administración relacionados (plantillas, contactos, informes).

Canal de mensajeríaMétodo HTTPRuta del punto finalDescripción
SMSPOST/sms/sendSmsMensaje único (JSON).
SMSPOST/sms/sendbulkProcesamiento masivo desde un archivo (multipartes).
WhatsAppPOST/whatsapp/message/sendbulkTexto, multimedia, plantillas, interactivo (multipartes).
RCSPOST/rcs/message/sendbulkMensajes RCS (multipartes).
TelegramPOST/telegram-sms/sendMensajes de Telegram.
EmailPOST/email/email-service/sendCorreo electrónico con asunto, cuerpo y destinatarios.
MessengerPOST/messenger/message/sendbulkMensajes de Facebook Messenger (de varias partes).
InstagramPOST/instagram/message/sendbulkMensajes de Instagram (varias partes).
PushPOST/push/message/sendNotificaciones push (JSON).

Por ejemplo, una plantilla WhatsApp para enviar:

curl · /whatsapp/message/sendbulk
curl -X POST https://api.broadnet.me/whatsapp/message/sendbulk \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -F batchId=0 \
  -F campaignName=order-updates \
  -F destinationNo=447700900123 \
  -F messageType=TEMPLATE \
  -F templateName=order_update \
  -F templateLanguage=en_US \
  -F bodyTemplateVariables=INV-400

Establezca batchId en 0 para iniciar un nuevo lote. El campo destinationNo acepta varios números separados por comas. La respuesta incluye el ID del lote que se utiliza para consultar el estado de cada destinatario.

SDK TypeScript

BroadNet publica un SDK oficial para TypeScript y Node.js : @broadnet/cpaas-sdk Disponible en npm. Se genera a partir de la especificación BroadNet OpenAPI, incluye módulos CommonJS y ES con definiciones de tipos completas y cuenta con una clase API por cada canal. Su única dependencia de ejecución es axios, que npm instala junto con él.

terminal
npm install @broadnet/cpaas-sdk axios
TypeScript · WhatsApp
import { Configuration, WhatsAppWhatsAppMessagingAPIApi } from "@broadnet/cpaas-sdk";

const wa = new WhatsAppWhatsAppMessagingAPIApi(
  new Configuration({
    basePath: "https://api.broadnet.me",
    accessToken: process.env.BROADNET_TOKEN!,
  }),
);

const res = await wa.whatsappMessageSendbulkPost({
  campaignName: "order-updates",
  messageType: "TEXT",
  destinationNo: "447700900123",
  content: "Your order has shipped.",
});

console.log(res.data); // batchId + per-file acceptance counts

Para cualquier otro idioma, llame directamente a la API REST (los ejemplos de Node.js, Python, Java, C#, Go y Ruby anteriores no utilizan la biblioteca BroadNet) o genere un cliente a partir de la especificación OpenAPI.

Especificación OpenAPI

La API completa se describe en un archivo OpenAPI 3.1: 329 rutas y 376 operaciones en ocho canales. Esta es una copia pública de la especificación, sin ejemplos internos. Puedes importarla a Postman o Insomnia, explorarla en Swagger UI o generar un cliente.

terminal
curl -O https://www.broadnet.me/developers/openapi.yaml

# Generate a client in any language, e.g. Python
npx @openapitools/openapi-generator-cli generate \
  -i openapi.yaml -g python -o broadnet-python

¿Prefieres Postman? Importa la especificación para obtener todas las operaciones, o comienza con una pequeña colección de las llamadas esenciales.

API HTTP heredada (/websmpp)

Las cuentas que se crearon en la plataforma BroadNet de la era SMPP pueden usar la API HTTP heredada en la ruta /websmpp. Esta API se mantiene activa para las integraciones existentes y está documentada en la especificación OpenAPI. Requiere credenciales como parámetros de solicitud (usuario y contraseña o clave de acceso) en lugar de un token Bearer. Las nuevas integraciones deben usar la API REST descrita anteriormente.

Método HTTPRuta del punto finalDescripción
GET/websmpp/websmsEnvía un SMS. Añade una hora programada y la diferencia horaria con respecto a GMT para programarlo.user, pass (or accesskey), sid, mno, type, text, schtime, gmt
POST/websmpp/json/smsEnviar con un objeto de campaña JSON que contenga las credenciales, el remitente, los números y el texto.campaign { username, password, sender, gsm, text, type }
GET/websmpp/websmsstatusEstado de un mensaje enviado, según su ID de respuesta.respid, format
POST/websmpp/api/dlrreportInforme de entregas para un rango de fechas, en formato de hoja de cálculo.username, pass, from_date, to_date
GET/websmpp/hlr/lookupBúsqueda HLR para un número.username, password, destination
curl · legacy
# Legacy HTTP API — credentials as query parameters (existing integrations only)
curl "https://api.broadnet.me/websmpp/websms?user=USERNAME&pass=PASSWORD&sid=BroadNet&mno=447700900123&type=1&text=Hello"

# Status of a submitted message
curl "https://api.broadnet.me/websmpp/websmsstatus?respid=MESSAGE_ID&format=json"

Preguntas frecuentes

¿Cómo me autentico?

Envía tu token de acceso en el encabezado Authorization: Bearer en cada solicitud. El token proviene de tu cuenta BroadNet ; la API no realiza ninguna llamada para generar tokens. Un token faltante o no válido es rechazado en la pasarela de API con HTTP 401 y un cuerpo JSON de dos campos, error y message. Guarda el token en una variable de entorno o en un gestor de secretos; nunca lo incluyas en el control de versiones ni en el código del cliente.

¿Cuál es la URL base?

Cada ejemplo llama a producción, https://api.broadnet.me. Las credenciales de prueba, y adónde enviar el tráfico de prueba, llegan con su acceso de prueba: solicítelo en /signup y le respondemos en un día hábil.

¿Cómo puedo enviar texto en árabe u otro texto Unicode?

Establezca messageType en UNICODE. Use TEXT solo cuando todos los caracteres pertenezcan al alfabeto GSM-7. Si tiene dudas, llame a POST /sms/identify con el mensaje: le devolverá el messageType, el número de caracteres, el número de segmentos y los caracteres por segmento.

¿Qué devuelve un envío exitoso?

POST /sms/sendSms devuelve HTTP 200 y el ID del mensaje como cuerpo de la respuesta. Los envíos masivos devuelven un objeto JSON con status, bulkSessionId, credits, deductcredits y bulkListInfo.

¿Cómo puedo enviar un SMS a varios destinatarios?

Utilice POST /sms/sendbulk con una carga multipart: destinationNumberFile es un archivo CSV o TXT con números y bulkRequest es una cadena JSON con senderId, message, messageType y campaignName. Los trabajos se pueden listar, pausar, reanudar o cancelar por ID de lote.

¿Cómo puedo consultar el estado de mi envío?

El estado de entrega se envía a la URL del webhook configurada en tu cuenta. En el caso de WhatsApp, el estado de cada destinatario también se puede consultar en /whatsapp/message/bulk-insights.

¿Existe un SDK ?

Sí, una: el SDK oficial TypeScript / Node.js, @broadnet/cpaas-sdk en npm, generado a partir de la especificación OpenAPI BroadNet. Para cualquier otro lenguaje, llame directamente a la API REST o genere un cliente a partir de la especificación OpenAPI 3.1 en /developers/openapi.yaml.

¿Qué es la API /websmpp?

La API HTTP heredada, conservada para las integraciones existentes de la era SMPP, acepta credenciales como parámetros de solicitud. Las nuevas integraciones deben usar la API REST de token Bearer documentada en esta página.

Comienza a enviar

¿Listo para enviar tu primer SMS?