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 s’utilise avec une Campaign d’e-mails transactionnels Braze et l’ID de Campaign 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.
À l’instar de l’endpoint d’envoi de Campaign déclenchée, ce type de Campaign vous permet d’héberger le contenu du message dans le tableau de bord de Braze tout en décidant, via votre API, quand et à qui un message est envoyé. Contrairement à l’endpoint d’envoi de Campaign déclenchée, qui accepte une audience ou un Segment comme destinataires, une requête adressée à cet endpoint doit spécifier un seul utilisateur, soit par external_user_id, soit par user_alias, car ce type de Campaign est spécialement conçu pour l’envoi de messages 1:1, comme des confirmations de commande ou des réinitialisations de mot de passe.
N’envoyez pas de Campaigns d’e-mails transactionnels via /campaigns/trigger/send ou /campaigns/trigger/schedule/create. Ces endpoints renvoient une erreur 400 pour les ID de Campaign d’e-mails transactionnels.
Conditions préalables
Pour utiliser cet endpoint, vous devez générer une clé API avec l’autorisation transactional.send.
Limite de débit
L’endpoint /transactional/v1/campaigns/{campaign_id}/send dispose d’un contingent horaire payant, mesuré en unités (par exemple, 50 000 unités par heure, selon votre forfait). Cet endpoint n’a pas de limite de débit propre. Les requêtes qui dépassent votre contingent sont tout de même envoyées, mais seul le volume alloué est couvert par le SLA. Dans la limite du volume couvert par le SLA, 99,9 % des e-mails sont envoyés en moins d’une minute. Le compteur de volume transactionnel est réinitialisé toutes les heures.
Les requêtes adressées à cet endpoint ne sont pas prises en compte dans votre limite de débit globale de l’API externe. Cet endpoint contourne la limitation du débit standard de la REST API : il ne renvoie donc pas les en-têtes de réponse standard X-RateLimit-* ni de réponses 429 en cas de dépassement des limites. Pour plus d’informations, contactez le support Braze.
Paramètres de chemin
| Paramètre | Requis | Type de données | Description |
|---|---|---|---|
campaign_id |
Requis | Chaîne de caractères | ID de la Campaign |
Corps de la requête
Content-Type: application/json
Authorization: Bearer YOUR-REST-API-KEY
{
"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 l’expression régulière suivante :/^[a-zA-Z0-9-_+\/=]+$/ Ce champ facultatif vous permet de transmettre un identifiant interne pour cet envoi précis, qui est inclus dans les événements envoyés par le postback d’événement HTTP transactionnel. Lorsqu’il est transmis, cet identifiant sert également de clé de déduplication, que Braze conserve pendant 24 heures. Si vous transmettez le même identifiant dans une autre requête, Braze ne crée pas de nouvelle instance d’envoi 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, la transmission de champs dans 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 protection : soyez donc prudent lorsque vous mettez à jour un utilisateur via cette API en transmettant différentes valeurs d’attributs personnalisés à intervalles rapprochés. |
Exemple de requête
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. Vous pouvez utiliser cet identifiant avec les événements du postback d’événement HTTP transactionnel pour suivre le statut d’un e-mail individuel envoyé à un seul utilisateur.
Exemples de réponses
{
"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
Dans certains cas, l’endpoint peut également renvoyer un code d’erreur et un message lisible par un être humain ; il s’agit le plus souvent d’erreurs de validation. Voici quelques erreurs courantes que vous pouvez rencontrer 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 Campaign fourni ne correspond pas à une Campaign 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 Campaign fourni ne correspond à aucune Campaign existante. |
The campaign is archived. Unarchive the campaign in order for trigger requests to take effect. |
L’ID de Campaign fourni correspond à une Campaign archivée. |
The campaign is paused. Resume the campaign in order for trigger requests to take effect. |
L’ID de Campaign fourni correspond à une Campaign en pause. |
campaign_id must be a string of the campaign api identifier |
L’ID de Campaign 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 l’autorisation d’effectuer cette action. |
Cet endpoint ne renvoie pas de réponses 429 lorsque vous dépassez votre quota transactionnel. Pour en savoir plus sur le quota, le SLA et les en-têtes de réponse, consultez la section Limite de débit.
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
{
"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
// 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"
}
}