Aller au contenu
Documentation

Créer un modèle de réservation

Composer une offre de rendez-vous — sa durée, ses règles, les calendriers qu'elle occupe, ses horaires —, voir ses créneaux avant de l'enregistrer, et obtenir l'adresse de sa page publique.

6 min de lecture Mise à jour le 11 novembre 2026

Un modèle de réservation est une offre de rendez-vous : sa durée, ses marges, son préavis, son horizon, son lieu, et les calendriers qu'un rendez-vous occupe. Sur sa page publique, une personne choisit un créneau ; chaque rendez-vous pris devient une réservation, à suivre comme dans Gérer les rendez-vous d'un modèle de réservation.

1Les calendriers à réserver

GET https://staging-api.docage.com/Calendars/Bookable?search=Martin&take=20
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…

La réponse range, section par section, ce qu'un rendez-vous peut occuper : les utilisateurs et les équipes de l'organisation, les objets réservables (une salle, un véhicule) et les calendriers que l'utilisateur voit. Chacun vient avec son calendrier (CalendarId). Une personne ou une équipe qui n'en a pas encore arrive sans lui, avec sa fiche (RecordId) : son calendrier se crée quand vous le demandez.

POST https://staging-api.docage.com/Calendars/ForRecord
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json

{ "RecordId": "5e1a7c90-0000-4000-8000-000000000601" }

La réponse porte son CalendarId. GET https://staging-api.docage.com/Calendars/Mine rend aussi les calendriers de l'utilisateur, le sien en tête.

2Ses horaires : la réservabilité

Elle est facultative. Sans réservabilité — ni sur le modèle, ni sur ses calendriers —, un rendez-vous se prend du lundi au vendredi, de 9 h à 12 h et de 14 h à 18 h.

POST https://staging-api.docage.com/AvailabilitySchedules
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json

{
  "Name": "Horaires du cabinet",
  "TimeZoneId": "Europe/Paris",
  "AvailabilityScheduleRanges": [
    { "DayOfWeek": 1, "Start": "09:00:00", "End": "12:00:00" },
    { "DayOfWeek": 1, "Start": "14:00:00", "End": "18:00:00" },
    { "DayOfWeek": 3, "Start": "09:00:00", "End": "12:00:00" }
  ],
  "AvailabilityScheduleExceptions": [
    { "Date": "2026-12-24", "Ranges": [] }
  ]
}
  • DayOfWeek : 0 dimanche, 1 lundi … 6 samedi.
  • Les heures sont locales du fuseau TimeZoneId : c'est la seule exception à la règle de l'UTC, pour qu'une plage de 9 h à 12 h suive l'heure d'été.
  • Une exception remplace les plages d'un jour ; sans plage, le jour est fermé.
  • Une plage dont la fin ne suit pas le début n'offre rien.

Posée sur le modèle (AvailabilityScheduleId), la réservabilité est un cadre, croisé avec celle de chaque calendrier ; un calendrier qui n'en a pas en hérite.

3Créer le modèle

POST https://staging-api.docage.com/Bookings
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json

{
  "IsTemplate": true,
  "Name": "Premier rendez-vous",
  "Description": "Un premier échange de 45 minutes.",
  "DurationMinutes": 45,
  "BufferAfterMinutes": 15,
  "MinNoticeMinutes": 1440,
  "MaxDaysAhead": 30,
  "LocationKind": 6,
  "AvailabilityScheduleId": "8d3f1b62-0000-4000-8000-000000000701",
  "CalendarGroup": {
    "Rule": 2,
    "Assignment": 2,
    "CalendarGroupLines": [
      { "CalendarId": "3a9c5e17-0000-4000-8000-000000000201" },
      { "CalendarId": "3a9c5e17-0000-4000-8000-000000000202" }
    ]
  }
}
  • IsTemplate à true : sans lui, la création est refusée (400). Une réservation ne se crée pas, elle naît de son modèle.
  • Les règles : DurationMinutes (30 d'office), BufferBeforeMinutes et BufferAfterMinutes (les marges avant et après), MinNoticeMinutes (le préavis, 120 d'office), MaxDaysAhead (l'horizon en jours, 60 d'office), SlotIncrementMinutes (le pas entre deux débuts ; vide, la durée), MaxPerDay (les rendez-vous par jour et par calendrier ; vide, sans limite).
  • Le lieu : LocationKind — 1 sur place, 2 téléphone (d'office), 3 Microsoft Teams, 4 Google Meet, 5 autre, 6 visio, une réunion par rendez-vous — et LocationDetails : l'adresse, le numéro ou le lien.
  • La personne qui réserve : AllowReschedule et AllowCancel (elle peut déplacer, annuler : vrais d'office), ReminderMinutesBefore (son rappel, 1 440 minutes avant d'office), CreatesContact (un contact créé ou retrouvé : vrai d'office).
  • OwnerDocageUserId : qui organise un rendez-vous qui ne réserve aucune personne — une salle seule ; vide, l'auteur du modèle.

Le calendrier groupé (CalendarGroup) dit ce qu'un rendez-vous occupe :

  • Rule 1, « Tous » : chaque ligne est réservée — une personne et une salle ensemble. Rule 2, « Au moins un » : une seule ligne, choisie par Assignment — 1 la première libre de la liste, 2 la moins occupée, 3 celle dont la dernière réservation est la plus ancienne, 4 celle dont elle est la plus récente, 5 au hasard.
  • Une ligne porte un calendrier (CalendarId), un groupe imbriqué (CalendarGroup, trois niveaux au plus), ou une entrée dynamique : DynamicType (DocageUser, Team, Calendar, ou le code d'un type d'objet réservable) et FriendlyName, son nom (« Véhicule »), unique dans le modèle. Elle est remplacée au moment de réserver par une fiche de son type — celle que la personne choisit dans le formulaire, ou celle que règle l'action d'un parcours.

La réponse est l'identifiant du modèle. Les refus (422), avec leur raison : un nom vide, une durée qui n'est pas positive, une marge ou un préavis négatif, un horizon de moins d'un jour, un calendrier supprimé ou d'une autre organisation, un type d'entrée dynamique inconnu ou non réservable, une adresse déjà prise (« Cette adresse publique est déjà utilisée »).

4Voir ses créneaux avant de l'enregistrer

Les créneaux qu'offrirait un modèle se calculent avant de le créer, sur les mêmes réglages et par le même calcul que sa page publique. Rien n'est écrit : ni modèle, ni option, ni calendrier.

POST https://staging-api.docage.com/Bookings/Preview/Slots
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json

{
  "DurationMinutes": 45,
  "SlotIncrementMinutes": 60,
  "MinNoticeMinutes": 1440,
  "MaxDaysAhead": 30,
  "AvailabilityScheduleId": "8d3f1b62-0000-4000-8000-000000000701",
  "CalendarGroup": {
    "Rule": 2,
    "Assignment": 2,
    "CalendarGroupLines": [
      { "CalendarId": "3a9c5e17-0000-4000-8000-000000000201" },
      { "CalendarId": "3a9c5e17-0000-4000-8000-000000000202" }
    ]
  },
  "FromUtc": "2026-11-16T00:00:00+01:00",
  "ToUtc": "2026-11-21T00:00:00+01:00"
}
JSON
[
  { "StartUtc": "2026-11-17T08:00:00Z", "EndUtc": "2026-11-17T08:45:00Z" },
  { "StartUtc": "2026-11-17T09:00:00Z", "EndUtc": "2026-11-17T09:45:00Z" },
  { "StartUtc": "2026-11-17T10:00:00Z", "EndUtc": "2026-11-17T10:45:00Z" }
]
  • Le corps reprend les règles du modèle (DurationMinutes, SlotIncrementMinutes, BufferBeforeMinutes, BufferAfterMinutes, MinNoticeMinutes, MaxDaysAhead, MaxPerDay), sa réservabilité (AvailabilityScheduleId), son calendrier groupé (CalendarGroup) et son responsable (OwnerDocageUserId). Sans valeur d'office ici : DurationMinutes (de 5 à 1 440) et MaxDaysAhead (de 1 à 365) sont à donner.
  • FromUtc et ToUtc bornent la fenêtre, 62 jours au plus, en UTC (Z ou décalage).
  • OrganizationId : l'organisation du futur modèle, où vous pouvez créer ; omise, la vôtre.
  • Une entrée dynamique attend sa fiche : "Choices": { "Véhicule": "6c4e2a18-0000-4000-8000-000000000301" } la remplace, pour l'aperçu, par une fiche de l'organisation qui convient à son type. Sans elle, l'entrée n'offre aucun créneau.

Ce qu'un créneau réserverait — les calendriers retenus et qui organiserait le rendez-vous — se lit avec le même corps, plus son début :

POST https://staging-api.docage.com/Bookings/Preview/Allocation
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json

{
  "DurationMinutes": 45,
  "SlotIncrementMinutes": 60,
  "MinNoticeMinutes": 1440,
  "MaxDaysAhead": 30,
  "CalendarGroup": {
    "Rule": 2,
    "Assignment": 2,
    "CalendarGroupLines": [
      { "CalendarId": "3a9c5e17-0000-4000-8000-000000000201" },
      { "CalendarId": "3a9c5e17-0000-4000-8000-000000000202" }
    ]
  },
  "StartUtc": "2026-11-17T08:00:00Z"
}
JSON
{
  "StartUtc": "2026-11-17T08:00:00Z",
  "EndUtc": "2026-11-17T08:45:00Z",
  "OrganizerName": "Claire Martin",
  "Lines": [
    { "CalendarId": "3a9c5e17-0000-4000-8000-000000000201", "Kind": 1, "Name": "Claire Martin", "DynamicName": null, "IsOrganizer": true }
  ]
}
  • Lines : les calendriers retenus, dans l'ordre du calendrier groupé, avec l'entrée dynamique que chacun remplace (DynamicName).
  • OrganizerName : la première personne retenue, sinon le responsable du modèle, sinon vous.

Les refus : 400 une borne de la fenêtre ou StartUtc qui manque, une fin qui ne suit pas le début ; 403 une organisation où vous ne pouvez pas créer ; 404 une organisation introuvable, ou que vous ne voyez pas ; 422 ce que la création refuserait — un réglage hors de ses bornes, un calendrier ou une réservabilité d'une autre organisation, un calendrier groupé mal formé —, une fenêtre de plus de 62 jours, ou un créneau que le modèle ne propose pas.

5Sa page publique

GET https://staging-api.docage.com/Bookings/2b6e9d14-0000-4000-8000-000000000801
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
  • Slug : l'adresse courte du modèle. Sans Slug à la création, elle est tirée du nom ; envoyée, elle est normalisée — minuscules sans accents, chiffres et tirets. Elle est unique sur toute la plateforme.
  • FormId : l'écran de réservation du modèle, sa propre copie du formulaire de réservation, posée à la création.

La page où l'on réserve est https://staging-app.docage.com/Booking/ suivie de cette adresse : celle que vous partagez ou intégrez.

6Le modifier

PUT https://staging-api.docage.com/Bookings/{id}, avec ce qui change ; les refus sont ceux de la création. Un rendez-vous déjà pris garde ce qu'il a recopié du modèle en naissant : son nom, sa durée, ses marges, son lieu, ses emails, son rappel, et ce que la personne peut en faire.

Les pièges

  • Un calendrier ne figure qu'une fois dans un même groupe, et chaque entrée dynamique a son nom propre.
  • Un calendrier cité par un modèle ne se supprime pas, ni une réservabilité qu'un modèle ou un calendrier emploie : retirez-les d'abord du modèle.
  • Supprimer un modèle annule ses rendez-vous à venir ; la personne est prévenue d'un rendez-vous confirmé.
  • Un modèle sans calendrier n'offre aucun créneau : donnez au moins une ligne à son calendrier groupé.
  • L'aperçu ne compte pas les rendez-vous du modèle : le maximum par jour (MaxPerDay) s'y applique à un modèle qui n'en a encore aucun ; une fois les réservations prises, la page publique peut proposer moins.