Événements
Envoyez des événements d’espace de travail et des événements personnalisés, et consultez le flux d’événements derrière les webhooks : livraisons, rebonds, ouvertures et plus encore.
Envoyer un événement
Enregistre un événement d’espace de travail (w:<name>) ou un événement personnalisé (c:<name>). Fonctionne avec les clés API de portée full ou events. Pour savoir lequel utiliser, consultez Suivi des événements. Les événements sont inclus dans les forfaits Pro, Business et Custom, avec 100 types d’événements au maximum sur Pro et 1 000 sur Business.
- Un événement d’espace de travail doit d’abord être défini. Ses
propertiessont vérifiées par rapport à la définition. - Un événement personnalisé ne nécessite aucune définition. Ses
propertiespeuvent être n’importe quel objet JSON.
Les événements système comme email.delivered sont enregistrés par Emailit et ne peuvent pas être envoyés. Pour enregistrer de nombreux événements en un seul appel, utilisez Envoyer des événements par lot.
/eventsParamètres du corps
typestringobligatoirew:<name> pour un événement d’espace de travail ou c:<name> pour un événement personnalisé, par exemple c:order.completed. Le nom compte de 1 à 100 lettres, chiffres, ., - ou _, et commence par une lettre ou un chiffre.propertiesobjectLes données de l’événement. Par défaut : {}.
- Événements d’espace de travail : uniquement les propriétés de la définition, chacune avec son type. Les propriétés obligatoires doivent être présentes,
nulllaisse vide une propriété facultative, et les dates sont enregistrées au format ISO 8601 en UTC. Consultez Types de propriétés. - Événements personnalisés : n’importe quel objet JSON, jusqu’à 32 Ko et 8 niveaux d’imbrication.
emailstringcontact_idstringcon_…). Prioritaire sur email. Un ID qui ne correspond à aucun contact de l’espace de travail renvoie 422.anonymous_idstringoccurred_atstring | integercontextobjectpage (url, path, title, referrer, search), campaign (source, medium, name, term, content), locale et timezone. Les clés inconnues sont supprimées et les valeurs trop longues sont raccourcies.Les contacts sont seulement recherchés, jamais créés. Emailit n’enregistre pas d’adresses IP avec les événements.
Réponse
Renvoie 201 Created avec l’événement : object, id, type, created_at et data. data.object contient ce qui a été enregistré :
objectstringworkspace_event ou custom_event.namestringpropertiesobjectcontactobject | nullid et email du contact auquel appartient l’événement. id vaut null lorsque seule l’adresse e-mail est connue. null si vous n’avez envoyé ni l’un ni l’autre.anonymous_idstring | nullanonymous_id que vous avez envoyé.occurred_atstringsourcestringapi pour cet endpoint. Les événements du script de suivi ont js, et les événements de test envoyés depuis le tableau de bord ont dashboard.contextobjectUne clé API de portée events ne peut pas lire de données : elle reçoit donc l’événement sans data, qui contient le contact retrouvé par son adresse e-mail.
| Statut | Cas |
|---|---|
400 |
Le corps n’est pas un objet JSON. |
403 |
La portée de la clé API n’est ni full ni events, ou le forfait n’inclut pas les événements d’espace de travail et personnalisés : sur Pay as you go, error vaut plan_required et required_plan vaut pro. Rien n’est enregistré. |
422 |
L’événement est invalide. errors est indexé par champ, comme type ou properties.total, et message reprend le premier problème. Renvoyé aussi pour un événement w: qui n’est pas défini, pour un contact_id qui ne correspond à aucun contact, et pour un type que l’espace de travail n’a jamais envoyé une fois qu’il utilise le nombre de types d’événements de son forfait (100 sur Pro, 1 000 sur Business). |
429 |
Trop de requêtes en une minute, ou l’espace de travail a atteint sa limite quotidienne d’usage raisonnable pour les événements d’espace de travail et personnalisés (code : events_daily_limit). Rien n’est enregistré. Réessayez après le nombre de secondes indiqué dans l’en-tête retry-after. |
{
"object": "event",
"id": "evt_2yJm3Rk8VbN1sQ5tLwX7eZhD4cF",
"type": "c:order.completed",
"created_at": "2026-10-19T09:30:02.114000+00:00",
"data": {
"object": {
"object": "custom_event",
"name": "order.completed",
"properties": { "order_id": "1001", "total": 59.9, "currency": "EUR" },
"contact": { "id": "con_2wPq7Lm3XcN8bV1zKd4RtY6sHf9", "email": "jane@example.com" },
"anonymous_id": null,
"occurred_at": "2026-10-19T09:30:00.000Z",
"source": "api"
}
}
}{
"object": "event",
"id": "evt_2yJm3Rk8VbN1sQ5tLwX7eZhD4cF",
"type": "c:order.completed",
"created_at": "2026-10-19T09:30:02.114000+00:00"
}{
"error": "plan_required",
"required_plan": "pro",
"message": "Workspace and custom events are included with Pro and Business."
}{
"error": "properties.segment must be a string",
"message": "properties.segment must be a string",
"errors": {
"properties.segment": ["must be a string"]
}
}{
"error": "type w:customer.tier is not defined in this workspace. Create it under /v2/workspace/events first, or send it as a custom event (c:customer.tier).",
"message": "type w:customer.tier is not defined in this workspace. Create it under /v2/workspace/events first, or send it as a custom event (c:customer.tier).",
"errors": {
"type": ["w:customer.tier is not defined in this workspace. Create it under /v2/workspace/events first, or send it as a custom event (c:customer.tier)."]
}
}Envoyer des événements par lot
Enregistre jusqu’à 100 événements d’espace de travail et événements personnalisés en une seule requête, par exemple lorsque votre backend synchronise des commandes à intervalles réguliers. Fonctionne avec les clés API de portée full ou events, sur les forfaits Pro, Business et Custom.
Le lot est traité en tout ou rien. Si un événement est invalide, aucun n’est enregistré, et la réponse liste chaque problème selon la position de l’événement dans la liste.
/events/batchParamètres du corps
eventsobject[]obligatoiretype, properties, email, contact_id, anonymous_id, occurred_at et context.Réponse
Renvoie 201 Created avec les événements enregistrés dans data, dans l’ordre où vous les avez envoyés. Chaque élément contient object (event), id, type et created_at. Utilisez Récupérer un événement pour en lire un avec son data.
| Statut | Cas |
|---|---|
400 |
events est absent, vide ou contient plus de 100 éléments. |
403 |
La portée de la clé API n’est ni full ni events, ou le forfait n’inclut pas les événements d’espace de travail et personnalisés : sur Pay as you go, error vaut plan_required et required_plan vaut pro. Rien n’est enregistré. |
422 |
Au moins un événement est invalide. Rien n’est enregistré. errors est indexé par events.<index>.<field>, par exemple events.3.properties.total, en comptant à partir de 0, et message reprend le premier problème. Un événement d’un type que l’espace de travail n’a jamais envoyé est invalide une fois que l’espace de travail utilise le nombre de types d’événements de son forfait (100 sur Pro, 1 000 sur Business). |
429 |
Trop de requêtes en une minute, ou le lot ferait dépasser à l’espace de travail sa limite quotidienne d’usage raisonnable pour les événements d’espace de travail et personnalisés (code : events_daily_limit). Rien n’est enregistré. Réessayez après le nombre de secondes indiqué dans l’en-tête retry-after. |
{
"data": [
{ "object": "event", "id": "evt_2yJm3Rk8VbN1sQ5tLwX7eZhD4cF", "type": "c:order.completed", "created_at": "2026-10-19T09:30:02.114000+00:00" },
{ "object": "event", "id": "evt_2yJm3Sa1XcP4uW8rMyB6fGjK0nT", "type": "c:order.completed", "created_at": "2026-10-19T09:30:02.114000+00:00" },
{ "object": "event", "id": "evt_2yJm3Td5ZeQ7vX2sNzC9hHkL3pU", "type": "w:customer.type", "created_at": "2026-10-19T09:30:02.114000+00:00" }
]
}{
"error": "events.1.email must be a valid email address",
"message": "events.1.email must be a valid email address",
"errors": {
"events.1.email": ["must be a valid email address"],
"events.2.properties.segment": ["must be a string"]
}
}Lister les événements
Renvoie les événements de votre espace de travail, du plus récent au plus ancien. Chaque livraison de webhook est construite à partir de l’un de ces événements : vous pouvez donc utiliser cet endpoint pour récupérer après coup les événements que votre endpoint a manqués. Nécessite une clé API de portée full.
/eventsParamètres de requête
pageintegerNuméro de page, à partir de 1. Par défaut : 1. Les pages situées au-delà de 2 500 événements ((page - 1) × limit > 2500) renvoient 422.
limitintegerNombre d’événements par page, de 1 à 100. Par défaut : 100.
typestringType d’événement, ou liste de types séparés par des virgules, par exemple email.delivered,email.bounced. Les événements d’espace de travail et les événements personnalisés conservent leur préfixe, par exemple c:order.completed. Consultez Types d’événements.
scopestringUniquement les événements de ces portées, séparées par des virgules : system (les événements qu’enregistre Emailit, comme email.delivered), workspace (les événements définis par l’espace de travail, w:<name>) et custom (les événements personnalisés, c:<name>). Par exemple, scope=workspace,custom. Par défaut : toutes les portées. Une portée inconnue renvoie 400.
include_databooleanDéfinissez true pour inclure le payload data de chaque événement. Par défaut : false, qui ne renvoie que object, id, type et created_at.
matchstringall (par défaut) exige que tous les filtres correspondent. Avec or, il suffit qu’un filtre corresponde. Consultez Filtrage et tri.
orderstringClé de tri de cette liste. Consultez les clés de tri ci-dessous.
directionstringasc ou desc.
Filtres et tri
Les filtres de liste sont des paramètres de requête key.condition=value sur un seul niveau. Consultez Filtrage et tri pour match, order, direction et la liste des conditions par type.
Clés de filtre
| Clé | Type | Conditions | Remarques |
|---|---|---|---|
type | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
created_at | date | exact, before, after, empty, not_empty |
Clés de tri
Passez dans order l’une de ces clés et dans direction la valeur asc ou desc : type, created_at
Sans filtre created_at, la liste ne couvre que les 2 derniers jours. Pour remonter plus loin, ajoutez-en un, par exemple created_at.after=2026-09-01T00:00:00Z. Les événements plus anciens restent disponibles tant que la conservation des données de votre forfait les garde.
Réponse
Renvoie 200 OK avec les événements dans data, ainsi que next_page_url et previous_page_url (null aux deux extrémités). Les URL de page conservent type, scope, limit et include_data.
Renvoie 422 avec code: "events_offset_too_large" lorsque la page est trop profonde. Réduisez la plage de dates ou les types plutôt que de paginer plus loin.
{
"data": [
{
"object": "event",
"id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "email.delivered",
"created_at": "2026-10-01T10:02:15.912000+00:00"
}
],
"next_page_url": "/v2/events?page=2&limit=100&type=email.delivered",
"previous_page_url": null
}{
"data": [
{
"object": "event",
"id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "email.delivered",
"data": {
"object": {
"id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
"object": "email",
"from": "hello@acme.com",
"to": "ada@example.com",
"subject": "Your order has shipped",
"status": "delivered",
"meta": { "order_id": "1042" },
"updated_at": "2026-10-01T10:02:14.307000+00:00",
"created_at": "2026-10-01T10:02:11.583000+00:00"
}
},
"created_at": "2026-10-01T10:02:15.912000+00:00"
}
],
"next_page_url": "/v2/events?page=2&limit=100&type=email.delivered&include_data=true",
"previous_page_url": null
}{
"error": "Page is too deep. Narrow the type or date filter, or open an earlier page.",
"code": "events_offset_too_large"
}Récupérer un événement
Renvoie un événement avec son payload data complet. L’id est la même valeur que celle que les webhooks envoient dans event_id : vous pouvez donc retrouver n’importe quel événement reçu. Nécessite une clé API de portée full.
/events/:idParamètres de chemin
idstringObligatoireID de l’événement, par exemple evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a.
Réponse
Renvoie 200 OK avec l’événement : object (event), id, type, data et created_at. data.object a la même forme que dans le payload de webhook de ce type ; consultez la référence des événements webhook.
Pour les événements d’espace de travail (w:) et les événements personnalisés (c:), data.object contient object (workspace_event ou custom_event), name, properties, contact, anonymous_id, occurred_at, source, identity_verified pour les événements du script de suivi qui nomment un contact et, s’il y en a un, context. Consultez Envoyer un événement.
Renvoie 404 avec error: "Event not found" si l’ID n’existe pas dans votre espace de travail.
{
"object": "event",
"id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "email.delivered",
"data": {
"object": {
"id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
"object": "email",
"from": "hello@acme.com",
"to": "ada@example.com",
"subject": "Your order has shipped",
"status": "delivered",
"meta": { "order_id": "1042" },
"updated_at": "2026-10-01T10:02:14.307000+00:00",
"created_at": "2026-10-01T10:02:11.583000+00:00"
}
},
"created_at": "2026-10-01T10:02:15.912000+00:00"
}{
"error": "Event not found"
}