Envoyer des e-mails transactionnels via la distribution déclenchée par l’API
/transactional/v1/campaigns/{campaign_id}/send
Utilisez cet endpoint pour envoyer des messages transactionnels immédiats et ponctuels à un utilisateur désigné.
Cet endpoint est utilisé parallèlement à la création d’une campagne d’e-mails transactionnels Braze et de l’ID de campagne correspondant.

L’e-mail transactionnel est actuellement disponible dans certains forfaits Braze. Contactez votre gestionnaire de la satisfaction client Braze pour plus de détails.
Similaire à l’endpoint d’envoi de campagne déclenchée, ce type de campagne vous permet d’héberger le contenu du message dans le tableau de bord de Braze tout en dictant quand et à qui un message est envoyé via votre API. Contrairement à l’endpoint d’envoi de campagne déclenchée, qui accepte une audience ou un segment auquel envoyer des messages, une requête à cet endpoint doit spécifier un utilisateur unique par external_user_id ou user_alias, car ce type de campagne est conçu pour l’envoi de messages 1:1 d’alertes telles que des confirmations de commande ou des réinitialisations de mot de passe.
Conditions préalables
Pour utiliser cet endpoint, vous devrez générer une clé API avec l’autorisation transactional.send.
Limite de débit
L’endpoint /transactional/v1/campaigns/{campaign_id}/send est un endpoint payant facturé en unités par heure (par exemple, 50 000 par heure selon votre forfait). Il n’existe pas de limite de débit distincte par endpoint : vous pouvez envoyer au-delà du volume qui vous est alloué, mais seul le volume alloué est couvert par le SLA. Les requêtes adressées à cet endpoint sont prises en compte dans votre limite de débit globale de l’API externe. Si vous dépassez cette limite (par exemple, 250 000 requêtes par heure sur l’ensemble des endpoints), Braze renvoie une erreur 429 et les requêtes sont limitées. Le compteur de volume transactionnel est réinitialisé toutes les heures, de sorte qu’après une heure, un nouveau contingent est disponible. Dans le cadre du volume couvert par le SLA, 99,9 % des e-mails seront envoyés en moins d’une minute.
Paramètres de chemin
| Paramètre | Requis | Type de données | Description |
|---|---|---|---|
campaign_id |
Requis | Chaîne de caractères | ID de la campagne |
Corps de la requête
1
2
Content-Type: application/json
Authorization: Bearer YOUR-REST-API-KEY
1
2
3
4
5
6
7
8
9
10
11
{
"external_send_id": (optional, string) see the following request parameters,
"trigger_properties": (optional, object) personalization key-value pairs that apply to the user in this request,
"recipient": (required, object)
{
// Either "external_user_id" or "user_alias" is required. Requests must specify only one.
"user_alias": (optional, User alias object) User alias of the user to receive message,
"external_user_id": (optional, string) External identifier of user to receive message,
"attributes": (optional, object) fields in the attributes object create or update an attribute of that name with the given value on the specified user profile before the message is sent and existing values are overwritten
}
}
Paramètres de requête
| Paramètre | Requis | Type de données | Description |
|---|---|---|---|
external_send_id |
Facultatif | Chaîne de caractères | Une chaîne de caractères compatible Base64. Validée par rapport à l’expression régulière suivante :/^[a-zA-Z0-9-_+\/=]+$/ Ce champ facultatif vous permet de transmettre un identifiant interne pour cet envoi particulier, qui est inclus dans les événements envoyés à partir du postback d’événement HTTP transactionnel. Une fois transmis, cet identifiant est également utilisé comme clé de déduplication, que Braze conserve pendant 24 heures. Transmettre le même identifiant dans une autre requête n’entraîne pas la création d’une nouvelle instance d’envoi par Braze pendant 24 heures. |
trigger_properties |
Facultatif | Objet | Voir les propriétés du déclencheur. Paires clé-valeur de personnalisation qui s’appliquent à l’utilisateur dans cette requête. |
recipient |
Requis | Objet | L’utilisateur que vous ciblez avec ce message. Peut contenir des attributes et un seul external_user_id ou user_alias.Notez que si vous fournissez un ID externe qui n’existe pas encore dans Braze, le fait de transmettre des champs à l’objet attributes crée ce profil utilisateur dans Braze et envoie ce message à l’utilisateur nouvellement créé. Si vous envoyez plusieurs requêtes au même utilisateur avec des données différentes dans l’objet attributes, les attributs first_name, last_name et email sont mis à jour de manière synchrone et intégrés dans votre message. Les attributs personnalisés ne bénéficient pas de cette même protection ; procédez donc avec prudence lors de la mise à jour d’un utilisateur via cette API et de la transmission de différentes valeurs d’attributs personnalisés en succession rapide. |
Exemple de requête
1
2
3
4
5
6
7
8
9
10
11
12
13
14
curl -X POST \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer YOUR-REST-API-KEY' \
-d '{
"external_send_id" : YOUR_BASE64_COMPATIBLE_ID
"trigger_properties": {
"example_string_property": YOUR_EXAMPLE_STRING,
"example_integer_property": YOUR_EXAMPLE_INTEGER
},
"recipient": {
"external_user_id": TARGETED_USER_ID_STRING
}
}' \
https://rest.iad-01.braze.com/transactional/v1/campaigns/{campaign_id}/send
Réponse
L’endpoint d’envoi d’e-mails transactionnels répond avec le dispatch_id du message, qui représente l’instance de cet envoi de message. Cet identifiant peut être utilisé avec les événements du postback d’événement HTTP transactionnel pour suivre le statut d’un e-mail individuel envoyé à un utilisateur unique.
Exemples de réponses
1
2
3
4
5
{
"dispatch_id": A randomly-generated unique ID of the instance of this send
"status": Current status of the message
"metadata" : Object containing additional information about the send instance
}
Résolution des problèmes
L’endpoint peut également renvoyer, dans certains cas, un code d’erreur et un message lisible par un être humain, qui sont le plus souvent des erreurs de validation. Voici quelques erreurs courantes que vous pouvez obtenir lorsque vous effectuez des requêtes invalides.
| Erreur | Résolution des problèmes |
|---|---|
The campaign is not a transactional campaign. Only transactional campaigns may use this endpoint |
L’ID de campagne fourni ne correspond pas à une campagne transactionnelle. |
The external reference has been queued. Please retry to obtain send_id. |
L’external_send_id a été créé récemment, essayez un nouvel external_send_id si vous souhaitez envoyer un nouveau message. |
Campaign does not exist |
L’ID de campagne fourni ne correspond pas à une campagne existante. |
The campaign is archived. Unarchive the campaign in order for trigger requests to take effect. |
L’ID de campagne fourni correspond à une campagne archivée. |
The campaign is paused. Resume the campaign in order for trigger requests to take effect. |
L’ID de campagne fourni correspond à une campagne en pause. |
campaign_id must be a string of the campaign api identifier |
L’ID de campagne fourni n’est pas dans un format valide. |
Error authenticating credentials |
La clé API fournie est invalide. |
Invalid whitelisted IPs |
L’adresse IP qui envoie la requête ne figure pas sur la liste blanche des adresses IP (si elle est utilisée). |
You do not have permission to access this resource |
La clé API utilisée n’a pas la permission d’effectuer cette action. |
La plupart des endpoints de Braze disposent d’une implémentation de limite de débit qui renvoie un code de réponse 429 si vous effectuez un nombre excessif de requêtes. L’endpoint d’envoi transactionnel dispose d’un quota horaire payant mesuré en unités (par exemple, 50 000 unités par heure, selon votre forfait). Il n’existe pas de limite de débit distincte par endpoint pour cet endpoint : vous pouvez envoyer au-delà du volume qui vous est alloué, mais seul ce volume est couvert par le SLA ; les requêtes dépassant cette allocation sont toujours envoyées, mais ne sont pas couvertes par le SLA. Les requêtes adressées à cet endpoint sont prises en compte dans votre limite de débit globale de l’API externe. Si vous dépassez cette limite (par exemple, 250 000 requêtes par heure sur l’ensemble des endpoints), Braze renvoie un code 429 et limite les requêtes jusqu’à ce que la limite soit réinitialisée. Le compteur de volume transactionnel est réinitialisé toutes les heures. Contactez l’assistance Braze si vous avez besoin de plus amples informations sur cette fonctionnalité.
Postback d’événement HTTP transactionnel
Tous les e-mails transactionnels sont complétés par des postbacks de statut d’événement envoyés sous forme de requête HTTP vers l’URL que vous avez spécifiée. Cela vous permet d’évaluer le statut du message en temps réel et de prendre des mesures pour atteindre l’utilisateur sur un autre canal si le message n’est pas distribué, ou de basculer vers un système interne si Braze connaît une certaine latence.
Vous pouvez associer ces mises à jour à des messages individuels à l’aide d’identifiants uniques :
dispatch_id: un ID unique généré automatiquement par Braze pour chaque message.external_send_id: un identifiant personnalisé que vous fournissez, tel qu’un numéro de commande, pour faire correspondre les mises à jour avec vos systèmes internes.
Par exemple, si vous incluez external_send_id: 1234 dans la requête lors de l’envoi d’un e-mail de confirmation de commande, tous les postbacks d’événements ultérieurs pour cet e-mail — comme Sent ou Delivered — incluront external_send_id: 1234. Cela vous permet de confirmer que le client de la commande n°1234 a bien reçu son e-mail de confirmation de commande.
Mise en place des postbacks
Dans votre tableau de bord de Braze :
- Allez dans Paramètres > Préférences des e-mails.
- Sous Transactional Event Status Postback, saisissez l’URL vers laquelle Braze doit envoyer les mises à jour de statut pour vos e-mails transactionnels.
- Testez le postback.

Corps du postback
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"dispatch_id": (string, a randomly-generated unique ID of the instance of this send),
"status": (string, Current status of message from the following message status table,
"metadata" : (object, additional information relating to the execution of an event)
{
"external_send_id" : (string, If provided at the time of the request, Braze will pass your internal identifier for this send for all postbacks),
"campaign_api_id" : (string, API identifier of this transactional campaign),
"received_at": (ISO 8601 DateTime string, Timestamp of when the request was received by Braze, only included for events with "sent" status),
"enqueued_at": (ISO 8601 DateTime string, Timestamp of when the request was enqueued by Braze, only included for events with "sent" status),
"executed_at": (ISO 8601 DateTime string, Timestamp of when the request was processed by Braze, only included for events with "sent" status),
"sent_at": (ISO 8601 DateTime string, Timestamp of when the request was sent to the ESP by Braze, only included for events with "sent" status),
"processed_at" : (ISO 8601 DateTime string, Timestamp the event was processed by the ESP, only included for events with "processed" status),
"delivered_at" : (ISO 8601 DateTime string, Timestamp the event was delivered to the user's inbox provider, only included for events with "processed" status),
"bounced_at" : (ISO 8601 DateTime string, Timestamp the event was bounced by the user's inbox provider, only included for events with "bounced" status),
"aborted_at" : (ISO 8601 DateTime string, Timestamp the event was Aborted by Braze, only included for events with "aborted" status),
"reason" : (string, The reason Braze or the Inbox provider was unable to process this message to the user, only included for events with "aborted" or "bounced" status),
}
}
Statut du message
| État | Description |
|---|---|
sent |
Message envoyé avec succès à un partenaire d’envoi d’e-mail de Braze |
processed |
Le partenaire d’envoi d’e-mail a reçu et préparé le message avec succès pour l’envoyer au fournisseur de boîte de réception de l’utilisateur |
aborted |
Braze n’a pas réussi à envoyer le message, car l’adresse de l’utilisateur ne permet pas de recevoir des e-mails ou la logique d’interruption Liquid a été appelée dans le corps du message. Tous les événements abandonnés comprennent un champ reason dans l’objet de métadonnées indiquant pourquoi le message a été abandonné |
delivered |
Le message a été accepté par le fournisseur de boîte de réception de l’utilisateur |
bounced |
Le message a été rejeté par le fournisseur de boîte de réception de l’utilisateur. Tous les événements de rebond comprennent un champ reason dans l’objet de métadonnées reflétant le code d’erreur de rebond fourni par le fournisseur de boîte de réception |
Exemple de postback
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Sent Event
{
"dispatch_id": "acf471119f7449d579e8089032003ded",
"status": "sent",
"metadata": {
"received_at": "2020-08-31T18:58:41.000+00:00",
"enqueued_at": "2020-08-31T18:58:41.000+00:00",
"executed_at": "2020-08-31T18:58:41.000+00:00",
"sent_at": "2020-08-31T18:58:42.000+00:00",
"campaign_api_id": "417220e4-5a2a-b634-7f7d-9ec891532368",
"external_send_id" : "34a2ceb3cf6184132f3d816e9984269a"
}
}
// Processed Event
{
"dispatch_id": "acf471119f7449d579e8089032003ded",
"status": "processed",
"metadata": {
"processed_at": "2020-08-31T18:58:42.000+00:00",
"campaign_api_id": "417220e4-5a2a-b634-7f7d-9ec891532368",
"external_send_id" : "34a2ceb3cf6184132f3d816e9984269a"
}
}
// Aborted
{
"dispatch_id": "acf471119f7449d579e8089032003ded",
"status": "aborted",
"metadata": {
"reason": "User not emailable",
"aborted_at": "2020-08-31T19:04:51.000+00:00",
"campaign_api_id": "417220e4-5a2a-b634-7f7d-9ec891532368",
"external_send_id" : "34a2ceb3cf6184132f3d816e9984269a"
}
}
// Delivered Event
{
"dispatch_id": "acf471119f7449d579e8089032003ded",
"status": "delivered",
"metadata": {
"delivered_at": "2020-08-31T18:27:32.000+00:00",
"campaign_api_id": "417220e4-5a2a-b634-7f7d-9ec891532368",
"external_send_id" : "34a2ceb3cf6184132f3d816e9984269a"
}
}
// Bounced Event
{
"dispatch_id": "acf471119f7449d579e8089032003ded",
"status": "bounced",
"metadata": {
"bounced_at": "2020-08-31T18:58:43.000+00:00",
"reason": "550 5.1.1 The email account that you tried to reach does not exist",
"campaign_api_id": "417220e4-5a2a-b634-7f7d-9ec891532368",
"external_send_id" : "34a2ceb3cf6184132f3d816e9984269a"
}
}