Webhooks
Référence des événements
Chaque événement qu’un webhook peut recevoir, avec les champs de son contenu et un exemple.
Chaque évènement, tel que votre point de terminaison le reçoit. Les exemples sont caviardés : identifiants, numéros et adresses sont fictifs. Des champs peuvent s’ajouter avec le temps, ignorez donc ceux que vous ne reconnaissez pas.
Événements SMS
Voici les événements SMS, de désabonnement et de numéro de téléphone. L’inscription d’un point de terminaison, l’enveloppe de chaque événement, les nouvelles tentatives et les signatures sont décrites dans Webhooks.
message.queued
Un message sortant a été accepté et facturé, et va être remis à l’opérateur.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.queued",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"from": "+1416XXXXXXX",
"to": "+1613XXXXXXX",
"status": "QUEUED",
"message_status": "QUEUED"
}
}| Champ de data | Signification |
|---|---|
| message_id | L’identifiant HonkIO du message, tel que renvoyé par POST /v1/messages ou listé par GET /v1/messages. |
| from | Votre numéro HonkIO d’où le message est parti, au format E.164. |
| to | Le numéro du destinataire, au format E.164. |
| status | Le statut du message à ce moment, en majuscules (la même valeur que message_status). |
| message_status | Le statut HonkIO du message, en majuscules : QUEUED, SENDING, DELIVERED, FAILED, UNDELIVERED ou RECEIVED. |
message.sending
Réservé : rarement, voire jamais envoyé. Il ne se déclenche que si un accusé final de l’opérateur indique le statut sending, ce qui n’est pas attendu en pratique.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.sending",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"status": "sending",
"message_status": "SENDING",
"to": "+1613XXXXXXX",
"from": "+1416XXXXXXX",
"errors": []
}
}| Champ de data | Signification |
|---|---|
| message_id | L’identifiant HonkIO du message, tel que renvoyé par POST /v1/messages ou listé par GET /v1/messages. |
| status | Le statut propre à l’opérateur tiré de son accusé, en minuscules (par exemple delivered, sending_failed, delivery_failed ou expired). |
| message_status | Le statut HonkIO du message, en majuscules : QUEUED, SENDING, DELIVERED, FAILED, UNDELIVERED ou RECEIVED. |
| to | Le numéro du destinataire, au format E.164. |
| from | Votre numéro HonkIO d’où le message est parti, au format E.164. |
| errors | Ce que l’opérateur a signalé, sous forme de liste ; vide s’il n’a rien signalé. |
| errors[].code | Le code d’erreur de l’opérateur, tel quel. |
| errors[].title | Une brève description de l’erreur. |
| errors[].detail | Plus de détails, quand l’opérateur en donne. |
message.sent
L’opérateur a accepté le message pour livraison. Déclenché au retour de l’appel d’envoi, pas par un accusé.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.sent",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"from": "+1416XXXXXXX",
"to": "+1613XXXXXXX",
"status": "SENDING",
"message_status": "SENDING",
"carrier_message_id": "40319xxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"segment_count": 1,
"cost_cents": 3
}
}| Champ de data | Signification |
|---|---|
| message_id | L’identifiant HonkIO du message, tel que renvoyé par POST /v1/messages ou listé par GET /v1/messages. |
| from | Votre numéro HonkIO d’où le message est parti, au format E.164. |
| to | Le numéro du destinataire, au format E.164. |
| status | Le statut du message à ce moment, en majuscules (la même valeur que message_status). |
| message_status | Le statut HonkIO du message, en majuscules : QUEUED, SENDING, DELIVERED, FAILED, UNDELIVERED ou RECEIVED. |
| carrier_message_id | L’identifiant attribué au message par l’opérateur, pour les demandes de soutien. |
| segment_count | Le nombre de segments SMS du message, qui est la base de sa facturation. |
| cost_cents | Ce que le message vous a coûté, en cents canadiens. |
message.delivered
L’accusé de l’opérateur indique que le message a atteint l’appareil.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.delivered",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"status": "delivered",
"message_status": "DELIVERED",
"to": "+1613XXXXXXX",
"from": "+1416XXXXXXX",
"errors": []
}
}| Champ de data | Signification |
|---|---|
| message_id | L’identifiant HonkIO du message, tel que renvoyé par POST /v1/messages ou listé par GET /v1/messages. |
| status | Le statut propre à l’opérateur tiré de son accusé, en minuscules (par exemple delivered, sending_failed, delivery_failed ou expired). |
| message_status | Le statut HonkIO du message, en majuscules : QUEUED, SENDING, DELIVERED, FAILED, UNDELIVERED ou RECEIVED. |
| to | Le numéro du destinataire, au format E.164. |
| from | Votre numéro HonkIO d’où le message est parti, au format E.164. |
| errors | Ce que l’opérateur a signalé, sous forme de liste ; vide s’il n’a rien signalé. |
| errors[].code | Le code d’erreur de l’opérateur, tel quel. |
| errors[].title | Une brève description de l’erreur. |
| errors[].detail | Plus de détails, quand l’opérateur en donne. |
message.failed
Le message n’est pas parti. Trois formes selon l’endroit de l’échec : un échec au passage à l’opérateur (CARRIER_UNAVAILABLE, CARRIER_TIMEOUT, CARRIER_ERROR, INVALID_PHONE_NUMBER, NOT_A_MOBILE_NUMBER) porte error_code et error_message mais pas de tableau errors ; un accusé de l’opérateur porte son statut brut, un tableau errors et un error_code, mais pas de error_message ; un envoi interrompu par un redémarrage du serveur (error_code STALE_QUEUED) ne porte ni to ni from. Un échec pour INSUFFICIENT_BALANCE ne déclenche aucun webhook.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.failed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"from": "+1416XXXXXXX",
"to": "+1613XXXXXXX",
"status": "FAILED",
"message_status": "FAILED",
"error_code": "INVALID_PHONE_NUMBER",
"error_message": "The destination is not a valid phone number."
}
}| Champ de data | Signification |
|---|---|
| message_id | L’identifiant HonkIO du message, tel que renvoyé par POST /v1/messages ou listé par GET /v1/messages. |
| status | Le statut propre à l’opérateur tiré de son accusé, en minuscules (par exemple delivered, sending_failed, delivery_failed ou expired). |
| message_status | Le statut HonkIO du message, en majuscules : QUEUED, SENDING, DELIVERED, FAILED, UNDELIVERED ou RECEIVED. |
| to | Le numéro du destinataire, au format E.164. |
| from | Votre numéro HonkIO d’où le message est parti, au format E.164. |
| error_code | Le code d’erreur HonkIO de l’échec, le même que celui du message dans l’API. |
| error_message | Une explication lisible de error_code. |
| errors | Ce que l’opérateur a signalé, sous forme de liste ; vide s’il n’a rien signalé. |
| errors[].code | Le code d’erreur de l’opérateur, tel quel. |
| errors[].title | Une brève description de l’erreur. |
| errors[].detail | Plus de détails, quand l’opérateur en donne. |
message.undelivered
L’opérateur a pris le message mais n’a pas pu le livrer : bloqué, expiré, ou appareil injoignable.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.undelivered",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"status": "delivery_failed",
"message_status": "UNDELIVERED",
"to": "+1613XXXXXXX",
"from": "+1416XXXXXXX",
"errors": [
{
"code": "40002",
"title": "Blocked as spam",
"detail": "The destination carrier blocked the message."
}
]
}
}| Champ de data | Signification |
|---|---|
| message_id | L’identifiant HonkIO du message, tel que renvoyé par POST /v1/messages ou listé par GET /v1/messages. |
| status | Le statut propre à l’opérateur tiré de son accusé, en minuscules (par exemple delivered, sending_failed, delivery_failed ou expired). |
| message_status | Le statut HonkIO du message, en majuscules : QUEUED, SENDING, DELIVERED, FAILED, UNDELIVERED ou RECEIVED. |
| to | Le numéro du destinataire, au format E.164. |
| from | Votre numéro HonkIO d’où le message est parti, au format E.164. |
| errors | Ce que l’opérateur a signalé, sous forme de liste ; vide s’il n’a rien signalé. |
| errors[].code | Le code d’erreur de l’opérateur, tel quel. |
| errors[].title | Une brève description de l’erreur. |
| errors[].detail | Plus de détails, quand l’opérateur en donne. |
message.received
Quelqu’un a texté l’un de vos numéros HonkIO. Les réponses STOP, START et HELP arrivent aussi ici, avec keyword_action qui indique ce qui en a été fait.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.received",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"from": "+1613XXXXXXX",
"to": "+1416XXXXXXX",
"body": "Yes, see you at 3",
"keyword_action": "ignored",
"segment_count": 1,
"cost_cents": 1,
"message_status": "RECEIVED"
}
}| Champ de data | Signification |
|---|---|
| message_id | L’identifiant HonkIO du message, tel que renvoyé par POST /v1/messages ou listé par GET /v1/messages. |
| from | Le numéro qui vous a texté, au format E.164. |
| to | Votre numéro HonkIO qui a reçu le texto, au format E.164. |
| body | Le texte du message. |
| keyword_action | Ce que HonkIO a fait d’un mot-clé de conformité, d’après le premier mot du texte : opted_out (STOP et semblables, suivi d’un évènement opt_out.recorded), reinstated (START ou UNSTOP après un désabonnement, suivi d’un évènement opt_out.reinstated), help (HELP, INFO ou AIDE ; la réponse automatique a été envoyée), ou ignored. |
| segment_count | Le nombre de segments SMS du message, qui est la base de sa facturation. |
| cost_cents | Ce que la réception du message vous a coûté, en cents canadiens. |
| message_status | Le statut HonkIO du message, en majuscules : QUEUED, SENDING, DELIVERED, FAILED, UNDELIVERED ou RECEIVED. |
opt_out.recorded
Un abonné a répondu à l’un de vos numéros par un mot-clé de désabonnement (une réponse dont le premier mot est STOP, STOPALL, UNSUBSCRIBE, CANCEL, END ou QUIT), et les messages vers lui depuis ce numéro sont maintenant bloqués. Se déclenche uniquement pour une réponse par mot-clé : un désabonnement enregistré avec POST /v1/compliance/opt-outs ne le déclenche pas.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "opt_out.recorded",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"phone_number": "+1613XXXXXXX",
"from_number": "+1416XXXXXXX",
"keyword": "STOP"
}
}| Champ de data | Signification |
|---|---|
| phone_number | L’abonné qui a texté le mot-clé, au format E.164 : la personne à qui cesser ou recommencer d’écrire. |
| from_number | Votre numéro HonkIO qui a reçu le mot-clé, au format E.164. Un désabonnement vaut pour les messages envoyés depuis ce numéro. |
| keyword | La réponse de l’abonné, rognée et en majuscules, par exemple STOP ou STOP PLEASE. La réponse entière, pas seulement le mot-clé : elle a été reconnue par son premier mot. |
opt_out.reinstated
Un abonné désabonné a répondu START ou UNSTOP, vous pouvez donc de nouveau lui écrire depuis ce numéro. Se déclenche uniquement pour une réponse par mot-clé, et seulement si un désabonnement existait : un START de quelqu’un qui ne s’était jamais désabonné est un simple message.received.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "opt_out.reinstated",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"phone_number": "+1613XXXXXXX",
"from_number": "+1416XXXXXXX",
"keyword": "START"
}
}| Champ de data | Signification |
|---|---|
| phone_number | L’abonné qui a texté le mot-clé, au format E.164 : la personne à qui cesser ou recommencer d’écrire. |
| from_number | Votre numéro HonkIO qui a reçu le mot-clé, au format E.164. Un désabonnement vaut pour les messages envoyés depuis ce numéro. |
| keyword | La réponse de l’abonné, rognée et en majuscules, par exemple START. La réponse entière, pas seulement le mot-clé : elle a été reconnue par son premier mot. |
phone_number.suspended
Le loyer mensuel n’a pas pu être prélevé, le numéro a donc été suspendu. Rechargez votre solde pour le récupérer avant la fin du délai de grâce.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "phone_number.suspended",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"phone_number": "+1416XXXXXXX",
"reason": "insufficient_balance",
"monthly_cost_cents": 299
}
}| Champ de data | Signification |
|---|---|
| phone_number | Votre numéro HonkIO, au format E.164. |
| reason | Toujours insufficient_balance : le loyer du mois n’a pas pu être prélevé. |
| monthly_cost_cents | Le loyer mensuel du numéro, en cents canadiens. |
phone_number.released
Le numéro a quitté votre compte et ne peut pas être récupéré. Cessez d’y acheminer quoi que ce soit.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "phone_number.released",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"phone_number": "+1416XXXXXXX",
"reason": "customer_released"
}
}| Champ de data | Signification |
|---|---|
| phone_number | Votre numéro HonkIO, au format E.164. |
| reason | suspended_grace_expired quand une suspension a dépassé son délai de grâce, customer_released quand vous l’avez libéré vous-même, admin_released quand le personnel de HonkIO l’a libéré. |
Événements de compte
Cinq événements de compte ne portent aucun message : account.delivery_warning lorsque plus de 10 % de vos 50 derniers messages réels ont échoué chez l’opérateur ; account.sending_paused lorsqu’une pause automatique se déclenche (channel vaut sms ou email ; une pause courriel ajoute bounce_rate_pct ou complaint_rate_pct) ; account.spend_warning lorsque les dépenses réelles d’une heure dépassent le plus élevé de 5 $ et de la moitié d’une journée typique ; account.inbound_email_capped lorsque le courriel reçu atteint le plafond quotidien du compte, au plus une fois par 24 heures ; account.inbound_sms_capped lorsque les textos reçus atteignent le plafond quotidien du compte, au plus une fois par 24 heures. Chacun est aussi envoyé par courriel. Leur contenu figure dans la référence ci-dessous.
account.delivery_warning
Plus de 10 % de vos 50 derniers messages réels ont échoué chez l’opérateur. Envoyé avant toute pause automatique, au plus une fois par période de pause. Aussi envoyé par courriel.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "account.delivery_warning",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"failure_rate_pct": 14,
"failed": 7,
"sample": 50
}
}| Champ de data | Signification |
|---|---|
| failure_rate_pct | La part de l’échantillon qui a échoué, en pourcentage arrondi. |
| failed | Le nombre de messages de l’échantillon qui ont échoué chez l’opérateur. |
| sample | Le nombre de vos messages réels les plus récents examinés. |
account.sending_paused
Une pause automatique a arrêté l’envoi réel jusqu’à paused_until. Le mode test n’est pas touché. Aussi envoyé par courriel.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "account.sending_paused",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"channel": "sms",
"paused_until": "2026-09-25T14:00:00.000Z",
"reason": "FAILURE_RATE"
}
}| Champ de data | Signification |
|---|---|
| channel | L’envoi arrêté : sms ou email. L’autre canal n’est pas en pause. |
| paused_until | Le moment où l’envoi réel reprend de lui-même, en ISO 8601 UTC. |
| reason | Pourquoi : OPT_OUT_RATE ou FAILURE_RATE pour les SMS ; BOUNCE_RATE ou COMPLAINT_RATE pour les courriels. |
| bounce_rate_pct | Pauses de courriel pour BOUNCE_RATE seulement : votre taux récent de rebonds réels, en pourcentage. |
| complaint_rate_pct | Pauses de courriel pour COMPLAINT_RATE seulement : votre taux récent de plaintes réelles, en pourcentage. |
account.spend_warning
Vos dépenses réelles de la dernière heure ont dépassé le plus élevé de 5 $ et de la moitié d’une journée habituelle. Aussi envoyé par courriel.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "account.spend_warning",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"spent_last_hour_cents": 1250,
"typical_daily_cents": 400,
"threshold_cents": 500
}
}| Champ de data | Signification |
|---|---|
| spent_last_hour_cents | Vos dépenses réelles de la dernière heure, en cents canadiens. |
| typical_daily_cents | Ce que votre compte dépense habituellement en une journée, en cents canadiens ; 0 sans historique. |
| threshold_cents | La dépense en une heure qui déclenche cet avertissement pour votre compte, en cents canadiens. |
account.inbound_email_capped
Le courriel reçu par ce compte a atteint son plafond quotidien. Le courriel supplémentaire est stocké comme refusé et n’est pas facturé jusqu’à ce que la fenêtre de 24 heures avance.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "account.inbound_email_capped",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"cap": 1000,
"window_hours": 24,
"received_in_window": 1000,
"managed_address_enabled": true
}
}| Champ de data | Signification |
|---|---|
| cap | Le plafond quotidien atteint : le remplacement propre à votre compte, ou la valeur par défaut de la plateforme. |
| window_hours | La fenêtre glissante sur laquelle le plafond est compté, en heures. Toujours 24. |
| received_in_window | Le nombre de messages reçus par votre compte dans la fenêtre, au moment où le plafond a été atteint. |
| managed_address_enabled | Si votre adresse entrante gérée accepte encore le courriel. Désactivez-la depuis la boîte de réception si ce trafic ne devrait pas s’y rendre. |
account.inbound_sms_capped
Les textos reçus par ce compte ont atteint leur plafond quotidien. Les textos supplémentaires sont stockés sans leur contenu et ne sont pas facturés jusqu’à ce que la fenêtre de 24 heures avance. STOP, START et HELP continuent de fonctionner.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "account.inbound_sms_capped",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"cap": 1000,
"window_hours": 24,
"received_in_window": 1000
}
}| Champ de data | Signification |
|---|---|
| cap | Le plafond quotidien atteint : le remplacement propre à votre compte, ou la valeur par défaut de la plateforme. |
| window_hours | La fenêtre glissante sur laquelle le plafond est compté, en heures. Toujours 24. |
| received_in_window | Le nombre de messages reçus par votre compte dans la fenêtre, au moment où le plafond a été atteint. |
Événements de courriel
Abonnez-vous aux événements de courriel comme aux événements SMS. Les livraisons sont signées exactement comme décrit dans Vérifier les signatures.
email.queued
Un courriel a été accepté et facturé, et il est en file, ou planifié si vous avez passé scheduled_at.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.queued",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
],
"subject": "Your receipt",
"tags": [
{
"name": "category",
"value": "receipt"
}
],
"status": "queued",
"is_commercial": false
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| email.subject | La ligne d’objet. |
| email.tags | Les étiquettes posées sur le courriel, sous forme de liste de paires name et value ; vide s’il n’y en a pas. |
| email.status | queued, ou scheduled quand le courriel attend scheduled_at. Absent pour les courriels envoyés en lot. |
| email.batch_id | Courriels envoyés avec POST /v1/emails/batch seulement : le lot auquel appartient le courriel. |
| email.is_commercial | Si vous avez marqué le courriel comme commercial (LCAP), ce qui décide du pied de page et de l’en-tête de désabonnement. |
email.sent
Le fournisseur de courriel a accepté le message pour livraison.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.sent",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
],
"subject": "Your receipt",
"tags": []
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| email.ses_message_id | L’identifiant du message chez le fournisseur de courriel, pour les demandes de soutien. Présent sur les évènements que le fournisseur signale. |
| email.subject | La ligne d’objet. |
| email.tags | Les étiquettes posées sur le courriel, sous forme de liste de paires name et value ; vide s’il n’y en a pas. |
email.delivered
Le serveur de courriel du destinataire a accepté le message.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.delivered",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"to": [
"ada@example.com"
],
"from": "receipts@mail.acme.ca",
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000",
"tags": [
{
"name": "category",
"value": "receipt"
}
]
},
"details": {
"delivered_at": "2026-10-01T17:00:03.512Z",
"smtp_response": "250 2.0.0 OK",
"processing_time_ms": 1204,
"recipients": [
"ada@example.com"
],
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| email.from | L’adresse d’expédition du courriel. |
| email.ses_message_id | L’identifiant du message chez le fournisseur de courriel, pour les demandes de soutien. Présent sur les évènements que le fournisseur signale. |
| email.tags | Les étiquettes posées sur le courriel, sous forme de liste de paires name et value ; vide s’il n’y en a pas. |
| details.delivered_at | Le moment où le serveur du destinataire a accepté le message, en ISO 8601 UTC. |
| details.smtp_response | La réponse SMTP du serveur du destinataire, telle quelle. |
| details.processing_time_ms | La durée de la livraison depuis l’acceptation, en millisecondes. |
| details.recipients | Les adresses de destinataires visées par ce rapport. |
| details.ses_message_id | Le même identifiant de fournisseur que email.ses_message_id. |
email.delivery_delayed
Le serveur du destinataire diffère le message ; la livraison est encore retentée. Plusieurs peuvent arriver pour un même courriel.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.delivery_delayed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"to": [
"ada@example.com"
],
"from": "receipts@mail.acme.ca",
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000",
"tags": [
{
"name": "category",
"value": "receipt"
}
]
},
"details": {
"delay_type": "MailboxFull",
"expiration_time": "2026-10-02T17:00:00.000Z",
"recipients": [
{
"email_address": "ada@example.com",
"status": "4.2.2",
"diagnostic_code": "smtp; 452 4.2.2 Mailbox full"
}
],
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| email.from | L’adresse d’expédition du courriel. |
| email.ses_message_id | L’identifiant du message chez le fournisseur de courriel, pour les demandes de soutien. Présent sur les évènements que le fournisseur signale. |
| email.tags | Les étiquettes posées sur le courriel, sous forme de liste de paires name et value ; vide s’il n’y en a pas. |
| details.delay_type | Le type de retard signalé par le fournisseur, par exemple MailboxFull, SpamDetected ou TransientCommunicationFailure. |
| details.expiration_time | Le moment où le fournisseur cessera de réessayer et fera rebondir le message, en ISO 8601 UTC. |
| details.recipients | Les destinataires dont la livraison est retardée, un objet chacun. |
| details.recipients[].email_address | L’adresse d’un destinataire retardé. |
| details.recipients[].status | Le code de statut SMTP pour ce destinataire. |
| details.recipients[].diagnostic_code | L’explication du serveur du destinataire, quand il en donne une. |
| details.ses_message_id | Le même identifiant de fournisseur que email.ses_message_id. |
email.bounced
Le message a rebondi. Un rebond permanent supprime l’adresse ; un rebond temporaire, non.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.bounced",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"to": [
"ada@example.com"
],
"from": "receipts@mail.acme.ca",
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000",
"tags": [
{
"name": "category",
"value": "receipt"
}
]
},
"details": {
"bounce_type": "Permanent",
"bounce_subtype": "General",
"diagnostic_code": "smtp; 550 5.1.1 user unknown",
"suppressed": true,
"transient": false,
"recipients": [
"ada@example.com"
],
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| email.from | L’adresse d’expédition du courriel. |
| email.ses_message_id | L’identifiant du message chez le fournisseur de courriel, pour les demandes de soutien. Présent sur les évènements que le fournisseur signale. |
| email.tags | Les étiquettes posées sur le courriel, sous forme de liste de paires name et value ; vide s’il n’y en a pas. |
| details.bounce_type | Permanent, Transient ou Undetermined. |
| details.bounce_subtype | La classification plus fine du fournisseur, par exemple General, NoEmail ou MailboxFull. |
| details.diagnostic_code | L’explication du serveur du destinataire pour le premier destinataire rebondi, quand il en donne une. |
| details.suppressed | true quand l’adresse a été ajoutée à votre liste de suppression (tout rebond permanent). |
| details.transient | true pour un rebond temporaire, qui ne supprime pas l’adresse. |
| details.recipients | Les adresses de destinataires visées par ce rapport. |
| details.ses_message_id | Le même identifiant de fournisseur que email.ses_message_id. |
email.complained
Un destinataire a signalé le message comme pourriel. L’adresse est supprimée et enregistrée comme désabonnement.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.complained",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"to": [
"ada@example.com"
],
"from": "receipts@mail.acme.ca",
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000",
"tags": [
{
"name": "category",
"value": "receipt"
}
]
},
"details": {
"complained_at": "2026-10-01T18:12:00.000Z",
"recipients": [
"ada@example.com"
],
"ses_message_id": "0101019xxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-000000"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| email.from | L’adresse d’expédition du courriel. |
| email.ses_message_id | L’identifiant du message chez le fournisseur de courriel, pour les demandes de soutien. Présent sur les évènements que le fournisseur signale. |
| email.tags | Les étiquettes posées sur le courriel, sous forme de liste de paires name et value ; vide s’il n’y en a pas. |
| details.complained_at | Le moment de la plainte, en ISO 8601 UTC. |
| details.recipients | Les adresses de destinataires visées par ce rapport. |
| details.ses_message_id | Le même identifiant de fournisseur que email.ses_message_id. |
email.rejected
Le message a été refusé avant ou pendant l’envoi, par les vérifications de HonkIO ou par le fournisseur de courriel, et les frais sont remboursés. Un refus de nos vérifications porte failure_code et failure_message ; un refus signalé par le fournisseur porte reason.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.rejected",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
]
},
"details": {
"failure_code": "DOMAIN_NOT_VERIFIED",
"failure_message": "The sending domain is not verified."
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| details.failure_code | Le code HonkIO qui explique le refus ou l’échec du courriel. |
| details.failure_message | Une explication lisible de failure_code. |
| details.reason | Refus signalés par le fournisseur de courriel seulement (à la place de failure_code) : la raison du fournisseur. |
| email.ses_message_id | L’identifiant du message chez le fournisseur de courriel, pour les demandes de soutien. Présent sur les évènements que le fournisseur signale. |
email.failed
Le courriel n’a pas pu être envoyé pour une raison qui ne tient pas au destinataire, comme une erreur de facturation ou du fournisseur, et les frais sont remboursés.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.failed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
]
},
"details": {
"failure_code": "SES_ERROR",
"failure_message": "The provider did not accept the message."
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| details.failure_code | Le code HonkIO qui explique le refus ou l’échec du courriel. |
| details.failure_message | Une explication lisible de failure_code. |
email.opened
La première ouverture du courriel : le pixel de suivi s’est chargé. Seulement quand le suivi des ouvertures est activé ; certains logiciels chargent les images automatiquement, une ouverture est donc un indice, pas une preuve. Les ouvertures suivantes ne déclenchent aucun webhook.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.opened",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
]
},
"details": {
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X)"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| details.ua | L’agent utilisateur qui a chargé le pixel ou suivi le lien, ou null. |
email.clicked
Le premier clic sur un lien suivi du courriel, quand le suivi des clics est activé. Les clics suivants ne déclenchent aucun webhook.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.clicked",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
]
},
"details": {
"url": "https://acme.ca/orders/1042",
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5)"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| details.url | Le lien suivi, tel qu’écrit dans votre courriel. |
| details.ua | L’agent utilisateur qui a chargé le pixel ou suivi le lien, ou null. |
email.unsubscribed
Un destinataire d’un courriel commercial s’est désabonné par son lien ou son en-tête, et il est maintenant supprimé pour ce domaine d’envoi.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.unsubscribed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
]
},
"details": {
"recipient": "ada@example.com",
"from_domain": "mail.acme.ca"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| details.recipient | L’adresse qui s’est désabonnée. |
| details.from_domain | Le domaine d’envoi pour lequel l’adresse est maintenant supprimée. |
email.cancelled
Un courriel planifié a été annulé avant son envoi, et les frais ont été remboursés.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.cancelled",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
]
},
"details": {
"cancelled_at": "2026-10-01T16:58:00.000Z"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| details.cancelled_at | Le moment de l’annulation, en ISO 8601 UTC. |
email.rescheduled
Un courriel planifié a été déplacé à une nouvelle heure.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.rescheduled",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "clxxxemailxxxxxxxxxxxxxxx",
"from": "receipts@mail.acme.ca",
"to": [
"ada@example.com"
],
"tags": []
},
"details": {
"previous_scheduled_at": "2026-10-02T13:00:00.000Z",
"scheduled_at": "2026-10-03T13:00:00.000Z"
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant HonkIO du courriel, tel que renvoyé par POST /v1/emails. |
| email.from | L’adresse d’expédition du courriel. |
| email.to | Les adresses des destinataires, sous forme de liste. |
| email.tags | Les étiquettes posées sur le courriel, sous forme de liste de paires name et value ; vide s’il n’y en a pas. |
| details.previous_scheduled_at | L’heure planifiée précédente, en ISO 8601 UTC. |
| details.scheduled_at | La nouvelle heure, en ISO 8601 UTC. |
email.received
Un courriel est arrivé sur l’un de vos domaines de réception ou sur votre adresse entrante gérée. Métadonnées seulement ; récupérez le corps par son id.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email.received",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"email": {
"id": "rcv_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"from": "ada@example.com",
"from_name": "Ada Lovelace",
"to": [
"support@abc123defg.inbound.honkio.ca"
],
"cc": [],
"subject": "Re: Your order",
"message_id": "<abc123@example.com>",
"in_reply_to": "<orig456@mail.acme.ca>",
"received_at": "2026-10-01T17:00:00.000Z",
"size_bytes": 12345,
"domain_id": null,
"verdicts": {
"spf": "PASS",
"dkim": "PASS",
"dmarc": "GRAY",
"spam": "PASS"
},
"attachments": [
{
"id": "rat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"filename": "invoice.pdf",
"content_type": "application/pdf",
"size_bytes": 48213,
"inline": false
}
]
}
}
}| Champ de data | Signification |
|---|---|
| email.id | L’identifiant du courriel reçu (rcv_…). Récupérez son corps avec GET /v1/emails/received/:id. |
| email.from | L’adresse de l’expéditeur, telle que donnée par l’en-tête From. |
| email.from_name | Le nom d’affichage de l’expéditeur, ou null. |
| email.to | Les adresses de l’en-tête To. |
| email.cc | Les adresses de l’en-tête Cc. |
| email.subject | La ligne d’objet. |
| email.message_id | Le Message-ID RFC 5322, avec ses chevrons. Pour répondre dans le même fil, envoyez-le comme en-tête In-Reply-To (et à la fin de References) dans la table headers de l’API d’envoi. |
| email.in_reply_to | Le Message-ID auquel ce courriel répond, ou null. |
| email.received_at | Le moment où le message nous est parvenu, en ISO 8601 UTC. |
| email.size_bytes | La taille du message brut, en-têtes compris. |
| email.domain_id | L’identifiant du domaine de réception, ou null pour votre adresse entrante gérée. |
| email.verdicts | Les résultats d’authentification et de pourriel de la vérification à la réception. PASS, FAIL, GRAY ou PROCESSING_FAILED. |
| email.verdicts.spf | Le résultat SPF pour l’expéditeur d’enveloppe. |
| email.verdicts.dkim | Le résultat de la signature DKIM. |
| email.verdicts.dmarc | Le résultat DMARC pour le domaine de From. |
| email.verdicts.spam | Le résultat de l’analyse antipourriel. Un message détecté comme virus n’est jamais livré. |
| email.attachments | Les pièces jointes, métadonnées seulement. Téléchargez chacune avec GET /v1/emails/received/:id/attachments/:attachment_id dans les 40 jours. |
| email.attachments[].id | L’identifiant de la pièce jointe (rat_…). |
| email.attachments[].filename | Le nom du fichier tel qu’envoyé, ou attachment-N s’il n’en avait pas. |
| email.attachments[].content_type | Le type de contenu déclaré. |
| email.attachments[].size_bytes | La taille en octets. |
| email.attachments[].inline | true pour une partie intégrée, comme une image incorporée. |
email_domain.verified
Les enregistrements DNS d’un domaine d’envoi sont validés et il peut envoyer.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email_domain.verified",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"domain": {
"id": "clxxxdomainxxxxxxxxxxxxxx",
"domain": "mail.acme.ca",
"region": "ca-central-1"
}
}
}| Champ de data | Signification |
|---|---|
| domain.id | L’identifiant HonkIO du domaine de courriel. |
| domain.domain | Le nom de domaine. |
| domain.region | La région d’où le domaine envoie (ca-central-1). |
email_domain.verification_failed
Un domaine d’envoi a échoué la vérification, ou l’a perdue lors d’une vérification ultérieure de ses enregistrements.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email_domain.verification_failed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"domain": {
"id": "clxxxdomainxxxxxxxxxxxxxx",
"domain": "mail.acme.ca",
"status": "temporarily_failed"
},
"details": {
"failure_reason": "DKIM records not found",
"revalidation": true
}
}
}| Champ de data | Signification |
|---|---|
| domain.id | L’identifiant HonkIO du domaine de courriel. |
| domain.domain | Le nom de domaine. |
| domain.status | failed quand un autre compte a depuis vérifié le même domaine, temporarily_failed quand une nouvelle vérification d’un domaine déjà vérifié a échoué ; absent quand une première vérification a échoué. |
| details.failure_reason | Pourquoi la vérification a échoué, par exemple quels enregistrements sont introuvables. |
| details.revalidation | true quand il s’agissait d’une nouvelle vérification d’un domaine déjà vérifié. Absent sinon. |
email_domain.receiving_verified
L’enregistrement MX entrant d’un domaine a été trouvé. Le courrier envoyé vers lui vous parvient désormais.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email_domain.receiving_verified",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"domain": {
"id": "clxxxdomainxxxxxxxxxxxxxx",
"domain": "reply.acme.ca"
}
}
}| Champ de data | Signification |
|---|---|
| domain.id | L’identifiant HonkIO du domaine de courriel. |
| domain.domain | Le nom de domaine. |
email_domain.receiving_failed
L’enregistrement MX entrant est manquant depuis plus longtemps que le délai de grâce. La réception sur ce domaine est coupée jusqu’à ce que l’enregistrement soit rétabli et le domaine revérifié.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "email_domain.receiving_failed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"domain": {
"id": "clxxxdomainxxxxxxxxxxxxxx",
"domain": "reply.acme.ca",
"status": "failed"
},
"details": {
"failure_reason": "Inbound MX missing on reply.acme.ca",
"revalidation": true
}
}
}| Champ de data | Signification |
|---|---|
| domain.id | L’identifiant HonkIO du domaine de courriel. |
| domain.domain | Le nom de domaine. |
| domain.status | Toujours failed : l’enregistrement MX entrant est manquant depuis plus longtemps que le délai de grâce. La réception reste coupée jusqu’à ce que l’enregistrement soit rétabli et le domaine revérifié. |
| details.failure_reason | Pourquoi la vérification a échoué, par exemple quels enregistrements sont introuvables. |
| details.revalidation | true quand il s’agissait d’une nouvelle vérification d’un domaine déjà vérifié. Absent sinon. |
HonkIO