Rejouer une requête sans doublon
Une création rejouée crée une seconde fiche : comment reprendre une requête interrompue sans rien doubler.
Une requête de lecture se rejoue sans risque. Une création (POST), non : rejouée après une coupure, elle crée une seconde
fiche, même si la première a été enregistrée avant que la réponse ne se perde. Trois façons de s'en garder.
Donner votre identifiant à la fiche
Chaque fiche porte un ExternalId (128 caractères au plus), que Docage ne remplit pas lui-même : posez-y l'identifiant de la
fiche dans votre système. Avant de rejouer une création, cherchez-la par lui :
QUERY https://staging-api.docage.com/Contacts
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"Filter": { "PropertyName": "ExternalId", "Comparison": "=", "Value": "CRM-004217" },
"Take": 1,
"EntityProperties": ["Id", "ExternalId"]
}curl -X QUERY "https://staging-api.docage.com/Contacts" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"Filter": {"PropertyName": "ExternalId", "Comparison": "=", "Value": "CRM-004217"},
"Take": 1,
"EntityProperties": ["Id", "ExternalId"]
}'using HttpClient client = new();
using HttpRequestMessage request = new(new HttpMethod("QUERY"), "https://staging-api.docage.com/Contacts");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"Filter": {
"PropertyName": "ExternalId",
"Comparison": "=",
"Value": "CRM-004217"
},
"Take": 1,
"EntityProperties": [
"Id",
"ExternalId"
]
}
""", 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/Contacts", {
method: "QUERY",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"Filter": {"PropertyName": "ExternalId", "Comparison": "=", "Value": "CRM-004217"},
"Take": 1,
"EntityProperties": ["Id", "ExternalId"]
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Une liste vide : la création n'a pas eu lieu, rejouez-la. Une fiche : gardez son identifiant.
Créer en deux temps
Les créations complètes, qui enregistrent puis envoient, se font mieux en deux requêtes :
- un parcours :
POST https://staging-api.docage.com/Transactions/CreateFullTransaction?launchTransaction=false, puisPOST https://staging-api.docage.com/Transactions/LaunchTransaction/{id}; - un email :
POST https://staging-api.docage.com/Mails/CreateFullMail?sendMail=false, puisPOST https://staging-api.docage.com/Mails/Send/{id}.
La première rend l'identifiant de la fiche enregistrée ; seule la seconde envoie. Si la seconde échoue sans réponse, relisez la fiche avant de la rejouer : son statut dit si l'envoi a eu lieu. En une seule requête, un envoi refusé laisse la fiche enregistrée en brouillon, et le message du refus le dit : ne la recréez pas, corrigez-la et lancez-la.
Les messages d'une conversation
Un message porte un ClientMessageId, l'identifiant que vous lui donnez à l'envoi : renvoyé avec le même identifiant, il n'est
pas doublé. Une note écrite par le compositeur d'une conversation a le sien, pour la même raison.
Les webhooks
Un envoi de webhook peut vous parvenir plus d'une fois (après un délai de réponse dépassé, par exemple). Son en-tête webhook-id
reste le même d'une tentative à l'autre : retenez-le, et ignorez un envoi déjà traité. Voir Webhooks.