swagger: '2.0'
host: 'localhost:8080'
basePath: /
schemes:
  - http
info:
  title: ClubMed Developers
  version: 0.1252.0
securityDefinitions:
  Bearer_go (connection as a Clubmed employee):
    type: oauth2
    authorizationUrl: 'http://mock:8088/authorize'
    logoutUrl: 'http://mock:8088/signout'
    flow: implicit
    scopes:
      iptv: access customer info during stay
      openid: required
      profile: your personal info
      email: access your email
      clubmed: access clubmed infos
      api_admin: access API administration routes
  Bearer_gm (connection as a customer):
    type: oauth2
    authorizationUrl: 'http://mock:8087/authorize'
    logoutUrl: 'http://mock:8087/signout'
    flow: implicit
    scopes:
      openid: required
      profile: your personal info
      email: access your email
      clubmed: access clubmed infos
tags: []
paths:
  /v1/products:
    get:
      summary: Provides the list of products with their key information
      operationId: getV1Products
      description: >-
        # Products

        ## Seasons

        Club Med have some mountain resort which are open during summer and
        winter.

        Those resort provide totally different services, therefore there is a
        WINTER product and SUMMER product.


        Example:

        * Punta Cana is a permanent resort, it has one product_id: PCAC

        * Chamonix is open during the winter and the summer, it has two
        product_id: CHAC_WINTER and CHAC_SUMMER.


        ## Prices

        The prices are the best prices available.


        ## Products Pagination

        The pagination is not activated by default.

        # Use of the Pagination

        ## Request

        You can require a paginated result with two optional parameters, to be
        passed in the query string:

        * **`limit`**: items per page. For example, if `limit=10`, any call
        result will contain an array of at most 10 items.

        * **`page`**: the page you want to reach. By default, `page=1` and you
        get the first items. If there are more than `limit` items, you may have
        to repeat the call for pages 2, 3, etc.


        Depending on the endpoint, pagination may be activated by default or
        not, with a default `limit` parameter.


        ## Response

        If the response is paginated, a specific HTTP status code will be sent:

        * Status Code = `206 Partial Content` 


        The response headers will contain metadata describing the result
        pagination:

        * Header **`Accept-Ranges`** : the type of the paginated items (example:
        products)

        * Header **`Content-Range`** : the range of paginated items for the
        current response, on format "first-last/total". Example: 0-9/256 =>
        items 0 to 9 over a total of 256  

        * Header **`Link`** : contains the links allowing to navigate to other
        pages of the same request, typed by the `rel` attribute: self, prev,
        next, first, last
            ```
            Link: <http://...?limit=10&page=2>; rel="self"
            Link: <http://...?limit=10&page=1>; rel="prev"
            Link: <http://...?limit=10&page=3>; rel="next"
            Link: <http://...?limit=10&page=1>; rel="first"
            Link: <http://...?limit=10&page=25>; rel="last"
            ```

        The client will have to iterate over the pages, sending the same request
        with an increased `page` parameter (or following the `next` Link), in
        order to fetch the complete result.

        The `Content-Range` header, or the lack of the `next` Link, indicates
        that the last page is reached.
      parameters:
        - type: string
          description: 'Language/Country. Ex: "en-US", "fr-FR", "ja-JP"...'
          name: accept-language
          in: header
          required: true
        - type: string
          description: Api_key provided by ClubMed API team
          name: api_key
          in: query
          required: false
        - type: array
          description: >-
            string composed of a field name (can be a path), a comparison
            operator (>, >=, <=, <, ==, !=) and a value. Logical operator AND
            applies between filters
          x-constraint:
            single: true
          items:
            type: string
            pattern: '/[A-Za-z0-9.[\]]+(>|>=|<=|<|==|!=).+/'
          collectionFormat: multi
          name: filter
          in: query
          required: false
        - type: integer
          description: Maximum rows count per page
          minimum: 1
          maximum: 200
          name: limit
          in: query
        - type: integer
          description: 'Requested page number, starting from 1 (default: 1)'
          minimum: 1
          name: page
          in: query
      tags:
        - product information
      responses:
        '200':
          description: >-
            List of products for a locale.<br> The prices are for the entire
            season
          schema:
            $ref: '#/definitions/product_list_v1'
            type: array
        '206':
          description: partial_content
        '403':
          description: forbidden
        '416':
          description: Requested range not satisfiable
        '500':
          description: internal_server_error
  '/v1/products/{product_id}':
    get:
      summary: Provides detailed information regarding a product
      operationId: getV1ProductsProduct_id
      description: The prices are the best prices available
      parameters:
        - type: string
          description: 'Language/Country. Ex: "en-US", "fr-FR", "ja-JP"...'
          name: accept-language
          in: header
          required: true
        - type: string
          description: a product_id from v1/products resource
          name: product_id
          in: path
          required: true
        - type: string
          description: Api_key provided by ClubMed API team
          name: api_key
          in: query
          required: false
      tags:
        - product information
      responses:
        '200':
          schema:
            $ref: '#/definitions/product_v1'
          description: Successful
        '403':
          description: forbidden
        '404':
          description: not_found
        '500':
          description: internal_server_error
definitions:
  product_category_v1:
    type: object
    properties:
      id:
        type: string
        description: product category id
        example: product_type_sun
      label:
        type: string
        description: >-
          name of the product category. The category give the segmentation
          beetween our product (ex: Sun, Snow, Montain in the summer...)
        example: Village soleil
  surroundings_images:
    type: array
    items:
      type: string
      description: product surroundings images
      example: 'http:myresortsurroundingpicture'
  country_v1:
    type: object
    properties:
      id:
        type: string
        description: ISO 2 country code
        example: FR
      label:
        type: string
        description: country label
        example: France
      description:
        type: string
        description: country description
        example: |-
          France in brief


          - Surface area: 632,834 sq km

          - Capital: Paris

          - Official language: French
           
          - Currency: the Euro.
    required:
      - id
      - label
  countries_v1:
    type: array
    items:
      $ref: '#/definitions/country_v1'
  destination_light_v1:
    type: object
    properties:
      geographical_area:
        type: string
        description: product geographical area
        example: Alps
      surroundings_images:
        $ref: '#/definitions/surroundings_images'
        type: array
      countries:
        $ref: '#/definitions/countries_v1'
        type: array
  comfort_v1:
    type: object
    properties:
      level:
        type: number
        description: comfort grade level
        example: 4
      label:
        type: string
        description: comfort grade level label
        example: 4 tridents
  departureDetails:
    type: object
    properties:
      country:
        type: string
        description: departure country label
        example: Guadeloupe
      city:
        type: string
        description: departure city label
        example: Guadeloupe
      date:
        type: string
        format: date
        description: departure date
        example: '20180102'
  Duration:
    type: object
    description: information regarding a tour or cruise arrival
    properties:
      in_nights:
        type: number
        description: duration in nights
        example: 8
      in_days:
        type: number
        description: duration in days
        example: 9
    required:
      - in_nights
      - in_days
  initial_price_v1:
    type: object
    description: 'Initial prices for the given conditions, without any discount.'
    properties:
      per_trip:
        type: number
        description: >-
          prices for all the stay without any discounts, according to terms and
          conditions
        example: 975
      per_trip_with_fees:
        type: number
        description: >-
          prices for all the stay with fees without any discounts, according to
          terms and conditions
        example: 1002.5
      per_night:
        type: number
        description: >-
          prices by night without any discounts, according to terms and
          conditions
        example: 140
      per_night_with_fees:
        type: number
        description: >-
          prices by night with fees without any discounts, according to terms
          and conditions
        example: 144
  best_price_v1:
    type: object
    description: Best prices for the given conditions.
    properties:
      per_trip:
        type: number
        description: >-
          minimum price for all the stay for this product, according to terms
          and conditions
        example: 824
      per_trip_with_fees:
        type: number
        description: >-
          minimum price for all the stay with fees for this product, according
          to terms and conditions
        example: 851.5
      per_night:
        type: number
        description: >-
          minimum price by night for this product, according to terms and
          conditions
        example: 118
      per_night_with_fees:
        type: number
        description: >-
          minimum price by night with fees for this product, according to terms
          and conditions
        example: 122
  fee_v1:
    type: object
    properties:
      per_trip:
        type: number
        description: fee amounts for the total stay
        example: 27.5
      per_night:
        type: number
        description: fee amounts by night
        example: 4
  accomodation:
    type: object
    properties:
      id:
        type: string
        description: accommodation included for the price id
        example: C
      label:
        type: string
        description: accommodation included for the price label
        example: Club Room
  departure_city_v1:
    type: object
    properties:
      id:
        type: string
        description: 'departure city id, if any transportation'
        example: PAR
      label:
        type: string
        description: 'departure city label, if any transportation'
        example: Paris
  departure_location_v1:
    type: object
    properties:
      id:
        type: string
        description: 'international code if relevant (airport, train station, harbour...)'
        example: CDG
      label:
        type: string
        description: 'label of the departure location (ex: label of the departure airport)'
        example: Charles de Gaulle airport
  terms_and_condition_v1:
    type: object
    properties:
      price_per:
        type: string
        description: 'type of price. (ADULT, or ROOM)'
        example: ADULT
        enum:
          - ADULT
          - ROOM
      package:
        type: string
        description: package in which the price is applied
        example: ALL_INCLUSIVE
      departure_date:
        type: string
        description: >-
          date of the journey beginning. If relevant, date of the transportation
          departure
        example: '20171115'
      arrival_date:
        type: string
        description: 'date of the journey ending. If any transportation, date of arrival'
        example: '20171115'
      stay_duration:
        type: number
        description: 'duration of the stay in days, without transportation'
        example: 7
      total_duration:
        type: number
        description: 'trip duration in days, including transportation if any'
        example: 7
      number_of_rooms_available_for_this_comfort:
        type: number
        description: refreshed every 24 hours
        example: 2
      number_of_adults:
        type: number
        description: number of adults used to calculate the price
        example: 2
      accomodation:
        $ref: '#/definitions/accomodation'
      departure_city:
        $ref: '#/definitions/departure_city_v1'
      departure_location:
        $ref: '#/definitions/departure_location_v1'
  term_and_conditions_v1:
    type: object
    properties:
      initial_price:
        $ref: '#/definitions/initial_price_v1'
      best_price:
        $ref: '#/definitions/best_price_v1'
      fee:
        $ref: '#/definitions/fee_v1'
      currency:
        type: string
        example: EUR
      terms_and_conditions:
        $ref: '#/definitions/terms_and_condition_v1'
  season_v1:
    type: array
    description: opening seasons (SUMMER and/or WINTER)
    items:
      type: string
      example: WINTER
      enum:
        - WINTER
        - SUMMER
  range_v1:
    type: object
    description: range for a tour
    properties:
      id:
        type: string
        description: range unique id
        example: range_escapade
      label:
        type: string
        description: range label
        example: Escapade
    required:
      - id
      - label
  ProductV1AreaComfort:
    type: object
    properties:
      level:
        type: integer
        description: comfort grade level
        example: 5
        x-constraint:
          positive: true
      label:
        type: string
        description: comfort grade level label
        example: 5 tridents
  ProductV1Area:
    type: object
    properties:
      id:
        type: string
        description: id of the area
        example: area_comfort_level_5_tridents
      label:
        type: string
        description: label of the area
        example: 5 tridents area
      comfort:
        $ref: '#/definitions/ProductV1AreaComfort'
    required:
      - id
      - label
  ProductV1Areas:
    type: array
    items:
      $ref: '#/definitions/ProductV1Area'
  product_summary_v1:
    type: object
    properties:
      id:
        type: string
        description: Club Med product unique id
        example: CHAC_WINTER
      category:
        $ref: '#/definitions/product_category_v1'
      sibling_id:
        type: string
        description: 'id of the sibling product open another season, if relevant'
        example: CHAC_SUMMER
      seo_description:
        type: string
        description: description to be used for seo
        example: >-
          Enjoy a luxury all-inclusive ski holiday in our France resort. For ski
          holidays, activity holidays and spa holidays, our Chamonix resort has
          it all.
      map:
        type: string
        description: map for the product
        example: 'http://mymapsurl'
      resort_id:
        type: string
        description: 'resort id, deprecated'
        example: CHAC
      title:
        type: string
        description: product title
        example: Chamonix Mont-Blanc
      full_title:
        type: string
        description: product full title to be used outside Club Med apps
        example: Clubmed Chamonix Mont-Blanc
      opening_status:
        type: string
        description: >-
          commercial status indicating if the product is OPEN, CLOSED or
          NOT_YET_OPEN
        example: OPEN
        enum:
          - OPEN
          - CLOSED
          - NOT_YET_OPEN
      destination:
        $ref: '#/definitions/destination_light_v1'
      comfort:
        $ref: '#/definitions/comfort_v1'
      type:
        type: string
        description: type of product
        example: VILLAGE
        enum:
          - CRUISE
          - TOUR
          - JOYVIEW
          - VILLAGE
          - VILLA
      description_title:
        type: string
        description: description headline"
        example: 'A stay at Chamonix, to enjoy the elegance of a legendary ski resort'
      adult_only:
        type: boolean
        description: '"true" if the product is forbidden to children.'
        example: false
      departure_details:
        $ref: '#/definitions/departureDetails'
      duration:
        $ref: '#/definitions/Duration'
      immersive_image:
        type: string
        description: product representative image
        example: 'http://mypicture'
      price:
        $ref: '#/definitions/term_and_conditions_v1'
      seasons:
        $ref: '#/definitions/season_v1'
        type: array
      min_authorized_age_in_months:
        type: number
        description: customer minimum age welcomed in the product
        example: 24
        minimum: 0
      range:
        $ref: '#/definitions/range_v1'
      areas:
        $ref: '#/definitions/ProductV1Areas'
        type: array
    required:
      - id
      - resort_id
      - title
      - full_title
      - opening_status
      - adult_only
  product_list_v1:
    type: array
    description: List of products for a locale.<br> The prices are for the entire season
    items:
      $ref: '#/definitions/product_summary_v1'
  product_strengths_v1:
    type: array
    description: strengths for the product
    items:
      type: string
      example: >-
        Recovering from your exertions in the pool or at Club Med Spa by CINQ
        MONDES
  bars_images_v1:
    type: array
    items:
      type: string
      example: 'http://image.jpg'
  bars_descriptions_v1:
    type: object
    properties:
      extra:
        type: string
        description: description of bar extra costs in an all inclusive package
        example: >-
          Champagnes, VSOP and XO spirits, bottled and canned drinks are
          available from vending machines...
      included:
        type: string
        description: description of the all inclusive package advantages at the bar
        example: >-
          Drinks served by the glass and at the bar only: water, fruit juices
          and sodas, hot drinks and cocktails with and without alcohol...
  bars_introduction_v1:
    type: object
    properties:
      description:
        type: string
        description: global description of bars for this product
        example: Relax in one of our bar...
      images:
        $ref: '#/definitions/bars_images_v1'
        type: array
      all_inclusive_description:
        $ref: '#/definitions/bars_descriptions_v1'
  restaurants_introduction_v1:
    type: object
    properties:
      description:
        type: string
        description: global description of restaurants for this product
        example: >-
          Each country has its own gastronomy, its own culinary art with its
          specific flavours and ingredients.
      images:
        $ref: '#/definitions/bars_images_v1'
        type: array
  accommodations_introduction_v1:
    type: object
    properties:
      description:
        type: string
        description: global description of restaurants for this product
        example: >-
          The Resort has 249 rooms in a hotel with several wings, less than 5
          minutes walking distance from the centre of Chamonix...
      images:
        $ref: '#/definitions/bars_images_v1'
        type: array
      rooms_count:
        type: number
        description: number of rooms in the product
        example: '249'
  arrival_details:
    type: object
    properties:
      country:
        type: string
        description: arrival country label
        example: Guadeloupe
      city:
        type: string
        description: arrival city label
        example: Guadeloupe
      date:
        type: string
        format: date
        description: arrival date
        example: '20180102'
  KeyPointsList:
    type: array
    description: list of the product key points
    items:
      type: string
      description: a product key point
      example: 24 participants max.
  Model 1:
    type: object
    properties:
      id:
        type: string
        example: PCAC
    required:
      - id
  V1RelatedProductsDetail:
    type: array
    description: list of products for before/during/After trip booking
    items:
      $ref: '#/definitions/Model 1'
  LinkModel:
    type: object
    properties:
      rel:
        type: string
        description: Name of the relationship
        example: self
      method:
        type: string
        description: HTTP method to use
        example: GET
      href:
        type: string
        description: Link to the resource
        example: 'https://api.clubmed.com/products'
  related links:
    type: array
    description: meta data (linked information) about the product
    items:
      $ref: '#/definitions/LinkModel'
  product_v1:
    type: object
    properties:
      id:
        type: string
        description: Club Med product unique id
        example: CHAC_WINTER
      category:
        $ref: '#/definitions/product_category_v1'
      sibling_id:
        type: string
        description: 'id of the sibling product open another season, if relevant'
        example: CHAC_SUMMER
      seo_description:
        type: string
        description: description to be used for seo
        example: >-
          Enjoy a luxury all-inclusive ski holiday in our France resort. For ski
          holidays, activity holidays and spa holidays, our Chamonix resort has
          it all.
      map:
        type: string
        description: map for the product
        example: 'http://mymapsurl'
      resort_id:
        type: string
        description: 'resort id, deprecated'
        example: CHAC
      title:
        type: string
        description: product title
        example: Chamonix Mont-Blanc
      full_title:
        type: string
        description: product full title to be used outside Club Med apps
        example: Clubmed Chamonix Mont-Blanc
      opening_status:
        type: string
        description: >-
          commercial status indicating if the product is OPEN, CLOSED or
          NOT_YET_OPEN
        example: OPEN
        enum:
          - OPEN
          - CLOSED
          - NOT_YET_OPEN
      destination:
        $ref: '#/definitions/destination_light_v1'
      comfort:
        $ref: '#/definitions/comfort_v1'
      type:
        type: string
        description: type of product
        example: VILLAGE
        enum:
          - CRUISE
          - TOUR
          - JOYVIEW
          - VILLAGE
          - VILLA
      description_title:
        type: string
        description: description headline"
        example: 'A stay at Chamonix, to enjoy the elegance of a legendary ski resort'
      adult_only:
        type: boolean
        description: '"true" if the product is forbidden to children.'
        example: false
      immersive_image:
        type: string
        description: product representative image
        example: 'http://mypicture'
      price:
        $ref: '#/definitions/term_and_conditions_v1'
      seasons:
        $ref: '#/definitions/season_v1'
        type: array
      min_authorized_age_in_months:
        type: number
        description: customer minimum age welcomed in the product
        example: 24
        minimum: 0
      range:
        $ref: '#/definitions/range_v1'
      description_1:
        type: string
        description: main product description
        example: >-
          Skiing in Chamonix means the unique pleasure of discovering a
          legendary resort, a true pioneer in the history of skiing, with all
          the charm this legendary name conjures up...
      description_2:
        type: string
        description: secondary product description
        example: >-
          A ski holiday in Chamonix is the chance to enjoy one of the world's
          most legendary ski resorts with a fabulous view of Mont Blanc...
      strengths:
        $ref: '#/definitions/product_strengths_v1'
        type: array
      site_surface_area_in_ha:
        type: number
        description: product total surface area in hectares
        example: 150
      bars_introduction:
        $ref: '#/definitions/bars_introduction_v1'
      restaurants_introduction:
        $ref: '#/definitions/restaurants_introduction_v1'
      accommodations_introduction:
        $ref: '#/definitions/accommodations_introduction_v1'
      departure_details:
        $ref: '#/definitions/departureDetails'
      arrival_details:
        $ref: '#/definitions/arrival_details'
      fact_sheet_url:
        type: string
        description: link to display the product fact sheet
        example: 'https://ns.clubmed.com/icp/factsheet/Factsheet.pdf'
        x-format:
          uri: true
      duration:
        $ref: '#/definitions/Duration'
      key_points:
        $ref: '#/definitions/KeyPointsList'
        type: array
      areas:
        $ref: '#/definitions/ProductV1Areas'
        type: array
      related_products:
        $ref: '#/definitions/V1RelatedProductsDetail'
        type: array
      _links:
        $ref: '#/definitions/related links'
        type: array
    required:
      - id
      - resort_id
      - title
      - full_title
      - opening_status
      - adult_only
      - key_points
