Integra el envío de SMS
en tu servicio.
Empieza con una sola clave API. Elige el país y envía hasta 1.000 números por solicitud. Consulta también el resultado de cada número.
Inicio rápido
- Crea una clave API
Tras registrarte, ser aprobado e iniciar sesión con OTP, ve a Gestionar claves API para crear una clave.
- Prepara créditos
La API usa el saldo y el precio de tu cuenta. El importe se descuenta cuando se acepta el envío.
- Envía y consulta los resultados
Guarda el ID del envío y consulta los resultados con la API de estado.
https://hexsms.comLlama a la API desde tu servidor mediante HTTPS. La vista previa no emite claves reales ni envía mensajes por API.
Cobertura
Destinos destacados
- Estados Unidos
- Canadá
- Reino Unido
- Alemania
- Francia
- España
- Italia
- Países Bajos
- Suecia
- Noruega
- Dinamarca
- Polonia
- Rumanía
- Chequia
- Austria
- Suiza
- Irlanda
- Portugal
- Finlandia
- Japón
- Corea del Sur
- China
- Taiwán
- RAE de Hong Kong (China)
- Singapur
- Malasia
- Indonesia
- Filipinas
- Tailandia
- Vietnam
- India
- Bangladés
- Pakistán
- Australia
- Nueva Zelanda
- Brasil
- México
- Sudáfrica
- Nigeria
- Emiratos Árabes Unidos
- Arabia Saudí
La disponibilidad, las tarifas y los requisitos de registro del remitente varían según tu cuenta y las redes locales. Consulta las tarifas por país antes de enviar.
GET/api/v1/messages/countries
Consulta por API los países activos y el precio que se te aplica. Indica el país con country al enviar y usa números del mismo país en cada solicitud. No se aceptan envíos a países sin tarifa configurada.
{ "currency": "USDT", "countries": [{ "country": "US", "unitPrice": 0.02 }] }Autentícate con una clave API
Incluye este encabezado en todas las solicitudes a la API. No necesitas cookies de sesión ni códigos OTP.
Authorization: Bearer hex_live_TU_CLAVE_APILa clave completa solo se muestra una vez al crearla. Guárdala en una variable de entorno del servidor y nunca en el código frontend. Las claves revocadas o de cuentas suspendidas no funcionan. Puedes crear hasta 5 claves.
/api/v1/messagesEnvía a 1.000 números de una vez
Envía el mismo mensaje a varios números. Validamos la solicitud, la ponemos en cola y respondemos al instante. Para enviar contenidos distintos a cada número, usa solicitudes separadas con un Idempotency-Key nuevo.
| Campo | Tipo | Descripción |
|---|---|---|
country * | string | Código de país ISO 3166-1 alfa-2, por ejemplo US, GB, JP o KR. No hay país predeterminado. |
text * | string | De 1 a 1.600 caracteres tras eliminar espacios. Todos los números de la solicitud reciben el mismo contenido. |
recipients * | string[] | De 1 a 1.000 números móviles. Se recomienda el formato con + y prefijo internacional. Todos los números deben ser del mismo país que country. |
Idempotency-Key * | header | De 8 a 100 letras ASCII, dígitos, guiones o guiones bajos. Usa un valor único para cada operación. |
Si hay un solo número no válido o duplicado, se rechaza toda la solicitud sin enviar ni cobrar. Los duplicados se comprueban tras normalizar los números al formato internacional.
curl -X POST 'https://hexsms.com/api/v1/messages' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: notice-20261024-001' \
-d '{
"country": "US",
"text": "Your verification code is 482913.",
"recipients": ["+12025550123", "+12025550124"]
}'{
"id": "35bed356-b84a-452a-8e94-98b538972ecd",
"country": "US",
"state": "RUNNING",
"total": 2,
"segments": 1,
"unitPrice": 0.025,
"cost": 0.05,
"createdAt": 1792800000000,
"note": null,
"replayed": false
}Si reintentas con la misma cuenta, el mismo Idempotency-Key, el mismo contenido y el mismo orden de números, se devuelve el resultado original sin enviar ni cobrar de nuevo (200, replayed: true). Si el cuerpo es distinto, se devuelve 409. La protección contra duplicados se mantiene aunque cambies de clave API. Las claves de solicitud no caducan.
Cómo se calcula el importe
Números × segmentos (segments) × precio unitario de la cuenta. UCS-2 admite 70 caracteres en un segmento y después 67 por segmento. GSM-7 básico admite 160 y después 153 por segmento. Los caracteres de extensión cuentan doble y los emojis usan su longitud en UTF-16. unitPrice y cost se expresan en USDT. La respuesta incluye el precio aplicado; el 0,025 de arriba es solo un ejemplo.
/api/v1/messages/{id}Consulta el resultado de cada número
Usa el id que devuelve la API de envío. Solo puedes consultar los envíos hechos por API con la misma cuenta. Esta consulta devuelve los resultados guardados. Si necesitas los últimos resultados del operador, llama antes a la API de actualización.
curl 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd?limit=1&offset=0' \
-H 'Authorization: Bearer YOUR_API_KEY'{
"id": "35bed356-b84a-452a-8e94-98b538972ecd",
"country": "US",
"state": "DONE",
"total": 2, "segments": 1,
"unitPrice": 0.025, "cost": 0.05,
"createdAt": 1792800000000, "note": null,
"summary": { "DELIVERED": 1, "PENDING": 1 },
"messages": [
{
"id": "d2787184-d8b8-49c6-9c15-1db90a6d5516",
"to": "12025550123",
"status": "DELIVERED",
"statusName": "DELIVERED_TO_HANDSET",
"description": "Message delivered to handset",
"error": null,
"updatedAt": 1792800005000
}
],
"pagination": { "limit": 1, "offset": 0, "nextOffset": 1 }
}limit va de 1 a 1.000 (100 por defecto) y offset de 0 a 1.000 (0 por defecto). Si nextOffset es null, es la última página. summary cuenta todos los números por estado. to usa el formato internacional sin +, y las horas se devuelven en milisegundos Unix. El orden puede diferir del de la solicitud original; identifica cada mensaje por su id.
Significa que la cola terminó de procesarse. Para confirmar la entrega, comprueba que el status de cada mensaje en messages sea DELIVERED.
/api/v1/messages/{id}/refreshObtén el estado de entrega más reciente
Actualiza los resultados guardados a partir de los registros del operador. No hace falta cuerpo. Después, vuelve a leer los resultados con GET. Cada envío se puede actualizar una vez cada 30 segundos. Los registros del operador están disponibles durante 48 horas tras el envío. Si hay webhooks configurados, los resultados pueden actualizarse automáticamente.
curl -X POST 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd/refresh' \
-H 'Authorization: Bearer YOUR_API_KEY'{ "id": "35bed356-b84a-452a-8e94-98b538972ecd", "updated": 2 }updated es el número de filas actualizadas. Puede ser 0 si los mensajes siguen en cola o no hay resultados nuevos. Recomendamos llamar a GET con intervalos de al menos 10 segundos y solicitar refresh solo cuando sea necesario.
Códigos de estado
state del envío
PREPARING: en preparación · RUNNING: en proceso · PAUSED: en pausa · DONE: cola procesada · CANCELED: cancelado
| status por número | Significado |
|---|---|
| QUEUED | En cola de envío. |
| SENDING | Enviando al operador. |
| PENDING | Aceptado por el operador; a la espera del resultado final. |
| DELIVERED | Entregado en el dispositivo del destinatario. |
| UNDELIVERABLE | No se pudo entregar. |
| EXPIRED | Venció el periodo de validez de la entrega. |
| REJECTED | Rechazado o se produjo un error de procesamiento. |
| CANCELED | Cancelado antes del envío. |
| UNKNOWN | Resultado aún desconocido. |
Los operadores pueden añadir códigos nuevos, así que gestiona también los valores de status desconocidos. Consulta el motivo del fallo en statusName, description y error.
Cómo gestionar los errores
{ "error": "Créditos insuficientes. Recarga y vuelve a intentarlo.", "code": "INSUFFICIENT_CREDITS" }| HTTP | code | Qué revisar |
|---|---|---|
| 403 | COUNTRY_NOT_ENABLED | Revisa las tarifas por país y si el país está activo. |
| 400 | INVALID_COUNTRY | Indica un código de país ISO en country. |
| 400 | INVALID_BODY / INVALID_JSON / INVALID_TEXT | Revisa el objeto JSON y el contenido del mensaje. |
| 400 | INVALID_RECIPIENTS / INVALID_PHONE / DUPLICATE_PHONE | Revisa la cantidad, el formato y los duplicados de los números. |
| 400 | INVALID_IDEMPOTENCY_KEY / INVALID_PAGINATION | Revisa la clave de solicitud o los valores de paginación. |
| 401 | UNAUTHORIZED | Falta la clave API Bearer o no es válida. |
| 402 | INSUFFICIENT_CREDITS | Recarga tus créditos. |
| 403 | ACCOUNT_INACTIVE | Comprueba que la cuenta esté aprobada y activa. |
| 404 | NOT_FOUND | Revisa el ID del envío y que pertenezca a tu cuenta. |
| 409 | IDEMPOTENCY_CONFLICT | Se reutilizó la misma clave de solicitud con un cuerpo distinto. |
| 413 / 415 | BODY_TOO_LARGE / UNSUPPORTED_MEDIA_TYPE | Envía un cuerpo JSON de 128KiB como máximo. |
| 429 | RATE_LIMITED / REFRESH_TOO_SOON | Espera los segundos indicados en Retry-After y vuelve a intentarlo. |
| 500 / 502 | INTERNAL_ERROR / PROVIDER_UNAVAILABLE | Inténtalo de nuevo más tarde. Para reintentar un envío, usa la misma clave de solicitud. |
| 503 | PREVIEW_ONLY | En la vista previa no se puede llamar a la API real. |
Cada clave API admite hasta 120 solicitudes por minuto entre envíos, consultas y actualizaciones. Si alcanzas el límite, revisa el encabezado Retry-After. La API está pensada para integraciones entre servidores y no admite llamadas CORS desde el navegador.
Conéctate con Node.js
const response = await fetch('https://hexsms.com/api/v1/messages', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.HEXSMS_API_KEY,
'Content-Type': 'application/json',
'Idempotency-Key': 'notice-20261024-001'
},
body: JSON.stringify({
country: 'US',
text: 'Your order is on its way.',
recipients: ['+12025550123', '+12025550124']
})
});
const result = await response.json();
if (!response.ok) throw new Error(result.code + ': ' + result.error);
console.log(result.id); // Use this ID to check delivery status.Crea una clave de solicitud una vez por operación y reutilízala si reintentas por falta de respuesta. Si reenvías con una clave nueva una operación que ya tuvo éxito, se tratará como un envío distinto.