API de passerelle de messagerie
Une seule API pour tous les canaux de messagerie
Envoyez des messages WhatsApp Business, SMS, Telegram, Messenger, Instagram et TikTok par un seul point de terminaison REST. Prépayé, facturé au message sortant, avec webhooks de distribution et mode test.
- À partir de
- 0,0003 $
- par message sortant
- À l’inscription
- 100
- messages gratuits
- Engagement
- Aucun
- prépayé, sans contrat
curl https://api.omnimessage.co/v1/messages \
-H "Authorization: Bearer om_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-shipped" \
-d '{
"channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
"to": "+971501234567",
"type": "text",
"text": { "body": "Your order #1042 has shipped." },
"reference": "order-1042"
}'{
"id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
"object": "message",
"mode": "live",
"channel_id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"channel_type": "whatsapp",
"direction": "outbound",
"to": "+971501234567",
"from": "+971800123456",
"type": "text",
"content": {
"text": { "body": "Your order #1042 has shipped." }
},
"status": "queued",
"error": null,
"reference": "order-1042",
"metadata": {},
"billing": {
"source": "wallet",
"amount_micros": 1000,
"package_grant_id": null,
"refunded": false
},
"created_at": "2026-10-05T09:30:00.000Z",
"sent_at": null,
"delivered_at": null,
"read_at": null,
"failed_at": null
}Canaux
Sept types de canaux, une seule forme de requête
Connectez les expéditeurs que vous possédez déjà. Chacun devient un ID de canal que vous transmettez au même point de terminaison, et chacun renvoie les mêmes statuts.
- 0,001 $WhatsApp BusinessModèles, messages interactifs et médias sur votre propre numéro Cloud API.Texte · Pièces jointes · Modèle · Boutons de réponse · Liste · Bouton URL · Position · Contacts
- 0,0005 $SMSMessages texte et médias depuis votre propre numéro Twilio.Texte · Pièces jointes
- 0,0005 $SMS OTPUne route réservée au texte pour les codes à usage unique.Texte
- 0,0003 $TelegramMessages de bot avec boutons, sondages, positions et médias.Texte · Pièces jointes · Boutons de réponse · Position · Contacts · Sondage
- 0,0005 $MessengerConversations avec les personnes qui écrivent à votre Page Facebook.Texte · Pièces jointes · Boutons de réponse
- 0,0005 $InstagramMessages privés pour un compte professionnel Instagram.Texte · Pièces jointes · Boutons de réponse
- 0,0005 $TikTokMessages privés pour un compte professionnel TikTok.Texte · Pièces jointes · Boutons de réponse
- Apportez vos propres canauxVos numéros et vos bots restent les vôtresVoir ce qu’il faut pour chaque canal
Fonctionnement
De l’inscription au message distribué en quatre étapes
Pas d’appel commercial, pas d’engagement minimum. Vous pouvez effectuer votre premier appel API en mode test une minute après avoir créé votre compte.
- Étape 01
Créez un compte
Inscrivez-vous, vérifiez votre adresse e-mail et créez une clé API dans la console. Les clés de test fonctionnent immédiatement, avant même qu’un canal soit connecté.
- Étape 02
Connectez un canal
Connectez-vous avec Facebook ou TikTok dans la console pour connecter un numéro WhatsApp, une Page ou un compte professionnel. Ajoutez un bot Telegram ou un numéro Twilio avec ses identifiants, dans la console ou avec
POST /v1/channels. - Étape 03
Envoyez par un seul point de terminaison
POST /v1/messagesprend un ID de canal, un destinataire et un objet de contenu typé. La forme de la requête est la même sur tous les canaux. - Étape 04
Suivez chaque distribution
Des webhooks signés signalent les statuts envoyé, distribué, lu et échec. Le même historique est disponible dans la console et avec
GET /v1/messages.
Types de messages
Ce que vous envoyez est ce qu’ils voient
Chaque message a un type et un objet de contenu placé sous la clé de ce type. Choisissez-en un pour voir le corps de la requête à côté du message qu’il produit.
{
"channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
"to": "+971501234567",
"type": "text",
"text": {
"body": "Votre commande n° 1042 a été expédiée. Suivez-la sur https://example.com/t/1042",
"preview_url": true
},
"reference": "order-1042"
}Du texte brut, accepté par tous les types de canaux. Définissez preview_url pour laisser le canal afficher un aperçu du lien.
CanauxWhatsApp Business, SMS, SMS OTP, Telegram, Messenger, Instagram et TikTok
Console
Une console pour tout ce qui n’est pas du code
Créez des clés, connectez des canaux, recherchez dans le journal des messages, rejouez des livraisons de webhooks et gérez la facturation. Tout ce qu’affiche la console est également disponible par l’API.
Tarifs
Payez au message, ou achetez des messages en volume
Rechargez un portefeuille prépayé à partir de 10 $ et payez le prix par message de chaque canal, ou achetez un forfait de crédits de messages pour vos volumes sur vos canaux les plus chers.
10 k messages
8 $
0,0008 $ par message
- 10 000 messages sortants
- Valable 3 mois à compter de l’achat
- Valable sur tous les types de canaux
100 k messages
Recommandé60 $
0,0006 $ par message
- 100 000 messages sortants
- Valable 6 mois à compter de l’achat
- Valable sur tous les types de canaux
1 M messages
400 $
0,0004 $ par message
- 1 000 000 messages sortants
- Valable 12 mois à compter de l’achat
- Valable sur tous les types de canaux
Paiement à l’usage
| Canal | Par message |
|---|---|
| WhatsApp Business | 0,001 $ |
| Telegram | 0,0003 $ |
| SMS | 0,0005 $ |
| SMS OTP | 0,0005 $ |
| Messenger | 0,0005 $ |
| 0,0005 $ | |
| TikTok | 0,0005 $ |
Ce que couvre le prix
- FacturéLes messages sortants acceptés par l’API, au moment où ils sont acceptés.
- GratuitLes messages entrants, les messages en mode test, les webhooks et la console.
- RembourséTout message qui se termine en échec, sur le forfait ou le portefeuille d’où il provenait.
- À partLes frais que Meta, les opérateurs ou d’autres fournisseurs facturent pour le canal lui-même.
Expérience développeur
Conçu pour être intégré une fois, puis oublié
Des webhooks signés, des nouvelles tentatives sans risque, un bac à sable qui se comporte comme la production et des erreurs sur lesquelles votre code peut s’appuyer.
Des webhooks vérifiables
Chaque livraison est signée en HMAC-SHA256 sur l’horodatage et le corps brut, dans l’en-tête OmniMessage-Signature. Répondez avec n’importe quel statut 2xx dans un délai de 10 secondes. Les livraisons en échec font l’objet de huit nouvelles tentatives à intervalles croissants, de 30 secondes à 24 heures.
import { createHmac, timingSafeEqual } from 'node:crypto';
// header is "t=<unix seconds>,v1=<hex hmac-sha256>"
export function verifySignature(rawBody, header, secret) {
const parts = header.split(',').map((part) => part.split('='));
const { t, v1 = '' } = Object.fromEntries(parts);
const expected = createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
const matches =
v1.length === expected.length &&
timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
return fresh && matches;
}{
"id": "evt_8Kd2pQ7wN4xB1zR6mT3c",
"object": "event",
"type": "message.delivered",
"mode": "live",
"created_at": "2026-10-05T09:30:02.900Z",
"data": {
"object": {
"id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
"object": "message",
"status": "delivered",
"reference": "order-1042",
"delivered_at": "2026-10-05T09:30:02.871Z"
}
}
}Un mode test qui ne coûte rien
Les clés de test utilisent des canaux bac à sable intégrés : il n’y a donc rien à connecter. Les derniers chiffres du destinataire déterminent le résultat simulé, et vos webhooks se déclenchent comme en production.
curl https://api.omnimessage.co/v1/messages \
-H "Authorization: Bearer om_test_..." \
-H "Content-Type: application/json" \
-d '{
"channel": "ch_test_whatsapp",
"to": "+971501230002",
"type": "text",
"text": { "body": "Hello from the sandbox" }
}'Des erreurs dotées d’un type et d’un code
Toute réponse autre que 2xx a le même corps : un type pour la catégorie d’échec, un code stable sur lequel fonder votre logique, le param en cause lorsqu’il y en a un, et un request_id pour l’assistance.
{
"error": {
"type": "billing_error",
"code": "insufficient_balance",
"message": "Not enough wallet balance or package credits.",
"request_id": "req_5Vn1cH8jL3qW6yD9sF2k",
"doc_url": "https://omnimessage.co/docs/errors#insufficient_balance"
}
}Des POST idempotents
Envoyez un en-tête
Idempotency-Key: une nouvelle tentative dans les 24 heures renvoie la réponse enregistrée avecIdempotent-Replayed: true, sans envoyer ni facturer deux fois.Des limites prévisibles
100 requêtes par seconde et par clé sur
POST /v1/messages, 20 ailleurs. Chaque réponse contientRateLimit-Remaining, et une réponse 429 contientRetry-After.Envoi par lots
POST /v1/messages/batchaccepte jusqu’à 100 messages. Chaque élément est accepté, rejeté et facturé séparément, et la réponse 207 les détaille par indice.Des clés à portée limitée
Donnez à chaque clé uniquement les portées dont elle a besoin, par exemple
messages:writeoubilling:read, et restreignez-la à une liste d’adresses IP autorisées.
Questions
Avant d’intégrer
Les réponses courtes. La documentation contient les réponses détaillées.
Ai-je besoin de mon propre numéro WhatsApp, bot ou numéro SMS ?
Oui. OmniMessage est une passerelle à laquelle vous apportez vos propres canaux : vous connectez votre propre numéro WhatsApp Cloud API, bot Telegram, numéro Twilio ou compte social, et vous en restez propriétaire. La page Canaux indique ce qu’il faut pour chaque type.
Qu’est-ce qui m’est facturé exactement ?
Un débit par message sortant accepté par l’API : un crédit de forfait si vous en avez un, sinon le prix par message du type de canal, prélevé sur votre portefeuille. Les messages entrants et les messages en mode test sont gratuits, et un message qui se termine en échec est remboursé automatiquement.
Les frais de Meta, des opérateurs ou des fournisseurs sont-ils inclus ?
Non. Les frais de passerelle couvrent l’API, le suivi de distribution, les webhooks et la console. Les frais que Meta, Twilio ou un autre fournisseur facturent pour le canal lui-même restent entre vous et ce fournisseur.
Comment tester sans envoyer de vrais messages ?
Utilisez une clé commençant par om_test_. Chaque compte dispose d’un canal bac à sable par type, par exemple ch_test_whatsapp. Rien n’est distribué ni facturé et les statuts sont simulés : un destinataire se terminant par 0000 échoue, 0001 reste à l’état envoyé, 0002 est en plus lu, et tout autre destinataire est distribué en deux secondes environ.
Que se passe-t-il lorsque mon solde est épuisé ?
L’API répond 402 insufficient_balance et rien n’est mis en file d’attente : vous ne devez donc jamais d’argent après coup. Vous pouvez vous abonner à l’événement balance.low ou activer la recharge automatique pour recharger le portefeuille lorsqu’il passe sous le seuil de votre choix.
Ai-je besoin d’un SDK ?
Non. L’API utilise du JSON sur HTTPS avec une authentification par jeton bearer : n’importe quel client HTTP convient. La documentation propose des exemples en cURL, Node, Python et PHP.
Envoyez votre premier message en mode test dès aujourd’hui
Créez un compte, copiez une clé de test et appelez l’API avant même de connecter un canal. Chaque nouveau compte démarre avec 100 messages gratuits.