MailLandDocs
Analytique

Journaux d'e-mails

Recherchez, filtrez et inspectez les journaux de livraison détaillés pour chaque e-mail envoyé via Mail.Land

Cette page liste uniquement les messages transactionnels : les e-mails de campagnes et d'automatisations (y compris les messages système sys_*) en sont exclus. Utilisez le point de terminaison des destinataires de campagne (voir Campagnes) pour l'historique d'envoi marketing/automatisation.

Lister les e-mails

GET https://api.mail.land/v1/transactional/logs
List emails
curl "https://api.mail.land/v1/transactional/logs?limit=20" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Paramètres de requête

ParamètreTypeDéfautDescription
cursorstring-Curseur opaque issu du nextCursor de la page précédente. À omettre pour la première page. Un curseur malformé ou altéré renvoie 400 INVALID_CURSOR.
limitint20Éléments par page
statusstring-Filtrer par statut (voir ci-dessous)
searchstring-Rechercher par destinataire, objet ou ID de message
fromdatetimeIl y a 30 joursDate de début
todatetimeMaintenantDate de fin
refreshboolfalseÉviter une page obsolète : il n'y a plus de cache de comptage à contourner

Filtres de statut

ValeurCorrespond à
queuedEn attente dans la file
sentAccepté par le MTA
deferred ou retryingTemporairement retardé
deliveredLivré avec succès
bouncedRebond permanent
failedErreur système ou rebond administratif
openedLe destinataire a ouvert l'e-mail
clickedLe destinataire a cliqué sur un lien
complainedLe destinataire a signalé un spam
Email logs response
{
  "items": [
    {
      "messageId": "t_a1b2c3d4e5f6",
      "recipient": "[email protected]",
      "subject": "Your order has shipped",
      "status": "delivered",
      "sentAt": "2026-02-17T12:34:56Z",
      "deliveredAt": "2026-02-17T12:34:58Z",
      "openedAt": "2026-02-17T13:15:00Z",
      "clickedAt": null,
      "bounceReason": null,
      "openCount": 2,
      "clickCount": 0
    },
    {
      "messageId": "t_d4e5f6a1b2c3",
      "recipient": "[email protected]",
      "subject": "Invoice #1234",
      "status": "bounced",
      "sentAt": "2026-02-17T12:30:00Z",
      "deliveredAt": null,
      "openedAt": null,
      "clickedAt": null,
      "bounceReason": "550 5.1.1 Mailbox not found",
      "openCount": 0,
      "clickCount": 0
    }
  ],
  "nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
  "hasMore": true
}

Priorité des statuts

Le champ status reflète l'événement de la plus haute priorité pour chaque e-mail :

  1. complained (le plus élevé)
  2. clicked
  3. opened
  4. Statut de livraison : queued → sent → deferred → delivered → bounced → failed

Par exemple, si un e-mail a été livré puis ouvert, le statut affiche opened.

Une plage de dates par défaut de 30 jours est appliquée pour des raisons de performances. Le paramètre de recherche filtre par e-mail du destinataire, ligne d'objet ou ID de message (insensible à la casse).

Statistiques des journaux

Obtenez des statistiques agrégées pour vos journaux d'e-mails :

GET https://api.mail.land/v1/transactional/logs/stats
Get log stats
curl "https://api.mail.land/v1/transactional/logs/stats" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
ParamètreTypeDéfautDescription
fromdatetimeIl y a 7 joursDate de début
todatetimeMaintenantDate de fin
emailTypeint-0 = Transactionnel, 1 = Marketing. Omettre ce paramètre couvre tous les types d'e-mails : contrairement à « Lister les e-mails » ci-dessus, qui ne couvre que les transactionnels.
refreshboolfalseContourner le cache
Log stats response
{
  "total": 4750,
  "accepted": 4750,
  "sent": 4700,
  "delivered": 4680,
  "opened": 1498,
  "clicked": 195,
  "bounced": 38,
  "complained": 1,
  "failed": 12,
  "queued": 20,
  "deliveryRate": 99.57,
  "openRate": 32.01,
  "clickRate": 13.02,
  "bounceRate": 0.81,
  "complaintRate": 0.021,
  "source": "clickhouse",
  "queryTimeMs": 32
}

Calculs des taux :

TauxFormule
deliveryRatedelivered / sent * 100
openRateopened / delivered * 100
clickRateclicked / delivered * 100
bounceRatebounced / sent * 100
complaintRatecomplained / sent * 100 (3 décimales)

Les en-têtes de réponse indiquent le statut du cache :

En-têteValeurs
X-CacheHIT, MISS ou FRESH
X-Stats-Sourcecache ou clickhouse
Cache-ControlToujours no-store, no-cache, must-revalidate

Détail d'un e-mail

Obtenez les détails complets d'un e-mail spécifique, y compris la chronologie des événements :

GET https://api.mail.land/v1/transactional/logs/{messageId}
Get email detail
curl https://api.mail.land/v1/transactional/logs/t_a1b2c3d4e5f6 \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Email detail response
{
  "messageId": "t_a1b2c3d4e5f6",
  "recipient": "[email protected]",
  "fromEmail": "[email protected]",
  "subject": "Your order has shipped",
  "status": "opened",
  "sentAt": "2026-02-17T12:34:56Z",
  "deliveredAt": "2026-02-17T12:34:58Z",
  "openedAt": "2026-02-17T13:15:00Z",
  "clickedAt": null,
  "createdAt": "2026-02-17T12:34:55Z",
  "bounceReason": null,
  "bounceCategory": null,
  "ipAddress": null,
  "retryCount": 0,
  "smtpResponse": "250 2.0.0 OK",
  "openCount": 2,
  "clickCount": 0,
  "htmlContent": "<html>...</html>",
  "textContent": "Your order has shipped...",
  "events": [
    {
      "eventType": "delivered",
      "timestamp": "2026-02-17T12:34:58Z",
      "ipAddress": null,
      "userAgent": null,
      "linkUrl": null,
      "bounceType": null,
      "bounceReason": null,
      "smtpResponse": "250 2.0.0 OK",
      "deviceType": null,
      "browser": null,
      "country": null,
      "city": null
    },
    {
      "eventType": "opened",
      "timestamp": "2026-02-17T13:15:00Z",
      "ipAddress": "203.0.113.45",
      "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
      "linkUrl": null,
      "bounceType": null,
      "bounceReason": null,
      "smtpResponse": null,
      "deviceType": "desktop",
      "browser": "Chrome",
      "country": "US",
      "city": "San Francisco"
    },
    {
      "eventType": "opened",
      "timestamp": "2026-02-17T14:30:00Z",
      "ipAddress": "203.0.113.45",
      "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0)",
      "linkUrl": null,
      "bounceType": null,
      "bounceReason": null,
      "smtpResponse": null,
      "deviceType": "mobile",
      "browser": "Safari",
      "country": "US",
      "city": "San Francisco"
    }
  ]
}

Le tableau events est fourni par ClickHouse et trié par horodatage. Si ClickHouse est temporairement indisponible, le détail de l'e-mail est quand même retourné depuis PostgreSQL mais events sera un tableau vide.

Champs des événements

ChampDescription
eventTypedelivered, opened, clicked, bounced, complained, ainsi que accepted, sent, deferred, admin_bounce, oob_bounce, expired
timestampQuand l'événement s'est produit (UTC)
ipAddressIP du client (pour les ouvertures/clics)
userAgentChaîne user agent du client
linkUrlURL cliquée (pour les événements clicked)
bounceTypehard, soft ou unknown (pour les événements bounced)
bounceReasonRéponse SMTP (pour les événements bounced)
smtpResponseRéponse du serveur distant (pour les événements delivered)
deviceTypedesktop, mobile ou tablet
browserNom du navigateur (Chrome, Safari, Firefox, etc.)
countryCode pays ISO
cityNom de la ville

Relancer un e-mail échoué

Relancer la livraison d'un e-mail rejeté ou échoué :

POST https://api.mail.land/v1/transactional/logs/{messageId}/retry
Retry failed email
curl -X POST https://api.mail.land/v1/transactional/logs/t_a1b2c3d4e5f6/retry \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Le message doit avoir le statut Bounced ou Failed, et le destinataire ne doit pas être supprimé.

StatutCodeDescription
200-Relance acceptée
400INVALID_REQUESTL'e-mail n'est pas rejeté ou échoué
400RECIPIENT_SUPPRESSEDLe destinataire est sur la liste de suppression
404RESOURCE_NOT_FOUNDMessage introuvable : pas EMAIL_NOT_FOUND
422DOMAIN_NOT_VERIFIEDLe domaine d'envoi n'est plus vérifié
429MARKETING_PAUSEDL'envoi marketing est actuellement en pause pour cet espace de travail
422RETRY_ATTACHMENTS_UNAVAILABLELe message avait des pièces jointes qui ne peuvent plus être récupérées ; renvoyez-le avec ses pièces jointes
422RETRY_ATTACHMENTS_UNKNOWNLe message a été envoyé avant l'enregistrement des pièces jointes, une nouvelle tentative ne peut donc pas les garantir ; renvoyez-le
429PLATFORM_CAPACITY_PROTECTIONLes nouveaux envois sont brièvement suspendus pour protéger la capacité de la plateforme ; rien n'a été modifié, réessayez sous peu
503RETRY_ATTACHMENT_STORAGE_UNAVAILABLELes pièces jointes n'ont pas pu être lues pour l'instant ; rien n'a été modifié, réessayez sous peu

La relance crée un nouveau travail d'e-mail avec le contenu original et le met en file d'attente pour la livraison. Les copies relancées sont envoyées sans suivi d'ouverture/de clic.

Étapes suivantes

Sur cette page