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.
Démarrage rapide
- 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é.
- 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.
- Envoyez et suivez vos messages
Conservez l’ID d’envoi et consultez les résultats via l’API de statut.
https://hexsms.comAppelez 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
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.
{ "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.
Authorization: Bearer hex_live_VOTRE_CLÉ_APILa 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.
/api/v1/messagesEnvoyez à 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.
| Champ | Format | Description |
|---|---|---|
country * | string | Code pays ISO 3166-1 alpha-2, par ex. US, GB, JP, KR. Aucun pays par défaut. |
text * | string | 1 à 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 * | header | 8 à 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 -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
}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.
/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 '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 à 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.
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.
/api/v1/messages/{id}/refreshRé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 -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 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éro | Signification |
|---|---|
| QUEUED | En attente d’envoi. |
| SENDING | Transmission à l’opérateur en cours. |
| PENDING | Accepté par l’opérateur ; en attente du résultat final. |
| DELIVERED | Remis à l’appareil du destinataire. |
| UNDELIVERABLE | Non remis. |
| EXPIRED | La durée de validité de remise a expiré. |
| REJECTED | Requête refusée ou erreur de traitement. |
| CANCELED | L’envoi en attente a été annulé. |
| UNKNOWN | Ré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
{ "error": "Crédits insuffisants. Rechargez puis réessayez.", "code": "INSUFFICIENT_CREDITS" }| HTTP | code | À vérifier |
|---|---|---|
| 403 | COUNTRY_NOT_ENABLED | Vérifiez les tarifs par pays et leur activation. |
| 400 | INVALID_COUNTRY | Indiquez un code pays ISO dans country. |
| 400 | INVALID_BODY / INVALID_JSON / INVALID_TEXT | Vérifiez l’objet JSON et le contenu du message. |
| 400 | INVALID_RECIPIENTS / INVALID_PHONE / DUPLICATE_PHONE | Vérifiez le nombre, le format et les doublons des numéros. |
| 400 | INVALID_IDEMPOTENCY_KEY / INVALID_PAGINATION | Vérifiez la clé de requête ou les valeurs de pagination. |
| 401 | UNAUTHORIZED | La clé API Bearer est absente ou invalide. |
| 402 | INSUFFICIENT_CREDITS | Rechargez vos crédits. |
| 403 | ACCOUNT_INACTIVE | Vérifiez que le compte est approuvé et actif. |
| 404 | NOT_FOUND | Vérifiez l’ID d’envoi et le compte propriétaire. |
| 409 | IDEMPOTENCY_CONFLICT | La même clé de requête a été utilisée avec un autre corps. |
| 413 / 415 | BODY_TOO_LARGE / UNSUPPORTED_MEDIA_TYPE | Envoyez un corps JSON de 128 Kio maximum. |
| 429 | RATE_LIMITED / REFRESH_TOO_SOON | Attendez le nombre de secondes indiqué par Retry-After avant de réessayer. |
| 500 / 502 | INTERNAL_ERROR / PROVIDER_UNAVAILABLE | Réessayez plus tard. Pour renvoyer un envoi, utilisez la même clé de requête. |
| 503 | PREVIEW_ONLY | Les 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
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.