Flux de réservation

Endpoints orientés consommateur pour la réservation de rendez-vous. Ces endpoints sont également utilisés par le widget BookingJS et sont optimisés pour les intégrations frontend.

Aucune authentification requise

Les endpoints de réservation consommateur ne nécessitent pas de clé API. Ils sont accessibles publiquement, car ils sont destinés aux consommateurs finaux. Le contrôle d'accès s'effectue via les paramètres de canal et les références de ressource.

Aperçu

Le flux de réservation standard se compose de trois étapes :

  1. Récupérer les rendez-vous disponibles - liste de tous les créneaux réservables
  2. Réserver un rendez-vous - blocage de 3 minutes sur le créneau sélectionné
  3. Finaliser la réservation - finaliser le rendez-vous avec les données du consommateur
MéthodeEndpointDescription
GET/resources/:ref/upcoming_bookablesRécupérer les rendez-vous disponibles
POST/rest/1/resources/:ref/reserve_appointmentRéserver un rendez-vous (3 min)
POST/resources/:ref/create_appointment_with_consumerFinaliser la réservation
POST/products/active_productsRécupérer les produits actifs
POST/resources/public_dataDonnées publiques des ressources
OPTIONS/resources/:ref/upcoming_bookablesPreflight CORS

1. Récupérer les rendez-vous disponibles

Récupère tous les créneaux réservables pour une ou plusieurs ressources. Les résultats sont regroupés selon un format de date configurable, afin de faciliter une UI à deux niveaux (par ex. vue mensuelle → liste journalière).

Endpoint
GET /resources/{ref}/upcoming_bookables

Paramètres de chemin

ParamètreTypeDescription
refstringRéférence de ressource ou UUID. Formats : resourceId@providerUuid@platform - référence complète ; resourceId@platform - forme courte ; uuid - UUID direct de la ressource

Paramètres de requête

ParamètreTypeObligatoireDescription
groupFormatstringNonFormat Joda-Time pour le regroupement. Tous les bookables ayant la même valeur se retrouvent dans un même groupe. Par défaut : yyyy-MM-dd. Exemples : MM-yyyy (mensuel), MMMM (nom du mois)
timeFormatstringNonFormat pour formattedStart/formattedEnd. Par défaut : yyyy-MM-dd HH:mm
languageTagstringNonBalise de langue IETF BCP 47 pour la traduction côté serveur (par ex. noms de mois). Exemple : de_DE, fr_FR
channelKeystringNonCanal de réservation. Par défaut : RESOURCE_PUBLIC. Voir Channel Keys
refstringNonRéférences de ressource supplémentaires. Peut être spécifié plusieurs fois pour charger les bookables de plusieurs ressources simultanément
prdRefstringNonRéférence de produit ou UUID. Filtre sur les bookables qui prennent en charge ce produit. Tient également compte du leadTime/followUpTime du produit

Request

Exemple : regroupement mensuel en français
curl -X GET "https://www.timum.de/resources/my-resource@myPlatform/upcoming_bookables?groupFormat=MMMM&languageTag=fr_FR"

Response

La réponse est un objet avec des clés dynamiques basées sur le groupFormat. Elle contient également un indicateur public_visible.

Response (200 OK)
{
  "avril 18": [
    {
      "formattedStart": "2018-04-30 14:00",
      "formattedEnd": "2018-04-30 14:30",
      "start": "2018-04-30T14:00:00+02:00",
      "end": "2018-04-30T14:30:00+02:00",
      "timeslot_uuid": "6cb6df60-48d8-11e8-a5e5-263fa1a58213",
      "product_uuid": "7fc85970-a2d0-11e2-9cd0-1231430706c1",
      "resource_uuid": "636627f0-006c-11ec-a5c8-02e4d9518b64",
      "product_name": "Gesellschaftsspiele spielen",
      "resource_name": "2nd Level Support",
      "contact_channel": null,
      "capacity": 1,
      "capacity_left": 1,
      "products": [],
      "kind": "models.Bookable"
    }
  ],
  "mai 18": [
    {
      "appointment_uuid": "864b80c0-483f-11f0-b6e3-72fe2304273f",
      "formattedStart": "2018-05-02 14:00",
      "formattedEnd": "2018-05-02 14:30",
      "start": "2018-05-02T14:00:00+02:00",
      "end": "2018-05-02T14:30:00+02:00",
      "timeslot_uuid": "267b2d70-48d9-11e8-a5e5-263fa1a58213",
      "product_uuid": "0bd09a60-1d8f-11e9-bf75-06ecf2a1ba22",
      "resource_uuid": "636627f0-006c-11ec-a5c8-02e4d9518b64",
      "product_name": "Video Call 30",
      "resource_name": "2nd Level Support",
      "contact_channel": {
        "type": "location",
        "value": "Telefon und Bildschirmfreigabe (wir rufen Sie an)"
      },
      "capacity": 5,
      "capacity_left": 3,
      "products": [
        { "uuid": "0bd09a60-1d8f-11e9-bf75-06ecf2a1ba22", "name": "Video Call 30" }
      ],
      "kind": "models.LotAppointment"
    }
  ],
  "public_visible": true
}

Types de Bookable

kindSignificationParticularité
models.BookableCréneau issu d'une disponibilité (timeslot)Devient un LotAppointment lors de la première réservation. Utilisez timeslot_uuid pour reserve/create
models.LotAppointmentRendez-vous en groupe existant avec capacité restanteRendez-vous déjà créé. Utilisez appointment_uuid pour reserve/create

Bookable vs LotAppointment

Un models.Bookable est un créneau potentiel issu d'une disponibilité. Dès que le premier consommateur réserve, il devient un models.LotAppointment avec un nouveau appointment_uuid. Pour les réservations suivantes du même créneau, vous devez utiliser ce nouvel UUID !

Champs de la réponse

ChampTypeDescription
start / endstringHorodatage ISO 8601 avec fuseau horaire
formattedStart / formattedEndstringHeure formatée selon timeFormat
timeslot_uuidstringUUID de la disponibilité sous-jacente
appointment_uuidstring?UUID du rendez-vous (uniquement pour LotAppointment)
product_uuidstring?UUID du produit, ou null
resource_uuidstringUUID de la ressource
capacitynumberCapacité totale du créneau
capacity_leftnumberPlaces restantes
contact_channelobject?Canal de contact avec type et value
productsarrayListe des produits disponibles pour ce créneau
kindstringmodels.Bookable ou models.LotAppointment

Codes de statut

CodeSignification
200Succès, bookables retournés
204Aucun bookable disponible (réponse vide)

2. Réserver un rendez-vous

Réserve temporairement un rendez-vous pendant 3 minutes. Pendant ce délai, le créneau ne peut être réservé que par le client à l'origine de la réservation. Cela évite les doubles réservations pendant la saisie du formulaire.

Endpoint
POST /rest/1/resources/{ref}/reserve_appointment

Toujours appeler avant de réserver

Appelez toujours cet endpoint avant d'utiliser create_appointment_with_consumer ! Même après l'expiration des 3 minutes, vous pouvez encore finaliser la réservation - mais si un autre client a été plus rapide, elle échouera.

Paramètres de requête

ParamètreTypeObligatoireDescription
refstringNonRéférence de ressource ou de canal
channelKeystringNonCanal de réservation. Par défaut : RESOURCE_PUBLIC

Request Body

ChampTypeObligatoireDescription
timeslot_uuidstringConditionnel*UUID du timeslot (disponibilité). À utiliser pour models.Bookable. Applique les paramètres par défaut de la disponibilité au nouveau rendez-vous
appointment_uuidstringConditionnel*UUID du rendez-vous existant. Obligatoire pour models.LotAppointment
product_uuidstringOuiUUID du produit à réserver
fromstringOuiHeure de début du bookable (ISO 8601, UTC)
tostringOuiHeure de fin du bookable (ISO 8601, UTC)

* Pour models.Bookable, envoyez timeslot_uuid. Pour models.LotAppointment, appointment_uuid est obligatoire.

Request

Réserver un rendez-vous
curl -X POST "https://www.timum.de/rest/1/resources/my-resource@myPlatform/reserve_appointment" \
  -H "Content-Type: application/json" \
  -d '{
    "timeslot_uuid": "6cb6df60-48d8-11e8-a5e5-263fa1a58213",
    "product_uuid": "7fc85970-a2d0-11e2-9cd0-1231430706c1",
    "from": "2025-01-15T13:00:00Z",
    "to": "2025-01-15T13:30:00Z"
  }'

Response

Response (200 OK)
{
  "api-info": { "version": "1" },
  "participation": {
    "uuid": "a48dcf00-483c-11f0-b6e3-72fe2304273f",
    "appointment_uuid": "a48d0bb0-483c-11f0-b6e3-72fe2304273f",
    "timeslot_uuid": "a48e6b40-483c-11f0-b6e3-72fe2304273f",
    "resource_uuid": "636627f0-006c-11ec-a5c8-02e4d9518b64",
    "product_uuid": "0bd09a60-1d8f-11e9-bf75-06ecf2a1ba22",
    "from": "2025-06-16T12:25:00Z",
    "to": "2025-06-16T12:55:00Z",
    "appointment_capacity": 1,
    "appointment_capacity_left": 0,
    "customer_uuid": "a48df610-483c-11f0-b6e3-72fe2304273f",
    "customer_mobile": null,
    "customer_fullName": null,
    "customer_email": null,
    "customer_note": null,
    "state": "RESERVED",
    "formatedAddress": "Telefon und Bildschirmfreigabe (wir rufen Sie an)",
    "messages": []
  },
  "appointments": [
    {
      "uuid": "a48d0bb0-483c-11f0-b6e3-72fe2304273f",
      "kind": "models.LotAppointment",
      "product_id": "0bd09a60-1d8f-11e9-bf75-06ecf2a1ba22",
      "product_name": "Video Call 30",
      "resource_id": "636627f0-006c-11ec-a5c8-02e4d9518b64",
      "from": "2025-06-16T12:25:00Z",
      "to": "2025-06-16T12:55:00Z",
      "state": "ACTIVE",
      "capacity": 1,
      "capacity_left": 0,
      "customers": [
        {
          "customer_placeholder_id": "a48df610-483c-11f0-b6e3-72fe2304273f",
          "customer_uuid": "a48df610-483c-11f0-b6e3-72fe2304273f",
          "participationState": "RESERVED",
          "participation_id": "a48dcf00-483c-11f0-b6e3-72fe2304273f"
        }
      ]
    }
  ]
}

Enregistrer customer_uuid

Enregistrez participation.customer_uuid à partir de la réponse ! Vous aurez besoin de cette valeur comme placeholder_id pour l'appel à create_appointment_with_consumer.

Comportement de la réservation

  • La réservation est valable pendant 3 minutes
  • Le state est RESERVED
  • Une fois le délai expiré, la réservation est automatiquement supprimée
  • capacity_left est réduit pendant la réservation
  • Vous pouvez encore réserver après le délai - mais sans protection contre les doubles réservations

3. Finaliser la réservation

Finalise la réservation avec les données du consommateur. Si un utilisateur existe déjà avec l'email ou le numéro de téléphone indiqué, le rendez-vous est rattaché à ce compte. Sinon, un nouveau compte est créé.

Endpoint
POST /resources/{ref}/create_appointment_with_consumer

Paramètres de requête

ParamètreTypeObligatoireDescription
timeFormatstringNonFormat des indications de temps dans la réponse

Request Body

ChampTypeObligatoireDescription
startstringOuiHeure de début (ISO 8601)
endstringOuiHeure de fin (ISO 8601)
timeslot_uuidstringOuiUUID du timeslot ou du rendez-vous
product_uuidstringNonUUID du produit
placeholder_idstringNon*participation.customer_uuid issu de la réponse de réservation. Identifie la réservation
emailstringOuiEmail du consommateur
firstnamestringOuiPrénom du consommateur
lastnamestringOuiNom du consommateur
mobilestringNonNuméro de mobile du consommateur
messagestringNonMessage facultatif (max. 1024 caractères)
localestringNonCode de langue (par ex. de, en). Détermine la langue des emails transactionnels
channelKeystringNonCanal de réservation. Par défaut : RESOURCE_PUBLIC

* placeholder_id est techniquement facultatif, mais vous devriez toujours l'envoyer pour garantir que la réservation de votre utilisateur est utilisée.

Request

Finaliser la réservation
curl -X POST "https://www.timum.de/resources/my-resource@myPlatform/create_appointment_with_consumer" \
  -H "Content-Type: application/json" \
  -d '{
    "start": "2025-01-15T13:00:00Z",
    "end": "2025-01-15T13:30:00Z",
    "timeslot_uuid": "6cb6df60-48d8-11e8-a5e5-263fa1a58213",
    "product_uuid": "7fc85970-a2d0-11e2-9cd0-1231430706c1",
    "placeholder_id": "a48df610-483c-11f0-b6e3-72fe2304273f",
    "channelKey": "RESOURCE_PUBLIC",
    "email": "max@example.com",
    "firstname": "Max",
    "lastname": "Mustermann",
    "mobile": "0173 1234567",
    "locale": "de",
    "message": "Ich freue mich auf den Termin."
  }'

Response (Succès)

Response (201 Created)
{
  "api-info": { "version": "1" },
  "createdAppointment": {
    "appointment_uuid": "864b80c0-483f-11f0-b6e3-72fe2304273f",
    "start": "2025-06-17T11:05:00+02:00",
    "end": "2025-06-17T12:05:00+02:00",
    "timeslot_uuid": "864c4410-483f-11f0-b6e3-72fe2304273f",
    "product_uuid": "0bd09a60-1d8f-11e9-bf75-06ecf2a1ba22",
    "resource_uuid": "636627f0-006c-11ec-a5c8-02e4d9518b64",
    "contact_channel": {
      "type": "location",
      "value": "Telefon und Bildschirmfreigabe (wir rufen Sie an)"
    },
    "product_name": "Video Call 30",
    "resource_name": "2nd Level Support",
    "capacity": 1,
    "capacity_left": 0,
    "products": [
      { "uuid": "0bd09a60-1d8f-11e9-bf75-06ecf2a1ba22", "name": "Video Call 30" }
    ],
    "kind": "models.LotAppointment",
    "cancelLink": "https://www.timum.de/rebook/6366c430-006c-11ec-a5c8-02e4d9518b64?..."
  }
}

cancelLink

La réponse contient un cancelLink. Ce lien signé permet au consommateur d'annuler son rendez-vous de manière autonome. Vous pouvez utiliser ce lien dans votre email de confirmation.

Response (Erreur)

Response (412 Precondition Failed)
{
  "api-info": { "version": "1" },
  "errors": [
    {
      "errorCode": "201",
      "message": "Das überlappt mit einem anderen Termin."
    }
  ]
}

Détails de l'algorithme

  • Si un utilisateur existe déjà avec l'email ou le numéro de mobile, le rendez-vous est rattaché à ce compte
  • Les attributs manquants (firstname, lastname, mobile) sont complétés chez l'utilisateur existant, mais jamais écrasés
  • La langue du nouvel utilisateur est reprise de l'acteur CRM (ou via le paramètre locale)
  • Pour les rendez-vous en groupe : la première réservation crée le rendez-vous, les suivantes augmentent le nombre de participants

Codes de statut

CodeSignification
201Rendez-vous créé avec succès
400Champ obligatoire manquant ou invalide
412Créneau déjà réservé (errorCode 201)

Dépannage

ProblèmeCauseSolution
"Das überlappt mit einem anderen Termin" (errorCode 201)Créneau d'une disponibilité déjà réservé. La première réservation génère un nouveau rendez-vous avec un nouvel UUIDUtilisez le nouveau timeslot_uuid issu de la première réponse de réservation pour les réservations suivantes
"Email manquant" alors qu'il est présent dans le bodyProblème de redirection dû à l'absence de www.Assurez-vous d'utiliser https://www.timum.de (avec www.)
Redirection 301 sans réponsewww. manquant dans l'URLUtilisez toujours https://www.timum.de
AppointmentAlreadyBookedExceptionLe consommateur participe déjà à ce rendez-vousUn utilisateur ne peut pas participer deux fois au même rendez-vous. Vérifiez l'absence de doublons

4. Récupérer les produits actifs

Récupère tous les produits actifs/activés d'une ressource. La liste de résultats peut être filtrée selon les paramètres de canal.

Endpoint
POST /products/active_products

Paramètres de requête

ParamètreTypeObligatoireDescription
refstringConditionnel*Référence de ressource ou de canal. Peut être spécifié plusieurs fois
tslRefsstringConditionnel*Référence de rendez-vous ou de disponibilité. Peut être spécifié plusieurs fois
channelKeystringNonCanal de réservation. Par défaut : RESOURCE_PUBLIC

* Au moins ref ou tslRefs doit être spécifié.

Request

Récupérer les produits
curl -X POST "https://www.timum.de/products/active_products?ref=my-resource@myPlatform&channelKey=RESOURCE_PUBLIC"

Response

Response (200 OK)
{
  "products": [
    {
      "uuid": "92867f70-4836-11e5-bc04-021a52c25043",
      "name": "Besichtigung",
      "description": "",
      "minDuration": 30,
      "maxDuration": 45,
      "leadTimeMinutes": 0,
      "followUpTimeMinutes": 20,
      "exclusive": false
    },
    {
      "uuid": "0bb978c0-5740-11eb-8b95-024759471364",
      "name": "Beratungsgespräch",
      "description": "Ausführliches Beratungsgespräch",
      "minDuration": 60,
      "maxDuration": 90,
      "leadTimeMinutes": null,
      "followUpTimeMinutes": null,
      "exclusive": true
    }
  ]
}

Champs de la réponse

ChampTypeDescription
uuidstringID unique du produit
namestringNom d'affichage du produit
descriptionstringDescription du produit (pour les notes clients)
minDurationnumber?Durée minimale en minutes
maxDurationnumber?Durée maximale en minutes
leadTimeMinutesnumber?Délai en amont (trajet/préparation) en minutes
followUpTimeMinutesnumber?Délai en aval (retour/clôture) en minutes
exclusivebooleanIndique si le produit est exclusif (uniquement pour certains canaux)

5. Récupérer les données publiques

Récupère des informations publiques sur le provider, la ressource, les paramètres de canal et la personne de contact. Utile pour l'affichage des widgets de réservation.

Endpoint
POST /resources/public_data

Paramètres de requête

ParamètreTypeObligatoireDescription
refstringConditionnel*Référence de ressource ou de canal. Peut être spécifié plusieurs fois
tslRefsstringConditionnel*Référence de rendez-vous ou de disponibilité. Peut être spécifié plusieurs fois
channelKeystringNonCanal de réservation. Par défaut : RESOURCE_PUBLIC

* Au moins ref ou tslRefs doit être spécifié.

Request

Récupérer les données publiques
curl -X POST "https://www.timum.de/resources/public_data?ref=my-resource@myPlatform&channelKey=RESOURCE_PUBLIC"

Response

Response (200 OK)
{
  "contact": {
    "name": "Max Makler",
    "email": "kontakt@example.de",
    "mobile": "0173 1234567",
    "phone": "030 12345678"
  },
  "resource": {
    "uuid": "636627f0-006c-11ec-a5c8-02e4d9518b64",
    "name": "Musterstraße 1",
    "description": "Schöne 3-Zimmer-Wohnung mit Balkon",
    "contactChannelType": "",
    "msgHelpText": "",
    "url": "https://example.com/expose/123",
    "imgUrl": "https://cdn.example.com/images/123.jpg"
  },
  "provider": {
    "name": "Mustermakler GmbH",
    "description": "Ihr Partner für Immobilien in Berlin",
    "isThemingAllowed": true,
    "isLocalisationAllowed": true,
    "areCustomFieldsAllowed": true
  },
  "channel": {
    "bookingProcess": "IMMEDIATE"
  }
}

Structure de la réponse

contact

ChampDescription
nameNom de la personne de contact (issu du contact profile)
emailAdresse email publique
mobileNuméro de mobile
phoneNuméro de ligne fixe

resource

ChampDescription
uuidID unique de la ressource
nameNom public de la ressource
descriptionDescription de la ressource
urlURL externe (par ex. lien vers l'annonce immobilière)
imgUrlURL de l'image de la ressource

provider

ChampDescription
nameNom du calendrier/de l'entreprise
descriptionDescription du provider
isThemingAllowedIndique si le theming personnalisé est autorisé
isLocalisationAllowedIndique si la localisation personnalisée est autorisée
areCustomFieldsAllowedIndique si les champs personnalisés sont autorisés

channel

ChampDescription
bookingProcessIMMEDIATE = réservation directe, REQUESTED = demande de rendez-vous

6. Preflight CORS

Les navigateurs envoient automatiquement des requêtes OPTIONS avant les requêtes cross-origin. timum y répond automatiquement pour tous les endpoints de réservation consommateur.

Endpoint
OPTIONS /resources/{ref}/upcoming_bookables

Response Headers

CORS Response Headers
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Auth-Token
Access-Control-Max-Age: 36

Support CORS automatique

Les requêtes cross-origin depuis n'importe quelle origine sont acceptées. Vous n'avez rien de particulier à configurer. Les navigateurs exécutent automatiquement ces requêtes preflight.

Channel Keys

timum prend en charge 4 canaux de réservation différents. Chaque canal dispose de ses propres paramètres pour la visibilité, le processus de réservation et le filtrage des produits.

channelKeyNom (UI)Utilisation
RESOURCE_PUBLICLien de réservation publicCanal par défaut. Peut être publié publiquement
RESOURCE_EXCLUSIVEAccès de réservation exclusifPour les clients acceptés (carnet d'adresses)
RESOURCE_REFERENCECalendrier de réservation intégréPour les embeds générés automatiquement (par ex. portails immobiliers)
CALENDAR_PUBLICPlugin de site web & calendrier globalPour les plugins de site web avec toutes les ressources

Les paramètres de canal peuvent être configurés dans le frontend timum sous Ressource → Activer la réservation de rendez-vous.

Processus de réservation

ProcessusDescription
IMMEDIATERéservation directe. Le rendez-vous est confirmé immédiatement. Le consommateur reçoit une confirmation, le provider reçoit une notification
REQUESTEDDemande de rendez-vous. Le rendez-vous doit être confirmé par le provider. Le consommateur reçoit "Demande reçue", le provider reçoit la demande à confirmer

Flux de réservation complet

Voici le déroulement complet pour la réservation d'un rendez-vous :

Étape 1 : Charger les bookables

curl "https://www.timum.de/resources/immobilie-123@is24/upcoming_bookables?groupFormat=yyyy-MM-dd&prdRef=besichtigung-30min@is24"

Étape 2 : Réserver le créneau

curl -X POST "https://www.timum.de/rest/1/resources/immobilie-123@is24/reserve_appointment" \
  -H "Content-Type: application/json" \
  -d '{
    "timeslot_uuid": "6cb6df60-48d8-11e8-a5e5-263fa1a58213",
    "product_uuid": "7fc85970-a2d0-11e2-9cd0-1231430706c1",
    "from": "2025-01-15T14:00:00Z",
    "to": "2025-01-15T14:30:00Z"
  }'

# La réponse contient participation.customer_uuid -> à conserver !

Étape 3 : Finaliser la réservation

curl -X POST "https://www.timum.de/resources/immobilie-123@is24/create_appointment_with_consumer" \
  -H "Content-Type: application/json" \
  -d '{
    "start": "2025-01-15T14:00:00Z",
    "end": "2025-01-15T14:30:00Z",
    "timeslot_uuid": "6cb6df60-48d8-11e8-a5e5-263fa1a58213",
    "product_uuid": "7fc85970-a2d0-11e2-9cd0-1231430706c1",
    "placeholder_id": "a48df610-483c-11f0-b6e3-72fe2304273f",
    "email": "interessent@example.com",
    "firstname": "Max",
    "lastname": "Interessent",
    "mobile": "0173 9876543",
    "locale": "de"
  }'

Sujets connexes