Documentation interactive · Portail développeurs · Spécification OpenAPI · EN · FR · DE · IT · PT · ES
URL de base : https://api.mailpro.com/sms
L'API SMS Mailpro™ vous permet de gérer par programmation des listes de contacts téléphoniques, des numéros de téléphone, et d'envoyer des SMS en masse ou individuels.
Chaque endpoint accepte trois méthodes d'authentification. Utilisez celle qui convient à votre pile technique.
POST /token, sans portée.> Les méthodes legacy Bearer JWT et id_client+api_key continuent de fonctionner sans changement et ne > sont pas soumises au contrôle de portée. Seuls les jetons d'accès OAuth 2.0 sont soumis aux > contrôles de portée par endpoint indiqués sur chaque opération ci-dessous.
Mailpro exploite un seul serveur d'autorisation OAuth 2.0 pour l'ensemble de ses APIs, exposé sur une surface unique et indépendante de la version : https://api.mailpro.com/oauth/. Il n'existe pas d'endpoint OAuth par version — vous obtenez un jeton depuis /oauth/token et le même jeton fonctionne sur cette API SMS, sur le CRM v3 et sur l'Email v2. Les endpoints qu'il peut appeler sont déterminés par les portées du jeton, et non par l'URL de base de l'API. Émetteur (claim iss) : https://api.mailpro.com/oauth/.
| Endpoint | URL |
|---|---|
| Autorisation | GET https://api.mailpro.com/oauth/authorize |
| Jeton / Rafraîchissement | POST https://api.mailpro.com/oauth/token |
| JWKS | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Découverte | GET https://api.mailpro.com/oauth/.well-known/openid-configuration |
Grants : authorization_code + PKCE (S256, obligatoire), client_credentials, refresh_token (rotation). Durée de vie du jeton d'accès 20 min ; jeton de rafraîchissement 30 jours (glissant, à usage unique) ; code d'autorisation 60 s.
Démarrage rapide — obtenir un jeton et appeler cette API (remplacez les valeurs d'exemple ; ne versionnez jamais un véritable secret) :
curl -X POST https://api.mailpro.com/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "scope=sms:send sms:read"
Puis appelez cette API avec Authorization: Bearer ACCESS_TOKEN. Le même jeton fonctionne sur les APIs CRM v3 et Email v2. Un jeton dépourvu de la portée requise par un endpoint reçoit 403 insufficient_scope. Présentation complète du flux et catalogue des portées : consultez la documentation de l'API CRM v3 › Authentification. Portées propres au SMS : sms:send, sms:read, sms:contacts:read, sms:contacts:write, account:read.
Authorization: Bearer <access_token>
Obtenez un jeton via POST /token (encodé en formulaire, grant OAuth2 password) :
POST https://api.mailpro.com/sms/token
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY
Le même jeton est également valide sur l'API CRM v3 et l'API Email v2 — authentifiez-vous une fois, appelez n'importe quelle API. Les jetons sont valides 30 jours par défaut ; utilisez grant_type=refresh_token pour les renouveler sans avoir à se réauthentifier. Sans portée — préférez OAuth 2.0 pour les intégrations installables.
Deux identifiants :
| Paramètre | Type | Description |
|---|---|---|
id_client | entier | Votre identifiant client numérique Mailpro, disponible dans Paramètres → Accès API |
api_key | chaîne | Votre clé API (format GUID), disponible dans Paramètres → Accès API |
Envoyez-les à l'un des emplacements suivants — choisissez-en un :
id_client: 12345 et api_key: a1b2c3d4-…. Les URLs sont journalisées par les serveurs web, les CDN et les proxys, si bien qu'une clé placée dans la chaîne de requête peut fuiter dans les journaux d'accès. Les en-têtes, eux, ne sont pas journalisés.?id_client=12345&api_key=…. Conservée pour la rétrocompatibilité avec les intégrations existantes. Basculez vers les en-têtes dès que possible.Si vous fournissez les identifiants à plusieurs endroits, l'en-tête l'emporte.
Pour les jetons émis par OAuth, chaque groupe d'endpoints exige une portée (les authentifications legacy en sont exemptes). Chaque opération indique sa portée sous Autorisation. Synthèse :
| Endpoints | Portée requise |
|---|---|
/send/* (envoi en masse, unitaire, planifié) | sms:send |
/history/list, /credit/get | sms:read |
/phone/list, /list/list | sms:contacts:read |
/phone/{add,edit,del}, /list/{edit,del}, /import/upload | sms:contacts:write |
/account/limits | account:read |
> POST /list/add (création d'une liste) est actuellement accessible avec tout > jeton valide — il n'est pas encore soumis au contrôle de portée. Un rejet de portée sur les > endpoints contrôlés renvoie 403 avec > { "error": "insufficient_scope", "required_scope": "…" }.
Tous les endpoints prennent en charge json (par défaut) et xml. Spécifiez le format dans l'URL :
/credit/get.json/credit/get.xmlLes noms de champs dans les réponses sont en PascalCase (TotalCredits, FirstName, …), tandis que les paramètres de requête sont en snake_case (id_client, address_book_id, …). Les endpoints de liste encapsulent leurs lignes dans un tableau Items.
Même règle sur les trois API Mailpro (Email v2, CRM v3, SMS) : 5 000 éléments par page, par défaut comme au maximum.
NumberOfRecords — éléments par page. Absent, 0 ou au-delà de 5 000 = 5 000.PageNumber — numéro de page à partir de 1 (par défaut 1).Paramètres inconnus : ils sont ignorés, jamais refusés. Quand une requête porte un paramètre que l'API ne reconnaît pas, la réponse contient X-Ignored-Parameters (les noms) et X-Documentation (un lien vers cette page), pour qu'une faute de frappe ne passe pas inaperçue.
Un SMS coûte crédits du pays × nombre de parts.
Crédits du pays — chaque pays de destination a un prix de 1, 2 ou 3 crédits, selon le préfixe international du numéro. L'envoi vers un numéro dont le préfixe n'est pas tarifé est rejeté avec un 400.
Nombre de parts — un message plus long qu'un SMS est découpé par l'opérateur et chaque part est facturée. La limite dépend des caractères utilisés :
| Alphabet | Message unique | Par part si découpé |
|---|---|---|
| GSM-7 (latin standard) | 160 caractères | 153 caractères |
| Unicode (accents hors GSM-7, cyrillique, emoji, …) | 70 caractères | 67 caractères |
Un seul caractère hors GSM-7 fait passer tout le message en Unicode ; ainsi un emoji peut faire passer un message de 160 caractères de 1 à 3 parts. Les caractères ^ { } [ ] ~ | \ et € comptent pour deux chacun, bien qu'ils soient GSM-7.
*Exemple :* un message de 300 caractères en latin standard = 2 parts ; envoyé vers un pays à 2 crédits, il coûte 2 × 2 = 4 crédits par destinataire.
Les numéros de téléphone sont normalisés automatiquement. Vous pouvez les envoyer sous de nombreux formats — les espaces, tirets, points, barres obliques, parenthèses, traits de soulignement et espaces insécables sont supprimés avant validation. Tout autre caractère (lettres, apostrophes, =, ;, etc.) rend le numéro invalide.
| Valide | Invalide |
|---|---|
+41794849980 — international E.164 | 0612345678 — format national (commence par 0) |
0041 79 484 99 80 — préfixe 00 + espaces | 41'794'849'80 — apostrophes (non supprimées) |
+33 6-12-34-56-78 — + avec tirets | tel=0041794849980 — caractères additionnels |
41794849980 — chiffres bruts | 1234567 — trop court (< 8 chiffres) |
Règles :
+, 00, ou aucun préfixe0)-, point ., barre oblique /, parenthèses ( ), trait de soulignement _, NBSP=, ;, + au milieu du numéro, etc.) → rejeté41794849980)| HTTP | Code | Signification |
|---|---|---|
| 400 | 103 | Entrée malformée — paramètre requis manquant ou invalide |
| 202 | 202 | Crédits SMS insuffisants |
| 401 | id_client / api_key invalides | |
| 500 | 500 | Erreur interne |
Mailpro™ peut notifier votre serveur en temps réel lorsque des événements SMS se produisent sur votre compte (un SMS est délivré, un SMS échoue, votre solde de crédits est bas, etc.). À la manière de Stripe — votre URL reçoit un POST signé en HMAC-SHA256 dès que l'événement se déclenche.
Chaque événement envoyé à votre webhook compte pour 1 requête dans votre quota de requêtes API.
POST /webhooks. La réponse contient un secret affiché une seule fois (à la manière de Stripe / GitHub) — conservez-le.secret (extraits de code ci-dessous).> ⏱ Délai d'activation — après la création, la mise à jour ou la suppression d'un webhook, le > changement met jusqu'à 10 minutes à se propager sur l'ensemble des serveurs de l'API > Mailpro. Pendant ce délai, les événements peuvent ne pas correspondre encore à votre nouvel > abonnement (ou correspondre encore à un abonnement tout juste supprimé). C'est le temps > nécessaire au rafraîchissement du cache d'abonnements en mémoire sur chaque instance d'API.
Tous les événements partagent une enveloppe commune :
{
"id": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"type": "sms.queued",
"created": 1748194800,
"apiVersion": "sms",
"account": { "id": 12345, "name": "ACME Corp" },
"data": {
"messageId": 12345,
"to": "41791234567",
"queuedAt": "2026-05-27T14:32:12.0123456Z",
"scheduledAt": "2026-05-27T14:32:12.0123456Z",
"parts": 1
}
}
| Champ | Format | Description |
|---|---|---|
id | evt_ + 32 hex | Identifiant unique d'événement — à utiliser comme clé d'idempotence de votre côté. |
type | <domaine>.<verbe> | Type d'événement canonique. |
created | secondes Unix UTC | Inclus dans la signature HMAC. |
apiVersion | "sms" pour les événements émis par POST /sms/send/add_single ; "v3" pour les événements émis par POST /v3/Sms/SingleSMS ; "watcher" pour les événements pilotés par DLR émis par le worker. | Quel composant Mailpro a publié l'événement. |
account.id | int | Votre identifiant client Mailpro (= id_client). |
account.name | string | Le nom de votre compte (pratique pour le débogage côté client). |
data | object | Charge utile de l'événement — la forme dépend de type (voir catalogue ci-dessous). |
Seuls les événements listés ci-dessous sont effectivement émis. Les formes correspondent au JSON littéral envoyé par la plateforme — faites correspondre ces noms de champs à l'identique lors du parsing.
| Événement | Déclencheur | Forme de data |
|---|---|---|
ping | Test via POST /webhooks/{id}/test | { message } |
sms.queued | POST /sms/send/add_single ou POST /v3/Sms/SingleSMS accepté dans la file d'envoi Mailpro | { messageId: int, to: string, queuedAt: ISO-8601, scheduledAt: ISO-8601, parts: int } |
sms.delivered | DLR avec code opérateur 004 ou 008 (codes de succès) | { messageId: int, phone: string, stateCode: string, dlrDate: datetime } |
sms.failed | DLR avec tout autre code opérateur (timeout, non délivré, rejeté, blacklisté, …) | { messageId: int, phone: string, stateCode: string, dlrDate: datetime } |
credits.sms.low | Le solde de crédits SMS est passé sous votre seuil d'alerte (worker CreditsLowWatcher) | { remaining: int, threshold: int, alertedAt: ISO-8601 } |
> Remarque — il n'existe pas d'événement sms.sent. Le DLR opérateur est le seul retour > que la plateforme reçoit entre les états « en file d'attente » et « délivré/échoué » ; ainsi, l'événement > suivant sms.queued est soit sms.delivered (succès), soit sms.failed (erreur). > La plupart des messages atteignent l'opérateur en quelques secondes, et un DLR en quelques minutes ; > les conditions du réseau mobile peuvent occasionnellement étendre ce délai à plusieurs heures.
> Nommage des champs — sms.queued utilise to (le destinataire tel que soumis par > l'appelant de l'API, après normalisation). sms.delivered / sms.failed utilisent > phone (le destinataire tel que renvoyé par l'opérateur sur le DLR). En pratique, il s'agira des > mêmes chiffres, mais les noms diffèrent parce que les événements proviennent de chemins de > code distincts.
Abonnez-vous à tous les événements de cette API en passant ["*"] dans le tableau events.
Chaque POST embarque un en-tête X-Mailpro-Signature :
X-Mailpro-Signature: t=1748194800,v1=7f9ac2b6e4d1c8a3...
X-Mailpro-Event-Id: evt_8f3a9b2c4d1e5f6789abcdef01234567
X-Mailpro-Event-Type: sms.delivered
X-Mailpro-Attempt: 1
Pour la vérifier :
t et v1 de l'en-tête.|now - t| > 300 (fenêtre anti-rejeu de 5 minutes).expected = hex(HMAC_SHA256(secret, t + "." + raw_body)).v1 avec expected (crypto.timingSafeEqual, hash_equals, CryptographicOperations.FixedTimeEquals) — jamais avec ==.const crypto = require('crypto');
function verifyMailproSignature(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
if (Math.abs(Date.now() / 1000 - parseInt(parts.t)) > 300) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(parts.t + '.' + rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(parts.v1, 'hex'),
Buffer.from(expected, 'hex'));
}
function verifyMailproSignature(string $rawBody, string $header, string $secret): bool {
parse_str(str_replace(',', '&', $header), $p);
if (abs(time() - (int)$p['t']) > 300) return false;
$expected = hash_hmac('sha256', $p['t'] . '.' . $rawBody, $secret);
return hash_equals($expected, $p['v1']);
}
import hmac, hashlib, time
def verify_mailpro_signature(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split('=') for p in header.split(','))
t = int(parts['t'])
if abs(time.time() - t) > 300:
return False
expected = hmac.new(
secret.encode(),
f"{t}.".encode() + raw_body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, parts['v1'])
using System.Security.Cryptography;
using System.Text;
static bool VerifyMailproSignature(string rawBody, string header, string secret) {
var parts = header.Split(',')
.Select(p => p.Split('='))
.ToDictionary(a => a[0], a => a[1]);
var t = long.Parse(parts["t"]);
if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300) return false;
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes($"{t}.{rawBody}"));
var expected = Convert.ToHexString(hash).ToLowerInvariant();
return CryptographicOperations.FixedTimeEquals(
Encoding.UTF8.GetBytes(expected),
Encoding.UTF8.GetBytes(parts["v1"]));
}
| Tentative | Délai avant la prochaine tentative |
|---|---|
| 1 → 2 | 10 secondes |
| 2 → 3 | 1 minute |
| 3 → 4 | 5 minutes |
| 4 → 5 | 30 minutes |
| 5 → 6 | 2 heures |
| 6 → 7 | 6 heures |
| 7 | abandonné (livraison marquée failed) |
Après 10 échecs consécutifs sur le même webhook, celui-ci est automatiquement désactivé (isActive: false) et vous recevez un e-mail de notification. Réactivez-le avec PUT /webhooks/{id} une fois votre endpoint corrigé.
Nous considérons votre webhook comme réussi uniquement si vous renvoyez un statut compris dans 200–299. Tout 3xx/4xx/5xx ou un timeout (> 10 s) est compté comme un échec et déclenche des réessais. Si votre endpoint est définitivement hors service, renvoyez explicitement 410 Gone — les réessais ont quand même lieu, mais le motif de l'échec est plus clair dans votre journal de livraison.
| Limite | Valeur |
|---|---|
| Webhooks par compte | 20 |
| Événements souscrits par webhook | 50 |
| Taille maximale de la charge utile | 256 Ko |
| Timeout HTTP par tentative | 10 secondes |
| Rétention de l'historique de livraison | 30 jours |
Obtenez un jeton Bearer JWT permettant d’authentifier tous les autres appels à l’API. L’endpoint /token du service SMS est une redirection 307 vers l’émetteur canonique /v3/token — votre client HTTP suit la redirection de manière transparente (la méthode POST et le corps sont conservés).
/tokenObtenir un jeton d’accès (redirection 307 vers /v3/token)
Obtient un jeton Bearer JWT à l’aide des identifiants client Mailpro. Transmettez l’access_token retourné en tant que Authorization: Bearer <token> dans toutes les requêtes suivantes. Le même jeton est également valable sur l’API CRM v3 et l’API Email v2.
> ⚙ Détail d’implémentation — POST /sms/token est une 307 Temporary > Redirect vers POST /v3/token (configurée au niveau de la couche de > réécriture web.config d’IIS). La 307 HTTP préserve à la fois la > méthode (POST) et le corps de la requête, si bien que tout > client HTTP respectant le standard suit la redirection de manière > transparente — vous continuez à poster sur /sms/token et récupérez un > JWT valide en retour. Il n’existe aucune logique d’émission de jetons > dupliquée ; l’API SMS n’émet jamais de jetons par elle-même.
| Type de grant | Cas d’usage |
|---|---|
password | Intégration standard — nom d’utilisateur + clé d’API |
refresh_token | Renouveler un jeton d’accès expirant sans se réauthentifier |
client_credentials | Serveur à serveur avec l’identifiant client seul |
Utilisez grant_type=refresh_token pour renouveler le jeton d’accès sans vous réauthentifier. Stockez les jetons côté serveur (Vault, variables d’environnement) ; ne les intégrez jamais dans du JS navigateur ni dans des binaires d’applications mobiles. Consultez la doc /token de l’API CRM v3 pour la note de sécurité complète.
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials | oui | |
username | string | Votre nom d’utilisateur Mailpro (email). Requis pour le grant password. | |
password | string | Votre clé d’API Mailpro (au format GUID). Requise pour le grant password. | |
refresh_token | string | Refresh token précédent. Requis pour le grant refresh_token. | |
client_id | string | Votre identifiant client Mailpro (entier). Requis pour le grant client_credentials. |
Réponses
| Code | Description |
|---|---|
200 | Jeton émis avec succès. Renvoyé par POST /v3/token après le suivi
transparent de la 307 — votre client HTTP voit une 200 classique avec le
même format de corps que celui qu’il aurait reçu directement de l’endpoint
de jeton v3.
|
307 | Temporary Redirect vers POST /v3/token, émise par la règle de réécriture
IIS du web.config. Les clients HTTP respectant le standard la suivent
automatiquement et conservent la méthode POST d’origine ainsi que le corps
de formulaire. Visible uniquement pour les clients qui désactivent
explicitement le suivi des redirections (par exemple curl --max-redirs 0).
|
400 | Identifiants invalides ou type de grant non pris en charge |
Exemple 200
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_in": 31535999,
"userName": "12345",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"application": null
}
Exemple 400
{
"error": "invalid_grant",
"error_description": "The username or password is incorrect."
}
Consultez votre solde de crédits SMS, votre quota d’API mensuel et le statut de votre compte.
/account/limits.{format}Récupérer le quota d’API mensuel
Retourne le quota de requêtes API mensuel du client authentifié.
Calcul du quota : la limite est calibrée à partir des crédits d’abonnement email (en général subscription_credits × 5). Pour un plan à 10 000 emails/mois, cela donne un budget mensuel de 50 000 requêtes. Réinitialisation à la date anniversaire de l’abonnement (et non le 1er du mois calendaire).
Ce qui consomme des crédits :
v2, v3 ou sms.Ce qui est GRATUIT (ne consomme pas de crédits) :
/health.401, 403 ou 429.Le quota est partagé entre les 3 API Mailpro (v2, v3, sms) — un client = un budget mensuel pour toute la plateforme. Les envois SMS consomment en plus le solde de crédits SMS dédié (GET /credit/get.{format}).
Scope OAuth : account:read
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Réponses
| Code | Description |
|---|---|
200 | Instantané du quota |
401 | Identifiants invalides |
404 | Aucun enregistrement de quota trouvé (compte nouvellement créé ; la ligne sera créée lors de la première requête authentifiée). |
Exemple 200
{
"monthlyLimit": 50000,
"remaining": 32847,
"used": 17153,
"isFree": false,
"remainedSendsForFree": null
}
Envoyez des SMS — soit un SMS transactionnel unique à un destinataire, soit une campagne en masse à une liste de contacts entière.
/send/add.{format}Envoyer un SMS en masse à une liste de contacts
Envoie un SMS à tous les numéros de téléphone d’une liste de contacts. Prend en charge la planification : positionnez scheduled_time sur une date future pour un envoi différé, ou omettez-le pour un envoi immédiat.
Consommation de crédits : les crédits sont déduits au moment de l’envoi. Les messages longs (>160 caractères GSM-7) sont scindés en plusieurs parties, chacune coûtant des crédits supplémentaires.
La réponse retourne { "Error": "Insufficient Credit", "Code": 202 } si le compte ne dispose pas de crédits suffisants.
Scope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
message | string | oui | Texte du message SMS. Restez sous 160 caractères pour un SMS en une seule partie. Les caractères en dehors de l’alphabet GSM-7 (par exemple chinois, arabe, emoji) basculent l’encodage en Unicode, ce qui réduit la limite à 70 caractères par partie. |
to | integer | oui | ID de la liste de contacts à laquelle envoyer (issu de /list/list) |
scheduled_time | string (date-time) | Planifie l’envoi pour une date/heure future (ISO 8601). Omettre ou laisser vide pour un envoi immédiat. | |
shorten_urls | boolean | Mettre true pour remplacer chaque lien du message par un lien court https://mailp.ro/m/... : moins de caractères, donc parfois moins de parties de SMS facturées. Un lien qui ne peut pas être raccourci reste tel quel. |
Réponses
| Code | Description |
|---|---|
200 | Envoi SMS en masse créé avec succès |
202 | Crédits SMS insuffisants |
400 | Champ obligatoire manquant |
401 | Identifiants invalides |
Exemple 200
{
"Id": 6001,
"Message": "Flash sale today only — 30% off all orders. Shop now at mailpro.com/shop",
"ScheduledTime": "2026-04-20T10:00:00",
"To": [
"42"
]
}
Exemple 202
{
"Error": "Insufficient Credit",
"Code": 202
}
Exemple 400
{
"Error": "Malformed Input",
"Code": 103
}
/send/add_single.{format}Envoyer un SMS unique (GET)
Envoie un SMS unique à un destinataire via une requête GET. Utile pour les intégrations simples lorsque POST n’est pas disponible. Les identifiants et le message sont transmis en paramètres de requête.
Note : évitez d’utiliser GET pour des messages sensibles — les paramètres de requête apparaissent dans les journaux serveur. Préférez POST /send/add_single.
Scope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
to | query | string | oui | Numéro de téléphone du destinataire. Accepte +41…, 0041… ou 41… avec ou sans séparateurs. Voir Format des numéros de téléphone dans la description de l’API. |
message | query | string | oui | Texte du message SMS (max. 160 caractères pour l’encodage standard) |
scheduled_time | query | string (date-time) | Planifie l’envoi (ISO 8601). Omettre pour un envoi immédiat. | |
shorten_urls | query | boolean | Mettre true pour remplacer chaque lien du message par un lien court https://mailp.ro/m/... : moins de caractères, donc parfois moins de parties de SMS facturées. Un lien qui ne peut pas être raccourci reste tel quel. |
Réponses
| Code | Description |
|---|---|
200 | SMS envoyé (ou planifié) avec succès |
202 | Crédits SMS insuffisants |
400 | Paramètre obligatoire manquant |
401 | Identifiants invalides |
Exemple 200
{
"Id": 5001,
"Message": "Your appointment is confirmed for tomorrow at 10:00.",
"ScheduledTime": "2026-04-15T09:00:00",
"To": "0041791234567",
"Charge": "1"
}
/send/add_single.{format}Envoyer un SMS unique
Envoie un SMS unique à un numéro de téléphone destinataire. Prend en charge la planification via scheduled_time.
Consommation de crédits : les crédits sont déduits au moment de l’envoi. Le champ Charge de la réponse indique combien de crédits ont été consommés.
La réponse retourne { "Error": "Insufficient Credit", "Code": 202 } si le compte ne dispose pas de crédits suffisants.
Scope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
message | string | oui | Texte du message SMS |
to | string | oui | Numéro de téléphone du destinataire. Accepte +41…, 0041… ou 41… avec ou sans séparateurs. Voir Format des numéros de téléphone dans la description de l’API. |
scheduled_time | string (date-time) | Planifie l’envoi pour un horaire futur. Omettre pour un envoi immédiat. | |
shorten_urls | boolean | Mettre true pour remplacer chaque lien du message par un lien court https://mailp.ro/m/... : moins de caractères, donc parfois moins de parties de SMS facturées. Un lien qui ne peut pas être raccourci reste tel quel. |
Réponses
| Code | Description |
|---|---|
200 | SMS envoyé (ou planifié) avec succès |
202 | Crédits SMS insuffisants |
400 | Champ obligatoire manquant |
401 | Identifiants invalides |
Exemple 200
{
"Id": 5001,
"Message": "Your verification code is 8472. Valid for 10 minutes.",
"ScheduledTime": "2026-04-15T14:30:00",
"To": "0041791234567",
"Charge": "1"
}
Exemple 202
{
"Error": "Insufficient Credit",
"Code": 202
}
Exemple 400
{
"Error": "Malformed Input",
"Code": 103
}
/send/list.{format}Lister les campagnes SMS
Retourne la liste des campagnes SMS (envois en masse) du compte. Pagination via les en-têtes NumberOfRecords et PageNumber.
Utilisez type_to pour filtrer par type d’envoi :
0 (par défaut) — envois en masse à une liste1 — envois individuels uniquesScope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
type_to | query | integer: 0, 1 | Filtre sur le type d’envoi :
- 0 (par défaut) — envois en masse vers une liste de contacts
- 1 — envois individuels à un seul numéro
|
Réponses
| Code | Description |
|---|---|
200 | Liste des campagnes SMS retournée avec succès |
401 | Identifiants invalides |
Exemple 200
[
{
"Id": 5001,
"Message": "Your verification code is 8472",
"ScheduledTime": "2026-04-15T09:00:00",
"To": "41791234567"
}
]
/send/del.{format}Annuler ou supprimer un envoi SMS
Annule un envoi SMS planifié en attente, ou supprime un envoi terminé de l’historique. Seuls les envois planifiés à venir peuvent être annulés. Les envois en cours ne peuvent pas être arrêtés.
Scope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
id_send | integer | oui | ID de l’envoi SMS à annuler ou supprimer (issu de /send/list) |
Réponses
| Code | Description |
|---|---|
200 | Envoi SMS annulé ou supprimé avec succès |
400 | id_send manquant |
401 | Identifiants invalides |
500 | Échec de la suppression (envoi introuvable ou déjà traité) |
Exemple 200
{
"Result": "OK"
}
Exemple 500
{
"Error": "Delete failed",
"Code": 500
}
/send/scheduled.{format}Lister mes envois SMS planifiés
Retourne les envois SMS (unitaires ou en campagne) planifiés pour une date future et qui n’ont pas encore été expédiés. Utile avant d’appeler /cancel ou /reschedule.
Les enregistrements sont triés par scheduled_time croissant.
Scope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
id_client | query | integer | oui | |
api_key | query | string | oui | |
NumberOfRecords | header | integer | Éléments par page — 5 000 par défaut et au maximum (voir Pagination). En-tête HTTP ou paramètre de query. | |
PageNumber | header | integer | Numéro de page (base 1) pour les réponses paginées. Transmis en en-tête HTTP. |
Réponses
| Code | Description |
|---|---|
200 | Liste des envois SMS planifiés |
401 | Identifiants invalides |
Exemple 200
[
{
"Id": 9001,
"Message": "Black Friday: 30% off until midnight.",
"ScheduledTime": "2026-11-27T12:00:00",
"To": "+33671234567"
}
]
/send/{id_send}/cancel.{format}Annuler un envoi SMS planifié
Annule un SMS planifié qui n’a pas encore été expédié. Si l’envoi a déjà été traité (ou s’il n’existe pas / appartient à un autre client), retourne 409 Conflict.
Scope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
id_send | path | integer | oui |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | |
api_key | string | oui |
Réponses
| Code | Description |
|---|---|
200 | Envoi annulé |
401 | Identifiants invalides |
409 | Déjà expédié ou introuvable |
Exemple 200
{
"Result": "OK",
"Cancelled": 9001
}
Exemple 409
{
"error": "conflict",
"message": "Send not found, not owned by client, or already dispatched."
}
/send/{id_send}/reschedule.{format}Replanifier un envoi SMS planifié
Met à jour la date prévue d’un SMS planifié qui n’a pas encore été expédié. La nouvelle date doit être dans le futur et dans un délai de 90 jours.
Nom du champ de date : l’API accepte scheduled_time (champ principal), ainsi que les alias historiques PlanDate, date_planned et DatePlanned. Fournissez n’importe lequel d’entre eux — le premier non null est utilisé.
Scope OAuth : sms:send
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
id_send | path | integer | oui |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | |
api_key | string | oui | |
scheduled_time | string (date-time) | Nom de champ principal. | |
PlanDate | string (date-time) | Alias historique accepté pour assurer la rétrocompatibilité. | |
date_planned | string (date-time) | Alias historique accepté pour assurer la rétrocompatibilité. | |
DatePlanned | string (date-time) | Alias historique accepté pour assurer la rétrocompatibilité. |
Réponses
| Code | Description |
|---|---|
200 | Envoi replanifié |
400 | scheduled_time manquant ou invalide |
401 | Identifiants invalides |
409 | Déjà expédié, introuvable ou nouvelle date hors plage |
Exemple 200
{
"Result": "OK",
"Id": 9001,
"NewScheduledTime": "2026-12-31T14:30:00"
}
Exemple 409
{
"error": "conflict",
"message": "Reschedule failed — send not found, already dispatched, or new date out of range."
}
Gérez les listes de contacts SMS. Une liste de contacts regroupe des numéros de téléphone pour les envois en masse. Vous pouvez créer jusqu’à 1 000 listes par compte (même limite sur les trois API Mailpro et dans l'app).
/list/list.{format}Lister les listes de contacts téléphoniques
Retourne toutes les listes de contacts SMS du compte. Utilisez les valeurs Id retournées lors de l’envoi de campagnes SMS en masse ou de l’ajout de numéros de téléphone.
Scope OAuth : sms:contacts:read
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Réponses
| Code | Description |
|---|---|
200 | Listes de numéros retournées avec succès |
401 | Identifiants invalides |
Exemple 200
{
"Items": [
{
"AddressBookId": 42,
"Name": "Newsletter subscribers",
"TotalNumberPhones": 1547
},
{
"AddressBookId": 43,
"Name": "Loyalty program",
"TotalNumberPhones": 823
}
]
}
/list/add.{format}Créer une liste de contacts
Crée une nouvelle liste de contacts SMS portant le nom indiqué. La liste démarre vide — ajoutez des numéros de téléphone avec POST /phone/add. Maximum 1 000 listes par compte (même limite sur les trois API Mailpro et dans l'app). Renvoie HTTP 422 si la limite est atteinte.
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
name | string | oui | Nom d’affichage de la nouvelle liste de contacts |
Réponses
| Code | Description |
|---|---|
200 | Liste de contacts créée avec succès |
400 | Champ obligatoire manquant (nom) |
401 | Identifiants invalides |
Exemple 200
{
"Id": 44,
"Name": "Spring campaign 2026",
"NumberPhones": 0
}
Exemple 400
{
"Error": "Malformed Input",
"Code": 103
}
/list/edit.{format}Renommer une liste de contacts
Met à jour le nom d’affichage d’une liste de contacts SMS existante. Les numéros de téléphone de la liste ne sont pas affectés.
Scope OAuth : sms:contacts:write
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
address_book_id | integer | oui | ID de la liste de contacts à renommer (issu de /list/list) |
name | string | oui | Nouveau nom d’affichage pour la liste de contacts |
Réponses
| Code | Description |
|---|---|
200 | Liste de contacts renommée avec succès |
400 | Champ obligatoire manquant |
401 | Identifiants invalides |
/list/del.{format}Supprimer une liste de contacts
Supprime définitivement une liste de contacts SMS ainsi que tous les numéros de téléphone qu’elle contient. Cette action est irréversible.
Scope OAuth : sms:contacts:write
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
address_book_id | integer | oui | ID de la liste de contacts à supprimer |
Réponses
| Code | Description |
|---|---|
200 | Liste de contacts supprimée avec succès |
400 | address_book_id manquant |
401 | Identifiants invalides |
Gérez les numéros de téléphone individuels au sein d’une liste de contacts — ajout, mise à jour et suppression des entrées.
/phone/list.{format}Lister les numéros de téléphone d’une liste de contacts
Retourne une liste paginée des numéros de téléphone d’une liste de contacts donnée. Utilisez address_book_id pour indiquer la liste à récupérer. Pagination : NumberOfRecords et PageNumber (5 000 par page par défaut, page 1).
Scope OAuth : sms:contacts:read
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
address_book_id | query | integer | oui | ID de la liste de contacts dont récupérer les numéros de téléphone |
NumberOfRecords | header | integer | Éléments par page — 5 000 par défaut et au maximum (voir Pagination). En-tête HTTP ou paramètre de query. | |
PageNumber | header | integer | Numéro de page (base 1) pour les réponses paginées. Transmis en en-tête HTTP. | |
SortByName | header | boolean | Définir à true pour trier les résultats par nom, dans l’ordre alphabétique. |
Réponses
| Code | Description |
|---|---|
200 | Numéros de téléphone retournés avec succès |
401 | Identifiants invalides |
Exemple 200
{
"Items": [
{
"Id": 1001,
"Number": "41791234567",
"FirstName": "Alice",
"LastName": "Dupont"
},
{
"Id": 1002,
"Number": "33612345678",
"FirstName": "Bob",
"LastName": "Martin"
}
]
}
/phone/add.{format}Ajouter un ou plusieurs numéros de téléphone à une liste
Ajoute un ou plusieurs numéros de téléphone à une liste de contacts.
Numéro unique : utilisez le champ number.
Import en masse : utilisez le champ phone_list avec les numéros séparés par des points-virgules : +41791234567;+33612345678;0049301234567
Les numéros de téléphone acceptent les formats +, 00 ou nu — consultez Format des numéros de téléphone dans la description de l’API pour la liste complète des entrées acceptées / rejetées. Les numéros en doublon sont ignorés silencieusement, sauf si force=1 est positionné.
Scope OAuth : sms:contacts:write
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
address_book_id | integer | oui | ID de la liste de contacts à laquelle ajouter le ou les numéros |
number | string | Numéro de téléphone unique. Accepte +41…, 0041… ou 41… avec ou sans
séparateurs (espaces, tirets, points, barres obliques, parenthèses).
Voir Format des numéros de téléphone dans la description de l’API.
Utilisez ce champ OU phone_list — pas les deux.
| |
phone_list | string | Liste de numéros de téléphone séparés par des points-virgules pour un import en masse.
Utilisez ce champ OU number — pas les deux.
Exemple : 0041791234567;0033612345678
| |
firstname | string | Prénom du contact (optionnel, uniquement pour un numéro unique) | |
lastname | string | Nom de famille du contact (optionnel, uniquement pour un numéro unique) | |
force | integer: 0, 1 | Définir à 1 pour ajouter un numéro même s’il était précédemment désabonné ou s’il existe déjà.
Valeur par défaut : 0 (les doublons sont ignorés).
|
Réponses
| Code | Description |
|---|---|
200 | Numéro(s) de téléphone ajouté(s) avec succès |
400 | Champ obligatoire manquant |
401 | Identifiants invalides |
Exemple 200
{
"Id": 1003,
"Number": "0041791234567",
"FirstName": "Alice",
"LastName": "Dupont"
}
/phone/edit.{format}Mettre à jour une entrée de numéro de téléphone
Met à jour le numéro de téléphone et/ou les coordonnées d’un contact d’une entrée existante. Utilisez number_id (issu de /phone/list) pour identifier l’entrée à mettre à jour. Seuls les champs fournis dans la requête sont mis à jour.
Scope OAuth : sms:contacts:write
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
number_id | integer | oui | ID de l’entrée numéro de téléphone à mettre à jour (issu de /phone/list) |
number | string | Nouveau numéro de téléphone. Accepte +41…, 0041… ou 41… avec ou sans séparateurs. Voir Format des numéros de téléphone dans la description de l’API. | |
firstname | string | Nouveau prénom du contact | |
lastname | string | Nouveau nom de famille du contact |
Réponses
| Code | Description |
|---|---|
200 | Entrée du numéro de téléphone mise à jour avec succès |
400 | number_id manquant |
401 | Identifiants invalides |
/phone/del.{format}Retirer un numéro de téléphone d’une liste
Retire définitivement une entrée numéro de téléphone précise de sa liste de contacts. Utilisez number_id (issu de /phone/list) pour identifier l’entrée.
Scope OAuth : sms:contacts:write
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (application/x-www-form-urlencoded)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_client | integer | oui | Votre identifiant client Mailpro |
api_key | string | oui | Votre clé d’API (GUID) |
number_id | integer | oui | ID de l’entrée numéro de téléphone à supprimer (issu de /phone/list) |
Réponses
| Code | Description |
|---|---|
200 | Numéro de téléphone retiré avec succès |
400 | number_id manquant |
401 | Identifiants invalides |
Consultez le solde de crédits SMS restant pour votre compte (distinct du quota de requêtes API mensuelles — voir /account/limits).
/credit/get.{format}Récupérer le solde de crédits SMS
Retourne le solde de crédits SMS courant pour votre compte. Les crédits SMS sont consommés au moment de l’envoi. Un SMS standard (≤ 160 caractères GSM-7) coûte 1 crédit. Les messages plus longs ou les messages avec des caractères spéciaux peuvent en coûter davantage.
> Note : ceci retourne votre solde de crédits d’envoi SMS, et non votre > quota de requêtes API. Pour le quota d’API, voir GET /account/limits.{format}.
Scope OAuth : sms:read
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Réponses
| Code | Description |
|---|---|
200 | Solde de crédits retourné avec succès |
401 | Identifiants invalides |
Exemple 200
{
"TotalCredits": 5000
}
Parcourez le journal complet des campagnes SMS passées.
/history/list.{format}Lister l’historique des envois SMS
Retourne un journal paginé de toutes les campagnes SMS passées envoyées depuis ce compte. Les résultats sont triés par date décroissante (les plus récents en premier). Pagination : NumberOfRecords et PageNumber (en-têtes ou query, 5 000 par page par défaut).
Scope OAuth : sms:read
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Réponses
| Code | Description |
|---|---|
200 | Liste d’historique retournée avec succès |
401 | Identifiants invalides |
Exemple 200
{
"Items": [
{
"Id": 583294,
"DateSent": "2026-07-17T18:56:39.813",
"Message": "Your verification code is 8472",
"Charge": 3,
"Parts": 1
}
]
}
Téléversez un fichier CSV ou XLSX pour importer en masse des numéros de téléphone dans une liste de contacts. Le fichier est mis en file d’attente pour un traitement asynchrone — suivez son achèvement via l’ImportJobId retourné ou via le callback optionnel webhook_url.
/import/upload.{format}Téléverser un fichier de numéros de téléphone (CSV / XLSX) pour un import en masse
Téléversez un fichier CSV ou XLSX pour importer des numéros de téléphone dans une liste de contacts. Le fichier est stocké et mis en file d’attente pour un traitement asynchrone — l’endpoint retourne immédiatement un ImportJobId.
Type de requête : multipart/form-data
Champs de formulaire obligatoires :
id_client (entier) — votre identifiant client Mailproapi_key (chaîne) — votre clé d’APIid_list (entier) — ID de la liste de contacts ciblefile (binaire) — le fichier CSV ou XLSX à téléverserOptionnel :
webhook_url (chaîne) — URL HTTPS appelée à la fin du traitement. Reçoit une charge utile JSON contenant le statut final (succès / échec) ainsi que le décompte des lignes importées / ignorées / invalides.Format du fichier :
UTF-8Phone ou PhoneNumber — insensible à la casse)+41791234567Scope OAuth : sms:contacts:write
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
format | path | string: json, xml | oui | Format de la réponse |
Corps de la requête (multipart/form-data)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
id_list | integer (int64) | oui | ID de la liste de contacts de destination |
file | string (binary) | oui | Fichier CSV ou XLSX (UTF-8, max. 50 Mo) |
webhook_url | string (uri) | URL de callback invoquée à la fin du traitement |
Réponses
| Code | Description |
|---|---|
200 | Fichier accepté et mis en file d’attente |
400 | Aucun fichier téléversé ou id_list manquant |
401 | Identifiants invalides |
500 | Erreur serveur ou de stockage |
Exemple 200
{
"Result": "OK",
"ImportJobId": 15,
"InternalName": "230575-20260420142616-phones.csv"
}
Abonnez votre serveur aux notifications d’évènements SMS en temps réel. Mailpro envoie en POST une charge utile JSON signée par HMAC sur votre URL dès que l’évènement souscrit se produit. Consultez la section « Webhooks » de l’introduction pour le catalogue complet des évènements, l’enveloppe de la charge utile, les extraits de vérification de signature et la politique de réessai.
/webhooksLister les webhooks
Retourne tous les webhooks configurés sur le compte authentifié.
Réponses
| Code | Description |
|---|---|
200 | Tableau de webhooks |
401 | Identifiants invalides |
Exemple 200
{
"items": [
{
"id": 14,
"url": "https://example.com/hooks/mailpro",
"description": "Intégration Slack",
"is_active": true,
"created_at": "2026-07-01T21:09:52.43",
"updated_at": "2026-07-21T18:56:08.02",
"last_delivery_at": "2026-07-21T18:56:07.653",
"last_delivery_status": 200,
"consecutive_failures": 0,
"events": [
"sms.delivered",
"sms.failed"
]
}
],
"total": 1
}
/webhooksCréer un webhook
Crée un nouvel abonnement webhook. La réponse contient un secret affiché une seule fois — stockez-le immédiatement, côté serveur. Utilisez-le pour vérifier la signature HMAC de chaque charge utile entrante.
Limites : max. 20 webhooks par compte, max. 50 évènements par webhook.
Corps de la requête (application/json)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
url | string (uri) | oui | Endpoint HTTPS (HTTP refusé en production) |
events | array of string | oui | Liste des types d’évènements auxquels s’abonner (voir le catalogue ci-dessus). Utilisez ["*"] pour vous abonner à tous les évènements de cette API. |
description | string |
Exemple
{
"url": "https://example.com/hooks/mailpro",
"events": [
"sms.delivered",
"sms.failed"
],
"description": "Intégration Slack"
}
Réponses
| Code | Description |
|---|---|
201 | Webhook créé — le secret n’est retourné qu’ici |
400 | URL invalide, liste d’évènements invalide ou limite dépassée |
401 | Identifiants invalides |
Exemple 201
{
"id": 42,
"url": "https://example.com/hooks/mailpro",
"events": [
"sms.delivered",
"sms.failed"
],
"description": "Intégration Slack",
"isActive": true,
"consecutiveFailures": 0,
"autoDisabledAt": null,
"autoDisabledReason": null,
"createdAt": "2026-05-25T10:00:00Z",
"updatedAt": "2026-05-25T10:00:00Z",
"secret": "whsec_AbcD1234EfgH5678IjkL9012MnoP3456QrsT"
}
/webhooks/{id}Récupérer un webhook
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
id | path | integer (int64) | oui |
Réponses
| Code | Description |
|---|---|
200 | Le webhook |
404 | Webhook introuvable |
/webhooks/{id}Mettre à jour un webhook
Mise à jour partielle — seuls les champs transmis sont modifiés.
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
id | path | integer (int64) | oui |
Corps de la requête (application/json)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
url | string (uri) | ||
events | array of string | ||
description | string | ||
isActive | boolean | Définir à true pour réactiver un webhook désactivé automatiquement, une fois votre endpoint corrigé. |
Réponses
| Code | Description |
|---|---|
200 | Webhook mis à jour |
400 | Charge utile invalide |
404 | Webhook introuvable |
/webhooks/{id}Supprimer un webhook
Supprime définitivement le webhook ainsi que l’intégralité de son historique de livraisons.
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
id | path | integer (int64) | oui |
Réponses
| Code | Description |
|---|---|
204 | Supprimé |
404 | Webhook introuvable |
/webhooks/{id}/testEnvoyer un évènement de test
Met en file d’attente un évènement ping immédiat (ou tout autre type d’évènement via le champ eventType du corps) vers votre endpoint. Utile pour vérifier l’accessibilité et la vérification de signature avant de s’appuyer sur de vrais évènements.
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
id | path | integer (int64) | oui |
Corps de la requête (application/json)
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
eventType | string |
Exemple
{
"eventType": "ping"
}
Réponses
| Code | Description |
|---|---|
202 | Évènement mis en file d’attente pour expédition |
404 | Webhook introuvable |
Exemple 202
{
"deliveryId": 1234,
"eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"eventType": "ping"
}
/webhooks/{id}/rotate-secretFaire pivoter le secret HMAC
Génère un nouveau secret HMAC et invalide immédiatement l’ancien. Le nouveau secret est retourné une seule fois dans la réponse — stockez-le. Toute livraison à partir de ce moment sera signée avec le nouveau secret.
Utilisez ceci si vous soupçonnez que votre secret a été compromis.
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
id | path | integer (int64) | oui |
Réponses
| Code | Description |
|---|---|
200 | Nouveau secret (visible une seule fois) |
404 | Webhook introuvable |
Exemple 200
{
"secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}
/webhooks/{id}/deliveriesLister les tentatives de livraison
Retourne l’historique des tentatives d’expédition pour ce webhook (rétention de 30 jours). Utile pour le débogage — quels évènements ont été envoyés, codes de statut reçus, nombre de réessais, messages d’erreur.
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
id | path | integer (int64) | oui | |
limit | query | integer | ||
cursor | query | integer (int64) | Curseur de pagination (= dernier ID de livraison vu). Retourne les livraisons dont id < cursor. |
Réponses
| Code | Description |
|---|---|
200 | Tableau des tentatives de livraison (les plus récentes en premier) |
404 | Webhook introuvable |
/webhooks/{id}/deliveries/{deliveryId}/replayRejouer une livraison
Met en file d’attente une nouvelle tentative de livraison avec la même charge utile que l’originale. Utile pour redéclencher une livraison en échec après avoir corrigé votre endpoint. Une NOUVELLE ligne Webhook_Delivery est créée (l’originale est préservée à des fins d’audit). Le rejeu suit la politique de réessai standard (même planning de backoff, même règle de désactivation automatique après 10 échecs).
Paramètres
| Nom | Où | Type | Obligatoire | Description |
|---|---|---|---|---|
id | path | integer (int64) | oui | |
deliveryId | path | integer (int64) | oui |
Réponses
| Code | Description |
|---|---|
202 | Rejeu mis en file d’attente |
404 | Webhook ou livraison introuvable |