Planifier une réunion de visio
Créer une réunion de visio, la placer dans le calendrier avec un contact, lui envoyer son lien personnel, gérer ses membres et son lien ouvert, puis lire ses séances et ses enregistrements.
Une réunion est une salle de visio permanente : elle se rouvre à chaque séance, et ses liens restent valables. Elle n'a pas d'heure : la date d'une visio est celle de l'événement du calendrier qui la porte. Son auteur en est l'organisateur ; un utilisateur de l'organisation y entre sous sa propre identité, un contact par un lien personnel, que lui apporte l'invitation de l'événement ou celle de la réunion.
1Créer la réunion
POST https://staging-api.docage.com/Meetings
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"Name": "Point projet Dupont",
"Description": "Revue du devis et des prochaines étapes",
"Kind": 1
}curl -X POST "https://staging-api.docage.com/Meetings" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"Name": "Point projet Dupont",
"Description": "Revue du devis et des prochaines étapes",
"Kind": 1
}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Meetings");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"Name": "Point projet Dupont",
"Description": "Revue du devis et des prochaines étapes",
"Kind": 1
}
""", 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/Meetings", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"Name": "Point projet Dupont",
"Description": "Revue du devis et des prochaines étapes",
"Kind": 1
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Kind:1vidéo,2audio seul.LobbyPolicy, la salle d'attente :1tous les invités attendent,2seul un lien ouvert fait attendre (d'office),3personne n'attend.RecordingPolicy:0aucun enregistrement,1les organisateurs peuvent enregistrer (d'office).RecordingRetentionDays: la conservation des enregistrements, de 1 à 3 650 jours ; vide, celle de l'organisation.
La réponse est l'identifiant de la réunion. 422, avec sa raison : un nom vide (« Donnez un nom à la réunion. »), une valeur hors de
son énumération, une conservation hors de ses bornes.
2La placer dans le calendrier, avec un contact
POST https://staging-api.docage.com/CalendarEvents
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"Name": "Point projet Dupont",
"StartUtc": "2026-11-17T14:00:00+01:00",
"EndUtc": "2026-11-17T14:45:00+01:00",
"TimeZoneId": "Europe/Paris",
"MeetingId": "1f7a3c55-0000-4000-8000-000000000901",
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f"
}curl -X POST "https://staging-api.docage.com/CalendarEvents" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"Name": "Point projet Dupont",
"StartUtc": "2026-11-17T14:00:00+01:00",
"EndUtc": "2026-11-17T14:45:00+01:00",
"TimeZoneId": "Europe/Paris",
"MeetingId": "1f7a3c55-0000-4000-8000-000000000901",
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f"
}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/CalendarEvents");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"Name": "Point projet Dupont",
"StartUtc": "2026-11-17T14:00:00+01:00",
"EndUtc": "2026-11-17T14:45:00+01:00",
"TimeZoneId": "Europe/Paris",
"MeetingId": "1f7a3c55-0000-4000-8000-000000000901",
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f"
}
""", 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/CalendarEvents", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"Name": "Point projet Dupont",
"StartUtc": "2026-11-17T14:00:00+01:00",
"EndUtc": "2026-11-17T14:45:00+01:00",
"TimeZoneId": "Europe/Paris",
"MeetingId": "1f7a3c55-0000-4000-8000-000000000901",
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f"
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;- Sans
CalendarId, l'événement va dans le calendrier par défaut de l'utilisateur, sinon dans son calendrier personnel. - La réunion est contrôlée quand on la rattache : une réunion d'une autre organisation, un modèle de réunion, ou une réunion que
l'utilisateur ne voit pas est refusée (
422, « La réunion Visio de l'événement est introuvable. »). - Inutile de remplir
OnlineMeetingUrl: chaque invité reçoit son propre lien.
Le reste de l'événement — sa série, son rappel, son annulation — est celui de tout événement : voir Lire et planifier dans le calendrier.
3Envoyer l'invitation
POST https://staging-api.docage.com/CalendarEvents/7c21d4a8-0000-4000-8000-000000000501/Invite
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl -X POST "https://staging-api.docage.com/CalendarEvents/7c21d4a8-0000-4000-8000-000000000501/Invite" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/CalendarEvents/7c21d4a8-0000-4000-8000-000000000501/Invite");
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/CalendarEvents/7c21d4a8-0000-4000-8000-000000000501/Invite", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;{ "Sent": 1, "Message": null }- Le contact reçoit un email avec l'invitation au format iCalendar et son lien personnel, qui le fait membre de la réunion. Sous
la salle d'attente d'office (
LobbyPolicy2), il entre sans attendre. - Un collègue n'a pas besoin d'invitation : un utilisateur de l'organisation entre dans la salle sous sa propre identité.
Sentcompte les invitations parties ; à0,Messagedit pourquoi : aucune adresse, ou seulement celle de l'organisateur, qui ne s'invite pas lui-même.
4Retrouver et régler les réunions
QUERY https://staging-api.docage.com/Meetings
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"SortOrder": "LastSessionStartedAtUtc_Desc",
"Skip": 0,
"Take": 20,
"EntityProperties": ["Id", "Name", "Kind", "LiveSinceUtc", "LastSessionStartedAtUtc"]
}curl -X QUERY "https://staging-api.docage.com/Meetings" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"SortOrder": "LastSessionStartedAtUtc_Desc",
"Skip": 0,
"Take": 20,
"EntityProperties": ["Id", "Name", "Kind", "LiveSinceUtc", "LastSessionStartedAtUtc"]
}'using HttpClient client = new();
using HttpRequestMessage request = new(new HttpMethod("QUERY"), "https://staging-api.docage.com/Meetings");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"SortOrder": "LastSessionStartedAtUtc_Desc",
"Skip": 0,
"Take": 20,
"EntityProperties": [
"Id",
"Name",
"Kind",
"LiveSinceUtc",
"LastSessionStartedAtUtc"
]
}
""", 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/Meetings", {
method: "QUERY",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"SortOrder": "LastSessionStartedAtUtc_Desc",
"Skip": 0,
"Take": 20,
"EntityProperties": ["Id", "Name", "Kind", "LiveSinceUtc", "LastSessionStartedAtUtc"]
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;LiveSinceUtcest renseigné pendant une séance ;LastSessionStartedAtUtcdit le début de la dernière. Le serveur les écrit seul.- Les événements qui portent une réunion ont son
MeetingId:GET https://staging-api.docage.com/CalendarEvents/Rangeles rend avec le reste du calendrier. - Modifier :
PUT https://staging-api.docage.com/Meetings/{id}, avec ce qui change —Name,Description,Kind,LobbyPolicy,RecordingPolicy,RecordingRetentionDays. - Supprimer :
DELETE https://staging-api.docage.com/Meetings/{id}la met à la corbeille.
5Les membres de la réunion
Les membres sont les personnes que la réunion attend : des utilisateurs, qui y entrent sous leur propre identité, et des contacts,
qui y entrent chacun par son lien personnel. Un membre a un rôle : 1 organisateur, 2 co-organisateur, 3 participant. Un co-organisateur a dans la salle les gestes
de l'organisateur : faire entrer, couper un micro, retirer, enregistrer, terminer.
POST https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Members
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{ "ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f", "Role": 3 }curl -X POST "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Members" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f",
"Role": 3
}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Members");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f",
"Role": 3
}
""", 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/Meetings/1f7a3c55-0000-4000-8000-000000000901/Members", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f",
"Role": 3
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;{
"Id": "4c8e2b17-0000-4000-8000-000000000911",
"DocageUserId": null,
"ContactId": "9b2d7a46-3c1e-4f0a-8b5d-1a2b3c4d5e6f",
"Name": "Claire Dupont",
"Email": "claire.dupont@example.com",
"Role": 3,
"LinkUrl": "https://staging-api.docage.com/Links/2e6b9f04-0000-4000-8000-000000000912"
}- Un utilisateur s'ajoute par
DocageUserId, un contact parContactId— l'un ou l'autre, jamais les deux ;Rolevaut3(participant) d'office. Un collègue n'a pas besoin d'être membre pour entrer : il le devient pour recevoir un rôle. - Un contact reçoit aussitôt son lien personnel (
LinkUrl) : il entre sous son nom et, sous la salle d'attente d'office (LobbyPolicy2), sans attendre. Ce lien vaut identité : qui l'a entre sous le nom du contact. Rien ne part par cet ajout : l'invitation s'envoie au § 6. - La liste :
GET https://staging-api.docage.com/Meetings/{id}/Members, organisateurs d'abord. Changer un rôle :PUT https://staging-api.docage.com/Meetings/{id}/Members/{memberId}avec{ "Role": 2 }; un utilisateur prend son nouveau rôle à sa prochaine entrée dans la salle. Retirer un membre :DELETE https://staging-api.docage.com/Meetings/{id}/Members/{memberId}; le lien personnel d'un contact expire à l'instant. - La liste se lit par qui voit la réunion ; le reste est réservé à qui peut la modifier.
403: l'appelant voit la réunion sans le droit de la modifier.404: la réunion est introuvable ou invisible, le membre n'est pas de cette réunion, ou la personne désignée est introuvable, d'une autre organisation ou invisible pour l'appelant — la même réponse.409: la personne est déjà membre.422: ni utilisateur ni contact, ou les deux ; un rôle inconnu.
6Envoyer leur lien aux membres
POST https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Invitations
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{ "MemberIds": ["4c8e2b17-0000-4000-8000-000000000911"] }curl -X POST "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Invitations" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{"MemberIds": ["4c8e2b17-0000-4000-8000-000000000911"]}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Invitations");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"MemberIds": [
"4c8e2b17-0000-4000-8000-000000000911"
]
}
""", 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/Meetings/1f7a3c55-0000-4000-8000-000000000901/Invitations", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({"MemberIds": ["4c8e2b17-0000-4000-8000-000000000911"]})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;1- Chaque membre désigné reçoit un email qui l'invite à la réunion, avec un bouton « Rejoindre la réunion » : son lien personnel pour
un contact, l'adresse de la salle pour un utilisateur.
MemberIdsvide : tous les membres. Un membre sans adresse email, et l'appelant lui-même, ne reçoivent rien ; un identifiant qui n'est pas celui d'un membre de la réunion est ignoré. - La réponse est le nombre d'emails partis. Cet email ne porte pas de date : pour une visio à une heure dite, envoyez l'invitation de l'événement (§ 3), avec sa pièce au format iCalendar.
- Ouvert à qui peut modifier la réunion, et à ses organisateurs.
403: l'appelant voit la réunion sans pouvoir la modifier ni l'organiser.404: la réunion est introuvable ou invisible.503: aucun email n'est parti, l'envoi a échoué ; le motif est dans la réponse.
7Le lien ouvert
Le lien ouvert fait entrer quiconque l'a, comme invité, sous le nom qu'il donne ; sous la salle d'attente d'office (LobbyPolicy
2), il attend qu'un organisateur le fasse entrer.
GET https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/OpenLink
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/OpenLink" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Get, "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/OpenLink");
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/Meetings/1f7a3c55-0000-4000-8000-000000000901/OpenLink", {
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;{
"LinkId": "7d0e4b19-0000-4000-8000-000000000921",
"Url": "https://staging-api.docage.com/Links/7d0e4b19-0000-4000-8000-000000000921",
"QrCodeUrl": "https://staging-api.docage.com/Links/QrCode/7d0e4b19-0000-4000-8000-000000000921"
}- Le lien naît à la première lecture et reste valable jusqu'à son remplacement.
QrCodeUrlest l'image d'un QR code qui y mène. Il se lit par qui voit la réunion (404sinon). - Un lien qui a trop circulé :
POST https://staging-api.docage.com/Meetings/{id}/OpenLink/Renewle remplace et fait expirer l'ancien à l'instant ; la réponse est le nouveau lien. Les liens personnels des contacts ne changent pas. Réservé à qui peut modifier la réunion :403pour qui la voit sans ce droit,404pour qui ne la voit pas.
8Les séances et les présences
Chaque ouverture de la salle est une séance : elle commence à la première entrée, et se termine quand la salle se vide ou qu'un organisateur la termine pour tous.
GET https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Sessions
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Sessions" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Get, "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Sessions");
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/Meetings/1f7a3c55-0000-4000-8000-000000000901/Sessions", {
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;[
{
"Id": "3b5c7e21-0000-4000-8000-000000000931",
"StartedAtUtc": "2026-11-17T13:01:12Z",
"EndedAtUtc": "2026-11-17T13:44:05Z",
"PeakParticipants": 2,
"ParticipantSeconds": 5058,
"Attendances": [
{
"Id": "8a4d2f60-0000-4000-8000-000000000932",
"DisplayName": "Hélène Martin",
"Role": 1,
"AdmissionStatus": 2,
"JoinedAtUtc": "2026-11-17T13:01:12Z",
"LeftAtUtc": "2026-11-17T13:44:05Z",
"ConnectedSeconds": 2573,
"IsUser": true,
"IsContact": false
},
{
"Id": "8a4d2f60-0000-4000-8000-000000000933",
"DisplayName": "Claire Dupont",
"Role": 3,
"AdmissionStatus": 2,
"JoinedAtUtc": "2026-11-17T13:02:40Z",
"LeftAtUtc": "2026-11-17T13:44:05Z",
"ConnectedSeconds": 2485,
"IsUser": false,
"IsContact": true
}
]
}
]- Les 100 séances les plus récentes, d'abord la dernière ; une séance en cours a
EndedAtUtcvide. Les dates sont en UTC, les durées en secondes :ParticipantSecondsadditionne les temps de connexion de tous. - Chaque présence, dans l'ordre d'arrivée :
IsUser, un utilisateur entré sous sa propre identité ;IsContact, un contact entré par son lien personnel ; ni l'un ni l'autre, un invité du lien ouvert. AdmissionStatus:1en attente,2admis,3refusé,4attente expirée,5retiré par un organisateur.- Se lit par qui voit la réunion (
404sinon).
9Les enregistrements
Un organisateur enregistre la séance en cours : la salle doit être ouverte — quelqu'un y est entré, depuis l'application ou par un
lien. Un enregistrement se facture à la minute entamée quand il s'achève, au prix d'une heure que rend HourlyPrice ; il ne se
rembourse pas.
GET https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings/Price
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings/Price" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Get, "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings/Price");
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/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings/Price", {
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;{ "CanRecord": true, "Refusal": null, "Kind": 1, "HourlyPrice": 2.40, "ActiveRecordingId": null }CanRecord à false : Refusal dit ce qui l'empêche, ou ActiveRecordingId désigne l'enregistrement déjà en cours. Puis le
démarrage :
POST https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…curl -X POST "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…"using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings");
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/Meetings/1f7a3c55-0000-4000-8000-000000000901/Recordings", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`
}
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;{
"Id": "5f2a8c63-0000-4000-8000-000000000941",
"Name": "Point projet Dupont",
"Kind": 1,
"Status": 2,
"Part": 1,
"StartedAtUtc": "2026-11-17T13:05:00Z",
"EndedAtUtc": null,
"DurationSeconds": null,
"SizeBytes": null,
"BilledMinutes": 0,
"BillingStatus": 0,
"PurgeAfterUtc": null,
"FailureReason": null,
"StartedByName": null,
"CanPlay": false,
"CanDelete": false
}Status |
État |
|---|---|
1 |
Demandé |
2 |
En cours |
3 |
Disponible : il se lit et se télécharge |
4 |
Purgé : sa durée de conservation est écoulée |
5 |
Supprimé |
10 |
Échec : aucun fichier lisible, rien n'est facturé |
11 |
Incertain : le service vidéo n'a pas confirmé le démarrage ; il est vérifié, jamais redemandé |
12 |
À vérifier |
- Le fichier est vidéo (MP4) ou audio (Ogg) selon la réunion ; au-delà de la durée maximale d'un fichier, l'enregistrement se
poursuit dans une partie suivante (
Part). - Arrêter :
POST https://staging-api.docage.com/MeetingRecordings/{id}/Stopest une demande — l'enregistrement reste2le temps que le fichier s'achève, puis passe à3, ou à10sans fichier lisible. Un flux le sait par le déclencheur11(enregistrement disponible). - La liste :
GET https://staging-api.docage.com/Meetings/{id}/Recordings, les plus récents d'abord ;CanPlayetCanDeletedisent ce que l'appelant peut en faire. - Le lire ou le télécharger :
GET https://staging-api.docage.com/MeetingRecordings/{id}/Playback?download=true&fileName=Point%20projet%20Dupontrend une adresse signée, valable 15 minutes (Url,ExpiresAtUtc,ContentType) ; sansdownload, l'adresse le lit dans un navigateur. - Le supprimer :
DELETE https://staging-api.docage.com/MeetingRecordings/{id}efface le fichier ; l'enregistrement reste dans la liste (Status5). Seul un enregistrement disponible, en échec ou à vérifier se supprime, par qui peut modifier la réunion ou l'a lancé. - Démarrer et lire le prix sont réservés aux organisateurs :
403pour qui entre dans la réunion sans l'organiser,404pour qui n'y entre pas. Au démarrage,409: la salle n'est pas ouverte, ou un enregistrement est déjà en cours ;422: l'enregistrement est désactivé pour la réunion ou par l'organisation, ou l'organisation n'est pas en production ;503: l'enregistrement ou la visio n'est pas disponible pour le moment, ou le service vidéo a refusé de démarrer. - Arrêter, lire, supprimer :
404pour un enregistrement introuvable ou dont l'appelant ne voit pas la réunion — la même réponse ;403pour qui la voit sans l'organiser (arrêter) ou sans pouvoir la modifier ni avoir lancé l'enregistrement (supprimer) ;409pour un enregistrement qui ne se lit pas ou ne se supprime pas dans son état ;503quand le service vidéo ou le stockage ne répond pas.
Les pièges
- Une réunion n'a pas d'heure : planifier, c'est poser un événement (§ 2) ; l'inviter à une date, c'est envoyer l'invitation de cet événement (§ 3). Ses membres ne s'envoient pas dans le corps de la réunion : ils se gèrent par leurs routes (§ 5).
- L'API n'entre pas dans la salle : rejoindre la réunion, faire entrer un invité, couper un micro, retirer quelqu'un ou terminer pour tous se font dans la salle, depuis l'application ; un enregistrement ne démarre que dans une salle ouverte.
- Un contact sans adresse email ne reçoit rien (
Sentà0au § 3 ; au § 6, il ne compte pas parmi les emails partis). - Un enregistrement facturé ne se rembourse pas : le supprimer efface le fichier, pas sa consommation.
- La réunion se crée même quand la visio n'est pas disponible pour l'organisation : c'est l'entrée dans la salle qui est alors refusée.
- Un module fermé :
403sur les réunions sans le module Visio ; sans le module Calendrier, ni événement, ni invitation. - Agir à la fin d'une réunion : un flux, déclencheurs
10(réunion terminée) et11(enregistrement disponible).