Référence de l'API SMS-C
← Retour à l'Index de Documentation
Référence complète pour tous les points de terminaison de l'API REST SMS-C avec des exemples de requêtes/réponses.
Table des Matières
- Aperçu de l'API
- Authentification
- Formats de Réponse Communes
- Point de Terminaison de Statut
- API de File d'Attente de Messages
- API PDU SMS Brut
- API de Gestion de Localisation
- API d'Inscription Frontend
- API de Campagnes
- API de Journalisation d'Événements
- API de Messages MMS
- API d'Événements SS7
- Codes d'Erreur
- Limitation de Taux
- Meilleures Pratiques
Aperçu de l'API
L'API REST SMS-C fournit un accès programmatique à la soumission, au routage et aux fonctions de gestion des messages.
URL de Base
https://api.example.com:8443/api
Port par Défaut : 8443 (configurable)
Protocole : HTTPS (TLS requis en production)
Type de Contenu
Toutes les requêtes et réponses utilisent JSON :
Content-Type: application/json
Version de l'API
L'API actuelle est la version 1 (implicite). Les futures versions utiliseront la version d'URL :
https://api.example.com:8443/api/v2/...
Authentification
Certificats Clients TLS (Recommandé)
Les déploiements en production doivent utiliser l'authentification par certificat client TLS :
curl --cert client.crt --key client.key \
https://api.example.com:8443/api/status
Authentification par Clé API
Authentification par clé API personnalisée via l'en-tête X-API-Key :
curl -H "X-API-Key: your_api_key_here" \
https://api.example.com:8443/api/status
Liste Blanche d'IP
Restreindre l'accès à l'API aux adresses IP de confiance au niveau du pare-feu.
Formats de Réponse Communes
Réponse de Succès
{
"data": {
...
}
}
Réponse d'Erreur
{
"errors": {
"detail": "Message d'erreur décrivant ce qui s'est mal passé"
}
}
Réponse de Liste
{
"data": [
{...},
{...}
]
}
Point de Terminaison de Statut
Point de contrôle de santé pour la surveillance et les équilibreurs de charge.
Obtenir le Statut de l'API
Requête :
GET /api/status
Réponse (200 OK) :
{
"status": "ok",
"application": "OmniMessage",
"timestamp": "2025-10-30T12:34:56Z"
}
Exemple :
curl https://api.example.com:8443/api/status
Cas d'Utilisation :
- Vérifications de santé des équilibreurs de charge
- Surveillance de la connectivité du système
- Vérification de la disponibilité du service
API de File d'Attente de Messages
Points de terminaison principaux pour la soumission et la gestion des messages.
Lister les Messages
Récupérer les messages de la file d'attente.
Requête :
GET /api/messages
En-têtes Optionnels :
smsc: frontend_name- Filtrer par SMSC de destinationinclude-unrouted: true|false|1|0- Inclure les messages sans enregistrement de localisation (par défaut : false)false(par défaut) : Ne retourner que les messages avec routage explicite ou enregistrement de localisationtrue: Inclure les messages sans enregistrement de localisation (mode rétrocompatible)
Paramètres de Requête (mode liste — uniquement lorsque aucun en-tête smsc n'est envoyé) :
status- Filtrer par un seul statut (par défaut : tous). Un des :queued,backoff,sent,delivered,expired,dropped,auto_replied,balance_rejected,deletedlimit- Max de dossiers à retourner (par défaut : 100, max : 1000)offset- Dossiers à ignorer pour la pagination (par défaut : 0)
Les résultats sont retournés du plus récent au plus ancien par ID de message. Le point de terminaison est paginé par défaut : sans limit, il retourne au maximum 100 dossiers, jamais l'ensemble du magasin.
Réponse (200 OK) — un tableau JSON de messages :
[
{
"id": 12345,
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900000",
"message_text": "Hello World",
"source_smsc": "api_client",
"dest_smsc": "uk_gateway",
"status": "queued",
"send_time": "2025-10-30T12:00:00Z",
"deliver_time": null,
"delivery_attempts": 0,
"inserted_at": "2025-10-30T12:00:00Z"
}
]
Exemples :
Obtenir les messages en attente pour un SMSC spécifique (uniquement avec routage explicite ou localisation) :
curl -H "smsc: uk_gateway" \
https://api.example.com:8443/api/messages
Obtenir les messages en attente y compris les messages non routés (rétrocompatible) :
curl -H "smsc: uk_gateway" \
-H "include-unrouted: true" \
https://api.example.com:8443/api/messages
Obtenir tous les messages livrés :
curl "https://api.example.com:8443/api/messages?status=delivered&limit=50"
Obtenir un Message Unique
Récupérer les détails d'un message spécifique.
Requête :
GET /api/messages/:id
Réponse (200 OK) :
{
"data": {
"id": 12345,
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900000",
"message_body": "Hello World",
"source_smsc": "api_client",
"dest_smsc": "uk_gateway",
"source_imsi": null,
"dest_imsi": null,
"message_parts": 1,
"message_part_number": 1,
"tp_data_coding_scheme": "00",
"tp_user_data_header": null,
"status": "queued",
"send_time": "2025-10-30T12:00:00Z",
"deliver_time": null,
"expires": "2025-10-31T12:00:00Z",
"deadletter": false,
"delivery_attempts": 0,
"deliver_after": "2025-10-30T12:00:00Z",
"raw_data_flag": false,
"raw_sip_flag": false,
"raw_pdu": null,
"inserted_at": "2025-10-30T12:00:00Z",
"updated_at": "2025-10-30T12:00:00Z"
}
}
Exemple :
curl https://api.example.com:8443/api/messages/12345
Soumettre un Message (Synchronisé)
Soumettre un message et recevoir immédiatement l'ID du message.
Requête :
POST /api/messages
Content-Type: application/json
Corps :
{
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900000",
"message_body": "Hello World",
"source_smsc": "api_client"
}
Champs Optionnels :
dest_smsc- Remplacer la décision de routagesend_time- Planifier pour une livraison future (ISO 8601)message_parts- Total de parties pour un message multipartmessage_part_number- Numéro de partie (indexé à partir de 1)tp_data_coding_scheme- DCS SMS (par défaut : "00")source_imsi- IMSI de l'abonné sourcedest_imsi- IMSI de l'abonné de destination
Réponse (201 Créé) :
{
"data": {
"id": 12345,
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900000",
"message_body": "Hello World",
"source_smsc": "api_client",
"dest_smsc": "uk_gateway",
"status": "queued",
"send_time": "2025-10-30T12:00:00Z",
"inserted_at": "2025-10-30T12:00:00Z"
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/messages \
-H "Content-Type: application/json" \
-d '{
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900000",
"message_body": "Hello World",
"source_smsc": "api_client"
}'
Performance : ~70 messages/seconde, temps de réponse moyen de 14ms
Utiliser Quand :
- Besoin de l'ID du message immédiatement
- Traitement de messages/seconde
- Nécessite une confirmation immédiate
Soumettre un Message (Asynchrone)
Soumettre un message avec un débit élevé (traitement par lots).
Requête :
POST /api/messages/create_async
Content-Type: application/json
Corps : Identique à l'endpoint synchronisé
Réponse (202 Accepté) :
{
"data": {
"status": "accepted",
"message": "Message mis en file d'attente pour traitement"
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/messages/create_async \
-H "Content-Type: application/json" \
-d '{
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900000",
"message_body": "Message de notification en masse",
"source_smsc": "bulk_api"
}'
Performance : ~4,650 messages/seconde, temps de réponse moyen de 0.22ms
Latence : Le message apparaît dans la base de données dans les 100ms (configurable)
Utiliser Quand :
- Messagerie en masse à volume élevé (> 100 msg/sec)
- Pas besoin de l'ID du message dans la réponse API
- Le débit est plus important que la confirmation instantanée
Mettre à Jour un Message
Mettre à jour partiellement les champs d'un message.
Requête :
PATCH /api/messages/:id
Content-Type: application/json
Corps :
{
"dest_smsc": "alternate_gateway",
"deliver_after": "2025-10-30T14:00:00Z"
}
Champs Modifiables :
dest_smsc- Changer la destinationdeliver_after- Retarder la livraisonmessage_body- Mettre à jour le texte du messagestatus- Changer le statut
Réponse (200 OK) :
{
"data": {
"id": 12345,
"dest_smsc": "alternate_gateway",
"deliver_after": "2025-10-30T14:00:00Z",
...
}
}
Exemple :
curl -X PATCH https://api.example.com:8443/api/messages/12345 \
-H "Content-Type: application/json" \
-d '{
"dest_smsc": "backup_gateway"
}'
Marquer un Message Comme Livré
Marquer un message comme ayant été livré avec succès.
Requête :
POST /api/messages/:id/mark_delivered
Content-Type: application/json
Corps :
{
"dest_smsc": "uk_gateway"
}
Réponse (200 OK) :
{
"data": {
"id": 12345,
"status": "delivered",
"deliver_time": "2025-10-30T12:05:30Z",
"dest_smsc": "uk_gateway",
...
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/messages/12345/mark_delivered \
-H "Content-Type: application/json" \
-d '{
"dest_smsc": "uk_gateway"
}'
Cas d'Utilisation : Appelé par les systèmes frontend après une livraison réussie
Incrémenter la Tentative de Livraison
Enregistrer une livraison échouée : incrémente le compteur de tentatives, déplace le message vers backoff, et planifie la prochaine tentative.
Requête :
PUT /api/messages/:id
Réponse (200 OK) — le message mis à jour :
{
"id": 12345,
"status": "backoff",
"delivery_attempts": 2,
"deliver_after": "2025-10-30T12:08:00Z"
}
Backoff : exponentiel, plafonné à 30 minutes, et jamais planifié après l'expiration du message :
deliver_after = min(now + min(2^attempts, 30) minutes, expires)
Le message reste en backoff jusqu'à ce que deliver_after passe, puis redevient éligible. Il continue à réessayer toutes les ≤30 minutes jusqu'à ce que expires soit atteint, après quoi il n'est plus servi (les livraisons échouées ne sont pas mises en lettre morte).
Exemple :
curl -X PUT https://api.example.com:8443/api/messages/12345
Cas d'Utilisation : Appelé par le frontend après un échec de livraison pour planifier une nouvelle tentative
Supprimer un Message
Supprimer un message de la file d'attente.
Requête :
DELETE /api/messages/:id
Réponse (204 Pas de Contenu)
Exemple :
curl -X DELETE https://api.example.com:8443/api/messages/12345
Avertissement : La suppression de messages les retire définitivement. Utiliser avec précaution.
API PDU SMS Brut
Soumettre des messages SMS en tant que PDU brut (Unité de Données de Protocole) pour une compatibilité maximale avec les systèmes hérités.
Soumettre un SMS Brut (Synchronisé)
Requête :
POST /api/messages_raw
Content-Type: application/json
Corps :
{
"pdu": "0001000B916407007009F0000004D4F29C0E",
"source_smsc": "legacy_system"
}
Format PDU : SMS TPDU (Transport Protocol Data Unit) encodé en hexadécimal
Réponse (201 Créé) :
{
"data": {
"id": 12346,
"source_msisdn": "+447700900000",
"destination_msisdn": "+447700900000",
"message_body": "Test",
"source_smsc": "legacy_system",
"raw_pdu": "0001000B916407007009F0000004D4F29C0E",
...
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/messages_raw \
-H "Content-Type: application/json" \
-d '{
"pdu": "0001000B916407007009F0000004D4F29C0E",
"source_smsc": "legacy_system"
}'
Soumettre un SMS Brut (Asynchrone)
Requête :
POST /api/messages_raw/async
Content-Type: application/json
Corps : Identique à l'endpoint synchronisé
Réponse (202 Accepté) :
{
"data": {
"status": "accepted",
"message": "PDU mis en file d'attente pour traitement"
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/messages_raw/async \
-H "Content-Type: application/json" \
-d '{
"pdu": "0001000B916407007009F0000004D4F29C0E",
"source_smsc": "legacy_gateway"
}'
Gestion des PDU
Le système effectue automatiquement :
- Décode le PDU en utilisant les normes SMS (3GPP TS 23.040)
- Extrait les numéros de téléphone, le texte du message, DCS
- Détecte les rapports de livraison (CP-ACK, RP-ACK, etc.)
- Effectue une recherche IMSI vers MSISDN si nécessaire
- Applique les règles de routage
- Stocke le PDU original pour référence
Détection des Rapports de Livraison :
- CP-ACK, CP-ERROR - Accusés de réception du protocole de connexion
- RP-ACK, RP-ERROR, RP-SMMA - Réponses du protocole de relais
- Les rapports de livraison sont enregistrés mais ne sont pas stockés en tant que messages
API de Gestion de Localisation
Gérer les informations de localisation des abonnés pour la livraison de messages terminés sur mobile.
Lister les Localisations
Requête :
GET /api/locations
Réponse (200 OK) :
{
"data": [
{
"id": 1,
"msisdn": "+15551234567",
"imsi": "001001000000001",
"location": "msc1.region1.example.com",
"ran_location": "cell_tower_12345",
"imei": "123456789012345",
"ims_capable": true,
"csfb": false,
"registered": true,
"expires": "2025-10-30T13:00:00Z",
"user_agent": "Samsung Galaxy",
"inserted_at": "2025-10-30T12:00:00Z",
"updated_at": "2025-10-30T12:00:00Z"
}
]
}
Exemple :
curl https://api.example.com:8443/api/locations
Obtenir une Localisation
Requête :
GET /api/locations/:id
Réponse (200 OK) :
{
"data": {
"id": 1,
"msisdn": "+15551234567",
"imsi": "001001000000001",
...
}
}
Exemple :
curl https://api.example.com:8443/api/locations/1
Créer/Mettre à Jour une Localisation
Crée une nouvelle localisation ou met à jour une existante en fonction de l'IMSI (identifiant unique).
Requête :
POST /api/locations
Content-Type: application/json
Corps :
{
"msisdn": "+15551234567",
"imsi": "001001000000001",
"location": "msc1.region1.example.com",
"ran_location": "cell_tower_12345",
"imei": "123456789012345",
"ims_capable": true,
"csfb": false,
"registered": true,
"expires": "2025-10-30T13:00:00Z",
"user_agent": "Samsung Galaxy"
}
Champs Requis :
imsi- Identifiant unique de l'abonnémsisdn- Numéro de téléphone
Champs Optionnels :
location- Adresse MSC/VLRran_location- ID de la tour cellulaire/secteurimei- Identifiant de l'appareilims_capable- Capacité VoLTE IMScsfb- Indicateur de retour à circuit commutéregistered- Actuellement enregistréexpires- Expiration de l'enregistrementuser_agent- Modèle/info de l'appareil
Réponse (201 Créé ou 200 OK) :
{
"data": {
"id": 1,
"msisdn": "+15551234567",
...
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/locations \
-H "Content-Type: application/json" \
-d '{
"msisdn": "+15551234567",
"imsi": "001001000000001",
"location": "msc1.region1.example.com",
"ims_capable": true,
"registered": true
}'
Cas d'Utilisation : Appelé par les systèmes de gestion de mobilité (HSS, MME, etc.) lorsque l'abonné s'enregistre
Mettre à Jour une Localisation
Requête :
PATCH /api/locations/:id
Content-Type: application/json
Corps : Mise à jour partielle avec n'importe quel champ de localisation
Réponse (200 OK) :
{
"data": {
"id": 1,
...
}
}
Exemple :
curl -X PATCH https://api.example.com:8443/api/locations/1 \
-H "Content-Type: application/json" \
-d '{
"location": "msc2.region2.example.com",
"ran_location": "cell_tower_67890"
}'
Supprimer une Localisation
Requête :
DELETE /api/locations/:id
Réponse (204 Pas de Contenu)
Exemple :
curl -X DELETE https://api.example.com:8443/api/locations/1
Cas d'Utilisation : Appelé lorsque l'abonné se désinscrit ou expire
API d'Inscription Frontend
Suivre et gérer les connexions SMSC frontend.
Lister Tous les Frontends
Requête :
GET /api/frontends
Réponse (200 OK) :
{
"data": [
{
"id": 1,
"frontend_name": "uk_gateway_1",
"frontend_type": "smpp",
"ip_address": "10.0.1.50",
"hostname": "gateway1.uk.example.com",
"uptime_seconds": 86400,
"configuration": {
"max_throughput": 1000,
"bind_type": "transceiver"
},
"status": "active",
"expires_at": "2025-10-30T12:02:00Z",
"last_seen_at": "2025-10-30T12:00:30Z",
"inserted_at": "2025-10-29T12:00:00Z",
"updated_at": "2025-10-30T12:00:30Z"
}
]
}
Exemple :
curl https://api.example.com:8443/api/frontends
Lister Uniquement les Frontends Actifs
Requête :
GET /api/frontends/active
Réponse (200 OK) : Même format, uniquement les frontends actifs
Exemple :
curl https://api.example.com:8443/api/frontends/active
Cas d'Utilisation : Obtenir la liste des destinations disponibles pour le routage
Obtenir des Statistiques sur les Frontends
Requête :
GET /api/frontends/stats
Réponse (200 OK) :
{
"data": {
"active_count": 5,
"expired_count": 2,
"unique_frontends": 7,
"total_registrations": 1523
}
}
Exemple :
curl https://api.example.com:8443/api/frontends/stats
Obtenir l'Histoire des Frontends
Requête :
GET /api/frontends/history/:name
Réponse (200 OK) :
{
"data": [
{
"id": 1,
"frontend_name": "uk_gateway_1",
"status": "active",
"inserted_at": "2025-10-30T12:00:00Z",
...
},
{
"id": 2,
"frontend_name": "uk_gateway_1",
"status": "expired",
"inserted_at": "2025-10-29T12:00:00Z",
...
}
]
}
Exemple :
curl https://api.example.com:8443/api/frontends/history/uk_gateway_1
Enregistrer un Frontend
Enregistrer ou mettre à jour la connexion frontend.
Requête :
POST /api/frontends/register
Content-Type: application/json
Corps :
{
"frontend_name": "uk_gateway_1",
"frontend_type": "smpp",
"ip_address": "10.0.1.50",
"hostname": "gateway1.uk.example.com",
"uptime_seconds": 86400,
"configuration": {
"max_throughput": 1000,
"bind_type": "transceiver",
"system_id": "gateway1"
}
}
Champs Requis :
frontend_name- Identifiant unique pour le frontendfrontend_type- Type :smpp,sip,http, etc.
Champs Optionnels :
ip_address- IP du frontendhostname- Nom d'hôte du frontenduptime_seconds- Temps de fonctionnement depuis le démarrageconfiguration- Objet de configuration personnalisé
Réponse (201 Créé) :
{
"data": {
"id": 1,
"frontend_name": "uk_gateway_1",
"status": "active",
"expires_at": "2025-10-30T12:01:30Z",
...
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/frontends/register \
-H "Content-Type: application/json" \
-d '{
"frontend_name": "uk_gateway_1",
"frontend_type": "smpp",
"ip_address": "10.0.1.50",
"hostname": "gateway1.uk.example.com"
}'
Délai d'Inscription : 90 secondes (les frontends doivent se réinscrire toutes les 60-90 secondes)
Cas d'Utilisation : Appelé périodiquement par les systèmes frontend pour maintenir le statut actif
API de Campagnes
Messagerie en masse : téléchargez une liste de destinataires nommée, puis exécutez une campagne limitée par le taux contre celle-ci. Voir le guide de Messagerie en Masse / Campagnes pour les concepts (filtre d'audience, taux de goutte, cycle de vie, statistiques).
Listes de Destinataires
Créer une Liste
Requête :
POST /api/campaign_lists
Content-Type: application/json
Chaque destinataire peut porter jusqu'à quatre variables de modèle (var1..var4).
Corps — fournir les destinataires sous forme de tableau JSON, de chaîne CSV brute, ou les deux. Les destinataires JSON peuvent être des chaînes MSISDN simples ou des objets avec var1..var4 :
{
"name": "Clients VIP",
"description": "Abonnés de grande valeur",
"recipients": [
{ "msisdn": "12025550101", "var1": "Alice", "var2": "Gold" },
"12025550102"
]
}
Pour CSV, une ligne d'en-tête nommant une colonne msisdn / destination_msisdn / number / phone sélectionne la colonne MSISDN (sinon, la première colonne est utilisée) ; les colonnes restantes deviennent var1..var4 dans l'ordre des colonnes :
{ "name": "Importé", "csv": "msisdn,first,plan\n12025550101,Alice,Gold\n12025550102,Bob,Silver\n" }
Réponse (201 Créé) :
{ "id": 1, "name": "Clients VIP", "recipient_count": 2 }
Lister / Obtenir / Ajouter / Supprimer des Listes
GET /api/campaign_lists # toutes les listes
GET /api/campaign_lists/:id # une liste, inclut "recipients": [{msisdn, variables}, ...]
PATCH /api/campaign_lists/:id # ajouter des destinataires ({"recipients": [...]} et/ou {"csv": "..."})
DELETE /api/campaign_lists/:id # supprimer la liste et ses destinataires
Campagnes
Créer une Campagne
Requête :
POST /api/campaigns
Content-Type: application/json
Corps :
{
"name": "Avis de maintenance",
"message": "Maintenance prévue ce soir 02:00-03:00.",
"source_msisdn": "12345",
"source_smsc": "IMS_SMSC",
"list_id": 1,
"audience": "active_only",
"drip_tps": 50
}
Champs :
name,message,source_msisdn,source_smsc— requislist_id— liste de destinataires. Omettre pour cibler TOUS les abonnés actuellement actifs (enregistrés).audience—active_only(par défaut) ouall. Ignoré lorsquelist_idest omis.drip_tps— messages soumis dans la file d'attente par seconde (par défaut à partir de la configuration).validity_hours— période de validité du message en heures ; définit l'expiresde chaque message (par défaut à partir de la configuration).deliver_after— heure ISO8601 optionnelle pour maintenir les messages jusqu'à avant la livraison (envoi programmé).
Réponse (201 Créé) : la campagne dans l'état draft, incluant un bloc stats en direct.
Contrôler une Campagne (démarrer / mettre en pause / reprendre / annuler)
Requête :
POST /api/campaigns/control
Content-Type: application/json
Corps :
{ "campaign_id": 7, "action": "start" }
action est l'un de start, pause, resume, cancel. Retourne la campagne mise à jour (200), 404 si non trouvée, ou 422 si l'action est invalide pour l'état actuel.
Lister / Obtenir des Campagnes
GET /api/campaigns # toutes les campagnes (les plus récentes en premier)
GET /api/campaigns/:id # une campagne, incluant des statistiques en direct
Réponse (GET /api/campaigns/:id) :
{
"id": 7,
"name": "Avis de maintenance",
"list_id": 1,
"audience": "active_only",
"status": "running",
"drip_tps": 50,
"total_targets": 1000,
"stats": {
"total": 1000, "pending": 600, "queued": 300,
"delivered": 90, "failed": 10, "skipped_inactive": 0,
"dispatched": 400, "progress_percent": 40, "delivery_percent": 22
}
}
Supprimer (Arrêter) une Campagne
DELETE /api/campaigns/:id
La suppression arrête la campagne (annule la livraison) mais garde l'enregistrement afin que son historique et ses statistiques restent visibles ; elle retourne la campagne annulée (200). L'enregistrement est purgé automatiquement une fois qu'il dépasse le TTL de conservation.
Résultats par Destinataire
GET /api/campaign_targets/:id # :id est l'ID de la campagne
GET /api/campaign_targets/:id?state=failed # filtrer par état cible
Retourne une entrée par destinataire avec son state
(pending / queued / delivered / failed / skipped_inactive), les message_ids soumis, et les compteurs de parties.
API de Journalisation d'Événements
Suivre les événements du cycle de vie des messages.
Obtenir les Événements de Message
Requête :
GET /api/events/:message_id
Réponse (200 OK) :
{
"data": [
{
"event_epoch": 1698672000,
"name": "message_inserted",
"description": "Message inséré dans la file d'attente",
"event_source": "node1@server.example.com"
},
{
"event_epoch": 1698672001,
"name": "message_routed",
"description": "Routé vers uk_gateway via route_id=42",
"event_source": "node1@server.example.com"
},
{
"event_epoch": 1698672005,
"name": "message_delivered",
"description": "Livré avec succès",
"event_source": "node2@server.example.com"
}
]
}
Exemple :
curl https://api.example.com:8443/api/events/12345
Types d'Événements :
message_inserted- Message créémessage_routed- Décision de routage prisemessage_delivered- Livraison réussiemessage_failed- Livraison échouéemessage_dropped- Écarté par la routeauto_reply_sent- Réponse automatique déclenchéenumber_translated- Transformation de numéro appliquéerouting_failed- Aucune route trouvéecharging_failed- Erreur de facturation
Enregistrer un Événement
Requête :
POST /api/events
Content-Type: application/json
Corps :
{
"message_id": 12345,
"name": "custom_event",
"description": "Description de l'événement personnalisé",
"event_source": "external_system"
}
Réponse (201 Créé) :
{
"data": {
"message_id": 12345,
"name": "custom_event",
"description": "Description de l'événement personnalisé",
"event_source": "external_system",
"event_epoch": 1698672010
}
}
Exemple :
curl -X POST https://api.example.com:8443/api/events \
-H "Content-Type: application/json" \
-d '{
"message_id": 12345,
"name": "external_delivery_confirmed",
"description": "Confirmé par le système en aval"
}'
Conservation des Événements : 7 jours (configurable)
API de Messages MMS
Gérer les messages de Service de Messagerie Multimédia (MMS).
Lister les Messages MMS
Requête :
GET /api/mms_messages
Réponse (200 OK) : Similaire aux messages SMS avec des champs MMS supplémentaires
Créer un Message MMS
Requête :
POST /api/mms_messages
Content-Type: application/json
Corps :
{
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900000",
"subject": "Photo",
"content_type": "image/jpeg",
"content_location": "https://cdn.example.com/media/12345.jpg",
"message_size": 524288
}
Réponse (201 Créé) : Objet complet du message MMS
API d'Événements SS7
Suivre les événements de signalisation SS7.
Lister les Événements SS7
Requête :
GET /api/ss7_events
Réponse (200 OK) :
{
"data": [
{
"id": 1,
"event_type": "MAP_UPDATE_LOCATION",
"imsi": "001001000000001",
"msisdn": "+15551234567",
"timestamp": "2025-10-30T12:00:00Z",
...
}
]
}
Créer un Événement SS7
Requête :
POST /api/ss7_events
Content-Type: application/json
Corps :
{
"event_type": "MAP_UPDATE_LOCATION",
"imsi": "001001000000001",
"msisdn": "+15551234567"
}
Réponse (201 Créé) : Objet complet de l'événement
Codes d'Erreur
Codes de Statut HTTP
| Code | Signification | Description |
|---|---|---|
| 200 | OK | Requête réussie |
| 201 | Créé | Ressource créée avec succès |
| 202 | Accepté | Requête acceptée pour traitement |
| 204 | Pas de Contenu | Suppression réussie |
| 400 | Mauvaise Requête | Format de requête invalide |
| 401 | Non Autorisé | Authentification requise |
| 403 | Interdit | Permissions insuffisantes |
| 404 | Non Trouvé | La ressource n'existe pas |
| 422 | Entité Non Traitable | Erreurs de validation |
| 429 | Trop de Requêtes | Limite de taux dépassée |
| 500 | Erreur Interne du Serveur | Erreur du serveur |
| 503 | Service Indisponible | Temporairement indisponible |
Format de Réponse d'Erreur
{
"errors": {
"detail": "Échec de la validation : destination_msisdn est requis"
}
}
Messages d'Erreur Courants
| Erreur | Cause | Solution |
|---|---|---|
| "destination_msisdn est requis" | Champ requis manquant | Inclure destination_msisdn dans la requête |
| "Format de numéro de téléphone invalide" | Numéro mal formé | Utiliser le format E.164 : +15551234567 |
| "Message trop long" | Dépasse la limite de taille | Diviser en plusieurs parties |
| "Aucune route trouvée" | Échec de routage | Vérifier la configuration de routage |
| "Échec de facturation" | Erreur OCS | Vérifier la connectivité du système de facturation |
| "Message non trouvé" | ID de message invalide | Vérifier que l'ID existe |
| "Frontend non enregistré" | SMSC inconnu | Enregistrer le frontend d'abord |
Limitation de Taux
Limites par Défaut
| Point de Terminaison | Limite | Fenêtre |
|---|---|---|
| POST /api/messages | 100 req/sec | Par IP |
| POST /api/messages/create_async | 1000 req/sec | Par IP |
| POST /api/messages_raw | 100 req/sec | Par IP |
| GET /api/* | 1000 req/sec | Par IP |
En-têtes de Limitation de Taux
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1698672060
Limite de Taux Dépassée
Réponse (429 Trop de Requêtes) :
{
"errors": {
"detail": "Limite de taux dépassée. Réessayez après 5 secondes."
}
}
Meilleures Pratiques
Soumission de Messages
- Utiliser Async pour le Bulk : Utiliser
/create_asyncpour > 100 msg/sec - Inclure source_smsc : Identifier toujours votre système
- Valider les Numéros : Utiliser le format E.164 (+code pays)
- Gérer les Erreurs : Implémenter une logique de réessai pour les erreurs 5xx
- Vérifier le Routage : Tester les routes avant la soumission en masse
Intégration Frontend
- S'inscrire Régulièrement : Se réinscrire toutes les 60 secondes
- Interroger pour les Messages : Interroger avec l'en-tête
smscpour vos messages - Utiliser include-unrouted Judicieusement : Par défaut, seuls les messages avec routage explicite ou enregistrement de localisation sont retournés. Définir
include-unrouted: trueuniquement si vous avez besoin d'un comportement rétrocompatible pour recevoir tous les messages non routés - Marquer Comme Livré : Toujours appeler mark_delivered après succès
- Incrémenter en Cas d'Échec : Utiliser l'endpoint PUT pour la logique de réessai
- Surveiller les Événements : Vérifier le journal des événements pour les problèmes de livraison
Performance
- Mise en Cache des Connexions : Réutiliser les connexions HTTP
- Requêtes par Lots : Regrouper plusieurs messages par requête
- Traitement Parallèle : Effectuer des appels API concurrents
- Surveiller les Métriques : Regarder Prometheus pour les goulets d'étranglement
- Définir des Délais : Utiliser un délai de 30 secondes pour les appels API
Sécurité
- Utiliser TLS : Toujours utiliser HTTPS en production
- Valider les Certificats : Ne pas ignorer la validation des certificats
- Faire Pivoter les Clés API : Changer régulièrement les clés
- Liste Blanche d'IP : Restreindre aux sources connues
- Journaliser l'Activité API : Surveiller les modèles suspects
Gestion des Erreurs
- Réessayer les Erreurs 5xx : Les erreurs du serveur sont généralement temporaires
- Ne Pas Réessayer les 4xx : Les erreurs du client nécessitent des corrections de code
- Backoff Exponentiel : Attendre plus longtemps entre les réessais
- Disjoncteur : Arrêter après des échecs répétés
- Alerte sur les Modèles : Surveiller les taux d'erreur
Exemple d'Intégration (Python)
import requests
import time
class SMSCClient:
def __init__(self, base_url, api_key=None):
self.base_url = base_url
self.session = requests.Session()
if api_key:
self.session.headers.update({"X-API-Key": api_key})
def submit_message(self, from_num, to_num, text, async_mode=False):
endpoint = "/messages/create_async" if async_mode else "/messages"
url = f"{self.base_url}{endpoint}"
payload = {
"source_msisdn": from_num,
"destination_msisdn": to_num,
"message_body": text,
"source_smsc": "python_client"
}
try:
response = self.session.post(url, json=payload, timeout=30)
response.raise_for_status()
return response.json()["data"]
except requests.exceptions.RequestException as e:
print(f"Erreur API : {e}")
return None
def get_pending_messages(self, smsc_name, include_unrouted=False):
url = f"{self.base_url}/messages"
headers = {"smsc": smsc_name}
# Inclure les messages non routés si demandé (mode rétrocompatible)
if include_unrouted:
headers["include-unrouted"] = "true"
try:
response = self.session.get(url, headers=headers, timeout=30)
response.raise_for_status()
return response.json()["data"]
except requests.exceptions.RequestException as e:
print(f"Erreur API : {e}")
return []
def mark_delivered(self, message_id, smsc_name):
url = f"{self.base_url}/messages/{message_id}/mark_delivered"
payload = {"dest_smsc": smsc_name}
try:
response = self.session.post(url, json=payload, timeout=30)
response.raise_for_status()
return True
except requests.exceptions.RequestException as e:
print(f"Erreur API : {e}")
return False
# Utilisation
client = SMSCClient("https://api.example.com:8443/api", api_key="your_key")
# Soumettre un message unique
result = client.submit_message("+15551234567", "+447700900000", "Hello")
print(f"ID du message : {result['id']}")
# Soumettre des messages en masse (asynchrone)
for i in range(1000):
client.submit_message("+15551234567", f"+44770090{i:04d}", f"Bulk {i}", async_mode=True)
# Boucle de sondage frontend
while True:
# Obtenir des messages avec routage explicite ou enregistrement de localisation
messages = client.get_pending_messages("my_gateway")
# Ou utiliser include_unrouted=True pour un comportement rétrocompatible
# messages = client.get_pending_messages("my_gateway", include_unrouted=True)
for msg in messages:
# Livrer le message via votre protocole
success = deliver_via_smpp(msg)
if success:
client.mark_delivered(msg["id"], "my_gateway")
else:
# Incrémenter pour réessayer
requests.put(f"{client.base_url}/messages/{msg['id']}")
time.sleep(5) # Sonde toutes les 5 secondes
Journal des Changements de l'API
Version 1 (Actuelle)
- Version initiale
- CRUD de la file d'attente de messages
- Soumission de PDU brut
- Gestion de la localisation
- Inscription frontend
- Journalisation des événements
Fonctionnalités Prévues
- Soumission de messages par lots (une seule requête, plusieurs messages)
- Modèles de messages
- API de livraison programmée
- Webhooks en temps réel pour les événements
- Point de terminaison API GraphQL
- Authentification OAuth2
Pour des questions ou des problèmes avec l'API, consultez le Guide de Dépannage ou contactez le support.