GET /api/v1/campaigns/{campaignId}/stats
Les performances de la campagne — les mêmes chiffres que l'écran Stats.
| Champ | Description |
|---|---|
sent | E-mails réellement expédiés |
delivered | sent moins bounced |
bounced | Envois rejetés par le serveur destinataire |
uniqueOpens / openRate | Contacts ayant ouvert au moins une fois, et leur part de delivered |
uniqueClicks / clickRate | Contacts ayant cliqué au moins une fois, et leur part de delivered |
unsubscribed / unsubscribeRate | Désabonnements attribués à cette campagne, et leur part de delivered |
topicOptOuts | Destinataires qui ont désactivé un sujet via cette campagne — ils restent abonnés |
clicksByLink | Par URL : {url, uniqueClicks, totalClicks} |
clicksOverTime | Par jour : {date, clicks}, date au format YYYY-MM-DD |
opensOverTime | Par jour : {date, opens}, date au format YYYY-MM-DD |
clicksByHour / opensByHour | Par heure depuis l'envoi : {hour, clicks} / {hour, opens}, hour de 0 à 47 |
sentAt et porte toujours les 48 créneaux, heures creuses comprises.
Les ouvertures comptent les premières ouvertures, une par destinataire au plus.
unsubscribed et topicOptOuts comptent deux départs différents et ne se recoupent jamais. Quelqu'un qui
se désabonne cesse de recevoir tout ce que vous envoyez ; quelqu'un qui désactive un sujet continue de recevoir le
reste. Les lire ensemble vous dit si une campagne a perdu une audience ou seulement un sujet.
topicOptOuts ne couvre que les campagnes envoyées depuis que les désactivations de sujet sont enregistrées — les plus anciennes
affichent 0.
Les taux sont des parts de delivered, pas de sent — une adresse en rebond n'a jamais eu l'occasion
d'ouvrir. Tant que rien n'est délivré, le dénominateur est nul et chaque taux vaut 0, jamais NaN :
interrogez progress sur la campagne elle-même pour savoir si l'envoi est terminé avant d'en tirer
la moindre conclusion. Une campagne d'une autre organisation répond 404, comme un id qui n'existe pas.
Autorisation
| Rôle dans l'organisation | Cet endpoint |
|---|---|
OWNER | Autorisé |
ADMIN | Autorisé |
MEMBER | Autorisé |
Exemple
bash
curl -H "x-api-key: $AGENTMAIL_API_KEY" \
"https://www.agentsmail.io/api/v1/campaigns/$CAMPAIGN_ID/stats"Réponse
200 OK— l'appel a réussi.401 Unauthorized— clé absente ou invalide, ou son propriétaire a quitté l'organisation.404 Not Found— aucune ressource de ce type, ou elle appartient à une autre organisation. L'API ne confirme jamais l'existence d'un id à un appelant qui n'y a pas droit.429 Too Many Requests— plus de 120 requêtes en une minute pour cette clé.
Champs de la réponse
| Champ | Type | Description |
|---|---|---|
success | boolean | Indique si l'opération a réussi |
data.sent | number | E-mails remis au fournisseur |
data.delivered | number | Acceptés par le serveur destinataire |
data.bounced | number | Rejetés définitivement — l'adresse passe sur la liste de suppression |
data.uniqueOpens | number | Destinataires ayant chargé le pixel de suivi au moins une fois |
data.openRate | number | Calculé sur les délivrés, pas sur les envoyés |
data.uniqueClicks | number | Destinataires ayant suivi au moins un lien suivi |
data.clickRate | number | Même base |
data.unsubscribed | number | Destinataires partis via cette campagne |
data.unsubscribeRate | number | Même base |
data.topicOptOuts | number | Destinataires ayant désactivé un sujet via cette campagne, toujours abonnés |
data.clicksByLink | array | Une entrée par URL suivie |
data.clicksOverTime | array | Clics regroupés par période |
Exemple de réponse
json
{
"success": true,
"data": {
"sent": 12,
"delivered": 12,
"bounced": 12,
"uniqueOpens": 12,
"openRate": 12,
"uniqueClicks": 12,
"clickRate": 12,
"unsubscribed": 12,
"unsubscribeRate": 12,
"topicOptOuts": 3,
"clicksByLink": [
{
"url": "https://example.com",
"clicks": 42
}
],
"clicksOverTime": [
{
"at": "2026-08-23T11:00:00.000Z",
"clicks": 12
}
]
}
}