Saltar al contenido
HEXSMSDEVELOPERS
HEXSMS API · v1

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.

REST APIJSONHasta 1.000 destinatarios / solicitud

Inicio rápido

  1. Crea una clave API

    Tras registrarte, ser aprobado e iniciar sesión con OTP, ve a Gestionar claves API para crear una clave.

  2. Prepara créditos

    La API usa el saldo y el precio de tu cuenta. El importe se descuenta cuando se acepta el envío.

  3. Envía y consulta los resultados

    Guarda el ID del envío y consulta los resultados con la API de estado.

Base URL https://hexsms.com

Llama a la API desde tu servidor mediante HTTPS. La vista previa no emite claves reales ni envía mensajes por API.

Cobertura

190+Cobertura de red global

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.

200 OK
{ "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.

HTTP
Authorization: Bearer hex_live_TU_CLAVE_API

La 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.

POST/api/v1/messages

Enví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.

CampoTipoDescripción
country *stringCódigo de país ISO 3166-1 alfa-2, por ejemplo US, GB, JP o KR. No hay país predeterminado.
text *stringDe 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 *headerDe 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 · Envío masivo
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"]
  }'
202 Accepted · En cola
{
  "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 se pierde la respuesta, reintenta con la misma clave de solicitud.

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.

GET/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 · Consultar estado
curl 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd?limit=1&offset=0' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 OK · Resultados por número
{
  "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.

DONE no significa entregado.

Significa que la cola terminó de procesarse. Para confirmar la entrega, comprueba que el status de cada mensaje en messages sea DELIVERED.

POST/api/v1/messages/{id}/refresh

Obté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 · Actualizar estado
curl -X POST 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd/refresh' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 OK
{ "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úmeroSignificado
QUEUEDEn cola de envío.
SENDINGEnviando al operador.
PENDINGAceptado por el operador; a la espera del resultado final.
DELIVEREDEntregado en el dispositivo del destinatario.
UNDELIVERABLENo se pudo entregar.
EXPIREDVenció el periodo de validez de la entrega.
REJECTEDRechazado o se produjo un error de procesamiento.
CANCELEDCancelado antes del envío.
UNKNOWNResultado 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

Formato de respuesta de error
{ "error": "Créditos insuficientes. Recarga y vuelve a intentarlo.", "code": "INSUFFICIENT_CREDITS" }
HTTPcodeQué revisar
403COUNTRY_NOT_ENABLEDRevisa las tarifas por país y si el país está activo.
400INVALID_COUNTRYIndica un código de país ISO en country.
400INVALID_BODY / INVALID_JSON / INVALID_TEXTRevisa el objeto JSON y el contenido del mensaje.
400INVALID_RECIPIENTS / INVALID_PHONE / DUPLICATE_PHONERevisa la cantidad, el formato y los duplicados de los números.
400INVALID_IDEMPOTENCY_KEY / INVALID_PAGINATIONRevisa la clave de solicitud o los valores de paginación.
401UNAUTHORIZEDFalta la clave API Bearer o no es válida.
402INSUFFICIENT_CREDITSRecarga tus créditos.
403ACCOUNT_INACTIVEComprueba que la cuenta esté aprobada y activa.
404NOT_FOUNDRevisa el ID del envío y que pertenezca a tu cuenta.
409IDEMPOTENCY_CONFLICTSe reutilizó la misma clave de solicitud con un cuerpo distinto.
413 / 415BODY_TOO_LARGE / UNSUPPORTED_MEDIA_TYPEEnvía un cuerpo JSON de 128KiB como máximo.
429RATE_LIMITED / REFRESH_TOO_SOONEspera los segundos indicados en Retry-After y vuelve a intentarlo.
500 / 502INTERNAL_ERROR / PROVIDER_UNAVAILABLEInténtalo de nuevo más tarde. Para reintentar un envío, usa la misma clave de solicitud.
503PREVIEW_ONLYEn 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

Node.js · Ejecutar en el servidor
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.