Poser et suivre une absence
Poser une absence pour soi ou pour un collègue, y joindre un justificatif, savoir qui l'approuvera, la terminer, la prolonger ou l'annuler, et savoir qui est absent.
Une absence est celle d'un utilisateur : un type (congés, maladie, déplacement…), une période et un statut. Elle pose ses événements dans les calendriers, répond en son nom par un message d'absence, et un type soumis à approbation passe par un parcours d'approbation.
Status |
Absence |
|---|---|
0 |
Demandée, en attente d'approbation |
1 |
Approuvée |
2 |
Refusée |
3 |
Annulée |
Une absence est une donnée personnelle — une maladie, une donnée de santé. D'office, elle se lit par l'absent, par qui l'a posée, par son responsable hiérarchique, par son approbateur et par les administrateurs de l'organisation ; une liste ne rend que celles que vous voyez.
1Les types d'absence proposés
GET https://staging-api.docage.com/Absences/Types?userId=00000000-0000-4000-8000-000000000601
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl "https://staging-api.docage.com/Absences/Types?userId=00000000-0000-4000-8000-000000000601" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Get, "https://staging-api.docage.com/Absences/Types?userId=00000000-0000-4000-8000-000000000601");
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/Absences/Types?userId=00000000-0000-4000-8000-000000000601", {
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;userId désigne l'absent ; omis, c'est vous. Chaque type dit :
- sa famille (
Family:0pendant le travail — une réunion, un déplacement, une formation — ;1en dehors du travail — des congés, une maladie) ; - son approbation (
Approval:0aucune,1une validation,2une signature), qui décidera (ApproverName), si l'absence sera approuvée d'office (ApprovedOnCreation), etApproverMissingquand personne ne peut l'approuver — la demande serait refusée ; - s'il attend un justificatif (
RequiresJustification) et s'il se décompte en jours (CountsInDays).
404 : l'absent n'est ni vous, ni un collègue actif que vous administrez ou dont vous êtes le responsable hiérarchique.
2Poser l'absence
Des congés du lundi 23 au mercredi 25 novembre, en journées entières, pour un absent à Paris :
POST https://staging-api.docage.com/Absences/Create
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"AbsenceTypeId": "00000000-0000-4000-8000-000000000b01",
"StartsAtUtc": "2026-11-22T23:00:00Z",
"EndsAtUtc": "2026-11-25T23:00:00Z",
"IsAllDay": true,
"TimeZoneId": "Europe/Paris",
"BackupDocageUserId": "00000000-0000-4000-8000-000000000602",
"Comment": "Congés posés avec l'équipe"
}curl -X POST "https://staging-api.docage.com/Absences/Create" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"AbsenceTypeId": "00000000-0000-4000-8000-000000000b01",
"StartsAtUtc": "2026-11-22T23:00:00Z",
"EndsAtUtc": "2026-11-25T23:00:00Z",
"IsAllDay": true,
"TimeZoneId": "Europe/Paris",
"BackupDocageUserId": "00000000-0000-4000-8000-000000000602",
"Comment": "Congés posés avec l'\''équipe"
}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Absences/Create");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"AbsenceTypeId": "00000000-0000-4000-8000-000000000b01",
"StartsAtUtc": "2026-11-22T23:00:00Z",
"EndsAtUtc": "2026-11-25T23:00:00Z",
"IsAllDay": true,
"TimeZoneId": "Europe/Paris",
"BackupDocageUserId": "00000000-0000-4000-8000-000000000602",
"Comment": "Congés posés avec l'équipe"
}
""", 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/Absences/Create", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"AbsenceTypeId": "00000000-0000-4000-8000-000000000b01",
"StartsAtUtc": "2026-11-22T23:00:00Z",
"EndsAtUtc": "2026-11-25T23:00:00Z",
"IsAllDay": true,
"TimeZoneId": "Europe/Paris",
"BackupDocageUserId": "00000000-0000-4000-8000-000000000602",
"Comment": "Congés posés avec l'équipe"
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;- La période est en UTC ; une date sans fuseau est lue en UTC. Elle ne dépasse pas un an.
- En journées entières (
IsAllDay), le début est minuit à l'heure locale du premier jour, et la fin, exclue, minuit à l'heure locale du lendemain du dernier jour.TimeZoneIdest le fuseau IANA de l'absent ; omis, celui de ses préférences, puis de son organisation. DocageUserIdpose l'absence pour un collègue : seuls qui l'administre et son responsable hiérarchique le peuvent (403sinon).BackupDocageUserId, facultatif : le collègue qui prend le relais, un utilisateur actif de l'organisation.TemplateId: un modèle d'absence (GET https://staging-api.docage.com/Absences/Templates?userId=…), qui fixe le type et propose son message.
La réponse est le résumé de l'absence : Id, Status, Name (composé par le serveur dans la langue de l'absent, « Congés · 23 → 25
nov. 2026 »), Days (les jours décomptés), ApproverName et TransactionId, le parcours d'approbation.
L'approbation. Un type sans approbation donne une absence approuvée. Un type soumis à approbation crée une demande (Status
0) et lance son parcours d'approbation vers le responsable hiérarchique de l'absent, sinon vers l'approbateur du type. Posée pour un
collègue par son responsable, son approbateur ou un administrateur, elle est approuvée d'office. Sans personne pour l'approuver, la
pose est refusée (422).
Le message d'absence est choisi seul : celui du modèle d'absence, sinon celui des préférences de l'absent ou de son organisation,
sinon le message par défaut du type. AbsenceMessageId en impose un — GET https://staging-api.docage.com/Absences/MessageProposal?typeId=… rend celui qui
serait retenu et les autres utilisables (Alternatives) — ; "NoMessage": true pose l'absence sans message.
Les refus : 400 sans type ; 404 absent introuvable ou inactif ; 409 chevauchement d'une autre absence de la même personne ;
422 type, modèle, message ou collègue inutilisable, période invalide, type à approbation sans approbateur, demande d'approbation qui
n'a pas pu partir (l'absence est alors annulée).
Seule l'absence en cours peut être remplacée par une nouvelle : renvoyez la pose avec "ReplaceCurrent": true — à condition
qu'elle soit la seule chevauchée et que la nouvelle ne commence pas dans le passé.
3Joindre un justificatif
Un justificatif — un arrêt de travail, une convocation — est un PDF, une image JPEG ou PNG, de 10 Mo au plus, reconnu à son contenu et
jamais à son nom. Il se lit par qui lit l'absence. Un type qui en attend un (RequiresJustification) ne bloque pas la pose : si
l'absence commence sans justificatif, l'absent en est prévenu une fois, dans l'application.
Dès la pose, la même route reçoit un formulaire (multipart/form-data) : la demande en JSON dans le champ Request, le fichier
dans le champ Justification. Pour une demande, le justificatif part en annexe de son parcours d'approbation — une image y est mise
en page en PDF.
curl -X POST "https://staging-api.docage.com/Absences/Create" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
--form-string 'Request={"AbsenceTypeId":"00000000-0000-4000-8000-000000000b02","StartsAtUtc":"2026-11-15T23:00:00Z","EndsAtUtc":"2026-11-18T23:00:00Z","IsAllDay":true,"TimeZoneId":"Europe/Paris"}' \
-F "Justification=@arret-de-travail.pdf;type=application/pdf"La réponse est le résumé de l'absence, comme pour la pose en JSON, et les refus sont les siens. Un justificatif refusé ne laisse rien
derrière lui, ni absence ni fichier (422) ; un formulaire sans Request, ou dont la demande ne se lit pas, répond 400, et au-delà
de 11 Mo, 413.
Après la pose, par qui peut modifier l'absence :
curl -X POST "https://staging-api.docage.com/Absences/00000000-0000-4000-8000-000000000a01/Files" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-F "File=@arret-de-travail.pdf;type=application/pdf"La réponse est l'identifiant du justificatif, en chaîne JSON. Ajouté après la pose, il ne rejoint pas un parcours d'approbation déjà lancé : l'approbateur, qui lit l'absence, le trouve sur elle.
400: aucun fichier, ou un formulaire illisible.403: vous voyez l'absence sans pouvoir la modifier.404: l'absence est introuvable, à la corbeille, ou vous ne la voyez pas.413: la requête dépasse 11 Mo.422: le fichier n'est ni un PDF ni une image JPEG ou PNG, ou il dépasse 10 Mo.
Les justificatifs d'une absence se listent par GET https://staging-api.docage.com/Absences/{id}/Files — le nom, le type, le poids et la date de dépôt de
chacun — et se téléchargent un à un par GET https://staging-api.docage.com/Absences/{id}/Files/{fileId}.
4Suivre les absences
- Les vôtres, d'un coup d'œil :
GET https://staging-api.docage.com/Absences/Staterend l'absence en cours (Current), les demandes en attente (Pending) et les absences à venir (Upcoming). - Une absence :
GET https://staging-api.docage.com/Absences/{id}/Summary. - Celles de votre équipe — les personnes dont vous êtes le responsable ou l'approbateur :
GET https://staging-api.docage.com/Absences/Team, les demandes en attente d'abord. - La liste, filtrée et paginée :
QUERY https://staging-api.docage.com/Absences
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"Scope": 2,
"Filter": { "PropertyName": "EndsAtUtc", "Comparison": ">", "Value": "2026-11-10T08:00:00Z" },
"SortOrder": "StartsAtUtc",
"Take": 50
}curl -X QUERY "https://staging-api.docage.com/Absences" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"Scope": 2,
"Filter": {"PropertyName": "EndsAtUtc", "Comparison": ">", "Value": "2026-11-10T08:00:00Z"},
"SortOrder": "StartsAtUtc",
"Take": 50
}'using HttpClient client = new();
using HttpRequestMessage request = new(new HttpMethod("QUERY"), "https://staging-api.docage.com/Absences");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"Scope": 2,
"Filter": {
"PropertyName": "EndsAtUtc",
"Comparison": ">",
"Value": "2026-11-10T08:00:00Z"
},
"SortOrder": "StartsAtUtc",
"Take": 50
}
""", 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/Absences", {
method: "QUERY",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"Scope": 2,
"Filter": {"PropertyName": "EndsAtUtc", "Comparison": ">", "Value": "2026-11-10T08:00:00Z"},
"SortOrder": "StartsAtUtc",
"Take": 50
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Scope : 1 les vôtres, 2 celles de votre équipe, 0 toutes celles que vous voyez ; AbsentUserId restreint à une personne.
Qui est absent en ce moment. GET https://staging-api.docage.com/Absences/ForUsers?ids={id1},{id2} rend l'absence en cours de chaque utilisateur demandé
(200 au plus, de votre organisation) avec sa fin effective. Le type d'une absence « en dehors du travail » n'y est rendu qu'à qui a le
droit de le lire.
Les totaux d'une année : GET https://staging-api.docage.com/Absences/Totals?year=2026&userId=… — par type, le nombre d'absences approuvées et les jours
décomptés.
5L'approbation
L'approbateur décide dans l'application. GET https://staging-api.docage.com/Absences/{id}/ApprovalLink lui rend sa place dans le parcours d'approbation
(TransactionMemberId), de quoi ouvrir son action : https://staging-app.docage.com/Transactions/NextAction?transactionMemberId=…. Une demande approuvée passe
à 1, refusée à 2 avec son motif (RefusalReason).
Aucune route n'approuve ni ne refuse une demande : la décision est l'action de l'approbateur dans son parcours d'approbation — une validation ou une signature, à son nom.
6Terminer, prolonger, annuler
- Terminer maintenant :
POST https://staging-api.docage.com/Absences/{id}/End. L'absence en cours se termine à l'instant (EndedAtUtc) ; une absence pas encore commencée est annulée. - Prolonger :
POST https://staging-api.docage.com/Absences/{id}/Extend, avec{ "EndsAtUtc": "2026-11-26T23:00:00Z" }. Seulement une absence approuvée, non terminée, d'un type sans approbation ; la nouvelle fin vient après l'actuelle. Un chevauchement répond409. - Annuler :
POST https://staging-api.docage.com/Absences/{id}/Cancel. Une absence pas encore commencée, ou une demande, qui est retirée : son parcours d'approbation est abandonné et ses événements de calendrier annulés. Une absence approuvée déjà commencée se termine. - Retoucher :
PUT https://staging-api.docage.com/Absences/{id}change le commentaire (Comment) ou le collègue de remplacement (BackupDocageUserId) ; la période seulement pour un type sans approbation, sur une absence approuvée et non terminée. Le type et le message d'une absence posée ne changent jamais (422).
End, Extend et Cancel rendent le résumé de l'absence ; le PUT, son identifiant. 403 : vous ne pouvez pas la modifier ;
404 : introuvable, ou vous ne la voyez pas ; 422 : une autre règle, avec son motif.
Les pièges
POST https://staging-api.docage.com/Absencesne crée qu'un modèle d'absence (IsTemplateàtrue) ; une absence se pose parPOST https://staging-api.docage.com/Absences/Create, qui calcule son statut, son approbateur, ses événements et son message.- Le statut est écrit par le serveur seul : une absence s'approuve par son parcours, s'annule par
Cancel. - Un événement de calendrier « Absent » (
ShowAsà4) n'est pas une absence : ni message d'absence, ni approbation.