Campagnes
Créez des campagnes, choisissez leurs listes de contacts, puis envoyez-les ou programmez-les.
Créer une campagne
Crée une campagne au statut draft. Nécessite une clé API avec la portée full. Émet l’événement campaign.created.
Une nouvelle campagne n’a aucun destinataire. Choisissez ses listes de contacts avec Mettre à jour une campagne, puis envoyez-la ou programmez-la. Les crédits sont débités à l’envoi de la campagne : 2 crédits par e-mail.
/campaignsParamètres du corps
namestringobligatoiresubjectstring{{first_name}}.from_emailstringnews@acme.com.from_namestringAcme. Le message est envoyé depuis Acme <news@acme.com>.reply_tostringfrom_email par défaut lors de l’envoi de la campagne.htmlstring{{first_name}}, {{last_name}}, {{email}}, {{unsubscribe_url}} et {{cf.<key>}} pour les champs personnalisés. Définissez le corps lors de la création de la campagne.textstringhtml.preview_textstringhtml si vous en avez besoin.contentstringhtml et text, pas content.content_typestringpar défaut : htmlcontent : html, text ou mjml. Emailit ne compile pas le MJML ; envoyez le HTML compilé dans html.Réponse
Renvoie 201 Created avec l’objet campagne. status vaut draft. La réponse ne renvoie pas html, text ni content.
Renvoie 400 si name est absent et 403 si la clé API n’a pas la portée full.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "draft",
"subject": "October news for {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"reply_to": "support@acme.com",
"preview_text": null,
"content_type": "html",
"created_at": "2026-10-01T09:30:12.482193Z",
"updated_at": "2026-10-01T09:30:12.482193Z"
}{
"error": "Bad Request"
}{
"statusCode": 403,
"error": "Forbidden",
"message": "Permission denied: campaigns:create"
}Récupérer une campagne
Récupère une campagne par son ID ou son nom. Nécessite une clé API avec la portée full.
/campaigns/{id}Paramètres de chemin
idstringobligatoirecmp_…) ou son nom. Encodez pour l’URL les noms qui contiennent des espaces ou des caractères spéciaux.Réponse
Renvoie l’objet campagne.
objectstringcampaign.idstringcmp_.statusstringdraft, scheduled, queued, sending, sent, canceled ou archived. queued signifie qu’une campagne programmée a atteint son heure d’envoi et attend un worker.namestringsubjectstringfrom_emailstring"" tant qu’elle n’est pas définie.from_namestring"" tant qu’il n’est pas défini.reply_tostring"" signifie que les réponses vont à from_email.preview_textstring | nullcontent_typestringhtml, text ou mjml pour les campagnes créées via l’API.scheduled_atstring | nullsent_atstring | nullrecipientsobject[]audience_id (aud_…) et exclude (true pour une liste exclue).Le corps (html, text et content) n’est pas inclus dans la réponse. Les statistiques d’engagement sont disponibles dans le tableau de bord, sous Email MarketingCampaigns.
Renvoie 404 si aucune campagne de l’espace de travail ne correspond à id.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "scheduled",
"subject": "October news for {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"reply_to": "support@acme.com",
"preview_text": null,
"content_type": "html",
"sent_at": null,
"scheduled_at": "2026-10-08 09:00:00+00",
"created_at": "2026-10-01 09:30:12.482193+00",
"updated_at": "2026-10-01 10:02:47.118204+00",
"recipients": [
{ "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "exclude": false },
{ "audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": true }
]
}{
"error": "Campaign not found"
}Mettre à jour une campagne
Met à jour les champs transmis et laisse les autres inchangés. Utilisez cet endpoint pour choisir les listes de contacts de la campagne avant de l’envoyer. Nécessite une clé API avec la portée full. Émet l’événement campaign.updated.
Une campagne programmée envoie le contenu enregistré à son heure d’envoi : vous pouvez donc encore la modifier après l’avoir programmée.
/campaigns/{id}Paramètres de chemin
idstringobligatoirecmp_…) ou son nom.Paramètres du corps
namestringsubjectstringfrom_emailstringfrom_namestringreply_tostringfrom_email.preview_textstringcontentstringcontent_typestringcontent : html, text ou mjml.recipientsobject[]Les listes de contacts à cibler. Remplace la liste actuelle. Incluez au moins une liste avec exclude défini sur false.
audience_id(chaîne, obligatoire) : un ID de liste (aud_…) de cet espace de travail.exclude(booléen, par défautfalse) :trueenregistre la liste comme exclusion. Le tableau de bord soustrait les listes exclues de son estimation du nombre de destinataires, mais l’envoi lui-même n’applique pas les exclusions pour le moment : retirez donc aussi ces contacts des listes incluses.
Les ID de liste en double sont ignorés. Au moment de l’envoi, Emailit envoie un e-mail une seule fois à chaque contact abonné des listes incluses, et ignore les contacts désinscrits et les adresses bloquées.
Le corps HTML et le corps texte sont définis lors de la création de la campagne. Les champs inconnus du corps de la requête sont ignorés.
Réponse
Renvoie l’objet campagne mis à jour, avec recipients.
Renvoie 422 si recipients ne contient aucune liste incluse ou fait référence à une liste extérieure à l’espace de travail, et 404 si la campagne n’existe pas.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "draft",
"subject": "Your October update, {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"reply_to": "support@acme.com",
"preview_text": null,
"content_type": "html",
"scheduled_at": null,
"created_at": "2026-10-01 09:30:12.482193+00",
"updated_at": "2026-10-01 10:02:47.118204+00",
"recipients": [
{ "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "exclude": false },
{ "audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": true }
]
}{
"message": "Validation failed.",
"errors": {
"recipients": ["One or more audiences are invalid."]
}
}{
"error": "Campaign not found"
}Lister les campagnes
Renvoie les campagnes de l’espace de travail, de la plus récente à la plus ancienne. Nécessite une clé API avec la portée full.
/campaignsParamètres de requête
pageintegerpar défaut : 1limitintegerpar défaut : 10searchstringstatusstringdraft, scheduled, sending (correspond aussi à queued), sent, canceled, archived ou all.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.
Clés de filtre
Les filtres utilisent des paramètres de requête key.condition=value, par exemple status.exact=sent ou created_at.after=2026-09-01. Pour les conditions propres à chaque type, consultez Filtrage et tri.
| Clé | Type | Remarques |
|---|---|---|
name |
chaîne | |
subject |
chaîne | |
status |
énumération | draft, scheduled, queued, sending, sent, archived |
created_at |
date | |
sent_at |
date |
Clés de tri pour order : name, subject, status, created_at, sent_at.
Réponse
Renvoie une page d’objets campagne sans reply_to, preview_text, content_type ni recipients. Pour ces champs, utilisez Récupérer une campagne.
dataobject[]total_recordsintegernext_page_urlstring | nullnull sur la dernière page. Il ne contient que page et limit : ajoutez de nouveau votre recherche et vos filtres quand vous le suivez.previous_page_urlstring | nullnull sur la première page.{
"data": [
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "sent",
"subject": "Your October update, {{first_name}}",
"from_email": "news@acme.com",
"from_name": "Acme",
"sent_at": "2026-10-08 09:00:04+00",
"scheduled_at": "2026-10-08 09:00:00+00",
"created_at": "2026-10-01 09:30:12.482193+00",
"updated_at": "2026-10-08 09:00:31+00"
}
],
"total_records": 34,
"next_page_url": "/v2/campaigns?page=2&limit=20",
"previous_page_url": null
}Envoyer ou programmer une campagne
Envoie la campagne immédiatement, ou la programme si vous transmettez un scheduled_at dans le futur. Nécessite une clé API avec la portée full et un espace de travail vérifié : les espaces de travail non vérifiés ne peuvent pas envoyer de campagnes et reçoivent 403.
Avant l’envoi, vérifiez que la campagne a une adresse from_email sur un domaine vérifié, un objet, un corps html ou text et au moins une liste de contacts incluse (définie avec Mettre à jour une campagne). Chaque e-mail coûte 2 crédits.
/campaigns/{id}/sendParamètres de chemin
idstringobligatoirecmp_…) ou son nom.Paramètres du corps
scheduled_atstringDate d’envoi. Accepte le format ISO 8601 (2026-10-08T09:00:00Z), un horodatage Unix en secondes ou du langage naturel comme tomorrow at 9am (interprété en UTC). L’heure doit être dans le futur et la campagne doit être au statut draft.
Omettez-le pour envoyer immédiatement. Pour envoyer une campagne programmée plus tôt que prévu, appelez cet endpoint sans scheduled_at.
Réponse
Envoi immédiat : le statut passe à sending et Emailit émet campaign.sending. Emailit crée ensuite un e-mail par destinataire : chaque contact abonné des listes incluses, dédoublonné par adresse, sans les contacts désinscrits ni les adresses bloquées. Une fois chaque destinataire transmis à la chaîne d’envoi, le statut passe à sent et Emailit émet campaign.sent. Suivez la livraison dans le tableau de bord ou avec les événements d’e-mail.
Programmation : le statut passe à scheduled et Emailit émet campaign.scheduled. À l’heure prévue, la campagne passe à queued (campaign.queued), puis est envoyée comme ci-dessus.
La réponse contient object, id, name et le nouveau status, ainsi que scheduled_at en cas de programmation.
| Statut | Cas |
|---|---|
403 |
L’espace de travail n’est pas vérifié, ou la clé API n’a pas la portée full. |
404 |
Aucune campagne ne correspond à id. |
422 |
scheduled_at ne peut pas être analysé ou n’est pas dans le futur, ou vous avez tenté de programmer une campagne qui n’est pas un brouillon. |
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "scheduled",
"scheduled_at": "2026-10-08T09:00:00.000000Z"
}{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "sending"
}{
"code": "unverified_workspace_recipient",
"error": "Workspace not verified",
"message": "Unverified workspaces cannot send campaigns. You can send individual emails only to workspace members' account emails."
}{
"error": "Campaign cannot be scheduled",
"message": "Campaign status is 'sent'. Only draft campaigns can be scheduled."
}Annuler une campagne
Passe le statut de la campagne à canceled et émet l’événement campaign.canceled. Nécessite une clé API avec la portée full.
Seules les campagnes au statut draft ou sending peuvent être annulées ; tout autre statut renvoie 422. L’annulation d’une campagne en cours d’envoi ne rappelle pas les e-mails déjà en file d’attente de livraison.
/campaigns/{id}/cancelParamètres de chemin
idstringobligatoirecmp_…) ou son nom.Réponse
Renvoie object, id, name et status (canceled).
Renvoie 422 si le statut de la campagne n’est ni draft ni sending, et 404 si la campagne n’existe pas.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"status": "canceled"
}{
"error": "Campaign cannot be canceled",
"message": "Campaign status is 'scheduled'. Only 'draft' or 'sending' campaigns can be canceled."
}{
"error": "Campaign not found"
}Supprimer une campagne
Supprime définitivement une campagne. Nécessite une clé API avec la portée full. Émet l’événement campaign.deleted.
La suppression d’une campagne n’a aucun effet sur les e-mails déjà envoyés ou en file d’attente. Pour arrêter une campagne en cours d’envoi, annulez-la d’abord.
/campaigns/{id}Paramètres de chemin
idstringobligatoirecmp_…) ou son nom.Réponse
Renvoie object, id, name et deleted: true. Renvoie 404 si la campagne n’existe pas.
{
"object": "campaign",
"id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
"name": "October newsletter",
"deleted": true
}{
"error": "Campaign not found"
}