Aller au contenu
Documentation

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.

9 min de lecture Mise à jour le 11 novembre 2026

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
}
  • Kind : 1 vidéo, 2 audio seul.
  • LobbyPolicy, la salle d'attente : 1 tous les invités attendent, 2 seul un lien ouvert fait attendre (d'office), 3 personne n'attend.
  • RecordingPolicy : 0 aucun enregistrement, 1 les 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"
}
  • 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…
JSON
{ "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 (LobbyPolicy 2), 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é.
  • Sent compte les invitations parties ; à 0, Message dit 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"]
}
  • LiveSinceUtc est renseigné pendant une séance ; LastSessionStartedAtUtc dit 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/Range les 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 }
JSON
{
  "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 par ContactId — l'un ou l'autre, jamais les deux ; Role vaut 3 (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 (LobbyPolicy 2), 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"] }
JSON
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. MemberIds vide : 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…
JSON
{
  "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. QrCodeUrl est l'image d'un QR code qui y mène. Il se lit par qui voit la réunion (404 sinon).
  • Un lien qui a trop circulé : POST https://staging-api.docage.com/Meetings/{id}/OpenLink/Renew le 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 : 403 pour qui la voit sans ce droit, 404 pour 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…
JSON
[
  {
    "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 EndedAtUtc vide. Les dates sont en UTC, les durées en secondes : ParticipantSeconds additionne 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 : 1 en attente, 2 admis, 3 refusé, 4 attente expirée, 5 retiré par un organisateur.
  • Se lit par qui voit la réunion (404 sinon).

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…
JSON
{ "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…
JSON
{
  "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}/Stop est une demande — l'enregistrement reste 2 le temps que le fichier s'achève, puis passe à 3, ou à 10 sans fichier lisible. Un flux le sait par le déclencheur 11 (enregistrement disponible).
  • La liste : GET https://staging-api.docage.com/Meetings/{id}/Recordings, les plus récents d'abord ; CanPlay et CanDelete disent 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%20Dupont rend une adresse signée, valable 15 minutes (Url, ExpiresAtUtc, ContentType) ; sans download, 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 (Status 5). 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 : 403 pour qui entre dans la réunion sans l'organiser, 404 pour 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 : 404 pour un enregistrement introuvable ou dont l'appelant ne voit pas la réunion — la même réponse ; 403 pour qui la voit sans l'organiser (arrêter) ou sans pouvoir la modifier ni avoir lancé l'enregistrement (supprimer) ; 409 pour un enregistrement qui ne se lit pas ou ne se supprime pas dans son état ; 503 quand 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 à 0 au § 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é : 403 sur 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) et 11 (enregistrement disponible).