Aller au contenu

Limites de caractères et segments

Le SMS sur GSM a une limite stricte de 160 caractères par segment pour le contenu ASCII. Les messages plus longs sont découpés en plusieurs segments, chacun facturé comme un SMS séparé. Lisoloo calcule le nombre de segments à la soumission et facture en conséquence.

Longueur (caractères)TypeNombre de SMS
1160SMS standard1
161320SMS long (2 segments)2
321480SMS long (3 segments)3
481640SMS long (4 segments)4
concaténéceil(len / 153) après le premier segment
jusqu’à 1600Maximum10

Pour les messages multi-segments la capacité par segment chute de 160 à 153 caractères — les 7 caractères supplémentaires par segment sont consommés par l’en-tête UDH (User Data Header) que l’opérateur utilise pour réassembler le message sur le combiné.

Un message de plus de 1 600 caractères est rejeté avec 1110 INVALID_FIELD_FORMAT à la soumission.

total_cost = total_recipients × segments_per_message × unit_price

unit_price est votre prix au niveau marchand par segment SMS dans currency, retourné par GET /balance. Un message de 200 caractères vers 50 destinataires à 0,02 $ par segment coûte 50 × 2 × 0,02 = 2,00 $.

Les messages contenant des caractères hors de l’alphabet GSM 03.38 (n’importe quel emoji, certains caractères accentués dans certains scripts, CJK, arabe, …) sont envoyés en UCS-2 (16 bits par caractère). Les segments UCS-2 plafonnent à 70 caractères en mono-segment, 67 caractères par segment quand concaténés. Un seul 🎉 où que ce soit dans le corps bascule l’ensemble du message en UCS-2.

EncodageMonoConcaténé
GSM 7-bit160153
UCS-2 (tout caractère non-GSM)7067

Si vous ne connaissez pas votre jeu de caractères à l’avance, supposez UCS-2 pour l’estimation de coût.

POST /send retourne le nombre de segments calculé pour le lot :

{
"data": {
"message_id": "...",
"total_recipients": 50,
"total_messages": 100,
"total_cost": 2.00,
"currency": "USD",
"status": "pending"
}
}
  • total_recipients est len(to).
  • total_messages est total_recipients × segments_per_message.
  • total_cost est total_messages × unit_price, déduit de votre solde à la soumission.

Pour les envois planifiés ou récurrents les totaux reflètent tout le planning, pas par-occurrence.

Si vous voulez estimer le coût avant d’appeler POST /send, comptez les segments côté client :

def segments(message: str) -> int:
is_gsm = all(c in GSM_03_38 for c in message)
n = len(message)
if is_gsm:
return 1 if n <= 160 else (n + 152) // 153
return 1 if n <= 70 else (n + 66) // 67

La table complète des caractères GSM 03.38 est à 3GPP TS 23.038.