Ajouter un service à une proposition

  • Service de proposition
  • Services
  • 4 routes
Comment ajouter un service à une proposition existante ?

Ce scénario montre comment identifier les services additionnels disponibles, relire les services déjà associés à une proposition puis mettre à jour la liste des services retenus.

Vue d'ensemble

La séquence POST/v0/proposals/search/best -> GET/v0/additional_services -> GET/v0/proposals/{proposal_id}/services -> PUT/v0/proposals/{proposal_id}/services permet d'identifier les services additionnels disponibles, de relire les services déjà présents, puis de remplacer la liste finale à conserver sur la proposition.

Prérequis

  • Une proposition exploitable doit être créée ou retrouvée au début du parcours.
  • Le proposal_id retourné par la première étape est requis pour relire puis mettre à jour les services.
  • La mise à jour finale fonctionne en logique cancel & replace : chaque appel doit porter l'ensemble complet des services à conserver.
  • Les appels documentés utilisent accept-language et x-api-key.

Process workflow

Legend:
Obligatoire
Optionnel
1

Créer ou retrouver la proposition

Obligatoire

Utilisez POST/v1/proposals/search/best pour créer ou retrouver la proposition de travail qui recevra ensuite des services additionnels.

Prerequis

  • Envoyez accept-language et x-api-key.
  • Le body doit porter les critères de réservation utilisés dans votre parcours de vente.
  • Conservez l'id retourné pour le réutiliser comme proposal_id dans les étapes suivantes.

Calling CURL

curl -X 'POST' \
  'https://api.clubmed.com/v1/proposals/search/best' \
  -H 'accept: application/json' \
  -H 'accept-language: fr-FR' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "product_id": "MPAC",
    "package_id": "PAI",
    "resort_arrival_date": "20260415",
    "duration": 7,
    "number_attendees": 2
  }'

Example answer

{
  "id": "123456",
  "product_id": "MPAC",
  "package_id": "PAI",
  "resort_arrival_date": "20260415",
  "resort_departure_date": "20260422",
  "creation_date_time": "2026-04-03T10:15:00Z",
  "price": {
    "amount": 9815.4,
    "currency": "EUR"
  },
  "alternative_price": {
    "amount": 9650.4,
    "currency": "EUR"
  },
  "option_durability": {
    "expiration_date_time": "2026-04-03T18:00:00Z",
    "is_reliable": true
  }
}

info: la route search/best retourne la meilleure proposition exploitable dans le contexte fourni, ce qui évite de parcourir une liste complète quand le parcours doit aller vite.


Codes de reponse

  • OK Response (200): retourne la proposition créée ou retrouvée avec l'identifiant à réutiliser downstream.
  • Error (400): critères invalides, incomplets ou incohérents avec les règles de proposition.
  • Error (401): l'authentification ou la clé API est absente, invalide ou expirée.
  • Error (403): au moins un client inclus dans les critères n'est pas autorisé à poursuivre le parcours.
  • Error (404): le produit demandé est inconnu pour le contexte envoyé.
POST/v1/proposals/search/best
Voir plus
2

Lister les services additionnels disponibles

Obligatoire

Cette route retourne la liste des services additionnels disponibles pour une proposition ou un booking donné. Utilisez-la pour identifier les services réellement vendables avant de construire la liste finale à envoyer sur la proposition.

Prerequis

  • accept-language et x-api-key sont requis.
  • Fournissez au moins un contexte métier comme proposal_id, booking_id ou customer_id selon votre parcours.
  • Les filtres types et filter permettent de restreindre la recherche aux services utiles.

Calling CURL

curl -X 'GET' \
  'https://api.clubmed.com/v0/additional_services?proposal_id=123456&types=CHILDCARE' \
  -H 'accept: application/json' \
  -H 'accept-language: fr-FR' \
  -H 'x-api-key: YOUR_API_KEY'

Example answer

[
  {
    "id": "VMOSK1",
    "product_information_id": "ACT_AGAC_baby_club_med_bis",
    "stay_index": 1,
    "time_slot": "MORNING",
    "age_in_months": {
      "min": 12,
      "max": 48
    },
    "not_compatible_with": [
      "string"
    ],
    "sold_only_with": [
      "string"
    ],
    "type": "CHILDCARE",
    "currency": "EUR",
    "schedules": [
      {
        "start_date": "20100430",
        "end_date": "20100430",
        "initial_stock": 12,
        "remaining_stock": 2,
        "attendees": [
          {
            "id": "A",
            "price": 88,
            "resort_price": 100
          }
        ]
      }
    ]
  }
]

info: utilisez les contraintes sold_only_with et not_compatible_with avant toute mise à jour, sinon la route finale de remplacement peut être rejetée.


Codes de reponse

  • OK Response (200): la liste des services additionnels disponibles a été retournée avec succès.
  • OK Response (206): la réponse est partielle.
  • Error (400): le contexte de proposition ou de booking est invalide, non validé, ou incohérent avec le client transmis.
  • Error (401): la requête est non autorisée car les éléments d'authentification ou la clé API sont absents, invalides ou expirés.
  • Error (403): l'accès est interdit pour le pays ciblé ou l'authentification attendue manque pour certains usages avec booking_id et customer_id.
  • Error (404): la proposition ou le booking n'a pas été trouvé pour le contexte fourni.
  • Error (409): les critères de proposition ne sont plus valides au moment de la lecture.
  • Error (416): la plage ou le filtre demandé n'est pas satisfaisable.
GET/v0/additional_services
Voir plus
3

Relire les services actuels de la proposition

Obligatoire

Cette route relit les services déjà présents sur la proposition. Utilisez cette réponse comme source de vérité avant la mise à jour finale, car l'appel de modification remplace la liste existante.

Prerequis

  • x-api-key est requis.
  • Le paramètre de path proposal_id est requis.
  • Le filtre optionnel filter permet de restreindre la lecture à certains services.

Calling CURL

curl -X 'GET' \
  'https://api.clubmed.com/v0/proposals/123456/services' \
  -H 'accept: application/json' \
  -H 'x-api-key: YOUR_API_KEY'

Example answer

[
  {
    "id": "AHSI01",
    "time_slot": "MORNING",
    "type": "RENTAL",
    "currency": "EUR",
    "schedules": [
      {
        "start_date": "20100430",
        "end_date": "20100430",
        "attendees": [
          {
            "id": "A",
            "price": 250,
            "price_without_discount": 300,
            "discounts": [
              {
                "amount": 50,
                "offer_id": "AVA",
                "code": "PARFIL"
              }
            ]
          }
        ]
      }
    ],
    "product_information_id": "ACT_AGAC_baby_club_med_bis",
    "sold_only_with": [
      "ATIG3A"
    ],
    "not_compatible_with": [
      "ATIG3A"
    ]
  }
]

info: partez de cette lecture pour reconstruire la liste complète à conserver, sinon certains services déjà présents risquent d'être supprimés lors du PUT.


Codes de reponse

  • OK Response (200): les services actuellement associés à la proposition ont été retournés avec succès.
  • Error (400): la requête est invalide ou le filtre transmis n'est pas exploitable.
  • Error (401): non documenté dans le Swagger.
  • Error (404): non documenté dans le Swagger.
GET/v0/proposals/{proposal_id}/services
Voir plus
4

Remplacer la liste des services de la proposition

Obligatoire

Cette route met à jour la liste des services associés à une proposition. La logique est de type cancel & replace : chaque appel doit contenir l'ensemble complet des services qui doivent rester attachés à la proposition après la mise à jour.

Prerequis

  • accept-language et x-api-key sont requis.
  • Le paramètre de path proposal_id est requis.
  • Construisez le payload final à partir de la recherche des services disponibles et de la relecture des services déjà présents.
  • Vérifiez les contraintes d'incompatibilité et de dépendance avant l'envoi.

Calling CURL

curl -X 'PUT' \
  'https://api.clubmed.com/v0/proposals/123456/services' \
  -H 'accept: application/json' \
  -H 'accept-language: fr-FR' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '@proposal-services-body.json'

Example answer

Aucun corps de réponse n'est documenté en cas de succès. Le Swagger documente une réponse 204 No Content.

info: après ce PUT, relancez GET/v0/proposals/{proposal_id}/services pour vérifier la liste réellement conservée sur la proposition.


Codes de reponse

  • OK Response (204): la liste des services a été mise à jour avec succès sans corps de réponse.
  • Error (400): le payload est invalide, contient des services incompatibles, ou oublie un service requis.
  • Error (401): la requête est non autorisée car les éléments d'authentification ou la clé API sont absents, invalides ou expirés.
  • Error (404): la proposition ciblée est introuvable.
  • Error (409): le contrôle économique de la proposition n'est plus valide au moment de la mise à jour.
PUT/v0/proposals/{proposal_id}/services
Voir plus