Lancer une campagne
Composer une campagne — à qui, par quel média —, la vérifier sans rien envoyer, la lancer, puis suivre ses envois.
Une campagne fait une même chose pour chaque personne d'une cible : lui envoyer un message (email, SMS, WhatsApp), ou générer un parcours à son nom.
1Les comptes et les modèles
GET https://staging-api.docage.com/Campaigns/Mailboxes: les comptes email qui peuvent envoyer une campagne ;IsReadydit s'ils sont prêts.GET https://staging-api.docage.com/Campaigns/Templates?media=1: les modèles d'email utilisables (2pour les SMS,3pour WhatsApp).
2Composer la campagne
POST https://staging-api.docage.com/Campaigns
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"Name": "Portes ouvertes de l'Atelier Lumière",
"Action": 1,
"IsMarketing": true,
"Audience": {
"Operator": 1,
"Nodes": [
{ "Source": 1, "GroupId": "44444444-0000-4000-8000-000000000044" },
{ "Source": 2, "ContactIds": ["55555555-0000-4000-8000-000000000055"] }
]
},
"Media": {
"Rule": 2,
"Nodes": [
{ "Media": 1, "TemplateId": "66666666-0000-4000-8000-000000000066", "ChannelId": "77777777-0000-4000-8000-000000000077" },
{ "Media": 2, "TemplateId": "88888888-0000-4000-8000-000000000088" }
]
}
}curl -X POST "https://staging-api.docage.com/Campaigns" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"Name": "Portes ouvertes de l'\''Atelier Lumière",
"Action": 1,
"IsMarketing": true,
"Audience": {"Operator": 1, "Nodes": [{"Source": 1, "GroupId": "44444444-0000-4000-8000-000000000044"}, {"Source": 2, "ContactIds": ["55555555-0000-4000-8000-000000000055"]}]},
"Media": {"Rule": 2, "Nodes": [{"Media": 1, "TemplateId": "66666666-0000-4000-8000-000000000066", "ChannelId": "77777777-0000-4000-8000-000000000077"}, {"Media": 2, "TemplateId": "88888888-0000-4000-8000-000000000088"}]}
}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Campaigns");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"Name": "Portes ouvertes de l'Atelier Lumière",
"Action": 1,
"IsMarketing": true,
"Audience": {
"Operator": 1,
"Nodes": [
{
"Source": 1,
"GroupId": "44444444-0000-4000-8000-000000000044"
},
{
"Source": 2,
"ContactIds": [
"55555555-0000-4000-8000-000000000055"
]
}
]
},
"Media": {
"Rule": 2,
"Nodes": [
{
"Media": 1,
"TemplateId": "66666666-0000-4000-8000-000000000066",
"ChannelId": "77777777-0000-4000-8000-000000000077"
},
{
"Media": 2,
"TemplateId": "88888888-0000-4000-8000-000000000088"
}
]
}
}
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Campaigns", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"Name": "Portes ouvertes de l'Atelier Lumière",
"Action": 1,
"IsMarketing": true,
"Audience": {"Operator": 1, "Nodes": [{"Source": 1, "GroupId": "44444444-0000-4000-8000-000000000044"}, {"Source": 2, "ContactIds": ["55555555-0000-4000-8000-000000000055"]}]},
"Media": {"Rule": 2, "Nodes": [{"Media": 1, "TemplateId": "66666666-0000-4000-8000-000000000066", "ChannelId": "77777777-0000-4000-8000-000000000077"}, {"Media": 2, "TemplateId": "88888888-0000-4000-8000-000000000088"}]}
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Action:1envoyer un message,2générer des parcours.Audience, la cible : un arbre de sources —1un groupe,2des contacts choisis,3des collègues,4une équipe,5une société,6un cercle,7un classeur,8un filtre de contacts —, réunies (Operator1, au moins une) ou croisées (2, toutes).Media, le canal : chaque média avec son modèle et son compte (ChannelId), tous (Rule1) ou le premier qui atteint la personne (2) ; ici l'email, sinon le SMS.IsMarketing: une campagne commerciale n'écrit pas à une personne désabonnée, et chaque message porte un lien de désabonnement.
La réponse est l'identifiant de la campagne, en brouillon.
3La vérifier sans rien envoyer
GET https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Preview
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl "https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Preview" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Get, "https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Preview");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Preview", {
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;La réponse compte les personnes de la cible, celles qui seront écartées (désabonnées, en double, sans adresse…), les envois par
média et la durée estimée. Sa liste Problems dit ce qui empêcherait le lancement : vide, la campagne peut partir.
POST https://staging-api.docage.com/Campaigns/Sample, avec la campagne, compose les messages d'une personne tels qu'ils partiraient.
4La lancer
POST https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Launch
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{ "ScheduledAt": "2026-11-10T08:00:00+01:00" }curl -X POST "https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Launch" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{"ScheduledAt": "2026-11-10T08:00:00+01:00"}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Launch");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"ScheduledAt": "2026-11-10T08:00:00+01:00"
}
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Campaigns/99999999-0000-4000-8000-000000000099/Launch", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({"ScheduledAt": "2026-11-10T08:00:00+01:00"})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Sans ScheduledAt ({}), elle part aussitôt ; avec, à cette heure (au moins une minute, au plus 366 jours plus tard). Au lancement,
la cible est figée : une personne ajoutée ensuite à un groupe ne la rejoint pas.
5Suivre ses envois
GET https://staging-api.docage.com/Campaigns/{id}/Stats: les comptes — en attente, envoyés, écartés (par raison), remis, ouverts, cliqués, rejetés, désabonnés.GET https://staging-api.docage.com/Campaigns/{id}/Recipients: une ligne par personne, avec son média, son adresse, son état et son message.
State |
État |
|---|---|
0 |
Brouillon |
1 |
Programmée |
2 |
En cours |
3 |
Terminée |
4 |
Arrêtée |
POST https://staging-api.docage.com/Campaigns/{id}/Stop l'arrête — c'est définitif, ce qui n'est pas parti ne partira pas ; POST https://staging-api.docage.com/Campaigns/{id}/Unschedule
ramène une campagne programmée au brouillon.
Les pièges
- Une campagne part d'un compte email de l'organisation, jamais d'un compte de la plateforme.
- Les envois sont cadencés (une trentaine d'emails par minute et par compte) : une grande cible prend du temps, la durée estimée de l'aperçu le dit.
- Une campagne lancée ne se modifie plus, hors son nom et sa description.