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. Un envoi programmé le déclenche au moment où vous le programmez, avec le statut SCHEDULED et scheduled_at, et part chez l’opérateur à l’heure prévue.
{
"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, RECEIVED, SCHEDULED ou CANCELLED. |
| scheduled_at | Pour un envoi programmé seulement : l’heure prévue de son départ, en ISO 8601 UTC. Son statut est alors SCHEDULED. |
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, RECEIVED, SCHEDULED ou CANCELLED. |
| 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, RECEIVED, SCHEDULED ou CANCELLED. |
| 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, RECEIVED, SCHEDULED ou CANCELLED. |
| 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_THROTTLED, 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 (son error_code est CARRIER_THROTTLED quand l’opérateur a pris le message puis l’a abandonné parce que la file était pleine : ce message est remboursé, et le renvoyer demande une nouvelle Idempotency-Key ; il est CARRIER_LOST, avec un tableau errors vide, quand l’opérateur a pris le message puis l’a perdu, constaté trois jours plus tard sans accusé ni trace chez l’opérateur : remboursé de la même façon) ; un envoi interrompu par un redémarrage du serveur (error_code STALE_QUEUED) ne porte ni to ni from. Un message programmé refusé à l’heure prévue (un destinataire qui s’est désabonné depuis, par exemple) échoue avec le error_code et le error_message de cette vérification, et est remboursé. Un message programmé qui ne peut pas partir avant sa limite (son expires_at, par défaut 24 heures après scheduled_at), parce qu’une pause, une limite d’envoi ou un opérateur qui le ralentissait l’a retenu jusque-là, échoue avec l’error_code SCHEDULED_SEND_EXPIRED et un error_message, et est remboursé. 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, RECEIVED, SCHEDULED ou CANCELLED. |
| 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, RECEIVED, SCHEDULED ou CANCELLED. |
| 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, RECEIVED, SCHEDULED ou CANCELLED. |
message.cancelled
Un message programmé a été annulé avant son envoi, et les frais ont été remboursés.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.cancelled",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"from": "+1416XXXXXXX",
"to": "+1613XXXXXXX",
"status": "CANCELLED",
"message_status": "CANCELLED",
"details": {
"cancelled_at": "2026-10-01T16:58:00.000Z"
}
}
}| 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, RECEIVED, SCHEDULED ou CANCELLED. |
| details.cancelled_at | Le moment de l’annulation du message, en ISO 8601 UTC. |
message.rescheduled
Un message programmé a été déplacé à une nouvelle heure.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "message.rescheduled",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"message_id": "clxxxmessagexxxxxxxxxxxxx",
"from": "+1416XXXXXXX",
"to": "+1613XXXXXXX",
"status": "SCHEDULED",
"message_status": "SCHEDULED",
"details": {
"previous_scheduled_at": "2026-10-02T13:00:00.000Z",
"scheduled_at": "2026-10-03T13:00:00.000Z"
}
}
}| 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, RECEIVED, SCHEDULED ou CANCELLED. |
| 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. |
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, QUIT ou ARRÊT, avec ou sans accent), 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. |
consent.double_opt_in_confirmed
Un destinataire a répondu OUI (ou O, YES, Y) à une confirmation de consentement envoyée depuis un numéro sans frais : les messages sans frais vers lui sont maintenant permis. La réponse déclenche aussi message.received.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "consent.double_opt_in_confirmed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"recipient": "+1613XXXXXXX",
"from": "+1833XXXXXXX",
"confirmation_id": "oic_xxxxxxxxxxxxxxxxxxxxxxxx",
"confirmed_at": "2026-09-24T12:00:00.000Z"
}
}| Champ de data | Signification |
|---|---|
| recipient | Le destinataire qui a confirmé, au format E.164 : les messages sans frais vers ce numéro sont maintenant permis. |
| from | Votre numéro sans frais qui a envoyé la confirmation et reçu la réponse, au format E.164. |
| confirmation_id | L’identifiant de la confirmation de consentement (oic_...), tel que renvoyé par POST /v1/compliance/opt-in-confirmations. |
| confirmed_at | Le moment où la réponse est arrivée, ISO 8601 UTC. |
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",
"rent_owed_cents": 0
}
}| 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é. |
| rent_owed_cents | Loyer maintenant dû pour ce numéro, en cents canadiens. Il correspond au loyer mensuel du numéro lorsqu’un numéro suspendu a été libéré, et vaut 0 lorsqu’un numéro actif l’a été. |
toll_free_verification.changes_requested
HonkIO a examiné votre demande de vérification sans frais et demande des modifications avant de la transmettre à l’opérateur. Modifiez-la selon reviewer_note et soumettez-la de nouveau ; rien de plus n’est facturé.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "toll_free_verification.changes_requested",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"verification_id": "tfv_xxxxxxxxxxxxxxxxxxxxxxxx",
"status": "CHANGES_REQUESTED",
"phone_numbers": [
{
"id": "clxxxnumberxxxxxxxxxxxxxx",
"phone_number": "+1833XXXXXXX"
}
],
"reviewer_note": "The opt-in screenshot does not show the SMS checkbox. Add one that does."
}
}| Champ de data | Signification |
|---|---|
| verification_id | L’identifiant de la demande de vérification sans frais (tfv_...), tel que renvoyé par POST /v1/toll-free-verifications. |
| status | L’état de la demande après la décision : CHANGES_REQUESTED, APPROVED ou REJECTED, selon l’événement. |
| phone_numbers | Les numéros sans frais couverts par la demande. |
| phone_numbers[].id | L’identifiant du numéro, tel que listé par GET /v1/phone-numbers. |
| phone_numbers[].phone_number | Le numéro sans frais, au format E.164. |
| reviewer_note | Ce que HonkIO vous demande de modifier, tel qu’affiché dans le tableau de bord. |
toll_free_verification.approved
L’opérateur a approuvé votre demande de vérification sans frais : tous les numéros qu’elle couvre peuvent maintenant envoyer des SMS.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "toll_free_verification.approved",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"verification_id": "tfv_xxxxxxxxxxxxxxxxxxxxxxxx",
"status": "APPROVED",
"phone_numbers": [
{
"id": "clxxxnumberxxxxxxxxxxxxxx",
"phone_number": "+1833XXXXXXX"
}
]
}
}| Champ de data | Signification |
|---|---|
| verification_id | L’identifiant de la demande de vérification sans frais (tfv_...), tel que renvoyé par POST /v1/toll-free-verifications. |
| status | L’état de la demande après la décision : CHANGES_REQUESTED, APPROVED ou REJECTED, selon l’événement. |
| phone_numbers | Les numéros sans frais couverts par la demande. |
| phone_numbers[].id | L’identifiant du numéro, tel que listé par GET /v1/phone-numbers. |
| phone_numbers[].phone_number | Le numéro sans frais, au format E.164. |
toll_free_verification.rejected
L’opérateur a refusé votre demande de vérification sans frais. Corrigez ce que reason indique et soumettez-la de nouveau, sans frais supplémentaires.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "toll_free_verification.rejected",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"verification_id": "tfv_xxxxxxxxxxxxxxxxxxxxxxxx",
"status": "REJECTED",
"phone_numbers": [
{
"id": "clxxxnumberxxxxxxxxxxxxxx",
"phone_number": "+1833XXXXXXX"
}
],
"reason": "Opt-in workflow does not show how consent is collected."
}
}| Champ de data | Signification |
|---|---|
| verification_id | L’identifiant de la demande de vérification sans frais (tfv_...), tel que renvoyé par POST /v1/toll-free-verifications. |
| status | L’état de la demande après la décision : CHANGES_REQUESTED, APPROVED ou REJECTED, selon l’événement. |
| phone_numbers | Les numéros sans frais couverts par la demande. |
| phone_numbers[].id | L’identifiant du numéro, tel que listé par GET /v1/phone-numbers. |
| phone_numbers[].phone_number | Le numéro sans frais, au format E.164. |
| reason | La raison du refus, telle que l’opérateur l’a donnée (habituellement en anglais). |
Événements de compte
Sept é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 ; account.auto_topup_succeeded lorsqu’un prélèvement de rechargement automatique crédite votre solde ; account.auto_topup_paused lorsque le rechargement automatique se met en pause. 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, en moyenne sur ses envois réels de la dernière semaine ; 0 tant qu’il n’a pas deux jours d’envois réels, ou s’il n’en a eu aucun cette semaine-là. |
| 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": {
"limit": "messages",
"cap": 1000,
"window_hours": 24,
"received_in_window": 1000,
"managed_address_enabled": true
}
}| Champ de data | Signification |
|---|---|
| limit | Le plafond atteint : messages (le nombre quotidien de messages) ou megabytes (le plafond quotidien de Mo facturables, les Mo entamés après le premier Mo de chaque message ; cap et received_in_window sont alors en Mo). |
| 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. Pour account.inbound_sms_capped, des segments de message (un long texto en compte plusieurs). |
| 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, compté en segments de message (un long texto en compte plusieurs). 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. Pour account.inbound_sms_capped, des segments de message (un long texto en compte plusieurs). |
account.auto_topup_succeeded
Un prélèvement de rechargement automatique a réussi et votre solde a été crédité. Le reçu est aussi envoyé par courriel.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "account.auto_topup_succeeded",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"attempt_id": "ata_a1b2c3d4e5f6a1b2c3d4e5f6",
"trigger": "threshold",
"amount_cents": 2500,
"tax_cents": 325,
"total_cents": 2825,
"balance_cents": 3100
}
}| Champ de data | Signification |
|---|---|
| attempt_id | L’identifiant de la tentative de rechargement automatique, tel que listé par GET /v1/auto-topup. Sur account.auto_topup_paused, c’est la tentative qui a causé la pause, ou null si aucun prélèvement n’était en cause. |
| trigger | Ce qui a déclenché le prélèvement : threshold quand votre solde est passé sous votre seuil, rent quand il ne couvrait pas un loyer exigible dans les 24 heures. |
| amount_cents | Le montant crédité à votre solde, en cents canadiens, avant taxe. |
| tax_cents | La taxe de vente ajoutée au prélèvement, en cents canadiens. |
| total_cents | Le total prélevé sur votre carte, en cents canadiens. |
| balance_cents | Votre solde après le crédit, en cents canadiens. |
account.auto_topup_paused
Le rechargement automatique a été mis en pause et ne prélèvera plus avant que vous le réactiviez avec Recharger pour reprendre, dans la section Rechargement automatique de la page de facturation. Une pause pour examen du compte est levée par le soutien de HonkIO. Aussi envoyé par courriel.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "account.auto_topup_paused",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"reason": "DECLINED",
"attempt_id": "ata_a1b2c3d4e5f6a1b2c3d4e5f6"
}
}| Champ de data | Signification |
|---|---|
| reason | Pourquoi il s’est mis en pause, en majuscules : DECLINED, AUTHENTICATION_REQUIRED, EXPIRED_CARD, CARD_REMOVED, BILLING_ADDRESS, ACCOUNT_REVIEW, ADMIN, REFUND ou CHARGE_LIMIT. |
| attempt_id | L’identifiant de la tentative de rechargement automatique, tel que listé par GET /v1/auto-topup. Sur account.auto_topup_paused, c’est la tentative qui a causé la pause, ou null si aucun prélèvement n’était en cause. |
É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. |
Événements push
Neuf événements couvrent les notifications (push.queued, push.sent, push.failed, push.fell_back, push.cancelled, push.rescheduled), les appareils (push_device.deactivated) et les applications (push_app.credentials_invalid, push_app.vapid_key_replaced). Ils sont décrits, avec leur déclencheur et leurs champs de données, sous webhooks push.
Événements Notify
Deux événements couvrent les notifications : notification.delivered et notification.failed. Chacun est décrit ci-dessous avec ses champs de données ; webhooks Notify explique leur lien avec les événements des envois derrière une notification.
notification.delivered
Un canal a livré la notification : channel l’indique, et l’identifiant du SMS, du courriel ou du push envoyé est renseigné. Survient une fois par notification ; l’envoi derrière elle déclenche aussi ses propres événements.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "notification.delivered",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"id": "ntf_xxxxxxxxxxxxxxxxxxxxxxxx",
"user_id": "user_1042",
"status": "delivered",
"channel": "email",
"message_id": null,
"email_id": "clxxxemailxxxxxxxxxxxxxxx",
"push_id": null,
"attempts": [
{
"channel": "sms",
"outcome": "skipped",
"reason": "no_phone_number"
},
{
"channel": "email",
"outcome": "delivered",
"reason": null
}
],
"livemode": true
}
}| Champ de data | Signification |
|---|---|
| id | L’identifiant de la notification, tel que renvoyé par POST /v1/notify et lu par GET /v1/notifications/:id. |
| user_id | Le user_id auquel la notification a été envoyée : votre identifiant pour le destinataire. |
| status | Le statut final de la notification, en minuscules : delivered ou failed, selon l’événement. |
| channel | Le canal qui l’a livrée, l’un des canaux de attempts ; null si aucun ne l’a fait. |
| message_id | L’identifiant du SMS qui l’a livrée, tel que listé par GET /v1/messages ; null sauf si channel vaut sms. |
| email_id | L’identifiant du courriel qui l’a livrée, tel que listé par GET /v1/emails ; null sauf si channel vaut email. |
| push_id | L’identifiant du push qui l’a livrée ; null sauf si channel vaut push. |
| attempts | Les canaux essayés, dans l’ordre : jusqu’à celui qui l’a livrée, ou tous les canaux si aucun ne l’a fait. |
| attempts[].channel | Le canal essayé. |
| attempts[].outcome | Ce qui s’est passé sur ce canal, en minuscules : delivered, skipped (la personne n’y était pas joignable, ou il ne pouvait pas servir), refused (le canal a refusé l’envoi) ou failed. |
| attempts[].reason | Pourquoi, pour tout résultat autre que delivered : une raison en minuscules pour un canal ignoré, comme no_phone_number ou no_email, ou le code d’erreur propre au canal, comme NO_CONSENT ou EMAIL_SUPPRESSED. null si delivered. |
| livemode | true pour une notification envoyée avec une clé réelle, false avec une clé de test, comme dans l’enveloppe. |
notification.failed
Aucun canal n’a livré la notification : chaque canal de son ordre a été ignoré, refusé ou a échoué, et attempts indique pourquoi pour chacun. Survient une fois par notification.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "notification.failed",
"created": "2026-09-24T12:00:00.000Z",
"account_id": "clxxxaccountxxxxxxxxxxxxx",
"livemode": true,
"data": {
"id": "ntf_xxxxxxxxxxxxxxxxxxxxxxxx",
"user_id": "user_1042",
"status": "failed",
"channel": null,
"message_id": null,
"email_id": null,
"push_id": null,
"attempts": [
{
"channel": "sms",
"outcome": "refused",
"reason": "NO_CONSENT"
},
{
"channel": "email",
"outcome": "skipped",
"reason": "no_email"
}
],
"livemode": true
}
}| Champ de data | Signification |
|---|---|
| id | L’identifiant de la notification, tel que renvoyé par POST /v1/notify et lu par GET /v1/notifications/:id. |
| user_id | Le user_id auquel la notification a été envoyée : votre identifiant pour le destinataire. |
| status | Le statut final de la notification, en minuscules : delivered ou failed, selon l’événement. |
| channel | Le canal qui l’a livrée, l’un des canaux de attempts ; null si aucun ne l’a fait. |
| message_id | L’identifiant du SMS qui l’a livrée, tel que listé par GET /v1/messages ; null sauf si channel vaut sms. |
| email_id | L’identifiant du courriel qui l’a livrée, tel que listé par GET /v1/emails ; null sauf si channel vaut email. |
| push_id | L’identifiant du push qui l’a livrée ; null sauf si channel vaut push. |
| attempts | Les canaux essayés, dans l’ordre : jusqu’à celui qui l’a livrée, ou tous les canaux si aucun ne l’a fait. |
| attempts[].channel | Le canal essayé. |
| attempts[].outcome | Ce qui s’est passé sur ce canal, en minuscules : delivered, skipped (la personne n’y était pas joignable, ou il ne pouvait pas servir), refused (le canal a refusé l’envoi) ou failed. |
| attempts[].reason | Pourquoi, pour tout résultat autre que delivered : une raison en minuscules pour un canal ignoré, comme no_phone_number ou no_email, ou le code d’erreur propre au canal, comme NO_CONSENT ou EMAIL_SUPPRESSED. null si delivered. |
| livemode | true pour une notification envoyée avec une clé réelle, false avec une clé de test, comme dans l’enveloppe. |
HonkIO