Documentation interactive · Portail développeurs · Spécification OpenAPI · EN · FR · DE · IT · PT · ES

Mailpro™ Email API v2 : Référence

URL de base : https://api.mailpro.com/v2

L'API Email Mailpro™ v2 vous permet de gérer par programmation les listes de contacts, les modèles d'e-mail, les adresses d'expéditeur et les campagnes — et d'envoyer des e-mails de masse comme transactionnels.

Authentification

Chaque endpoint accepte trois méthodes d'authentification. Utilisez celle qui convient à votre stack.

> Le Bearer JWT legacy et IdClient+ApiKey continuent de fonctionner sans changement et ne sont pas > soumis aux scopes. Seuls les tokens d'accès OAuth 2.0 sont soumis aux contrôles de scope par endpoint > indiqués sur chaque opération ci-dessous.

Méthode 1 — OAuth 2.0 (recommandée pour les intégrations)

Mailpro exploite un seul serveur d'autorisation OAuth 2.0 pour toutes ses API, sur une surface unique, indépendante de la version : https://api.mailpro.com/oauth/. Il n'existe pas d'endpoint OAuth par version — vous obtenez un token via /oauth/token et le même token fonctionne sur cette API Email v2, sur CRM v3 et sur SMS. Les endpoints qu'il peut appeler dépendent des scopes du token, pas de l'URL de base de l'API. Émetteur (claim iss) : https://api.mailpro.com/oauth/.

EndpointURL
AutorisationGET https://api.mailpro.com/oauth/authorize
Token / renouvellementPOST https://api.mailpro.com/oauth/token
JWKSGET https://api.mailpro.com/oauth/.well-known/jwks
DécouverteGET https://api.mailpro.com/oauth/.well-known/openid-configuration

Grants : authorization_code + PKCE (S256, obligatoire), client_credentials, refresh_token (rotation). Durée du token d'accès : 20 min ; token de rafraîchissement : 30 jours (glissants, à usage unique) ; code d'autorisation : 60 s.

Démarrage rapide — obtenir un token et appeler cette API (remplacez les valeurs ; ne commitez jamais un vrai 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=email:send email:read"

Appelez ensuite cette API avec Authorization: Bearer ACCESS_TOKEN. Le même token fonctionne sur les API CRM v3 et SMS. Un token auquel il manque le scope exigé par un endpoint reçoit 403 insufficient_scope. Parcours complet et catalogue des scopes : voir la documentation de l'API CRM v3 › Authentification. Scopes utiles pour l'e-mail : email:send, email:read, email:templates:read, email:templates:write, contacts:read, contacts:write, account:read.

Méthode 2 — Bearer JWT (legacy)

Authorization: Bearer <access_token>

Obtenez un token via POST /token (encodé en formulaire, OAuth2 password grant) :

POST https://api.mailpro.com/v2/token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY

Le même token est également valide sur l'API CRM v3 et l'API SMS — authentifiez-vous une seule fois, appelez n'importe quelle API. Les tokens sont valides 30 jours par défaut ; utilisez grant_type=refresh_token pour les renouveler sans devoir vous réauthentifier. Sans scopes — préférez OAuth 2.0 pour les intégrations installables.

Méthode 3 — IdClient + ApiKey

Deux identifiants :

ParamètreTypeDescription
IdCliententierVotre identifiant client numérique Mailpro, accessible dans Paramètres → Accès API
ApiKeychaîneVotre clé API, accessible dans Paramètres → Accès API

Transmettez-les à l'un de ces emplacements — choisissez-en un :

Si vous fournissez les identifiants à plusieurs endroits, l'en-tête l'emporte.

Contrôle des scopes OAuth par endpoint (Email v2)

Pour les tokens émis par OAuth, chaque groupe d'endpoints exige un scope (l'authentification legacy en est dispensée). Chaque opération indique son scope sous Authorization. Résumé :

EndpointsScope requis
/send/* (campagnes, transactionnel, planification, test — sauf /send/{IdSend}/status)email:send
/stats/* (sauf /stats/del), /history/list, /send/{IdSend}/statusemail:read
/message/*, /senderEmail/* (lecture)email:templates:read
/message/*, /senderEmail/* (add/edit/del), /stats/delemail:templates:write
/list/list, /email/listcontacts:read
/list/{add,edit,del}, /email/{add,addSingle,edit,del}, /import/uploadcontacts:write
/account/*account:read

Un refus de scope renvoie 403 avec { "error": "insufficient_scope", "required_scope": "…" }.

Format de réponse

Tous les endpoints prennent en charge json (par défaut) et xml. Précisez le format dans l'URL :

Pagination

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.

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.

Réponses d'erreur

HTTPSignification
400Requête incorrecte — paramètre obligatoire manquant ou invalide
401Non autorisé — IdClient ou ApiKey invalide
403Interdit — limite du compte atteinte (par exemple, nombre maximal de listes)
404Introuvable — la ressource demandée n'existe pas
500Erreur interne du serveur

Erreurs liées aux règles métier :

Suivi des envois (e-mails transactionnels)

Chaque e-mail unitaire envoyé (POST /send/sendmail, l'API CRM v3, le relais SMTP ou une automation) reçoit un identifiant. Il peut être suivi jusqu'à ce que le serveur du destinataire l'accepte ou le refuse. Les campagnes ne sont pas concernées : utilisez les statistiques.

statusSignificationFinal ?
queuedAccepté, en attente d'expédition.non
scheduledPlanifié pour plus tard (DatePlanned).non
sentRemis par nos serveurs, pas encore de réponse du serveur du destinataire.non
deliveredAccepté par le serveur du destinataire (DiagCode = sa réponse SMTP).oui
bouncedRefusé. BounceType : hard = adresse invalide ou refus définitif ; soft = refus après nouvelles tentatives (boîte pleine, serveur injoignable…).oui
not_foundIdentifiant inconnu ou qui n'appartient pas à votre compte.oui

Interroger sans boucler

Les statuts sont conservés 365 jours.

Webhooks

Mailpro™ peut notifier votre serveur en temps réel lorsque certains événements se produisent sur votre compte (un e-mail est délivré, une campagne se termine, un contact rebondit, etc.). Façon Stripe — votre URL reçoit un POST signé en HMAC-SHA256 dès que l'événement est déclenché.

Chaque événement envoyé à votre webhook compte pour 1 requête dans votre quota de requêtes API.

Fonctionnement

> ⏱ Délai d'activation — après création, mise à jour ou suppression d'un webhook, la > modification met jusqu'à 10 minutes à se propager sur l'ensemble des serveurs > de l'API Mailpro. Pendant cette fenêtre, les événements peuvent ne pas encore correspondre à votre nouvel abonnement > (ou peuvent toujours correspondre à un abonnement qui vient d'être retiré). C'est le temps nécessaire pour > rafraîchir le cache d'abonnements en mémoire sur chaque instance de l'API.

Enveloppe de la charge utile

Tous les événements partagent une enveloppe commune :

{
  "id":         "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "type":       "email.delivered",
  "created":    1748194800,
  "apiVersion": "v2",
  "account":    { "id": 12345, "name": "ACME Corp" },
  "data":       { "messageId": "...", "email": "[email protected]", "...": "..." }
}
ChampFormatDescription
idevt_ + 32 hexIdentifiant unique de l'événement — à utiliser comme clé d'idempotence de votre côté.
type<domain>.<verb>Type d'événement canonique.
createdSecondes Unix UTCInclus dans la signature HMAC.
apiVersion"v2"L'API Mailpro qui a publié l'événement.
account.idintVotre identifiant client Mailpro (= IdClient).
account.namestringLe nom de votre compte (pratique pour le débogage côté client).
dataobjectCharge utile de l'événement — sa structure dépend du type (voir le catalogue ci-dessous).

Catalogue des événements

ÉvénementDéclencheurStructure de data
pingTest via POST /webhooks/{id}/test{ message }
email.processedEnvoi accepté par le pipeline{ messageId, email, campaignId, processedAt }
email.deliveredUn email unitaire a été accepté par le serveur destinataire — API v2/v3, SMTP ou Automation (pas les campagnes). Émis depuis le flux de livraison PowerMTA.{ messageId, email, idSending, sendingType, diagCode, deliveredAt }
email.openedPixel de tracking déclenché{ messageId, email, campaignId, openedAt, ip, userAgent }
email.clickedClic sur un lien tracké{ messageId, email, campaignId, clickedAt, url, ip, userAgent }
email.bouncedRebond dur ou souple{ messageId, email, campaignId, bouncedAt, bounceType, reason }
email.spam_reportPlainte FBL{ messageId, email, campaignId, reportedAt }
email.unsubscribedLien de désinscription cliqué{ messageId, email, campaignId, unsubscribedAt }
email.droppedRefusé avant envoi{ messageId, email, campaignId, droppedAt, reason }
campaign.startedLe dispatch commence{ campaignId, name, totalRecipients, startedAt }
campaign.finishedTous les destinataires traités{ campaignId, name, totalSent, totalFailed, finishedAt }
credits.lowSolde de crédits e-mail sous votre seuil d'alerte{ remaining, threshold }

Abonnez-vous à tous les événements de cette API en passant ["*"] dans le tableau events.

Signature HMAC

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: email.delivered
X-Mailpro-Attempt:   1

Pour vérifier :

Node.js
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'));
}
PHP
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']);
}
Python
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'])
C#
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"]));
}

Réessais et désactivation automatique

TentativeDélai avant la prochaine tentative
1 → 210 secondes
2 → 31 minute
3 → 45 minutes
4 → 530 minutes
5 → 62 heures
6 → 76 heures
7abandonnée (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é.

Succès = HTTP 2xx

Nous considérons votre webhook comme réussi uniquement si vous renvoyez un statut compris dans 200–299. Tout 3xx/4xx/5xx ou un délai d'attente dépassé (> 10 s) compte 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 toujours lieu, mais le motif d'échec est plus clair dans votre journal de livraison.

Limites

LimiteValeur
Webhooks par compte20
Événements souscrits par webhook50
Taille maximale de la charge utile256 Ko
Délai HTTP par tentative10 secondes
Rétention de l'historique de livraison30 jours

Sommaire

Authentication

Obtenez un jeton JWT Bearer pour authentifier tous les autres appels d’API. L’endpoint v2 /token 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 préservés).

POST /token

Obtenir un jeton d’accès (redirection 307 vers /v3/token)

Obtient un jeton JWT Bearer à partir des identifiants client Mailpro. Transmettez l’access_token renvoyé comme Authorization: Bearer <token> dans toutes les requêtes suivantes. Le même jeton est également valable sur l’API CRM v3 et l’API SMS.

> ⚙ Détail d’implémentation — POST /v2/token est une redirection 307 > Temporary Redirect vers POST /v3/token (configurée au niveau de la couche > de réécriture IIS web.config). HTTP 307 préserve à la fois la méthode > (POST) et le corps de la requête, si bien que tout client HTTP conforme > aux standards suit la redirection de manière transparente — vous continuez à > poster sur /v2/token et récupérez un JWT valide. Il n’y a aucune logique > d’émission de jeton dupliquée ; l’API Email v2 n’émet jamais de jetons elle-même.

Types de grant pris en charge
Type de grantCas d’usage
passwordIntégration standard — nom d’utilisateur + clé API
refresh_tokenRenouveler un jeton d’accès expirant sans se réauthentifier
client_credentialsServeur à serveur avec uniquement l’identifiant client
Durée de vie des jetons

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’application mobile. Voir 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)

NomTypeObligatoireDescription
grant_typestring: password, refresh_token, client_credentialsoui
usernamestringVotre nom d’utilisateur Mailpro (e-mail). Requis pour le grant password.
passwordstringVotre clé API Mailpro (format GUID). Requise pour le grant password.
refresh_tokenstringJeton de rafraîchissement précédent. Requis pour le grant refresh_token.
client_idstringVotre identifiant client Mailpro (entier). Requis pour le grant client_credentials.

Réponses

CodeDescription
200Jeton émis avec succès. Renvoyé par POST /v3/token après le suivi transparent du 307 — votre client HTTP voit un 200 normal avec la même forme de corps qu’il recevrait directement depuis l’endpoint de jeton v3.
307Redirection temporaire (Temporary Redirect) vers POST /v3/token, émise par la règle de réécriture IIS dans web.config. Les clients HTTP conformes aux standards suivent automatiquement cette redirection et préservent la méthode POST d’origine ainsi que le corps de formulaire. Visible uniquement par les clients qui désactivent explicitement le suivi des redirections (par ex. curl --max-redirs 0).
400Identifiants 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."
}

Account

Consultez le solde de crédits e-mail, le quota mensuel d’API et l’état de votre abonnement.

GET /account/credits.{format}

Obtenir le solde de crédits e-mail

Renvoie le solde de crédits e-mail restants pour votre compte Mailpro. Chaque e-mail envoyé consomme un crédit. Les crédits n’expirent pas avec l’abonnement, mais ne sont utilisables que tant que l’abonnement est actif.

Scope OAuth : account:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Réponses

CodeDescription
200Solde de crédits renvoyé avec succès
401Identifiants invalides

Exemple 200

{
  "Credits": 48500
}

GET /account/subscriptionEndDate.{format}

Obtenir la date de fin d’abonnement

Renvoie la date d’expiration de l’abonnement Mailpro en cours. Après la date d’expiration, les envois sont bloqués jusqu’au renouvellement de l’abonnement.

Scope OAuth : account:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Réponses

CodeDescription
200Date de fin d’abonnement renvoyée avec succès
401Identifiants invalides

Exemple 200

{
  "SubscriptionEndDate": "2027-01-15T00:00:00"
}

GET /account/limits.{format}

Obtenir le quota mensuel d’API

Renvoie le quota mensuel de requêtes API pour le client authentifié.

Calcul du quota : la limite est calibrée à partir des crédits e-mail de l’abonnement (typiquement crédits_abonnement × 5). Pour un forfait de 10 000 e-mails/mois, cela donne un budget mensuel de 50 000 requêtes. Réinitialisé à la date anniversaire de l’abonnement (et non le 1er du mois calendaire).

Ce qui consomme du quota :

Ce qui est GRATUIT (ne consomme pas de quota) :

Le quota est partagé entre les 3 API Mailpro (v2, v3, sms) — un client = un budget mensuel pour l’ensemble de la plateforme.

Scope OAuth : account:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Réponses

CodeDescription
200Instantané du quota
401Identifiants invalides
404Aucun enregistrement de quota trouvé (compte récemment créé ; la ligne sera créée à la première requête authentifiée).

Exemple 200

{
  "MonthlyLimit": 50000,
  "Remaining": 32847,
  "Used": 17153,
  "IsFree": false,
  "RemainedSendsForFree": 0
}

Lists

Gérez les listes (listes de contacts). Une liste regroupe des contacts pour les campagnes en masse. Maximum 1 000 listes par compte (même limite sur les trois API Mailpro et dans l'app). Type 0 = liste standard. Type 1 = liste noire (utilisée pour la gestion des désabonnements).

GET /list/list.{format}

Lister toutes les listes

Renvoie toutes les listes du compte, triées par date de création (les plus récentes en premier), sauf si sortByName=true est défini. Utilisez type=0 pour les listes classiques ou type=1 pour les listes noires.

> Alias hérité : /addressbook/list.{format} — même endpoint, conservé pour rétrocompatibilité. > Les nouvelles intégrations doivent utiliser /list/*.

Scope OAuth : contacts:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
titleFilterquerystringFiltrer par titre (correspondance partielle, insensible à la casse)
typequeryinteger: 0, 10 = listes standard uniquement, 1 = listes noires uniquement. Omettre pour toutes les renvoyer.
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.
sortByNamequerybooleanPasser à true pour trier les résultats par ordre alphabétique du titre

Réponses

CodeDescription
200Listes renvoyées avec succès. > La réponse contient également un champ dupliqué hérité AddressBookList (contenu identique) > et chaque élément possède un AddressBookID dupliqué hérité (identique à ListID). Les nouvelles > intégrations doivent les ignorer.
401Identifiants invalides

Exemple 200

{
  "Lists": [
    {
      "ListID": 101,
      "Title": "Newsletter — France",
      "Type": 0,
      "NumberEmails": 4521,
      "CreationDate": "2025-01-15T10:30:00"
    },
    {
      "ListID": 102,
      "Title": "Unsubscribers",
      "Type": 1,
      "NumberEmails": 312,
      "CreationDate": "2025-01-15T10:31:00"
    }
  ]
}

POST /list/add.{format}

Créer une liste

Crée une nouvelle liste (liste de contacts). La liste démarre vide — ajoutez des contacts avec /email/add ou /email/addSingle. 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.

> Alias hérité : /addressbook/add.{format} — même endpoint, conservé pour rétrocompatibilité.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
TitlestringouiNom d’affichage de la nouvelle liste
Typeinteger: 0, 10 = liste standard (par défaut), 1 = liste noire

Réponses

CodeDescription
200Liste créée avec succès. > Un champ dupliqué hérité AddressBookList est également renvoyé (contenu identique).
400Title manquant
401Identifiants invalides
422Limite de listes (1 000) atteinte

Exemple 200

{
  "Lists": [
    {
      "ListID": 103,
      "Title": "Spring Campaign 2026",
      "Type": 0,
      "NumberEmails": 0,
      "CreationDate": "2026-04-14T12:00:00"
    }
  ]
}

POST /list/edit.{format}

Renommer une liste

Met à jour le titre d’une liste existante. Les contacts qu’elle contient ne sont pas affectés.

> Alias hérité : /addressbook/edit.{format} — même endpoint, conservé pour rétrocompatibilité. > Le nom de paramètre AddressBookID est également accepté comme alias hérité de ListID.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
ListIDintegerouiIdentifiant de la liste à renommer (issu de /list/list). L’alias hérité AddressBookID est aussi accepté.
TitlestringouiNouveau titre de la liste

Réponses

CodeDescription
200Liste renommée avec succès
400ListID ou Title manquant
401Identifiants invalides
404Liste introuvable

POST /list/del.{format}

Supprimer une liste

Supprime définitivement une liste ainsi que tous les contacts qu’elle contient. Cette action est irréversible.

> Alias hérité : /addressbook/del.{format} — même endpoint, conservé pour rétrocompatibilité. > Le nom de paramètre AddressBookID est également accepté comme alias hérité de ListID.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
ListIDintegerouiIdentifiant de la liste à supprimer. L’alias hérité AddressBookID est aussi accepté.

Réponses

CodeDescription
200Liste supprimée avec succès
400ListID manquant
401Identifiants invalides
404Liste introuvable

Exemple 200

{
  "Result": "OK"
}

Contacts

Gérez les contacts e-mail individuels. Les contacts appartiennent à une ou plusieurs listes. Utilisez l’import en masse (/email/add) pour les gros lots, ou l’ajout de contact unique (/email/addSingle) pour les inscriptions individuelles avec valeurs de champs personnalisés.

GET /email/list.{format}

Lister les contacts

Renvoie une liste paginée des contacts e-mail du compte. Filtrez par liste ou par motif d’e-mail. Les résultats sont triés par ordre alphabétique lorsque sortByName=true, sinon par ordre d’insertion.

Scope OAuth : contacts:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
emailFilterquerystringFiltrer par adresse e-mail (correspondance partielle, insensible à la casse)
listIdqueryintegerRenvoyer uniquement les contacts de cette liste. L’alias hérité addressBookId est également accepté.
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.
sortByNamequerybooleanPasser à true pour trier les résultats par ordre alphabétique de l’adresse e-mail

Réponses

CodeDescription
200Liste de contacts renvoyée avec succès
401Identifiants invalides

Exemple 200

{
  "Emails": [
    {
      "IdEmail": 10001,
      "Email": "[email protected]",
      "Field1": "Alice",
      "Field2": "Dupont"
    }
  ]
}

POST /email/add.{format}

Importer des contacts (en masse)

Importe une ou plusieurs adresses e-mail dans une liste en une seule requête. Fournissez les adresses dans EmailList, séparées par des points-virgules.

Exemple : [email protected];[email protected];[email protected]

Cet endpoint importe uniquement les adresses e-mail. Pour également définir des valeurs de champs personnalisés, utilisez plutôt /email/addSingle pour chaque contact.

Les adresses précédemment désabonnées sont silencieusement ignorées sauf si Force=1 est défini.

Sélection de la liste : fournissez ListId (ou son alias hérité AddressBookId). Au moins l’un des deux est requis.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
ListIdintegerIdentifiant de la liste de destination. L’alias hérité AddressBookId est aussi accepté.
EmailListstringouiAdresses e-mail à importer, séparées par des points-virgules
Forceinteger: 0, 1Passez à 1 pour réimporter des adresses précédemment désabonnées. Valeur par défaut : 0 (les adresses désabonnées sont ignorées).

Réponses

CodeDescription
200Contacts importés avec succès
400EmailList manquant
401Identifiants invalides

Exemple 200

{
  "Result": "3 contacts imported"
}

POST /email/addSingle.{format}

Ajouter un contact unique

Ajoute un contact à une liste avec des valeurs de champs personnalisés optionnelles.

Field1 à Field25 correspondent aux définitions des colonnes personnalisées de votre liste. La correspondance dépend de l’ordre dans lequel les colonnes ont été définies — consultez les paramètres de votre liste dans l’interface Mailpro pour savoir à quel numéro de champ correspond chaque colonne (par ex. Field1 = Prénom, Field2 = Nom, Field3 = Ville…).

Sélection de la liste : fournissez ListId (ou son alias hérité AddressBookId).

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
ListIdintegerIdentifiant de la liste de destination. L’alias hérité AddressBookId est aussi accepté.
EmailstringouiAdresse e-mail du nouveau contact
Forceinteger: 0, 1Passez à 1 pour réajouter une adresse précédemment désabonnée
Field1stringValeur du champ personnalisé 1 (la correspondance avec la colonne dépend de votre liste)
Field2stringValeur du champ personnalisé 2
Field3stringValeur du champ personnalisé 3
Field4stringValeur du champ personnalisé 4
Field5stringValeur du champ personnalisé 5

Réponses

CodeDescription
200Contact ajouté avec succès
400Email manquant
401Identifiants invalides

Exemple 200

{
  "EmailId": 10002,
  "Email": "[email protected]",
  "Field1": "Alice",
  "Field2": "Dupont",
  "ListID": 101
}

POST /email/edit.{format}

Mettre à jour un contact

Met à jour l’adresse e-mail et/ou les valeurs des champs personnalisés d’un contact existant. Identifiez le contact via EmailId (issu de /email/list). Les paramètres EmailId et Email sont tous deux requis.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
EmailIdintegerouiIdentifiant du contact à mettre à jour (issu de /email/list)
EmailstringouiNouvelle adresse e-mail du contact
Field1stringNouvelle valeur du champ personnalisé 1
Field2stringNouvelle valeur du champ personnalisé 2
Field3stringNouvelle valeur du champ personnalisé 3

Réponses

CodeDescription
200Contact mis à jour avec succès
400EmailId ou Email manquant
401Identifiants invalides
404Contact introuvable

POST /email/del.{format}

Supprimer un contact

Supprime définitivement un contact à partir de son identifiant unique.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
EmailIdintegerouiIdentifiant du contact à supprimer (issu de /email/list)

Réponses

CodeDescription
200Contact supprimé avec succès
400EmailId manquant
401Identifiants invalides
404Contact introuvable

Messages

Gérez les modèles d’e-mails HTML. Un modèle de message stocke l’objet, le corps HTML et la configuration du lien de désabonnement. Les modèles sont réutilisés d’une campagne à l’autre.

GET /message/list.{format}

Lister les modèles de messages

Renvoie les modèles d’e-mails HTML enregistrés sur le compte. Par défaut, le corps HTML n’est pas inclus dans la réponse, pour limiter la taille des charges utiles. Passez bodyHTML=true pour l’inclure (limite automatiquement les résultats à 10 par page).

Scope OAuth : email:templates:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
subjectFilterquerystringFiltrer par objet (correspondance partielle, insensible à la casse)
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.
bodyHTMLquerybooleanPasser à true pour inclure le corps HTML complet dans chaque résultat. Lorsque true, les résultats sont automatiquement limités à 10 par page, quelle que soit la valeur de numberOfRecords.

Réponses

CodeDescription
200Modèles de messages renvoyés avec succès
401Identifiants invalides

Exemple 200

{
  "MessageList": [
    {
      "IDMessage": 501,
      "Subject": "Spring Newsletter — April 2026",
      "Language": "EN",
      "LinkAlign": "center",
      "LinkUp": 0,
      "UpdateDate": "2026-03-10T14:22:00"
    }
  ]
}

POST /message/add.{format}

Créer un modèle de message

Crée un nouveau modèle d’e-mail HTML. Le modèle stocke l’objet, le corps HTML et la configuration du lien de désabonnement. Une fois créé, utilisez l’IDMessage renvoyé lors du lancement d’une campagne.

Scope OAuth : email:templates:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
SubjectstringouiLigne d’objet de l’e-mail (255 caractères maximum)
BodyHTMLstringouiContenu HTML complet du corps de l’e-mail
LanguagestringouiCode de langue pour la localisation du lien de désabonnement (par ex. EN, FR, DE)
LinkAlignstring: left, center, rightouiAlignement horizontal du lien de désabonnement
LinkUpinteger: 0, 1ouiPosition du lien de désabonnement — 0 = en bas de l’e-mail, 1 = en haut

Réponses

CodeDescription
200Modèle de message créé avec succès
400Champ requis manquant
401Identifiants invalides

Exemple 200

{
  "IDMessage": 502,
  "Subject": "Spring Newsletter — April 2026",
  "Language": "EN",
  "LinkAlign": "center",
  "LinkUp": 0
}

POST /message/edit.{format}

Mettre à jour un modèle de message

Met à jour le contenu et les métadonnées d’un modèle de message existant.

Scope OAuth : email:templates:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
MessageIdintegerouiIdentifiant du modèle de message à mettre à jour (issu de /message/list)
SubjectstringouiNouvelle ligne d’objet de l’e-mail
BodyHTMLstringouiNouveau contenu HTML du corps de l’e-mail
LanguagestringouiCode de langue pour la localisation du lien de désabonnement
LinkAlignstring: left, center, rightoui
LinkUpinteger: 0, 1oui

Réponses

CodeDescription
200Modèle de message mis à jour avec succès
400Champ requis manquant
401Identifiants invalides
404Modèle de message introuvable

POST /message/del.{format}

Supprimer un modèle de message

Supprime définitivement un modèle de message à partir de son identifiant unique. Les modèles utilisés par des campagnes planifiées en attente ne peuvent pas être supprimés.

Scope OAuth : email:templates:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
MessageIdintegerouiIdentifiant du modèle de message à supprimer (issu de /message/list)

Réponses

CodeDescription
200Modèle de message supprimé avec succès
400MessageId manquant
401Identifiants invalides
404Modèle de message introuvable

Campaigns

Envoyez des campagnes e-mail en masse à une liste et gérez les envois planifiés. Une campagne s’appuie sur un modèle de message et une adresse expéditrice.

GET /send/list.{format}

Lister les campagnes planifiées

Renvoie la liste des campagnes e-mail planifiées et récemment traitées. Les résultats sont triés par date d’envoi planifiée (les plus récentes en premier).

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
subjectMessageFilterquerystringFiltrer par objet de campagne (correspondance partielle, insensible à la casse)
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.

Réponses

CodeDescription
200Liste des campagnes renvoyée avec succès
401Identifiants invalides

Exemple 200

{
  "sends": [
    {
      "IDSend": 3001,
      "ListID": 101,
      "SenderEmail": "[email protected]",
      "SenderName": "Your Company Newsletter",
      "DatePlanned": "2026-04-20T09:00:00",
      "SubjectMessage": "Spring Newsletter — April 2026",
      "NumberCredit": 4521
    }
  ]
}

POST /send/campaign.{format}

Lancer une campagne

Planifie ou envoie immédiatement une campagne e-mail vers une liste à l’aide d’un modèle de message enregistré et d’une adresse expéditrice.

Requis :

Planification : définissez DatePlanned à une date/heure ISO 8601 future pour planifier l’envoi. Omettez DatePlanned pour envoyer immédiatement.

Suivi statistiques : passez Campaign=1 et fournissez un TitleCampaign pour activer le suivi des ouvertures/clics/rebonds dans la section Statistiques.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
ListIdintegerIdentifiant de la liste de destinataires (issue de /list/list). L’alias hérité IDAddressBook est aussi accepté.
IDMessageintegerouiIdentifiant du modèle de message à envoyer (issu de /message/list)
IDEmailExpintegerouiIdentifiant de l’adresse e-mail expéditrice à utiliser (issue de /senderEmail/list)
IDUnsubscribeListintegerListe utilisée pour recueillir les contacts désabonnés (liste noire). L’alias hérité IDUnsubscribeAddressBook est aussi accepté.
DatePlannedstring (date-time)Date/heure d’envoi planifiées (ISO 8601). Omettre pour envoyer immédiatement.
Campaigninteger: 0, 1Passez à 1 pour suivre cet envoi comme campagne nommée dans les statistiques
TitleCampaignstringTitre de campagne affiché dans les statistiques (requis lorsque Campaign=1)

Réponses

CodeDescription
200Campagne planifiée ou envoyée avec succès. > La réponse renvoie également les alias hérités AddressBookID et UnsubscribeAddressBookID > (identiques à ListID / UnsubscribeListID). Les nouvelles intégrations doivent les ignorer.
400IDMessage ou IDEmailExp manquant
401Identifiants invalides
403Crédits e-mail insuffisants
404Liste, message ou expéditeur introuvable

Exemple 200

{
  "send": {
    "IDSend": 3002,
    "ListID": 101,
    "UnsubscribeListID": 102,
    "IDCampaign": 8001,
    "SenderName": "Your Company Newsletter",
    "SenderEmail": "[email protected]",
    "DatePlanned": "2026-04-20T09:00:00",
    "SubjectMessage": "Spring Newsletter — April 2026",
    "NumberCredit": 4521
  }
}

POST /send/del.{format}

Annuler ou supprimer une campagne

Annule un envoi de campagne planifié en attente, ou supprime un envoi terminé. Seuls les envois planifiés dans le futur peuvent être annulés — les envois en cours ne peuvent pas être arrêtés.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
IdSendintegerouiIdentifiant de l’envoi de campagne à annuler ou supprimer (issu de /send/list)

Réponses

CodeDescription
200Campagne annulée ou supprimée avec succès
400IdSend manquant
401Identifiants invalides
404Campagne introuvable

Exemple 200

{
  "Result": "Campaign Deleted"
}

GET /send/scheduled.{format}

Lister mes campagnes e-mail planifiées

Renvoie les campagnes e-mail et les envois unitaires planifiés à une date future et qui n’ont pas encore été distribués. Utile avant un appel à /cancel ou /reschedule. Les enregistrements sont triés par DatePlanned croissant.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.

Réponses

CodeDescription
200Liste des campagnes/envois planifiés. > Chaque enregistrement inclut également les alias hérités AddressBookID et > UnsubscribeAddressBookID (identiques à ListID / UnsubscribeListID).
401Identifiants invalides

Exemple 200

{
  "sends": [
    {
      "IDSend": 5001,
      "ListID": 101,
      "UnsubscribeListID": 102,
      "IDCampaign": 8001,
      "SenderName": "Your Company Newsletter",
      "SenderEmail": "[email protected]",
      "DatePlanned": "2026-05-01T09:00:00",
      "SubjectMessage": "Spring Sale 2026",
      "NumberCredit": 4521
    }
  ]
}

POST /send/{IdSend}/cancel.{format}

Annuler une campagne/un envoi planifié

Annule un envoi e-mail planifié (campagne ou unitaire) qui n’a pas encore été distribué. Si l’envoi est déjà parti (ou s’il n’existe pas / appartient à un autre client), renvoie 409 Conflict.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
IdSendpathintegeroui

Réponses

CodeDescription
200Envoi annulé
401Identifiants invalides
409Déjà distribué ou introuvable

Exemple 200

{
  "Result": "OK",
  "Cancelled": 5001
}

PATCH /send/{IdSend}/reschedule.{format}

Replanifier une campagne/un envoi planifié

Met à jour la DatePlanned d’un envoi e-mail planifié. La nouvelle date doit être dans le futur et dans un délai de 90 jours.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
IdSendpathintegeroui

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
PlanDatestring (date-time)oui

Réponses

CodeDescription
200Envoi replanifié
400PlanDate manquante ou invalide
401Identifiants invalides
409Déjà distribué, introuvable ou nouvelle date hors plage (doit être future et dans un délai de 90 jours)

Exemple 200

{
  "Result": "OK",
  "IdSend": 5001,
  "NewPlanDate": "2026-12-31T14:30:00"
}

POST /send/sendingTest.{format}

Envoyer un e-mail de test

Envoie un aperçu d’un modèle de message à un destinataire spécifié pour relecture avant le lancement de la véritable campagne. L’expéditeur, le modèle et le destinataire de test sont tous identifiés par leurs identifiants.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
MessageIdintegerouiIdentifiant du modèle de message à prévisualiser (issu de /message/list)
IDEmailExpFromintegerouiIdentifiant de l’adresse expéditrice à utiliser (issue de /senderEmail/list)
IDEmailExpTointegerouiIdentifiant de l’adresse expéditrice destinataire — l’e-mail de test est envoyé à cette adresse

Réponses

CodeDescription
200E-mail de test envoyé avec succès
400Champ requis manquant
401Identifiants invalides

Exemple 200

{
  "SendingTest": {
    "IdSendingTest": 7001,
    "ToEmail": "[email protected]",
    "FromEmail": "[email protected]",
    "SenderName": "Your Company Newsletter"
  }
}

Transactional

Envoyez des e-mails transactionnels ponctuels à des destinataires individuels. Contrairement aux campagnes, les e-mails transactionnels ne nécessitent pas de liste — vous transmettez directement l’adresse du destinataire et le corps HTML.

GET /send/mail/scheduled.{format}

Lister les e-mails unitaires programmés

Renvoie les e-mails unitaires envoyés avec /send/sendmail et une date future, pas encore partis. Les campagnes sont listées par /send/scheduled.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Réponses

CodeDescription
200E-mails programmés renvoyés
401Identifiants invalides

Exemple 200

{
  "scheduledMails": [
    {
      "IdSingleSend": 880123,
      "Email": "[email protected]",
      "Subject": "Your invoice",
      "DatePlanned": "2026-12-01T09:00:00"
    }
  ]
}

POST /send/mail/{IdSingleSend}/cancel.{format}

Annuler un e-mail unitaire programmé

Annule l'e-mail tant qu'il n'est pas parti.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
IdSingleSendpathinteger (int64)ouiIdSingleSend renvoyé par /send/sendmail

Réponses

CodeDescription
200E-mail annulé
401Identifiants invalides
409Envoi introuvable, ou déjà parti

Exemple 200

{
  "Result": "OK",
  "Cancelled": 880123
}

POST /send/mail/{IdSingleSend}/reschedule.{format}

Reprogrammer un e-mail unitaire programmé

Change la date d'envoi. La nouvelle date doit être future et à moins de 90 jours. PATCH est aussi accepté.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
IdSingleSendpathinteger (int64)ouiIdSingleSend renvoyé par /send/sendmail

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
PlanDatestring (date-time)ouiNouvelle date d'envoi (ISO 8601)

Réponses

CodeDescription
200E-mail reprogrammé
400Date manquante ou invalide
401Identifiants invalides
409Envoi introuvable, déjà parti, ou date hors limites

Exemple 200

{
  "Result": "OK",
  "IdSingleSend": 880123,
  "NewPlanDate": "2026-12-15T09:00:00"
}

POST /send/sendmail.{format}

Envoyer un e-mail transactionnel

Envoie un e-mail transactionnel ponctuel à un ou plusieurs destinataires. Contrairement aux campagnes, cet endpoint ne nécessite pas de liste — l’adresse du destinataire et le corps HTML sont transmis directement.

Requis :

Format EmailData : [email protected],Alice,Dupont,Paris La première valeur est l’adresse e-mail ; les valeurs 2 à 26 correspondent à Field1–Field25 pour les variables de personnalisation de votre modèle HTML.

Plusieurs destinataires : séparez plusieurs entrées EmailData par des points-virgules : [email protected],Alice;[email protected],Bob

Planification : définissez DatePlanned à une date/heure ISO 8601 future, ou omettez-la pour envoyer immédiatement.

Scope OAuth : email:send

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (multipart/form-data)

NomTypeObligatoireDescription
IDEmailExpintegerouiIdentifiant de l’adresse e-mail expéditrice à utiliser (issue de /senderEmail/list)
EmailDatastringouiDestinataire au format email,champ1,champ2,...,champ25 (séparés par des virgules). La première valeur est l'adresse email ; les suivantes sont des champs de personnalisation mappés sur Field1–Field25 dans votre modèle HTML. La partie locale de l'email (avant le @) accepte les lettres, les chiffres et . _ - + — y compris le sous-adressage RFC 5322 (user+tag@domain, ex. Gmail, Fastmail, Proton). Les autres caractères spéciaux autorisés par la RFC 5322 (ex. ! # $ % & ' * / = ? ^ { | } ~) et les parties locales entre guillemets ne sont pas acceptés.
BodyHTMLstringouiContenu HTML complet du corps de l’e-mail
SubjectstringouiLigne d’objet de l’e-mail (255 caractères maximum)
attachmentsarray of string (binary)Pièces jointes optionnelles — envoyez la requête en multipart/form-data et ajoutez une partie fichier par pièce jointe (n'importe quel nom de champ). Jusqu'à 5 fichiers, 10 Mo par fichier, 15 Mo au total. Types acceptés : PDF, Word, Excel, PowerPoint, images (JPG, PNG, GIF, WebP), ZIP, CSV, TXT — les fichiers exécutables et scripts sont refusés. Facturation : l'envoi garde son crédit habituel, plus 1 crédit par 512 Ko de pièces jointes au-delà des 512 premiers Ko (les pièces jointes ≤ 512 Ko n'ajoutent rien). Tous les autres champs de cet endpoint (ReplyTo, ActivateStatistics, CustomHeaders, …) fonctionnent exactement comme dans la variante form-urlencoded.
KeepInMyFilesbooleanfalse (par défaut) : les pièces jointes ne servent qu'à cet envoi — elles sont stockées hors de votre compte, ne comptent pas dans votre quota de stockage et sont supprimées automatiquement après 35 jours. true : les pièces jointes sont aussi conservées dans les fichiers de votre compte (dossier Secure/Files/Sending/api) et comptent dans votre quota de stockage.

Réponses

CodeDescription
200E-mail transactionnel envoyé ou planifié avec succès
400Champ requis manquant ou format d’e-mail invalide
401Identifiants invalides
403Crédits e-mail insuffisants
404Expéditeur introuvable ou adresse e-mail désabonnée

Exemple 200

{
  "SingleSend": {
    "IdSingleSend": 8001,
    "IdEmailExp": 201,
    "DatePlanned": "2026-04-15T14:30:00",
    "Subject": "Your order #12345 is confirmed",
    "Email": "[email protected]",
    "Field1": "Alice",
    "Field2": "Dupont",
    "UnsubscriptionLink": false,
    "ActivateStatistics": true
  }
}

GET /send/{IdSend}/status.{format}

Obtenir le statut de livraison d'un e-mail transactionnel

Renvoie le statut de livraison actuel d'un e-mail transactionnel envoyé via /send/sendmail. Transmettez l'IdSingleSend renvoyé par cet appel.

Valeurs possibles : delivered (accepté par le serveur du destinataire, voir DiagCode), bounced (refusé — BounceType: hard adresse invalide ou refus définitif, soft refus après nouvelles tentatives), sent (remis au serveur de messagerie, pas encore de réponse), scheduled (pas encore envoyé, DatePlanned dans le futur) et queued (en attente d'expédition). delivered et bounced sont finaux : arrêtez d'interroger. Chaque e-mail a un statut final au plus tard 48 heures après l'envoi ; interrogez toutes les 15 minutes au plus (chaque appel compte dans votre quota API) ou utilisez les webhooks email.delivered / email.bounced. Seul le client qui a envoyé l'e-mail peut lire son statut — tout autre id renvoie 404.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
IdSendpathintegerouiL'IdSingleSend renvoyé par /send/sendmail.

Réponses

CodeDescription
200Statut de livraison actuel
401Identifiants invalides
404Aucun envoi transactionnel trouvé avec cet id pour ce client

Exemple 200

{
  "status": {
    "IdSingleSend": 8001,
    "Email": "[email protected]",
    "Status": "delivered",
    "DatePlanned": "2026-04-15T14:30:00",
    "StatusDate": "2026-04-15T14:30:07",
    "DiagCode": "2.0.0 (success)",
    "BounceType": null
  }
}

Sender Addresses

Listez et gérez les adresses e-mail expéditrices validées. Seules les adresses vérifiées peuvent être utilisées comme adresse From dans les campagnes.

GET /senderEmail/list.{format}

Lister les adresses expéditrices validées

Renvoie la liste des adresses d'expéditeur configurées pour le compte. Seules les adresses avec IsValid: true peuvent être utilisées pour envoyer des campagnes. Les nouvelles adresses s'ajoutent avec /senderEmail/add et deviennent valides une fois le lien de l'e-mail de validation cliqué.

Scope OAuth : email:templates:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
emailFilterquerystringFiltrer par adresse e-mail (correspondance partielle, insensible à la casse)
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.
sortByNamequerybooleanPasser à true pour trier les résultats par ordre alphabétique du nom d’expéditeur

Réponses

CodeDescription
200Adresses expéditrices renvoyées avec succès
401Identifiants invalides

Exemple 200

{
  "ExpEmailList": [
    {
      "IDEmailExp": 201,
      "Email": "[email protected]",
      "SenderName": "Your Company Newsletter",
      "IsValid": true,
      "CreationDate": "2025-06-01T09:00:00"
    },
    {
      "IDEmailExp": 202,
      "Email": "[email protected]",
      "SenderName": "Your Company Support",
      "IsValid": true,
      "CreationDate": "2025-06-01T09:05:00"
    }
  ]
}

POST /senderEmail/add.{format}

Ajouter une adresse d'expéditeur

Ajoute l'adresse avec les mêmes contrôles que l'application et lui envoie un e-mail de validation. Elle est utilisable une fois le lien de cet e-mail cliqué. Un compte peut avoir jusqu'à 25 expéditeurs, validés ou en attente.

Scope OAuth : email:templates:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
EmailstringouiAdresse de l'expéditeur
SenderNamestringouiNom affiché aux destinataires

Réponses

CodeDescription
200Adresse ajoutée. DomainHasMx vaut false quand le domaine n'a pas d'enregistrement MX.
400Email ou SenderName manquant
401Identifiants invalides
422Adresse refusée : invalide, déjà parmi les expéditeurs du compte, domaine de messagerie public, nom interdit, ou limite de 25 atteinte. Le message donne la raison.
503Indisponible pour le moment, réessayez

Exemple 200

{
  "Result": "OK",
  "ConfirmationSent": true,
  "DomainHasMx": true
}

POST /senderEmail/{IdSenderEmail}/resendValidation.{format}

Renvoyer l'e-mail de validation

Pour une adresse encore en attente de validation.

Scope OAuth : email:templates:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
IdSenderEmailpathintegerouiID de l'expéditeur, de /senderEmail/list

Réponses

CodeDescription
200E-mail renvoyé
401Identifiants invalides
404Expéditeur introuvable
409Cet expéditeur est déjà validé
503Indisponible pour le moment, réessayez

Exemple 200

{
  "Result": "OK",
  "ConfirmationSent": true
}

GET /senderEmail/{IdSenderEmail}/authentication.{format}

Contrôler le domaine d'un expéditeur (SPF, DKIM, DMARC, MX)

Contrôle le domaine en direct dans le DNS et renvoie les enregistrements à publier. Lecture seule. Le DKIM s'active dans l'application : DkimSettingsUrl ouvre le bon écran.

Scope OAuth : email:templates:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
IdSenderEmailpathintegerouiID de l'expéditeur, de /senderEmail/list

Réponses

CodeDescription
200État du domaine. Spf.RecommendedRecord est construit à partir de votre enregistrement actuel : publiez-le seulement si Spf.ChangeNeeded vaut true.
401Identifiants invalides
404Expéditeur introuvable
503Indisponible pour le moment, réessayez

Exemple 200

{
  "Domain": "example.com",
  "Spf": {
    "Valid": true,
    "Record": "v=spf1 include:spf.mailpro.com -all",
    "RecommendedRecord": "v=spf1 include:spf.mailpro.com -all",
    "ChangeNeeded": false
  },
  "Dkim": {
    "Valid": true,
    "Records": [
      {
        "Host": "key._domainkey.example.com",
        "Value": "v=DKIM1;k=rsa;p=MIIBIjANBgkq...",
        "Validated": true
      }
    ]
  },
  "Dmarc": {
    "Valid": true,
    "Record": "v=DMARC1; p=quarantine"
  },
  "Mx": {
    "Valid": true,
    "Record": "mail.example.com"
  },
  "DkimSettingsUrl": "https://app.mailpro.com/dkim/list?d=example.com"
}

POST /senderEmail/del.{format}

Retirer une adresse expéditrice

Retire une adresse e-mail expéditrice validée du compte. Les adresses expéditrices utilisées par des campagnes planifiées ne peuvent pas être supprimées.

Scope OAuth : email:templates:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
idEmailExpintegerouiIdentifiant de l’adresse expéditrice à retirer (issu de /senderEmail/list)

Réponses

CodeDescription
200Adresse expéditrice retirée avec succès
400idEmailExp manquant
401Identifiants invalides

Exemple 200

{
  "Result": "EmailSender Deleted"
}

Statistics

Accédez aux indicateurs de performance par campagne : ouvertures, clics, rebonds, etc. Des ventilations détaillées par heure, par jour, par pays, par OS et par client de messagerie sont disponibles.

GET /stats/list.{format}

Lister les statistiques de campagnes

Renvoie les indicateurs de performance globaux de toutes les campagnes : nombre d’envois, taux d’ouverture, taux de clic, nombre de rebonds. Filtrez par plage de dates ou par titre de campagne. Les résultats sont triés par date d’envoi (les plus récents en premier).

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
titleCampaignFilterquerystringFiltrer par titre de campagne (correspondance partielle, insensible à la casse)
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.
dateStartquerystring (date-time)Début de la plage de dates du filtre (ISO 8601)
dateEndquerystring (date-time)Fin de la plage de dates du filtre (ISO 8601)

Réponses

CodeDescription
200Statistiques de campagnes renvoyées avec succès
401Identifiants invalides

Exemple 200

{
  "Campaigns": [
    {
      "IdCampaign": 8001,
      "DateCampaign": "2026-04-20T09:00:01",
      "TitleCampaign": "Spring Newsletter April 2026",
      "NumberEmailSend": 4521,
      "NumberEmailOpen": 1823,
      "NumberEmailClick": 342,
      "BadMail": 12,
      "NumberUnsubscribers": 8,
      "NumberComplaints": 1,
      "SpamTrap": 0,
      "DeliverabilityScore": 98
    }
  ]
}

GET /stats/byHour.{format}

Statistiques par heure

Renvoie la ventilation horaire des ouvertures et des clics pour une campagne donnée. Utile pour identifier l’heure d’envoi optimale.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegerouiIdentifiant de la campagne (issu de /stats/list)

Réponses

CodeDescription
200Statistiques horaires renvoyées avec succès
401Identifiants invalides

Exemple 200

{
  "ByHour": [
    {
      "Hour": 9,
      "Opens": 823,
      "Clicks": 142
    },
    {
      "Hour": 10,
      "Opens": 512,
      "Clicks": 98
    }
  ]
}

GET /stats/byDay.{format}

Statistiques par jour

Renvoie la ventilation journalière des ouvertures et des clics pour une campagne donnée.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegerouiIdentifiant de la campagne (issu de /stats/list)

Réponses

CodeDescription
200Statistiques journalières renvoyées avec succès
401Identifiants invalides

POST /stats/del.{format}

Supprimer les statistiques d’une campagne

Supprime définitivement tous les enregistrements statistiques d’une campagne donnée.

Scope OAuth : email:templates:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
IdCampaignintegerouiIdentifiant de la campagne dont supprimer les statistiques (issu de /stats/list)

Réponses

CodeDescription
200Statistiques de campagne supprimées avec succès
400IdCampaign manquant
401Identifiants invalides
404Campagne introuvable

Exemple 200

{
  "Result": "Statistic Deleted"
}

GET /stats/country.{format}

Ventilation par géolocalisation

Renvoie la ventilation par géolocalisation des ouvertures de campagne — combien d’ouvertures proviennent de chaque pays.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegeroui

Réponses

CodeDescription
200Ventilation par pays renvoyée
401Identifiants invalides

GET /stats/open.{format}

Journal des événements d’ouverture

Renvoie le journal des événements d’ouverture par destinataire pour une campagne (une ligne par ouverture). Utilisez emailFilter pour rechercher un destinataire spécifique (correspondance partielle, insensible à la casse).

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegeroui
emailFilterquerystring
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.

Réponses

CodeDescription
200Événements d’ouverture renvoyés
401Identifiants invalides

GET /stats/click.{format}

Journal des événements de clic

Renvoie le journal des événements de clic par destinataire pour une campagne — en précisant le lien cliqué et le moment du clic.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegeroui
emailFilterquerystring
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.

Réponses

CodeDescription
200Événements de clic renvoyés
401Identifiants invalides

GET /stats/system.{format}

Ventilation par système d’exploitation

Renvoie la ventilation des ouvertures par système d’exploitation (Windows, macOS, iOS, Android, Linux, etc.) pour une campagne donnée.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegeroui

Réponses

CodeDescription
200Ventilation par OS renvoyée
401Identifiants invalides

GET /stats/emailSoftware.{format}

Ventilation par client de messagerie

Renvoie la ventilation des ouvertures par client de messagerie (Gmail, Outlook, Apple Mail, Thunderbird, etc.) pour une campagne donnée.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegeroui

Réponses

CodeDescription
200Ventilation par client de messagerie renvoyée
401Identifiants invalides

GET /stats/bounce.{format}

Journal des rebonds

Renvoie la liste des destinataires en rebond (rebonds durs, rebonds doux, plaintes pour spam) d'une campagne, avec la raison de l'échec pour chaque adresse.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
idCampaignqueryintegeroui
emailFilterquerystring
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.

Réponses

CodeDescription
200Événements de rebond renvoyés
401Identifiants invalides

Exemple 200

{
  "ListBadMail": [
    {
      "Email": "[email protected]",
      "Date": "2026-04-20T09:05:12",
      "Error": "550 5.1.1 recipient rejected",
      "AddressbookId": 1813318
    }
  ]
}

History

Parcourez le journal complet de tous les envois d’e-mails passés.

GET /history/list.{format}

Lister l’historique des envois

Renvoie un journal paginé de tous les envois d’e-mails passés. Filtrez par identifiant de campagne ou par objet. Passez bodyHTML=true pour inclure le corps HTML (limite automatiquement à 10 par page).

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
subjectMessageFilterquerystringFiltrer par objet de campagne (correspondance partielle, insensible à la casse)
idCampaignqueryintegerRenvoyer l’historique d’une campagne spécifique uniquement
numberOfRecordsqueryintegerÉléments par page — 5 000 par défaut et au maximum (voir Pagination).
pageNumberqueryintegerNuméro de page (à partir de 1). Par défaut : 1.
bodyHTMLquerybooleanPasser à true pour inclure le corps HTML complet. Limite automatiquement les résultats à 10 par page.

Réponses

CodeDescription
200Historique renvoyé avec succès
401Identifiants invalides

Exemple 200

{
  "HistoricList": [
    {
      "IDHistoric": 9001,
      "SubjectMessage": "Spring Newsletter — April 2026",
      "DateSend": "2026-04-20T09:00:01",
      "NumberSend": 4521,
      "NumberOpen": 1823,
      "NumberClick": 342
    }
  ]
}

Import

Téléversez un fichier CSV ou XLSX pour importer des contacts e-mail dans une liste en masse. Le fichier est placé en file d’attente pour un traitement asynchrone — suivez la fin de traitement via l’ImportJobId renvoyé ou via le callback WebhookUrl optionnel.

POST /import/upload.{format}

Téléverser un fichier de contacts (CSV/XLSX) pour import en masse

Téléversez un fichier CSV ou XLSX pour importer des contacts e-mail dans une liste. Le fichier est stocké et placé en file d’attente pour un traitement asynchrone — l’endpoint renvoie immédiatement un ImportJobId.

Type de requête : multipart/form-data

Champs de formulaire requis :

Optionnel :

Format du fichier :

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (multipart/form-data)

NomTypeObligatoireDescription
ListIdintegerouiIdentifiant de la liste de destination. L’alias hérité AddressBookId est aussi accepté.
filestring (binary)ouiFichier CSV ou XLSX (UTF-8, 50 Mo maximum)
WebhookUrlstring (uri)URL de callback invoquée lorsque le traitement est terminé

Réponses

CodeDescription
200Fichier accepté et mis en file d’attente
400Aucun fichier téléversé ou ListId manquant
401Identifiants invalides
500Erreur de serveur ou de stockage

Exemple 200

{
  "Result": "OK",
  "ImportJobId": 13,
  "InternalName": "230575-20260420140221-contacts.csv"
}

Webhooks

Abonnez votre serveur aux notifications d’événements en temps réel. Mailpro envoie en POST une charge utile JSON signée HMAC à 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.

GET /webhooks

Lister les webhooks

Renvoie l’ensemble des webhooks configurés sur le compte authentifié.

Réponses

CodeDescription
200Tableau des webhooks
401Identifiants 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": [
        "email.delivered",
        "email.bounced"
      ]
    }
  ],
  "total": 1
}

POST /webhooks

Créer un webhook

Crée un nouvel abonnement webhook. La réponse contient un secret qui n’est affiché qu’une seule fois — stockez-le immédiatement, côté serveur. Utilisez-le pour vérifier la signature HMAC de chaque charge utile entrante.

Limites : 20 webhooks maximum par compte, 50 événements maximum par webhook.

Corps de la requête (application/json)

NomTypeObligatoireDescription
urlstring (uri)ouiEndpoint HTTPS (HTTP refusé en production)
eventsarray of stringouiListe des types d’événements à souscrire (voir le catalogue ci-dessus). Utilisez ["*"] pour vous abonner à tous les événements de cette API.
descriptionstring

Exemple

{
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "email.delivered",
    "email.bounced"
  ],
  "description": "Intégration Slack"
}

Réponses

CodeDescription
201Webhook créé — le secret n’est renvoyé qu’ici
400URL, liste d’événements invalide ou limite dépassée
401Identifiants invalides

Exemple 201

{
  "id": 42,
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "email.delivered",
    "email.bounced"
  ],
  "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"
}

GET /webhooks/{id}

Récupérer un webhook

Paramètres

NomOùTypeObligatoireDescription
idpathinteger (int64)oui

Réponses

CodeDescription
200Le webhook
404Webhook introuvable

PUT /webhooks/{id}

Mettre à jour un webhook

Mise à jour partielle — seuls les champs transmis sont modifiés.

Paramètres

NomOùTypeObligatoireDescription
idpathinteger (int64)oui

Corps de la requête (application/json)

NomTypeObligatoireDescription
urlstring (uri)
eventsarray of string
descriptionstring
isActivebooleanPassez à true pour réactiver un webhook désactivé automatiquement, une fois votre endpoint corrigé.

Réponses

CodeDescription
200Webhook mis à jour
400Charge utile invalide
404Webhook introuvable

DELETE /webhooks/{id}

Supprimer un webhook

Supprime définitivement le webhook et l’intégralité de son historique de livraisons.

Paramètres

NomOùTypeObligatoireDescription
idpathinteger (int64)oui

Réponses

CodeDescription
204Supprimé
404Webhook introuvable

POST /webhooks/{id}/test

Envoyer 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 de corps eventType) à destination de 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

NomOùTypeObligatoireDescription
idpathinteger (int64)oui

Corps de la requête (application/json)

NomTypeObligatoireDescription
eventTypestring

Exemple

{
  "eventType": "ping"
}

Réponses

CodeDescription
202Événement mis en file d’attente pour distribution
404Webhook introuvable

Exemple 202

{
  "deliveryId": 1234,
  "eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "eventType": "ping"
}

POST /webhooks/{id}/rotate-secret

Faire pivoter le secret HMAC

Génère un nouveau secret HMAC et invalide immédiatement l’ancien. Le nouveau secret est renvoyé une seule fois dans la réponse — stockez-le. Chaque livraison ultérieure sera signée avec le nouveau secret.

Utilisez cette opération si vous soupçonnez que votre secret a été compromis.

Paramètres

NomOùTypeObligatoireDescription
idpathinteger (int64)oui

Réponses

CodeDescription
200Nouveau secret (visible une seule fois)
404Webhook introuvable

Exemple 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /webhooks/{id}/deliveries

Lister les tentatives de livraison

Renvoie l’historique des tentatives de distribution pour ce webhook (rétention 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

NomOùTypeObligatoireDescription
idpathinteger (int64)oui
limitqueryinteger
cursorqueryinteger (int64)Curseur de pagination (= dernier identifiant de livraison vu). Renvoie les livraisons avec id < cursor.

Réponses

CodeDescription
200Tableau des tentatives de livraison (les plus récentes en premier)
404Webhook introuvable

POST /webhooks/{id}/deliveries/{deliveryId}/replay

Rejouer 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 ayant échoué après correction de votre endpoint. Une NOUVELLE ligne Webhook_Delivery est créée (l’originale est préservée pour audit). Le rejouage suit la politique de réessai standard (même calendrier de backoff, même règle de désactivation automatique après 10 échecs).

Paramètres

NomOùTypeObligatoireDescription
idpathinteger (int64)oui
deliveryIdpathinteger (int64)oui

Réponses

CodeDescription
202Rejouage mis en file d’attente
404Webhook ou livraison introuvable

Suppression

Bounces et désinscrits du compte : lister, ajouter, retirer.

GET /suppression/bounces.{format}

Lister les bounces du compte

Les plus récents d'abord. Le total est dans l'en-tête X-Total-Count.

Scope OAuth : email:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
typequerystring: hard, softhard ou soft
sourcequerystringOrigine du bounce : list, contact, api ou smtp
emailquerystringAdresse exacte
dateFromquerystring (date-time)À partir de cette date
dateToquerystring (date-time)Jusqu'à cette date
numberOfRecordsqueryinteger
pageNumberqueryinteger

Réponses

CodeDescription
200Bounces renvoyés
400type doit valoir hard ou soft
401Identifiants invalides

Exemple 200

{
  "bounces": [
    {
      "Id": 5521,
      "Source": "contact",
      "BounceType": "hard",
      "Email": "[email protected]",
      "Date": "2026-10-12T08:30:00",
      "DiagCode": "550 5.1.1 User unknown",
      "IdList": 101
    }
  ]
}

POST /suppression/bounces/{Id}/del.{format}

Retirer un bounce

Source et Type sont obligatoires, tels que renvoyés par /suppression/bounces : un Id seul n'est pas unique.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
Idpathinteger (int64)ouiId du bounce

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
Sourcestringouilist, contact, api ou smtp
Typestring: hard, softouihard ou soft

Réponses

CodeDescription
200Bounce retiré
400Source ou Type manquant
401Identifiants invalides
404Bounce introuvable

Exemple 200

{
  "Result": "OK",
  "Id": 5521,
  "Restored": false
}

POST /suppression/bounces/{Id}/restore.{format}

Remettre en liste un contact en hard bounce

Uniquement pour un hard bounce de source contact.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
Idpathinteger (int64)ouiId du bounce

Réponses

CodeDescription
200Contact remis en liste
401Identifiants invalides
404Hard bounce de contact introuvable, ou adresse plus active

Exemple 200

{
  "Result": "OK",
  "Id": 5521,
  "Restored": true
}

GET /suppression/unsubscribers.{format}

Lister les désinscrits du compte

Les plus récents d'abord. Le total est dans l'en-tête X-Total-Count.

Scope OAuth : contacts:read

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
sourcequerystringOrigine de la désinscription : contact, list, smtp, api ou api3
emailquerystringAdresse exacte
dateFromquerystring (date-time)À partir de cette date
dateToquerystring (date-time)Jusqu'à cette date
numberOfRecordsqueryinteger
pageNumberqueryinteger

Réponses

CodeDescription
200Désinscrits renvoyés
401Identifiants invalides

Exemple 200

{
  "unsubscribers": [
    {
      "Id": 9012,
      "Source": "api",
      "Email": "[email protected]",
      "Date": "2026-10-20T16:05:00",
      "ListName": null,
      "Comment": "Asked by phone"
    }
  ]
}

POST /suppression/unsubscribers/add.{format}

Ajouter un désinscrit

Sans ListId, l'adresse est désinscrite pour tout le compte. Avec, de cette liste de désinscription seulement.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
EmailstringouiAdresse à désinscrire
CommentstringCommentaire libre
ListIdinteger (int64)Liste de désinscription du compte (facultatif)

Réponses

CodeDescription
200C'est fait. AlreadyUnsubscribed vaut true quand l'adresse l'était déjà.
400Une adresse valide est obligatoire
401Identifiants invalides
404ListId n'est pas une liste de désinscription de ce compte

Exemple 200

{
  "Result": "OK",
  "AlreadyUnsubscribed": false
}

POST /suppression/unsubscribers/{Id}/del.{format}

Retirer un désinscrit

Source est obligatoire, tel que renvoyé par /suppression/unsubscribers : un Id seul n'est pas unique.

Scope OAuth : contacts:write

Paramètres

NomOùTypeObligatoireDescription
formatpathstring: json, xmlouiFormat de réponse
Idpathinteger (int64)ouiId du désinscrit

Corps de la requête (application/x-www-form-urlencoded)

NomTypeObligatoireDescription
Sourcestringouicontact, list, smtp, api ou api3

Réponses

CodeDescription
200Désinscrit retiré
400Source est obligatoire
401Identifiants invalides
404Désinscrit introuvable

Exemple 200

{
  "Result": "OK",
  "Removed": 9012
}