Aller au contenu
HEXSMSDEVELOPERS
HEXSMS API · v1

Intégrez l’envoi de SMS
à votre service.

Commencez avec une seule clé API. Choisissez un pays et envoyez jusqu’à 1 000 numéros par requête. Suivez aussi le résultat pour chaque numéro.

REST APIJSONJusqu’à 1 000 destinataires / requête

Démarrage rapide

  1. Créez une clé API

    Après l’inscription, l’approbation et la connexion OTP, rendez-vous surGestion des clés APIpour créer une clé.

  2. Préparez vos crédits

    L’API utilise les crédits et les tarifs de votre compte. Le montant est débité lors de la prise en charge de l’envoi.

  3. Envoyez et suivez vos messages

    Conservez l’ID d’envoi et consultez les résultats via l’API de statut.

Base URL https://hexsms.com

Appelez l’API depuis votre serveur en HTTPS. Le mode aperçu ne permet ni l’émission de vraies clés ni l’envoi via l’API.

Pays pris en charge

190+Couverture réseau mondiale

Principaux pays couverts

  • États-Unis
  • Canada
  • Royaume-Uni
  • Allemagne
  • France
  • Espagne
  • Italie
  • Pays-Bas
  • Suède
  • Norvège
  • Danemark
  • Pologne
  • Roumanie
  • Tchéquie
  • Autriche
  • Suisse
  • Irlande
  • Portugal
  • Finlande
  • Japon
  • Corée du Sud
  • Chine
  • Taïwan
  • R.A.S. chinoise de Hong Kong
  • Singapour
  • Malaisie
  • Indonésie
  • Philippines
  • Thaïlande
  • Viêt Nam
  • Inde
  • Bangladesh
  • Pakistan
  • Australie
  • Nouvelle-Zélande
  • Brésil
  • Mexique
  • Afrique du Sud
  • Nigeria
  • Émirats arabes unis
  • Arabie saoudite

La disponibilité, les tarifs et les conditions d’enregistrement de l’expéditeur varient selon votre compte et les réseaux locaux. Vérifiez les tarifs par pays avant l’envoi.

GET/api/v1/messages/countries

Consultez via l’API les pays actifs et les tarifs réellement appliqués. Indiquez le pays avec country dans la requête d’envoi et n’incluez que des numéros de ce pays dans une même requête. Les pays sans tarif configuré ne sont pas acceptés.

200 OK
{ "currency": "USDT", "countries": [{ "country": "US", "unitPrice": 0.02 }] }

Authentifiez-vous avec une clé API

Ajoutez l’en-tête ci-dessous à chaque requête API externe. Aucun cookie de session ni code OTP n’est nécessaire.

HTTP
Authorization: Bearer hex_live_VOTRE_CLÉ_API

La clé complète n’est affichée qu’une seule fois, lors de sa création. Conservez-la dans une variable d’environnement du serveur et jamais dans le code frontend. Une clé révoquée ou un compte suspendu ne peut plus être utilisé. Vous pouvez créer jusqu’à 5 clés.

POST/api/v1/messages

Envoyez à 1 000 numéros d’un coup

Envoyez un même message à plusieurs numéros. La requête est validée, mise en file d’envoi, puis une réponse est renvoyée immédiatement. Pour envoyer un contenu différent par numéro, utilisez des requêtes distinctes avec une nouvelle Idempotency-Key.

ChampFormatDescription
country *stringCode pays ISO 3166-1 alpha-2, par ex. US, GB, JP, KR. Aucun pays par défaut.
text *string1 à 1 600 caractères après suppression des espaces. Tous les numéros d’une requête reçoivent le même contenu.
recipients *string[]1 à 1 000 numéros mobiles. Le format +indicatif pays est recommandé ; tous les numéros doivent appartenir au pays indiqué dans country.
Idempotency-Key *header8 à 100 caractères : lettres latines, chiffres, tirets ou underscores. Utilisez une valeur unique pour chaque requête.

Un seul numéro invalide ou en double entraîne le rejet de toute la requête, sans envoi ni débit. Les doublons sont détectés après conversion au format international.

cURL · Envoi groupé
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 · Mis en file d’envoi
{
  "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 la réponse est perdue, renvoyez avec la même clé de requête.

Une nouvelle tentative avec le même compte, la même Idempotency-Key, le même contenu et le même ordre des numéros renvoie le résultat existant sans nouvel envoi ni débit (200, replayed: true). Si le corps diffère, la réponse est 409. La protection contre les doublons est conservée même après un changement de clé API. Les clés de requête n’expirent pas.

Calcul du montant

Nombre de numéros × nombre de segments (segments) × tarif du compteEn UCS-2, un segment contient jusqu’à 70 caractères, puis 67 par segment. En GSM-7 de base, un segment contient jusqu’à 160 caractères, puis 153 par segment. Les caractères étendus comptent double et les emoji selon leur longueur UTF-16. unitPrice et cost sont en USDT. Le tarif de la réponse est celui réellement appliqué ; 0,025 ci-dessus n’est qu’un exemple.

GET/api/v1/messages/{id}

Suivez le résultat de chaque numéro

Utilisez l’id renvoyé par l’API d’envoi. Seuls les envois effectués via l’API par le même compte sont consultables. Cette API renvoie les résultats enregistrés ; pour les derniers résultats opérateur, appelez d’abord l’API d’actualisation ci-dessous.

cURL · Consulter le statut
curl 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd?limit=1&offset=0' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 OK · Résultats par numéro
{
  "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 à 1 000 (100 par défaut), offset de 0 à 1 000 (0 par défaut). Si nextOffset vaut null, c’est la dernière page. summary indique le nombre de numéros par statut. to est renvoyé au format international sans +, et les horodatages en millisecondes Unix. L’ordre des résultats peut différer de l’ordre d’envoi ; identifiez chaque message par son id.

DONE ne signifie pas que le message a été reçu.

Cela signifie que le traitement de la file d’envoi est terminé. Pour confirmer la réception, vérifiez que le status de messages vaut DELIVERED.

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

Récupérez le dernier statut de réception

Actualise les résultats enregistrés à partir des journaux de l’opérateur. Aucun corps n’est nécessaire. Relisez ensuite les résultats avec GET. Un même envoi peut être actualisé une fois toutes les 30 secondes. Les journaux de l’opérateur sont disponibles pendant 48 heures après l’envoi. Si un webhook est configuré, les résultats peuvent être mis à jour automatiquement.

cURL · Actualiser le statut
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 est le nombre de lignes mises à jour. Il peut valoir 0 si l’envoi est encore en file ou s’il n’y a pas de nouveau résultat. Nous recommandons d’appeler GET à intervalles d’au moins 10 secondes et de n’utiliser refresh qu’en cas de besoin.

Comprendre les codes de statut

state de l’envoi

PREPARING en préparation · RUNNING en cours · PAUSED en pause · DONE file traitée · CANCELED annulé

status par numéroSignification
QUEUEDEn attente d’envoi.
SENDINGTransmission à l’opérateur en cours.
PENDINGAccepté par l’opérateur ; en attente du résultat final.
DELIVEREDRemis à l’appareil du destinataire.
UNDELIVERABLENon remis.
EXPIREDLa durée de validité de remise a expiré.
REJECTEDRequête refusée ou erreur de traitement.
CANCELEDL’envoi en attente a été annulé.
UNKNOWNRésultat pas encore connu.

Les opérateurs peuvent ajouter de nouveaux codes : gérez aussi les valeurs de status inconnues. Le motif d’échec est indiqué dans statusName, description et error.

Gérer les erreurs

Format de réponse d’erreur
{ "error": "Crédits insuffisants. Rechargez puis réessayez.", "code": "INSUFFICIENT_CREDITS" }
HTTPcodeÀ vérifier
403COUNTRY_NOT_ENABLEDVérifiez les tarifs par pays et leur activation.
400INVALID_COUNTRYIndiquez un code pays ISO dans country.
400INVALID_BODY / INVALID_JSON / INVALID_TEXTVérifiez l’objet JSON et le contenu du message.
400INVALID_RECIPIENTS / INVALID_PHONE / DUPLICATE_PHONEVérifiez le nombre, le format et les doublons des numéros.
400INVALID_IDEMPOTENCY_KEY / INVALID_PAGINATIONVérifiez la clé de requête ou les valeurs de pagination.
401UNAUTHORIZEDLa clé API Bearer est absente ou invalide.
402INSUFFICIENT_CREDITSRechargez vos crédits.
403ACCOUNT_INACTIVEVérifiez que le compte est approuvé et actif.
404NOT_FOUNDVérifiez l’ID d’envoi et le compte propriétaire.
409IDEMPOTENCY_CONFLICTLa même clé de requête a été utilisée avec un autre corps.
413 / 415BODY_TOO_LARGE / UNSUPPORTED_MEDIA_TYPEEnvoyez un corps JSON de 128 Kio maximum.
429RATE_LIMITED / REFRESH_TOO_SOONAttendez le nombre de secondes indiqué par Retry-After avant de réessayer.
500 / 502INTERNAL_ERROR / PROVIDER_UNAVAILABLERéessayez plus tard. Pour renvoyer un envoi, utilisez la même clé de requête.
503PREVIEW_ONLYLes vrais appels API sont impossibles en mode aperçu.

Chaque clé API permet jusqu’à 120 requêtes par minute, envoi, consultation et actualisation confondus. En cas de limitation, consultez l’en-tête Retry-After. L’API est destinée aux échanges serveur à serveur ; les appels CORS depuis le navigateur ne sont pas pris en charge.

Connectez-vous avec Node.js

Node.js · À exécuter sur le serveur
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.

Créez une clé de requête une seule fois par opération et réutilisez-la en cas de nouvelle tentative faute de réponse. Renvoyer une opération réussie avec une nouvelle clé crée un envoi distinct.