# Cómo enviar SMS desde código: Python, PHP, Node.js, Java, Go y C# con una sola llamada REST

> Enviar un SMS desde código consiste en un único POST autenticado HTTPS: un token Bearer, un cuerpo JSON con el ID de remitente, el número de destino, el mensaje y el tipo de mensaje, y un ID de mensaje de vuelta. Aquí tiene la misma solicitud en Python, PHP, Node.js, Java, Go y C#, además de la gestión de errores y consejos para producción.

- URL canónica: https://www.broadnet.me/es/blog/send-sms-api-python-php-nodejs-java-csharp
- Idioma: es
- Última actualización: 2026-10-20
- Editor: BroadNet (https://www.broadnet.me)

- Publicado: 2026-09-28
- Autor: BroadNet Editorial Team

Para enviar un SMS desde código, realice un POST HTTPS a https://api.broadnet.me/sms/sendSms con un encabezado Authorization: Bearer y un cuerpo JSON que contenga senderId, destinationNumber, el mensaje y messageType. Una llamada exitosa devuelve un HTTP 200 con el ID del mensaje como cuerpo de respuesta; el resultado de la entrega llegará más tarde como una confirmación de entrega (DLR) a su webhook. Cada lenguaje a continuación utiliza únicamente su biblioteca HTTP estándar; la única SDK oficial es para TypeScript y Node.js.

## Puntos clave

- Endpoint: POST https://api.broadnet.me/sms/sendSms, cuerpo JSON, token Bearer.
- Campos obligatorios: senderId, destinationNumber (formato internacional sin el signo más), mensaje, messageType (TEXT).
- Respuesta: 200 con el ID del mensaje; consérvelo para cotejar con las confirmaciones de entrega.
- Errores: un token ausente o inválido recibe un 401 de la pasarela; los errores API devuelven status, error, message, errorCode y requestUri.
- Una SDK oficial: @broadnet/cpaas-sdk para TypeScript/Node.js; genere clientes para otros lenguajes a partir de la especificación OpenAPI.

## ¿Qué necesita antes de realizar el envío?

- Un token de acceso de su cuenta BroadNet, guardado en una variable de entorno (BROADNET_TOKEN más abajo), nunca en el código fuente o en una aplicación móvil.
- Un ID de remitente permitido para el país de destino; algunos países requieren un registro previo.
- Un número de destino en formato internacional, por ejemplo 447700900123 (un número ficticio del Reino Unido).

El acceso de prueba se gestiona a través de nuestros ingenieros: solicítelo y recibirá las credenciales de prueba en un plazo de un día hábil; normalmente, el primer mensaje de prueba se envía unos cinco minutos después. La [guía de inicio rápido](https://www.broadnet.me/developers/quickstart) le explicará el proceso.

## ¿Cómo es la solicitud?

Aquí tiene la solicitud con cURL. Todos los ejemplos a continuación envían el mismo cuerpo JSON.

```
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
```

## ¿Cómo se envía un SMS con Python?

Con la librería requests, el argumento json= configura automáticamente el encabezado Content-Type.

```
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
```

## ¿Cómo se envía un SMS con PHP?

La extensión curl de PHP es suficiente; no es necesario ningún paquete adicional.

```
<?php
$ch = curl_init("https://api.broadnet.me/sms/sendSms");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        "Authorization: Bearer " . getenv("BROADNET_TOKEN"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        "senderId"          => "BroadNet",
        "destinationNumber" => "447700900123",
        "message"           => "Your verification code is 482913",
        "messageType"       => "TEXT",
    ]),
]);

$messageId = curl_exec($ch);
echo $messageId;
```

## ¿Cómo se envía un SMS con Node.js?

Node.js 18 y versiones posteriores incluyen fetch integrado:

```
// 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
```

O utilice el SDK oficial de TypeScript/Node.js, @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
```

## ¿Cómo se envía un SMS con Java?

Java 11 y versiones posteriores incluyen java.net.http.HttpClient:

```
// 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ómo se envía un SMS con Go?

```
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
}
```

## ¿Cómo se envía un SMS con C# y .NET?

.NET 6 y versiones posteriores no requieren paquete NuGet: HttpClient y System.Net.Http.Json están integrados.

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

## ¿Qué se recibe y cómo se gestionan los errores?

| Respuesta | Significado | Qué hacer |
|---|---|---|
| 200 + ID de mensaje | Aceptado para entrega | Guarde el ID con su propio registro; espere al DLR |
| 400 | Error de validación o campo faltante | Corrija la solicitud; no reintente sin cambios |
| 401 | Token Bearer faltante o no válido | Compruebe el token y el encabezado Authorization |
| 500 | Error inesperado del servidor | Reintente con backoff; compruebe el estado del mensaje antes de volver a enviarlo |

Un 200 significa que la plataforma ha aceptado el mensaje, no que el terminal lo haya recibido. La entrega se informa mediante la confirmación de entrega; consulte [qué es un DLR](https://www.broadnet.me/answers/what-is-dlr) y [confirmaciones de entrega y códigos de error de SMS](https://www.broadnet.me/blog/sms-delivery-receipts-dlr-error-codes). El API no tiene encabezado de idempotencia, por lo que debe conservar el ID del mensaje devuelto y comprobar su estado antes de volver a enviarlo para evitar duplicados. La página de [códigos de error](https://www.broadnet.me/developers/error-codes) enumera el resto.

## ¿Cómo prepararlo para producción?

- Mantenga el token en el lado del servidor. Nunca llame a la API de SMS desde un navegador o una aplicación móvil, donde el token podría extraerse; en su lugar, llame a su propio backend.
- Envíe mensajes largos con conocimiento de causa: GSM-7 admite 160 caracteres por SMS, Unicode (UCS-2) 70, y los textos más largos se dividen en segmentos facturables. Consulte [el límite de caracteres de SMS](https://www.broadnet.me/answers/sms-character-limit-explained).
- Encole los envíos masivos y respete el rendimiento de su cuenta; lea los [límites de velocidad](https://www.broadnet.me/developers/rate-limits).
- Reciba las confirmaciones de entrega mediante un [webhook](https://www.broadnet.me/developers/webhooks) y almacene el estado final.
- Valide primero los números en formato internacional; consulte la [validación de números de teléfono E.164](https://www.broadnet.me/blog/e164-phone-number-validation-msisdn).

Para volúmenes muy altos o una infraestructura de telecomunicaciones existente, SMPP puede ser más adecuado que REST; consulte [SMPP frente a REST](https://www.broadnet.me/compare/sms-api-vs-smpp). La plataforma de BroadNet gestiona 30,000 SMS por segundo por nodo.

## Preguntas frecuentes

### ¿Cuál es la forma más sencilla de enviar un SMS desde código?

Un HTTPS POST a un SMS API con un token de acceso y un cuerpo JSON. Con BroadNet, se trata de un POST https://api.broadnet.me/sms/sendSms con senderId, destinationNumber, el mensaje y messageType.

### ¿Existe un BroadNet SDK para Python, PHP o Java?

No. Existe un único SDK @broadnet/cpaas-sdk oficial para TypeScript y Node.js. Otros lenguajes llaman al REST API directamente, como se muestra aquí, o generan un cliente a partir de la especificación OpenAPI.

### ¿En qué formato debe estar el número de teléfono?

Formato internacional con el código de país y sin signo más ni espacios, por ejemplo 447700900123.

### ¿Significa una respuesta 200 que el SMS ha sido entregado?

No. Significa que el mensaje fue aceptado. La confirmación de entrega (DLR) indica si este llegó al terminal.

### ¿Puedo enviar SMS directamente desde una aplicación de Android o iOS?

No de forma segura. Ejecute la llamada API en su servidor para que el token de acceso nunca se envíe dentro de la aplicación, y haga que la aplicación llame a su servidor.

### ¿Dónde encuentro la referencia completa de la API?

En la [referencia de API](https://www.broadnet.me/developers/api-reference) y en la [especificación de OpenAPI](https://www.broadnet.me/developers/openapi).

Los ejemplos de código son los que aparecen en nuestras páginas para desarrolladores, verificados según la especificación OpenAPI publicada. Revisado el 28 de septiembre de 2026. Consulte nuestros [estándares editoriales](https://www.broadnet.me/about/editorial-standards).
