---
uuid: 10d3a9a4-4e2d-4464-bb38-71312e325e61
date_created: 2025-10-09T08:29:01.391Z
date_updated: 2026-04-07T09:48:40.789Z
seo_url: add-external-services-to-proposal
category: Services
tags: 
  - Proposal service
routes: 
  - POST /v3/proposals/search
  - GET /v0/additional_services
  - GET /v0/products/{product_id}/external_services
---

# Add external services to a proposal

This scenario explains how to create a proposal, retrieve the related additional services, and then read the external-service details available for the targeted product. It fits proposal-enrichment journeys before booking.

The flow starts with proposal creation and then reuses returned identifiers to expose services such as parking or concierge.

## Flow

```mermaid
flowchart LR
    step0["Create the proposal"]
    step1["Retrieve additional services"]
    step2["Retrieve external service details"]
    step0 --> step1
    step1 --> step2
```

## Overview

This scenario helps an application enrich a proposal with external services before the booking journey continues.

## Prerequisites

* The booking criteria required to create a proposal.
* A `proposal_id` and then a `product_id` returned during the flow.
* A valid `x-api-key` and, depending on the channel, an appropriate authorization context.

## Expected result

The application can display the available external services, expose their business information, and prepare their addition to the proposal.

## 1 - Create the proposal

Use `POST /v3/proposals/search` to create the initial proposal that will be enriched with external services.

#### Prerequisites

* A valid `accept-language` header and `x-api-key`.
* The booking criteria required by the route, such as `product_id`, `resort_arrival_date`, `duration`, and `number_attendees`.
* A consistent locale that will also be reused in the following steps.

#### Calling CURL

```bash
curl -X 'POST' \
  'https://api.clubmed.com/v3/proposals/search' \
  -H 'accept: application/json' \
  -H 'accept-language: en-US' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "product_id": "MPAC",
    "resort_arrival_date": "20260415",
    "duration": 7,
    "number_attendees": 2
  }'
```

#### Example answer

```json
[
  {
    "id": "123456",
    "product_id": "MPAC",
    "package_id": "AI",
    "price": {
      "total": 9815.4,
      "currency": "EUR"
    },
    "is_bookable": false
  }
]
```

> **info:** Keep the returned `proposal_id` and reuse the same locale in the service-related steps that follow.

***

**Response codes**

* **OK Response (200):** returns one or more priced proposals matching the submitted criteria.
* **Error (400):** the criteria, attendee setup, or JSON payload are invalid.
* **Error (401):** authentication is missing, invalid, or expired.
* **Error (404):** the requested product is unknown.
* **Error (409):** the proposal criteria are no longer valid.

**Related route**: [POST https://api.clubmed.com//v3/proposals/search](https://api.clubmed.com/doc?search=POST%20%2Fv3%2Fproposals%2Fsearch)

## 2 - Retrieve additional services

Use `GET /v0/additional_services` to list the additional services available before focusing on the product's external services.

#### Prerequisites

* Have a valid `proposal_id`.
* Send `accept-language` and `x-api-key`.
* Add filters when you need to narrow the returned list.

#### Calling CURL

```bash
curl -X 'GET' \
  'https://api.clubmed.com/v0/additional_services?proposal_id=123456' \
  -H 'accept: application/json' \
  -H 'accept-language: en-US' \
  -H 'x-api-key: YOUR_API_KEY'
```

#### Example answer

```json
[
  {
    "id": "VMOSK1",
    "type": "CHILDCARE",
    "currency": "EUR",
    "schedules": [
      {
        "start_date": "20100430",
        "end_date": "20100430",
        "attendees": [
          {
            "id": "A",
            "price": 88
          }
        ]
      }
    ]
  }
]
```

> **info:** This step mainly confirms that the proposal can still receive services before you query the product's external catalog.

***

**Response codes**

* **OK Response (200):** returns the additional services available for the proposal.
* **Error (400):** the proposal context or filters are invalid.
* **Error (401):** authentication is missing, invalid, or expired.
* **Error (404):** the proposal was not found in the submitted context.
* **Error (409):** the proposal criteria are no longer valid.

**Related route**: [GET https://api.clubmed.com//v0/additional\_services](https://api.clubmed.com/doc?search=GET%20%2Fv0%2Fadditional_services)

## 3 - Retrieve external service details

Use `GET /v0/products/{product_id}/external_services` to retrieve the external services exposed by the product, such as concierge or partner-provided services.

#### Prerequisites

* Have a valid `product_id`.
* Send `accept-language` and `x-api-key`.
* Add a `filter` only if you need to restrict the returned list.

#### Calling CURL

```bash
curl -X 'GET' \
  'https://api.clubmed.com/v0/products/MPAC/external_services' \
  -H 'accept: application/json' \
  -H 'accept-language: en-US' \
  -H 'x-api-key: YOUR_API_KEY'
```

#### Example answer

```json
[
  {
    "id": "CHAMP285",
    "type": "CONCIERGERIE",
    "subtype": "BABY_SKI_LESSON",
    "title": "Champagne bottle",
    "description": "Bouteille de champagne de qualite superieur",
    "image": "https://ns.clubmed.com/fbs/test.jpg"
  }
]
```

> **info:** Reuse `id`, `type`, and `subtype` to expose only the external services that are relevant in your UI.

***

**Response codes**

* **OK Response (200):** returns the external services available for the product.
* **Error (400):** the request or filters are invalid.
* **Error (401):** non documented in Swagger.
* **Error (404):** non documented in Swagger.

**Related route**: [GET https://api.clubmed.com//v0/products/{product\_id}/external\_services](https://api.clubmed.com/doc?search=GET%20%2Fv0%2Fproducts%2F%7Bproduct_id%7D%2Fexternal_services)
