---
uuid: 8b0ae43d-15d4-4605-806e-d30db5bceb87
date_created: 2025-10-17T15:24:26.037Z
date_updated: 2026-04-03T16:26:42.233Z
seo_url: cruise-proposal-cabin-selection
category: Booking
tags: 
  - Booking
routes: 
  - GET /v2/products
  - POST /v1/proposals/search/best
  - GET /v0/proposals/{proposal_id}/available_rooms
  - POST /v1/accommodations_arrangement/check
  - PUT /v1/proposals/{proposal_id}/accommodations_arrangement
---

# Cruises: select a cabin in a proposal

This scenario explains how to identify open cruise products, create a proposal, list the available cabins, optionally validate the arrangement, and apply the selected cabin.

It is specific to cruises, where the customer can choose a physical cabin instead of only selecting a room code.

## Flow

```mermaid
flowchart LR
    step0["List available cruises"]
    step1["Create the cruise proposal"]
    step2["List available cabins"]
    step3["Check the cabin assignment"]
    step4["Apply the cabin selection"]
    step0 --> step1
    step1 --> step2
    step2 --> step3
    step3 --> step4
    classDef optional fill:transparent,stroke:#ffffff,color:#ffffff,stroke-width:1px,stroke-dasharray: 6\,4
    class step0 optional
    class step3 optional
```

## Overview

Cruise journeys differ from standard resort journeys because the customer can select a physical cabin. This scenario covers the end-to-end flow from cruise discovery to final cabin assignment.

## Prerequisites

* Identify a cruise product that is open to sale.
* Keep the `product_id` and then the `proposal_id` returned by the previous steps.
* If you change the original room code, validate the arrangement before applying it.

## 1 - List available cruises

Use `GET /v2/products` to list available cruises.

#### Prerequisites

Prepare the parameters required by the call. Keep `x-api-key` and, when the route is customer-scoped, a valid bearer token.

#### Calling CURL

```bash
curl -X GET \
  -H "x-api-key: YOUR_API_KEY" \
  -H "accept-language: en-US" \
  "https://api.clubmed.com/v2/products?limit=20&page=1"
```

#### Example answer

```json
[
  {
    "id": "product-1",
    "label": "Club Med Valmorel",
    "country_code": "FR",
    "type": "RESORT"
  }
]
```

> **info:** Sélectionnez le `product_id` de la croisière voulue pour créer ensuite la proposition et charger les cabines disponibles.

***

**Response codes**

* `200 OK`: the expected data is returned.
* `400 Bad Request`: the request is invalid or incomplete.
* `404 Not Found`: the requested resource cannot be found.

**Related route**: [GET https://api.clubmed.com//v2/products](https://api.clubmed.com/doc?search=GET%20%2Fv2%2Fproducts)

## 2 - Create the cruise proposal

Use `POST /v1/proposals/search/best` to create the initial cruise proposal before selecting a cabin.

#### Prerequisites

Prepare the parameters required by the call. Keep `x-api-key` and, when the route is customer-scoped, a valid bearer token. Validate the request body before the call to avoid a validation error.

#### Calling CURL

```bash
curl -X POST \
  -H "x-api-key: YOUR_API_KEY" \
  -H "accept-language: en-US" \
  -H "Content-Type: application/json" \
  -d '{"product_id": "product-1", "start_date": "2026-07-05", "end_date": "2026-07-12", "attendees": [{"birthdate": "1990-03-12"}]}' \
  "https://api.clubmed.com/v1/proposals/search/best"
```

#### Example answer

```json
{
  "id": "proposal-1",
  "product_id": "product-1",
  "price": {
    "amount": 2890,
    "currency": "EUR"
  },
  "option_available": true
}
```

> **info:** Keep the returned `proposal_id` to load available cabins and then apply the cabin selection to the proposal.

***

**Response codes**

* `200 OK`: the operation succeeds and the resource is returned.
* `400 Bad Request`: the body or parameters are invalid.
* `404 Not Found`: the target resource cannot be found.

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

## 3 - List available cabins

Use `GET /v0/proposals/{proposal_id}/available_rooms` to list the physical cabins that can still be assigned on the cruise proposal.

#### Prerequisites

Prepare `proposal_id`. Keep `x-api-key` and, when the route is customer-scoped, a valid bearer token.

#### Calling CURL

```bash
curl -X GET \
  -H "x-api-key: YOUR_API_KEY" \
  -H "accept-language: en-US" \
  "https://api.clubmed.com/v0/proposals/{proposal_id}/available_rooms"
```

#### Example answer

```json
[
  {
    "id": "cabin-1",
    "label": "Deluxe cabin",
    "occupancy": 2,
    "remaining_stock": 4
  }
]
```

> **info:** Compare cabin characteristics and remaining availability before you lock one physical cabin on the proposal.

***

**Response codes**

* `200 OK`: the expected data is returned.
* `400 Bad Request`: the request is invalid or incomplete.
* `404 Not Found`: the requested resource cannot be found.

**Related route**: [GET https://api.clubmed.com//v0/proposals/{proposal\_id}/available\_rooms](https://api.clubmed.com/doc?search=GET%20%2Fv0%2Fproposals%2F%7Bproposal_id%7D%2Favailable_rooms)

## 4 - Check the cabin assignment

Use `POST /v1/accommodations_arrangement/check` to validate the selected cabin assignment before applying it to the cruise proposal.

#### Prerequisites

Prepare the parameters required by the call. Keep `x-api-key` and, when the route is customer-scoped, a valid bearer token. Validate the request body before the call to avoid a validation error.

#### Calling CURL

```bash
curl -X POST \
  -H "x-api-key: YOUR_API_KEY" \
  -H "accept-language: en-US" \
  -H "Content-Type: application/json" \
  -d '[{"id": "room-1", "occupancy": 2, "attendees": [{"id": "attendee-1"}, {"id": "attendee-2"}]}]' \
  "https://api.clubmed.com/v1/accommodations_arrangement/check"
```

#### Example answer

```json
[
  {
    "id": "room-1",
    "remaining_stock": 3,
    "differential_prices": {
      "amount": 120,
      "currency": "EUR"
    }
  }
]
```

> **info:** Validate stock and price impact first, especially when several cabin candidates are still available.

***

**Response codes**

* `200 OK`: the operation succeeds and the resource is returned.
* `400 Bad Request`: the body or parameters are invalid.
* `404 Not Found`: the target resource cannot be found.

**Related route**: [POST https://api.clubmed.com//v1/accommodations\_arrangement/check](https://api.clubmed.com/doc?search=POST%20%2Fv1%2Faccommodations_arrangement%2Fcheck)

## 5 - Apply the cabin selection

Use the cabin-update route attached to this step to apply the selected physical cabin on the proposal once availability has been validated.

#### Prerequisites

Prepare `proposal_id`. Keep `x-api-key` and, when the route is customer-scoped, a valid bearer token. Validate the request body before the call to avoid a validation error.

#### Calling CURL

```bash
curl -X PUT \
  -H "x-api-key: YOUR_API_KEY" \
  -H "accept-language: en-US" \
  -H "Content-Type: application/json" \
  -d '[{"id": "room-1", "occupancy": 2, "attendees": [{"id": "attendee-1"}, {"id": "attendee-2"}]}]' \
  "https://api.clubmed.com/v1/proposals/{proposal_id}/accommodations_arrangement"
```

#### Example answer

```http
HTTP/1.1 204 No Content
```

> **info:** Success may be returned without a response body. Read the resource again afterwards if you need to display the final state.

***

**Response codes**

* `204 No Content`: the operation is applied successfully.
* `400 Bad Request`: the body or parameters are invalid.
* `404 Not Found`: the target resource cannot be found.

**Related route**: [PUT https://api.clubmed.com//v1/proposals/{proposal\_id}/accommodations\_arrangement](https://api.clubmed.com/doc?search=PUT%20%2Fv1%2Fproposals%2F%7Bproposal_id%7D%2Faccommodations_arrangement)
