NAV
shell javascript

Introduction

Welcome to the Visit Galaxy API Reference. If you don’t have an API key, get in touch with us.

The API gives you access to some of the citybreak functionaility, enabling you to search for products, get content, search availability and use shopping baskets for booking and generating pay-later invoices.

This documentation is too long? You can check out the Swagger UI https://galaxy.test.citybreak.com/v5/. It targets test data and you can request a test API key for internal products that you can make bookings and do availability searches for. Give it a try and come back later.

The live Galaxy API endpoint is accessible at https://galaxy.citybreak.com/v5/

Point of Sales

A point of sales is concept widely used in the Citybreak system, implementation will guide you about which one you should use. The following settings can be configured per point of sales:

If you wish different combination of those settings for different purposes, you most likely would like to use more than 1 point of sales. Talk to our implementation team help.citybreak.com, they know all there is to know on the subject.

Example Workflow

This section will provide a very basic example workflow for booking a hotel room for one adult and one child that encompasses creating a basket, searching for availability, adding items and customer information, committing then checking the reservation and, finally, cancelling it. For each step, see to the right of the page for prototype calls using cURL or simple Javascript calls as well as example responses. Each of these calls (not counting the API keys and specific parameters that you will need to plug in) are the minimum requirements for a successful response.

Choose a Point of Sale Choose a currency Search availability Create basket Add booking item Add customer info Commit Basket Get Status Review reservation Cancel Reservation

Get Point of Sale

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/pointofsales'

var r = fetch("https://galaxy.citybreak.com/v5/api/pointofsales",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

[
  {
    "Id": 1234561,
    "Name": "Online"
  },
  {
    "Id": 1234562,
    "Name": "online viktors hotell 3"
  },
  {
    "Id": 1234565,
    "Name": "callcenter test"
  },
  {
    "Id": 1234569,
    "Name": "Veras Call Center"
  },
  {
    "Id": 1234570,
    "Name": "Test salespoint Distribution API"
  }
]

The first step is to obtain a valid Point of Sale Identifier. This is needed for many of the following operations and defines the products available for search as well as many of the settings important for creating a booking, such as rate codes availability periods, etc. We will go with the “Test salespoint Distribution API” Point of Sale - 1234570

HTTP Request

GET https://galaxy.citybreak.com/v5/api/pointofsales

Choose A Currency

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/pointofsales/currencies/1234570'
var r = fetch("https://galaxy.citybreak.com/v5/api/pointofsales/currencies/1234570",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

[
  "DKK",
  "SEK",
  "NOK",
  "EUR"
]

Once we have a Point of Sale we need to choose a Currency. Rates for hotel room products in the Availability Search are shown in whatever currency you choose but certain hotels do not have products for sale in all currencies so your results may be filtered depending on the currency you choose. We will choose Swedish Kronor - SEK.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/pointofsales/currencies/1234570

Create A Basket

curl -X POST 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' -d '{
  "PointOfSalesId": 1234570,
  "Currency": "SEK"
}' 'https://galaxy.citybreak.com/v5/api/basket/create'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/create",
{
  method:"POST"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json"
  },
  body: JSON.Stringify({
	"PointOfSalesId": 1234570,
	"Currency": "SEK"
  })
});

Example of response:

{
  "BasketId": 87654321,
  "Success": true
}

For all booking operations you will need a Shopping Basket. This entity will be the reference for all information related to a booking, right up until the time the customer decides to commit to the booking and has provided all the necessary information. It is therefore very important to hold a reference to the BasketId, in this case - 87654321.

You can optionally provide an Online3 Id to use the hybrid checkout flow, which means the Galaxy basket and the user can be redirected to your existing Online3 checkout & payment flow.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/basket/create

Search Availability

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' -d '{
   "PointOfSalesId": 1234570,
   "Arrival": "2017-10-14T12:27:58.851Z",
   "Departure": "2017-10-15T12:27:58.851Z",
   "Currency": "SEK",
   "PageSize": 20,
   "Page": 0,
   "PersonConfigurations": [
     {
       "Adults": 1,
       "ChildrenAges": [
         1
       ] 
     }
   ]
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
      "ApiKey": "APIKEY132456789EWOK",
      "Accept": "application/json",
      "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
      "PointOfSalesId": 1234570,
      "Arrival": "2017-10-14T12:27:58.851Z",
      "Departure": "2017-10-15T12:27:58.851Z",
      "Currency": "SEK",
      "PageSize": 20,
      "Page": 0,
      "PersonConfigurations": [
        {
          "Adults": 1,
          "ChildrenAges": [
            1
          ]
        }
	  ]
	})
});

Example of response:

{
  "AccommodationSearch": {
    "PointOfSalesId": 1234570,
    "Arrival": "2017-10-14T00:00:00Z",
    "Departure": "2017-10-15T00:00:00Z",
    "Currency": "SEK",
    "PageSize": 20,
    "Page": 0,
    "Sort": {
      "Order": 0,
      "Field": "Price"
    },
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          1
        ]
      }
    ],
    "ContentFilter": null,
    "OutputFilter": null
  },
  "Accommodations": [
    {
      "Id": "cbis:12345",
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1010101010",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1010101010",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "The absolute Leading e-commerce platform for the DMO and individual hotels in the Nordics!"
          },
          {
            "Id": 100038,
            "Name": "Elevator",
            "Value": "False"
          },
          {
            "Id": 100163,
            "Name": "Reception",
            "Value": "False"
          }
        ],
        "Categories": null,
        "Geos": [],
        "Pois": [],
        "Position": null
      },
      "Products": [
        {
          "Price": {
            "Price": 450,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Name": "Dubbelrum med extra säng",
          "Content": {
            "PriceFrom": null,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Dubbelrum med extra säng"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "IncludedAddons": [],
          "MaxPopopulation": 3,
          "MinPopulation": 1,
          "ExtraBeds": 1,
          "PersonConfiguration": {
            "Adults": 1,
            "ChildrenAges": [
              1
            ]
          },
          "PricePeriods": [
            {
              "DateStart": "2017-10-14T00:00:00",
              "DateEnd": "2017-10-15T00:00:00",
              "AdultPrice": 300,
              "ChildPrice": 150,
              "TotalPrice": 450,
              "Currency": "SEK"
            }
          ],
          "BookingConditions": {
            "Name": null,
            "Terms": null
          },
          "BookingKey": "18-A"
        },
        {
          "Price": {
            "Price": 500,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Name": "Dubbelrum",
          "Content": {
            "PriceFrom": null,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Dubbelrum"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "IncludedAddons": [
            {
              "Name": "Trädgårdstomte",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Trädgårdstomte"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "Price": 150,
              "Amount": 1,
              "Currency": "SEK",
              "PriceIncluded": false,
              "IsExtraBed": false,
              "PayOnSite": false
            }
          ],
          "MaxPopopulation": 3,
          "MinPopulation": 1,
          "ExtraBeds": 1,
          "PersonConfiguration": {
            "Adults": 1,
            "ChildrenAges": [
              1
            ]
          },
          "PricePeriods": [
            {
              "DateStart": "2017-10-14T00:00:00",
              "DateEnd": "2017-10-15T00:00:00",
              "AdultPrice": 250,
              "ChildPrice": 100,
              "TotalPrice": 350,
              "Currency": "SEK"
            }
          ],
          "BookingConditions": {
            "Name": null,
            "Terms": null
          },
          "BookingKey": "19-A"
        }
      ],
      "TotalResults": 2
    }
  ],
  "SearchId": "899fe054-3bb4-4ff8-b577-ba716b0b3317",
  "ExpirationDate": "2017-09-15T09:15:46.0619347Z",
  "TotalResults": 1,
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

At a minimum, an Availability Search requires the PointOfSalesId we obtained earlier (1234570) and the Currency (“SEK”) as well as the Arrival and Departure dates we want to search for, the PersonConfigurations - i.e. the number of rooms or cabins (each item in the list represents a “room”) and the guest make up, both Adult and Child (a list of ages for each child) for each room - and the “PageSize” of the result you want. If there are 50 results and you want to have 20 products at a time, you can check the total number products in the first response at Page 0 and repeat the request incrementing the Page as necessary.

The information above is one of the most complex and probably the most important parts of the Galaxy API. It returns a list of “Accommodations”, which in this case for Citybreak are Hotel Properties (or Bed & Breakfasts, Apartments, etc), within which is a list of “Products” which are Hotel Rooms (or Beds or Apartments, etc. depending on the property. These may also come with compulsory Add-ons (also known as sub-products) like breakfast included or champagne on arrival.

Each Accommodation object will also have content information about the property, that can also be found in an Accommodation Search, and how many room types (Placements) are available.

The product objects represent the rooms that will actually be booked. As such they have a lot of the important information a customer might want to see, they contain a “Price” that represents total spend as well as a “PricePeriods” list that breaks the cost dow for example. Other useful information might be included in the content info or the room configuration/occupancy allowances, etc. The most important information for the booking process however is the BookingKey. There is one per Product and is used to add a product to a Basket.

Also required is the SearchId that represents your search. The object represented by this unique id will hold references to all the products that were returned in the Accommodation Search. Also keep note of the ExpirationDate of the search as the reference will be invalid after this timestamp is passed.

For this example we will use the double room at BookVisit Hotel with a handy Garden Gnome included:

BookingKey = 19-A SearchId = 899fe054-3bb4-4ff8-b577-ba716b0b3317

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation

Add A Booking Item

curl -X PUT 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-US' -d '[
  {
    "BookKey": "19-A",
    "Amount" 1
  }
]' 'https://galaxy.citybreak.com/v5/api/basket/add/accommodation/87654321/899fe054-3bb4-4ff8-b577-ba716b0b3317'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/add/accommodation/87654321/899fe054-3bb4-4ff8-b577-ba716b0b3317",
{
  method:"PUT"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  },
  body: JSON.Stringify(
    [
      {
        "BookKey": "19-A",
        "Amount": 1
      }
    ])
});

Example of response:

true

Taking the BasketId: 87654321 of the basket we created earlier, the SearchId: 899fe054-3bb4-4ff8-b577-ba716b0b3317 from the availability search and the BookKey: 19-A of the product we selected, we can now add a product to our Basket.

PUT https://galaxy.citybreak.com/v5/api/basket/add/accommodation/87654321/899fe054-3bb4-4ff8-b577-ba716b0b3317

Add Customer Info

curl -X POST 
--header 'Content-Type: application/json' 
--header 'apiKey: APIKEY132456789EWOK' -d '{
   "NameFirst": "Test",
   "NameLast": "User",
   "Salutation": "Ms",
   "CustomerType": "Private",
   "Culture": "en-US",
   "Address": { 
     "StreetAddress1": "Test Road 123",
     "PostalCode": "41111",
     "City": "Gothenburg",
     "CountryCode": "SE"
   },
   "Email": "testuser%40visit.com",
   "PhoneMobile": { 
     "CountryCode": "46",
     "AreaCode": "07",
     "Number": "2222222"
   }
 }' 'https://galaxy.citybreak.com/v5/api/basket/customer/87654321'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/customer/87654321",
{
  method:"POST"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
  }  
  body: JSON.Stringify({
    "NameFirst": "Test",
    "NameLast": "User",
    "Salutation": "Ms",
    "CustomerType": "Private",
    "Culture": "en-US",
    "Address": {
      "StreetAddress1": "Test Road 123",
      "PostalCode": "41111",
      "City": "Gothenburg",
      "CountryCode": "SE"
    },
    "Email": "testuser@visit.com",
    "PhoneMobile": {
      "CountryCode": "46",
      "AreaCode": "07",
      "Number": "2222222"
    }
  }
}
});

Example of response: no content

To commit a Basket we will need to provide Customer Information using our BasketId: 87654321. In the example, we have created Ms. Test User and will POST her data which will attach it to the basket. You will only receive a status code of 204 to indicate success. The basket now has the bare minimum required to commit it.

If you’d rather redirect the user to your existing Online3 checkout & payment flow, this is where you would redirect the user to the hybrid checkout.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/basket/customer/87654321

Commit A Basket

curl -X POST 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/basket/commit/87654321'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/commit/87654321",
{
  method:"POST"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
  }  
});

Example of response: an integer representing the CommitJobId

98761234

Once you have all the information in the basket, you can Commit it. This will start the process of finalising bookings and generating the necessary financial information. You only need to provide the Basket Id for this call. The whole commit process is a two step one. First, in this call, we will use a POST call and the BasketId: 87654321 to trigger the Basket commit job. What you get in return is the CommitJobId, you should use it with Commit Status to get the status of the job. Our CommitJobId is 98761234.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/basket/commit/87654321

Get The Commit Job Status

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/basket/commit/status/98761234'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/commit/status/98761234",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json"
  }  
});

Example of response:

{
  "Status": "CompletedOk",
  "Subtasks": [
    {
      "Task": "StartingCommit",
      "Status": "CompletedOk",
      "ExtraInfo": null
    },
    {
      "Task": "CreatingConfirmations",
      "Status": "CompletedOk",
      "ExtraInfo": null
    },
    {
      "Task": "CreditCardAction",
      "Status": "CompletedOk",
      "ExtraInfo": null
    },
    {
      "Task": "CreatingInvoices",
      "Status": "NotStarted",
      "ExtraInfo": null
    },
    {
      "Task": "CreatingStatistics",
      "Status": "NotStarted",
      "ExtraInfo": null
    },
    {
      "Task": "FinishingTransaction",
      "Status": "CompletedOk",
      "ExtraInfo": null
    }
  ],
  "ResvVersionId": 12349876,
  "BookingCode": "EWOK12"
}

Once the basket has been ordered to be Committed, in order to get information about the booking you will need to use the CommitJobId: 98761234 to query the Commit Status of the job. As you can see in the example return, there are a number of different tasks that run as a part of a commit job. All of these are running in the back ground. Continue polling /basket/commit/status/{id} until you get either CompletedOk ok Failed as status. Both of them are final statuses. If you get Ok your reservation is confirmed and you have the booking code in the result. If you get Fail you will be provided with some detailes what went wrong. Like if you failed to confirm the reservation in a sub system or you havent provided enough information.

The other important information returned by the status is the ResvVersionId (reservation version id), for us: 12349876 and the BookingCode, for us: EWOK12, which are used to obtain information about the Reservation

HTTP Request

GET https://galaxy.citybreak.com/v5/api/basket/commit/status/98761234

Review A Reservation

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/reservation/latest/EWOK12'
var r = fetch("https://galaxy.citybreak.com/v5/api/reservation/latest/EWOK12",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json"
  }  
});

Example of response:

{
  "BookingCode": "EWOK12",
  "Version": 1,
  "BookingDate": "2017-09-27T13:12:54.1938577Z",
  "AutoCancellation": "9999-12-31T23:59:59.9999999",
  "Fees": [],
  "BookingUser": {
    "Id": 113685,
    "NameFirst": "Galaxy",
    "NameLast": "Api user",
    "Email": null
  },
  "CancellationMessage": null,
  "LastCancellation": "2017-10-27T15:48:06.009Z",
  "Customer": {
    "NameFirst": "Test",
    "NameLast": "User",
    "Salutation": Ms,
    "CustomerNumber": null,
    "CustomerType": 0,
    "Culture": null,
    "CivicRegistrationNumber": null,
    "Company": null,
    "CompanyDepartment": null,
    "Address": {
      "StreetAddress1": "Test Road 123",
      "StreetAddress2": null,
      "StreetAddress3": null,
      "PostalCode": "41111",
      "City": "Gothenburg",
      "CountryCode": "SE",
      "State": null
    },
    "Email": null,
    "PhoneHome": {
      "CountryCode": null,
      "AreaCode": null,
      "Number": null
    },
    "PhoneWork": {
      "CountryCode": null,
      "AreaCode": null,
      "Number": null
    },
    "PhoneMobile": {
      "CountryCode": "46",
      "AreaCode": "07",
      "Number": "2222222"
    }
  },
  "ProductGroups": [
    {
      "Products": [
        {
          "Id": 3,
          "Name": "Dubbelrum",
          "Price": 350
        }
      ],
      "Id": 153663,
      "Name": "BookVisit Hotel"
    }
  ]
}

There are two ways to return information about a reservation, either by the Version of the Reservation, using the BookingCode and ResVersionId or by the latest version as we have done here where we just require our BookingCode: EWOK12. It displays limited information about the booked products, the customer and some meta information about the booking itself. The user should retain a reference to the BookingCode so that they are able to reference their reservation

HTTP Request

GET https://galaxy.citybreak.com/v5/api/reservation/latest/EWOK12

Cancel A Reservation

curl -X POST 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/reservation/cancel/EWOK12'
var r = fetch("https://galaxy.citybreak.com/v5/api/reservation/cancel/EWOK12",
{
  method: "POST",
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json"
  }  
});

Example of response: int32

Finally, lets cancel our reservation. Cancelling policies can vary for products and so it is worth noting here that the only guaranteed cancellation that of the reservation. There might be part or full payments due depending on policies, cancellation insurance and other factors, that can differ product to product. To cancel, we once again just require our BookingCode: EWOK12. Similarly to committing a Basket, it returns an integer. Use this value in Commit Status to see the status of your cancel job.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/reservation/cancel/EWOK12

Point of Sale

Points of Sale are the distribution channels controlled by an Citybreak Organisation. An API key may give access to multiple Points of Sale, each with it’s own rate and currency information and selection of available products. Having a valid Point of Sale Id is important for most other queries in the API

All GET operations

Point Of Sales

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/pointofsales'

var r = fetch("https://galaxy.citybreak.com/v5/api/pointofsales",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

[
  {
    "Id": 1,
    "Name": "Online"
  },
  {
    "Id": 2,
    "Name": "online viktors hotell 3"
  },
  {
    "Id": 5,
    "Name": "callcenter test"
  },
  {
    "Id": 9,
    "Name": "Veras Call Center"
  }
]

Get the points of sale available to the current API Key.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/pointofsales

Currencies

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/pointofsales/currencies/{pointOfSaleId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/pointofsales/currencies/{pointOfSaleId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

[
  "DKK",
  "SEK",
  "NOK",
  "EUR"
]

Get currencies available for a given Point of Sale. Availability searches will require a currency for a valid search.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/pointofsales/currencies

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.

Accommodation

Accommodation operations provide information on Accommodation products available in a point of sale. No availability information is included here, it is primarily content (images, position, categories, etc).

All GET operations

Accommodation

curl -X GET 
  --header 'ApiKey: APIKEY132456789EWOK'
  --header 'Accept: application/json' 
  --header 'Accept-Language: en-US'
  'https://galaxy.citybreak.com/v5/api/accommodation/{pointOfSaleId}/{pageSize}/{page}'
var r = fetch("https://galaxy.citybreak.com/v5/api/accommodation/{pointOfSaleId}/{pageSize}/{page}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Page": 0,
  "PageSize": 20,
  "TotalResults": 1,
  "Items": [
    {
      "Id": "cbis:12345",
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=4136104",
            "IsMain": true,
            "Name": null,
            "Copyright": "",
            "Description": null
          },
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
          },
        ],
        "Categories": null,
        "Geos": [
          {
            "Id": 69962,
            "Path": null
          },
        ],
        "Pois": [],
        "Position": {
          "Latitude": 57.7039005352791,
          "Longitude": 11.9626625079345
        }
      },
      "Children": [
        {
          "Id": "pt:355468",
          "Name": "BookVisit Hotel BookVisit",
          "Content": {
            "PriceFrom": null,
            "Images": null,
            "Information": null,
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          }
        }
      ]
    }
  ]
}

Get details about Accommodation

HTTP Request

GET https://galaxy.citybreak.com/v5/api/accommodation/view/{pointOfSalesId}/{page}/{pageSize}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
pageSize Size of the page.
page The page (starting at 0).

Product

curl -X GET 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/accommodation/{pointOfSalesId}/{pageSize}/{page}'
var r = fetch("https://galaxy.citybreak.com/v5/api/accommodation/view/{pointOfSaleId}/{productId}'",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Id": "cbis:12345",
  "Name": "BookVisit Hotel",
  "Content": {
    "PriceFrom": 0,
    "Images": [
      {
        "Uri": "//images.citybreak.com/image.aspx?ImageId=4136104",
        "IsMain": true,
        "Name": null,
        "Copyright": "",
        "Description": null
      },
    ],
    "Information": [
      {
        "Id": 99,
        "Name": "Name",
        "Value": "BookVisit Hotel"
      },
      {
        "Id": 101,
        "Name": "Introduction",
        "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
      },
    ],
    "Categories": null,
    "Geos": [
      {
        "Id": 69962,
        "Path": null
      },
    ],
    "Pois": [],
    "Position": {
      "Latitude": 57.7039005352791,
      "Longitude": 11.9626625079345
    }
  },
  "Children": [
    {
      "Id": "pt:542664"
      "Name": "BookVisit Hotel BookVisit",
      "Content": {
        "PriceFrom": null,
        "Images": null,
        "Information": null,
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    }
  ]
}

Get details and content about a specific Citybreak product, the requests requires that you have both a Point of Sale Id and a valid Product Id

HTTP Request

GET https://galaxy.citybreak.com/v5/api/accommodation/view/{pointOfSalesId}/{productId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
productId The Id of the product you wish to retrieve.

Activity

Activity operations provide information on Activity products available in a point of sale. No availability information is included here, it is primarily content (images, position, categories, etc).

All GET operations

Activity

curl -X GET 
  --header 'ApiKey: APIKEY132456789EWOK'
  --header 'Accept: application/json' 
  --header 'Accept-Language: en-US'
  'https://galaxy.citybreak.com/v5/api/activity/{pointOfSaleId}/20/0'
var r = fetch("https://galaxy.citybreak.com/v5/api/activity/{pointOfSaleId}/20/0",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Page": 0,
  "PageSize": 20,
  "TotalResults": 25,
  "Items": [
    {
      "Id": "cbis:1324320",
      "Name": "Valley stars 7-9 years",
      "Content": {
        "PriceFrom": 1280,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5039905",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 141,
            "Name": "Prices from",
            "Value": "1280"
          },
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Valley stars 7-9 years"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Grouplessons for Valley stars 7-9 years, beginner level"
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "Beginner lessons where will learn skiing, stop and turn through fun activities. We will begin to handle the lifts. \r\n\r\nMust know: Nothing."
          }
        ],
        "Categories": null,
        "Geos": [
          {
            "Id": 105257,
            "Path": "[ALPINCO Hafjell och Kvitfjell]"
          },
          {
            "Id": 105629,
            "Path": "Hafjell & Kvitfjell"
          },
          {
            "Id": 105260,
            "Path": "Hafjell"
          }
        ],
        "Pois": [],
        "Position": {
          "Latitude": 61.2340708391529,
          "Longitude": 10.4462814331055
        }
      },
      "Occasions": [
        {
          "Start": "2017-12-18T00:00:00Z",
          "End": "2017-12-18T00:00:00Z",
          "Arena": null
        },
        {
          "Start": "2017-12-18T00:00:00Z",
          "End": "2017-12-18T00:00:00Z",
          "Arena": null
        },
        {
          "Start": "2017-12-18T00:00:00Z",
          "End": "2017-12-18T00:00:00Z",
          "Arena": null
        }
      ],
      "Children": []
    }
  ]
}   

Get details about Activity

HTTP Request

GET https://galaxy.citybreak.com/v5/api/activity/{pointOfSalesId}/{pageSize}/{page}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
pageSize Size of the page.
page The page.

Product

curl -X GET 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/activity/view/{pointOfSaleId}/{productId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/activity/view/{pointOfSaleId}/{productId}'",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Id": "cbis:1324320",
  "Name": "Valley stars 7-9 years",
  "Content": {
    "PriceFrom": 1280,
    "Images": [
      {
        "Uri": "//images.citybreak.com/image.aspx?ImageId=5039905",
        "IsMain": false,
        "Name": null,
        "Copyright": null,
        "Description": null
      }
    ],
    "Information": [
      {
        "Id": 141,
        "Name": "Prices from",
        "Value": "1280"
      },
      {
        "Id": 99,
        "Name": "Name",
        "Value": "Valley stars 7-9 years"
      },
      {
        "Id": 101,
        "Name": "Introduction",
        "Value": "Grouplessons for Valley stars 7-9 years, beginner level"
      },
      {
        "Id": 102,
        "Name": "Description",
        "Value": "Beginner lessons where will learn skiing, stop and turn through fun activities. We will begin to handle the lifts. \r\n\r\nMust know: Nothing."
      }
    ],
    "Categories": null,
    "Geos": [
      {
        "Id": 105257,
        "Path": "[ALPINCO Hafjell och Kvitfjell]"
      },
      {
        "Id": 105629,
        "Path": "Hafjell & Kvitfjell"
      },
      {
        "Id": 105260,
        "Path": "Hafjell"
      }
    ],
    "Pois": [],
    "Position": {
      "Latitude": 61.2340708391529,
      "Longitude": 10.4462814331055
    }
  },
  "Occasions": [
    {
      "Start": "2017-12-18T00:00:00Z",
      "End": "2017-12-18T00:00:00Z",
      "Arena": null
    },
    {
      "Start": "2017-12-18T00:00:00Z",
      "End": "2017-12-18T00:00:00Z",
      "Arena": null
    },
    {
      "Start": "2017-12-18T00:00:00Z",
      "End": "2017-12-18T00:00:00Z",
      "Arena": null
    }
  ],
  "Children": []
}

Get details and content about a specific Citybreak product, the requests requires that you have both a Point of Sale Id and a valid Product Id

HTTP Request

GET https://galaxy.citybreak.com/v5/api/activity/view/{pointOfSalesId}/{productId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
productId The Id of the product you wish to retrieve.

Transport

Transport operations provide information on Transport products available in a point of sale. No availability information is included here, it is primarily content (price groups, routes, etc).

All GET operations

Price Groups

curl -X GET 
  --header 'ApiKey: APIKEY132456789EWOK'
  --header 'Accept: application/json' 
  --header 'Accept-Language: en-US'
  'https://galaxy.citybreak.com/v5/api/transport/priceGroups/{pointOfSalesId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/transport/priceGroups/{pointOfSalesId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	"Accept-Language": "en-US"
  }  
});

Example of response:

{
  "PersonPriceGroups": [
    {
      "Code": "997",
      "Name": "Adult",
      "MinAge": 0,
      "MaxAge": 2147483647
    },
    {
      "Code": "1037",
      "Name": "Child 4-11",
      "MinAge": 4,
      "MaxAge": 11
    },
    {
      "Code": "1166",
      "Name": "Child 0-3",
      "MinAge": 0,
      "MaxAge": 3
    },
    {
      "Code": "1359",
      "Name": "Teens 12-15",
      "MinAge": 12,
      "MaxAge": 15
    }
  ],
  "VehiclePriceGroups": [
    {
      "Code": "998",
      "Name": "Car max 1.85m x 5m "
    },
    {
      "Code": "1032",
      "Name": "Motorhome max 4m x 7m"
    },
    {
      "Code": "1034",
      "Name": "Motorcycle"
    },
    {
      "Code": "1035",
      "Name": "Motorcycle with sidecar"
    },
    {
      "Code": "1036",
      "Name": "Bicycle"
    },
    {
      "Code": "1160",
      "Name": "Car max 2.20m x 6m"
    },
    {
      "Code": "1161",
      "Name": "Motorhome max 4m x 10m"
    }
  ]
}

Get lists of person and vehicle price groups that could be available from the specified point of sales, with full details about them

HTTP Request

GET https://galaxy.citybreak.com/v5/api/transport/priceGroups/{pointOfSalesId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
Accept-Language The language culture (e.g en-us)

Price Groups for product

curl -X GET 
  --header 'ApiKey: APIKEY132456789EWOK'
  --header 'Accept: application/json' 
  --header 'Accept-Language: en-US'
  'https://galaxy.citybreak.com/v5/api/transport/priceGroups/{pointOfSalesId}/{productId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/transport/priceGroups/{pointOfSalesId}/{productId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	"Accept-Language": "en-US"
  }  
});

Example of response:

{
  "PersonPriceGroups": [
    {
      "Code": "997",
      "Name": "Adult",
      "MinAge": 0,
      "MaxAge": 2147483647
    },
    {
      "Code": "1037",
      "Name": "Child 4-11",
      "MinAge": 4,
      "MaxAge": 11
    },
    {
      "Code": "1166",
      "Name": "Child 0-3",
      "MinAge": 0,
      "MaxAge": 3
    },
    {
      "Code": "1359",
      "Name": "Teens 12-15",
      "MinAge": 12,
      "MaxAge": 15
    }
  ],
  "VehiclePriceGroups": [
    {
      "Code": "998",
      "Name": "Car max 1.85m x 5m "
    },
    {
      "Code": "1032",
      "Name": "Motorhome max 4m x 7m"
    },
    {
      "Code": "1034",
      "Name": "Motorcycle"
    },
    {
      "Code": "1035",
      "Name": "Motorcycle with sidecar"
    },
    {
      "Code": "1036",
      "Name": "Bicycle"
    },
    {
      "Code": "1160",
      "Name": "Car max 2.20m x 6m"
    },
    {
      "Code": "1161",
      "Name": "Motorhome max 4m x 10m"
    }
  ]
}

Get lists of person and vehicle price groups for a specific product that is available from the specified point of sales, with full details about them

HTTP Request

GET https://galaxy.citybreak.com/v5/api/transport/priceGroups/{pointOfSalesId}/{productId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
productId The product identifier.
Accept-Language The language culture (e.g en-us)

Routes

curl -X GET 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/transport/routes/{pointOfSalesId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/transport/routes/{pointOfSalesId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Locations": [
    {
      "Code": "25142",
      "Name": "Oslo",
      "City": null,
      "Country": "NO",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25132",
      "Name": "Copenhagen",
      "City": null,
      "Country": "DK",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25130",
      "Name": "Amsterdam",
      "City": null,
      "Country": "NL",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25140",
      "Name": "Newcastle",
      "City": null,
      "Country": "GB",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25852",
      "Name": "Frederikshavn",
      "City": null,
      "Country": "DK",
      "NameScheme": "DFDS"
    }
  ],
  "Routes": [
    {
      "DepartureLocationCode": "25142",
      "ArrivalLocationCode": "25132",
      "Description": null,
      "AllowRoundtrip": true,
      "AllowOneWay": true
    },
    {
      "DepartureLocationCode": "25130",
      "ArrivalLocationCode": "25140",
      "Description": null,
      "AllowRoundtrip": true,
      "AllowOneWay": true
    },
    {
      "DepartureLocationCode": "25142",
      "ArrivalLocationCode": "25852",
      "Description": null,
      "AllowRoundtrip": true,
      "AllowOneWay": true
    },
    {
      "DepartureLocationCode": "25852",
      "ArrivalLocationCode": "25142",
      "Description": null,
      "AllowRoundtrip": false,
      "AllowOneWay": true
    }
  ]
}

Get list of locations and routes that could be available from the specified point of sales, with full details about them

HTTP Request

GET https://galaxy.citybreak.com/v5/api/transport/routes/{pointOfSalesId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
Accept-Language The language culture (e.g en-us)

Routes for product

curl -X GET 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/transport/routes/{pointOfSalesId}/{productId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/transport/routes/{pointOfSalesId}/{productId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Locations": [
    {
      "Code": "25142",
      "Name": "Oslo",
      "City": null,
      "Country": "NO",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25132",
      "Name": "Copenhagen",
      "City": null,
      "Country": "DK",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25130",
      "Name": "Amsterdam",
      "City": null,
      "Country": "NL",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25140",
      "Name": "Newcastle",
      "City": null,
      "Country": "GB",
      "NameScheme": "DFDS"
    },
    {
      "Code": "25852",
      "Name": "Frederikshavn",
      "City": null,
      "Country": "DK",
      "NameScheme": "DFDS"
    }
  ],
  "Routes": [
    {
      "DepartureLocationCode": "25142",
      "ArrivalLocationCode": "25132",
      "Description": null,
      "AllowRoundtrip": true,
      "AllowOneWay": true
    },
    {
      "DepartureLocationCode": "25130",
      "ArrivalLocationCode": "25140",
      "Description": null,
      "AllowRoundtrip": true,
      "AllowOneWay": true
    },
    {
      "DepartureLocationCode": "25142",
      "ArrivalLocationCode": "25852",
      "Description": null,
      "AllowRoundtrip": true,
      "AllowOneWay": true
    },
    {
      "DepartureLocationCode": "25852",
      "ArrivalLocationCode": "25142",
      "Description": null,
      "AllowRoundtrip": false,
      "AllowOneWay": true
    }
  ]
}

Get list of locations and routes for a specific product that could be available from the specified point of sales, with full details about them

HTTP Request

GET https://galaxy.citybreak.com/v5/api/transport/routes/{pointOfSalesId}/{productId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
productId The product identifier.
Accept-Language The language culture (e.g en-us)

Locations

curl -X GET 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/transport/locations/{pointOfSalesId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/transport/locations/{pointOfSalesId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "DepartureLocations": [
    {
      "Code": "25130",
      "Name": "Amsterdam",
      "City": null,
      "Country": "NL",
      "NameScheme": "DFDS",
      "Type": "Seaport"
    },
    {
      "Code": "25142",
      "Name": "Oslo",
      "City": null,
      "Country": "NO",
      "NameScheme": "DFDS",
      "Type": "Seaport"
    },
    {
      "Code": "25852",
      "Name": "Frederikshavn",
      "City": null,
      "Country": "DK",
      "NameScheme": "DFDS",
      "Type": "Seaport"
    }
  ],
  "ArrivalLocations": [
    {
      "Code": "25132",
      "Name": "Copenhagen",
      "City": null,
      "Country": "DK",
      "NameScheme": "DFDS",
      "Type": "Seaport"
    },
    {
      "Code": "25140",
      "Name": "Newcastle",
      "City": null,
      "Country": "GB",
      "NameScheme": "DFDS",
      "Type": "Seaport"
    },
    {
      "Code": "25142",
      "Name": "Oslo",
      "City": null,
      "Country": "NO",
      "NameScheme": "DFDS",
      "Type": "Seaport"
    },
    {
      "Code": "25852",
      "Name": "Frederikshavn",
      "City": null,
      "Country": "DK",
      "NameScheme": "DFDS",
      "Type": "Seaport"
    }
  ]
}

Get details about locations that could be available from the specified point of sales, with full details about them

HTTP Request

GET https://galaxy.citybreak.com/v5/api/transport/locations/{pointOfSalesId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
Accept-Language The language culture (e.g en-us)

Availability - Accommodation

Availability - Accommodation calls provide information about the availability of any type of accommodation products. Searches will return products with availability, content, room price, and subproduct information (such as breakfasts or tickets to nearby attractions), as well as a Search ID with its Expiry. This search differs from the other accommodation availability search in that it does not do automatic placement of persons into rooms. That means if you send two person configurations: one with 1 adult and one with 2 adults, you will get a flat list of room results priced twice: first for 1 adult and secondly for 2 adults.

The SearchId can be used to retrieve prior, cached searches in a much shorter amount of time if used before its Expiry. The object recalled by the search contains all the unfiltered information retrieved in the first search, so further or different filtering on content, etc. can be done in this call.

The SearchId and the BookingKey of each room product are used in the basket operations to add the product found to the Basket

GET and POST operations

Accommodation

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 0,
   "Arrival": "2017-10-14",
   "Departure": "2017-10-15",
   "Currency": "SEK",
   "PageSize": 20,
   "PersonConfigurations": [
     {
       "Adults": 1,
       "ChildrenAges": [
         0
       ] 
     }
   ]
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Arrival": "2017-10-14",
	   "Departure": "2017-10-15",
	   "Currency": "SEK",
	   "PageSize": 20,
	   "PersonConfigurations": [
	     {
	       "Adults": 1,
	       "ChildrenAges": [
	         0
	       ] 
	     }
	   ]
	})  
});

Example of response:

{
  "AccommodationSearch": {
    "PointOfSalesId": 0,
    "Arrival": "2017-10-14T00:00:00Z",
    "Departure": "2017-10-15T00:00:00Z",
    "Currency": "SEK",
    "PageSize": 20,
    "Page": 0,
    "Sort": {
      "Order": 0,
      "Field": "Price"
    },
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          0
        ]
      }
    ],
    "ContentFilter": null,
    "OutputFilter": null,
    "PromoCode": null
  },
  "Accommodations": [
    {
      "Id": "cbis:12345",
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=10101010",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1010101010",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "The absolute Leading e-commerce platform for the DMO and individual hotels in the Nordics!"
          },
          {
            "Id": 100038,
            "Name": "Elevator",
            "Value": "False"
          },
          {
            "Id": 100163,
            "Name": "Reception",
            "Value": "False"
          }
        ],
        "Categories": null,
        "Geos": [],
        "Pois": [],
        "Position": null
      },
      "Products": [
        {
          "Price": {
            "Price": 450,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Name": "Dubbelrum med extra säng",
          "Content": {
            "PriceFrom": null,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Dubbelrum med extra säng"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "IncludedAddons": [],
          "MaxPopopulation": 3,
          "MinPopulation": 1,
          "ExtraBeds": 1,
          "PersonConfiguration": {
            "Adults": 1,
            "ChildrenAges": [
              0
            ]
          },
          "PricePeriods": [
            {
              "DateStart": "2017-10-14T00:00:00",
              "DateEnd": "2017-10-15T00:00:00",
              "AdultPrice": 300,
              "ChildPrice": 150,
              "TotalPrice": 450,
              "Currency": "SEK"
            }
          ],
          "BookingConditions": {
            "Name": null,
            "Terms": null
          },
          "PromoCodeDescription": null,
          "BookingKey": "18-A"
        },
        {
          "Price": {
            "Price": 500,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Name": "Dubbelrum",
          "Content": {
            "PriceFrom": null,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Dubbelrum"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "IncludedAddons": [
            {
              "Name": "Trädgårdstomte",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Trädgårdstomte"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "Price": 150,
              "Amount": 1,
              "Currency": "SEK",
              "PriceIncluded": false,
              "IsExtraBed": false,
              "PayOnSite": false
            }
          ],
          "MaxPopopulation": 3,
          "MinPopulation": 1,
          "ExtraBeds": 1,
          "PersonConfiguration": {
            "Adults": 1,
            "ChildrenAges": [
              0
            ]
          },
          "PricePeriods": [
            {
              "DateStart": "2017-10-14T00:00:00",
              "DateEnd": "2017-10-15T00:00:00",
              "AdultPrice": 250,
              "ChildPrice": 100,
              "TotalPrice": 350,
              "Currency": "SEK"
            }
          ],
          "BookingConditions": {
            "Name": null,
            "Terms": null
          },
          "PromoCodeDescription": null,
          "BookingKey": "19-A"
        }
      ],
      "TotalResults": 2
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh",
  "ExpirationDate": "2017-09-15T09:15:46.0619347Z",
  "TotalResults": 1,
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as arrival and departure dates. The filter can also include content filtering, such as only including those hotels associated with a particular CBIS category or that have 24 hr reception. Content filtering possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The Most important return values in this response are the SearchId and the BookingKey used in the Basket, also pay attention to the ExpirationDate of the SearchId

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Arrival": "2018-11-23T15:23:15.087Z", //DateTime - Mandatory "Departure": "2018-11-23T15:23:15.088Z", //DateTime - Mandatory "Currency": "string", //string - Mandatory e.g SEK or EUR "PageSize": 0, //int Mandatory "Sort": { // Optional - defaults to Price Ascending "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, //List of configurations for guest numbers. Each item represents a room price you're looking for. //Cannot be empty, must represent at least one guest "PersonConfigurations": [ { "Adults": 0, //int - represents number of adults "ChildrenAges": [ //List of ints - each int represents the age of a child guest 0 ] } ], "ContentFilter": { // Optional - See ContentFilter }, "OutputFilter": { // Optional - See OutputFilter }, "PromoCode": "string" // string - Optional }

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "Page": 1,
  "PageSize": 20,
  "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh"
}' 'https://galaxy.citybreak.com/v5/api/availability/accommodation/get'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/get",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "Page": 1,
    "PageSize": 20,
    "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh"
  })  
});

Example of response:

{
  "AccommodationSearch": {
    "PointOfSalesId": 0,
    "Arrival": "2017-10-14T00:00:00Z",
    "Departure": "2017-10-15T00:00:00Z",
    "Currency": "SEK",
    "PageSize": 20,
    "Page": 1,
    "Sort": {
      "Order": 0,
      "Field": "Price"
    },
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          0
        ]
      }
    ],
    "ContentFilter": null,
    "OutputFilter": null
  },
  "Accommodations": [
    {
      "Id": "cbis:12345",
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=10101010",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=10101010",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "The absolute Leading e-commerce platform for the DMO and individual hotels in the Nordics!"
          },
          {
            "Id": 100038,
            "Name": "Elevator",
            "Value": "False"
          },
          {
            "Id": 100163,
            "Name": "Reception",
            "Value": "False"
          }
        ],
        "Categories": null,
        "Geos": [],
        "Pois": [],
        "Position": null
      },
      "Products": [
        {
          "Price": {
            "Price": 450,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Name": "Dubbelrum med extra säng",
          "Content": {
            "PriceFrom": null,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Dubbelrum med extra säng"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "IncludedAddons": [],
          "MaxPopopulation": 3,
          "MinPopulation": 1,
          "ExtraBeds": 1,
          "PersonConfiguration": {
            "Adults": 1,
            "ChildrenAges": [
              1
            ]
          },
          "PricePeriods": [
            {
              "DateStart": "2017-10-14T00:00:00",
              "DateEnd": "2017-10-15T00:00:00",
              "AdultPrice": 300,
              "ChildPrice": 150,
              "TotalPrice": 450,
              "Currency": "SEK"
            }
          ],
          "BookingConditions": {
            "Name": null,
            "Terms": null
          },
          "PromoCodeDescription": null,
          "BookingKey": "18-A"
        },
        {
          "Price": {
            "Price": 500,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Name": "Dubbelrum",
          "Content": {
            "PriceFrom": null,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Dubbelrum"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "IncludedAddons": [
            {
              "Name": "Trädgårdstomte",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Trädgårdstomte"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "Price": 150,
              "Amount": 1,
              "Currency": "SEK",
              "PriceIncluded": false,
              "IsExtraBed": false,
              "PayOnSite": false
            }
          ],
          "MaxPopopulation": 3,
          "MinPopulation": 1,
          "ExtraBeds": 1,
          "PersonConfiguration": {
            "Adults": 1,
            "ChildrenAges": [
              1
            ]
          },
          "PricePeriods": [
            {
              "DateStart": "2017-10-14T00:00:00",
              "DateEnd": "2017-10-15T00:00:00",
              "AdultPrice": 250,
              "ChildPrice": 100,
              "TotalPrice": 350,
              "Currency": "SEK"
            }
          ],
          "BookingConditions": {
            "Name": null,
            "Terms": null
          },
          "PromoCodeDescription": null,
          "BookingKey": "19-A"
        }
      ],
      "TotalResults": 2
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh",
  "ExpirationDate": "2017-09-15T09:15:46.0619347Z",
  "TotalResults": 1
}

This is a POST request that requires a filter with a valid (non-expired) SearchId. The filter otherwise has the same constraints as in the original Accommodation availability search. You can see a bare minimum version of this search in the examples.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation/get

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "Page":1, //int mandatory - the pager is 0-indexed so 1 is the second page "PageSize": 0, //int Mandatory "Sort": { // Optional "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, //string - Mandatory - the search Id of a still valid accommodation availability search "SearchId":"string", "OutputFilter": { // Optional - See OutputFilter } }

Availability - Placement Accommodation

Availability - Placement Accommodation calls provide information about the availability of any type of accommodation products. Both searches (normal and fuzzy) will return products with availability, including content, pricing groups with room information (Placements) and subproduct information (such as breakfasts or tickets to nearby attractions), as well as a Search ID with its Expiry. This search differs from the default accommodation availability search in that it does automatic placement of persons into rooms. That means if you send two person configurations: one with 1 adult and one with 2 adults, you will get a list of room combinations priced and bookable as a whole.

The SearchId can be used to retrieve prior, cached searches in a much shorter amount of time if used before its Expiry. The object recalled by the search contains all the unfiltered information retrieved in the first search, so further or different filtering on content, etc. can be done in this call.

The SearchId and the BookingKey of each room product are used in the basket operations to add the product found to the Basket

GET and POST operations

Placement Accommodation

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 0,
   "Arrival": "2017-10-14",
   "Departure": "2017-10-15",
   "Currency": "SEK",
   "PageSize": 20,
   "PersonConfigurations": [
     {
       "Adults": 1,
       "ChildrenAges": [
         0
       ] 
     }
   ]
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation/placement'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/placement",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Arrival": "2017-10-14",
	   "Departure": "2017-10-15",
	   "Currency": "SEK",
	   "PageSize": 20,
	   "PersonConfigurations": [
	     {
	       "Adults": 1,
	       "ChildrenAges": [
	         0
	       ] 
	     }
	   ]
	})  
});

Example of response:

{
  "AccommodationSearch": {
    "PointOfSalesId": 0,
    "Arrival": "2017-10-14T00:00:00Z",
    "Departure": "2017-10-15T00:00:00Z",
    "Currency": "SEK",
    "PageSize": 20,
    "Page": 0,
    "Sort": {
      "Order": 0,
      "Field": "Price"
    },
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          0
        ]
      }
    ],
    "ContentFilter": null,
    "OutputFilter": null,
    "PromoCode": null
  },
  "Accommodations": [
    {
      "Id": "cbis:12345",
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=10101010",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1010101010",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "The absolute Leading e-commerce platform for the DMO and individual hotels in the Nordics!"
          },
          {
            "Id": 100038,
            "Name": "Elevator",
            "Value": "False"
          },
          {
            "Id": 100163,
            "Name": "Reception",
            "Value": "False"
          }
        ],
        "Categories": null,
        "Geos": [],
        "Pois": [],
        "Position": null
      },
      "Placements": [
        {
          "Price": {
            "Price": 450,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Placements": [
            {
              "Name": "Dubbelrum med extra säng",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Dubbelrum med extra säng"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "IncludedAddons": [],
              "MaxPopopulation": 3,
              "MinPopulation": 1,
              "ExtraBeds": 1,
              "PersonConfiguration": {
                "Adults": 1,
                "ChildrenAges": [
                  0
                ]
              },
              "PricePeriods": [
                {
                  "DateStart": "2017-10-14T00:00:00",
                  "DateEnd": "2017-10-15T00:00:00",
                  "AdultPrice": 300,
                  "ChildPrice": 150,
                  "TotalPrice": 450,
                  "Currency": "SEK"
                }
              ],
              "BookingConditions": {
                "Name": null,
                "Terms": null
              },
              "PromoCodeDescription": null
            }
          ],
          "BookingKey": "18-A"
        },
        {
          "Price": {
            "Price": 500,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Placements": [
            {
              "Name": "Dubbelrum",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Dubbelrum"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "IncludedAddons": [
                {
                  "Name": "Trädgårdstomte",
                  "Content": {
                    "PriceFrom": null,
                    "Images": [],
                    "Information": [
                      {
                        "Id": 99,
                        "Name": "Name",
                        "Value": "Trädgårdstomte"
                      }
                    ],
                    "Categories": null,
                    "Geos": null,
                    "Pois": null,
                    "Position": null
                  },
                  "Price": 150,
                  "Amount": 1,
                  "Currency": "SEK",
                  "PriceIncluded": false,
                  "IsExtraBed": false,
                  "PayOnSite": false
                }
              ],
              "MaxPopopulation": 3,
              "MinPopulation": 1,
              "ExtraBeds": 1,
              "PersonConfiguration": {
                "Adults": 1,
                "ChildrenAges": [
                  0
                ]
              },
              "PricePeriods": [
                {
                  "DateStart": "2017-10-14T00:00:00",
                  "DateEnd": "2017-10-15T00:00:00",
                  "AdultPrice": 250,
                  "ChildPrice": 100,
                  "TotalPrice": 350,
                  "Currency": "SEK"
                }
              ],
              "BookingConditions": {
                "Name": null,
                "Terms": null
              },
              "PromoCodeDescription": null
            }
          ],
          "BookingKey": "19-A"
        }
      ],
      "TotalResults": 2
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh",
  "ExpirationDate": "2017-09-15T09:15:46.0619347Z",
  "TotalResults": 1,
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as arrival and departure dates. The filter can also include content filtering, such as only including those hotels associated with a particular CBIS category or that have 24 hr reception. Content filtering possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The Most important return values in this response are the SearchId and the BookingKey used in the Basket, also pay attention to the ExpirationDate of the SearchId

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation/placement

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Arrival": "2018-11-23T15:23:15.087Z", //DateTime - Mandatory "Departure": "2018-11-23T15:23:15.088Z", //DateTime - Mandatory "Currency": "string", //string - Mandatory e.g SEK or EUR "PageSize": 0, //int - Mandatory "Sort": { // Optional - defaults to Price Ascending "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, //List of configurations for guest numbers. Each item represents a "room". //Cannot be empty, must represent at least one guest "PersonConfigurations": [ { "Adults": 0, //int - represents number of adults "ChildrenAges": [ //List of ints - each int represents the age of a child guest 0 ] } ], "ContentFilter": { // Optional - See ContentFilter }, "OutputFilter": { // Optional - See OutputFilter }, "PromoCode": "string" // string - Optional }

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "Page": 1,
  "PageSize": 20,
  "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh"
}' 'https://galaxy.citybreak.com/v5/api/availability/accommodation/placement/get'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/placement/get",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "Page": 1,
    "PageSize": 20,
    "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh"
  })  
});

Example of response:

{
  "AccommodationSearch": {
    "PointOfSalesId": 0,
    "Arrival": "2017-10-14T00:00:00Z",
    "Departure": "2017-10-15T00:00:00Z",
    "Currency": "SEK",
    "PageSize": 20,
    "Page": 1,
    "Sort": {
      "Order": 0,
      "Field": "Price"
    },
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          0
        ]
      }
    ],
    "ContentFilter": null,
    "OutputFilter": null
  },
  "Accommodations": [
    {
      "Id": "cbis:12345",
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=10101010",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=10101010",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "The absolute Leading e-commerce platform for the DMO and individual hotels in the Nordics!"
          },
          {
            "Id": 100038,
            "Name": "Elevator",
            "Value": "False"
          },
          {
            "Id": 100163,
            "Name": "Reception",
            "Value": "False"
          }
        ],
        "Categories": null,
        "Geos": [],
        "Pois": [],
        "Position": null
      },
      "Placements": [
        {
          "Price": {
            "Price": 450,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Placements": [
            {
              "Name": "Dubbelrum med extra säng",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Dubbelrum med extra säng"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "IncludedAddons": [],
              "MaxPopopulation": 3,
              "MinPopulation": 1,
              "ExtraBeds": 1,
              "PersonConfiguration": {
                "Adults": 1,
                "ChildrenAges": [
                  1
                ]
              },
              "PricePeriods": [
                {
                  "DateStart": "2017-10-14T00:00:00",
                  "DateEnd": "2017-10-15T00:00:00",
                  "AdultPrice": 300,
                  "ChildPrice": 150,
                  "TotalPrice": 450,
                  "Currency": "SEK"
                }
              ],
              "BookingConditions": {
                "Name": null,
                "Terms": null
              },
              "PromoCodeDescription": null
            }
          ],
          "BookingKey": "18-A"
        },
        {
          "Price": {
            "Price": 500,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Placements": [
            {
              "Name": "Dubbelrum",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Dubbelrum"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "IncludedAddons": [
                {
                  "Name": "Trädgårdstomte",
                  "Content": {
                    "PriceFrom": null,
                    "Images": [],
                    "Information": [
                      {
                        "Id": 99,
                        "Name": "Name",
                        "Value": "Trädgårdstomte"
                      }
                    ],
                    "Categories": null,
                    "Geos": null,
                    "Pois": null,
                    "Position": null
                  },
                  "Price": 150,
                  "Amount": 1,
                  "Currency": "SEK",
                  "PriceIncluded": false,
                  "IsExtraBed": false,
                  "PayOnSite": false
                }
              ],
              "MaxPopopulation": 3,
              "MinPopulation": 1,
              "ExtraBeds": 1,
              "PersonConfiguration": {
                "Adults": 1,
                "ChildrenAges": [
                  1
                ]
              },
              "PricePeriods": [
                {
                  "DateStart": "2017-10-14T00:00:00",
                  "DateEnd": "2017-10-15T00:00:00",
                  "AdultPrice": 250,
                  "ChildPrice": 100,
                  "TotalPrice": 350,
                  "Currency": "SEK"
                }
              ],
              "BookingConditions": {
                "Name": null,
                "Terms": null
              },
              "PromoCodeDescription": null
            }
          ],
          "BookingKey": "19-A"
        }
      ],
      "TotalResults": 2
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh",
  "ExpirationDate": "2017-09-15T09:15:46.0619347Z",
  "TotalResults": 1,
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with a valid (non-expired) SearchId. The filter otherwise has the same constraints as in the original Accommodation availability search. You can see a bare minimum version of this search in the examples.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation/placement/get

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "Page":1, //int mandatory - the pager is 0-indexed so 1 is the second page "PageSize": 0, //int Mandatory "Sort": { // Optional "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, //string - Mandatory - the search Id of a still valid accommodation availability search "SearchId":"string", "OutputFilter": { // Optional - See OutputFilter } }

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 0,
  "Start": "2018-11-09",
  "End": "2018-11-13",
  "Currency": "SEK"
}' 'https://galaxy.citybreak.com/v5/api/availability/accommodation/calendar'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/calendar",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 0,
    "Start": "2018-11-09",
    "End": "2018-11-13",
    "Currency": "SEK"
  })  
});

Example of response:

{
  "Calendar": [
    {
      "Date": "2018-11-09T00:00:00",
      "Groups": [
        {
          "Id": "ptg:987654",
          "Name": "Visit Hotell",
          "Products": [
            {
              "Id": "pt:54321",
              "Name": "Double room",
              "Nights": 1
            },
            {
              "Id": "pt:54321",
              "Name": "Double room",
              "Nights": 2
            }
          ]
        },
        {
          "Id": "ptg:2345678",
          "Name": "Citybreak Hotell",
          "Products": [
            {
              "Id": "pt:65432",
              "Name": "Double room",
              "Nights": 1
            }
          ]
        }
      ]
    },
    {
      "Date": "2018-11-10T00:00:00",
      "Groups": [
        {
          "Id": "ptg:1234567",
          "Name": "Visit Hotell",
          "Products": [
            {
              "Id": "pt:54321",
              "Name": "Double room",
              "Nights": 1
            }
          ]
        }
      ]
    }
  ],
  "PromoCodeStatus": "None",
  "CalendarContext": {
    "PointOfSalesId": 0,
    "Start": "2018-11-09T00:00:00",
    "End": "2018-11-13T00:00:00",
    "Currency": "SEK",
    "ContentFilter": null,
    "PromoCode": null
  },
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as the start and end dates of the calendar, the pointOfSalesId and the currency. As in other availability queries, the filter can also include a content filter, such as only those hotels associated with a particular CBIS category or that have 24 hr reception. Content possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The return of this call is a set of availble dates (if there is availability) an entity called Groups which shows accommodation options available on that day with the nested sub-products (think hotels with sub-products being hotel rooms) in the search period and the possible lengths of stay. This is useful for, say, quickly displaying days on which you can begin a stay and, once clicked, the minimum and maximum number of days you may stay within the search period.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation/placement/calendar

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Start": "2018-11-23", //DateTime - Mandatory, conforms to ISO 8601 "End": "2018-11-23", //DateTime - Mandatory, conforms to ISO 8601 "Currency": "string", //string - Mandatory e.g SEK or EUR "ContentFilter": { // Optional - See ContentFilter }, "PromoCode": "string" // string - Optional }

Fuzzy Accommodation Search

The fuzzy accommodation search will look for available accommodation options in the vicinity of the requested Arrival/Departure of the stay definition. The result will give you options that match or partially match the stay definition. A score will tell how good of a match it was. You can use the related methods to navigate in the search result until it is resolved into a bookable match. Once you have found the accommodation product you are looking for (or the end user has selected it) you can put that selection and required stay dates in the basket.

How to add a result to basket

Call Scan

First you call the Scan method to get perform a search. You will get a partial listing back describing the first set of results. The SearchId will be used in all other methods to refer back to the original search you made. The scan operation will examine dates around the stay (-10 days before arrival and +10 days after the selected departure), and give you bookkeys to pass to the next methods.

Page through the result

By using the Get method you will be able to page through the result.

Get arrival dates in search span

Once you get a result you like and would like to investigate further you can get more details of the possible stays with that result by calling arrivaldates with a bookKey obtained with the scan or get methods. That will give you all valid arrival dates available in scan sector that was used.

Get departure dates

By calling the departuredates with a bookKey obtained with the scan method, given an arrival date you will get all valid departures from that date.

List bookable alternatives

By calling bookablealternatives you will get back actual bookable items between a specified arrival and departure. You will get a list of items back. Since an accommodation product may be sold under certain conditions, you may get more than one back. Each describing a price and the conditions under it will be sold. Included subproducts can differ between the items for instance.

Add to basket

Once you have a bookable alternative you can add it to the basket by calling PUT api/basket/add/cabin/{basketId}/{searchId}/{bookKey}

Scan

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 0,
  "Currency": "EUR",
  "PageSize": 20,
  "Stay": {
    "ArrivalDaysMask": 0x7F, 
    "DepartureDayMask": 0x7F,
    "MinStayLength": 3,
    "MaxStayLength": 5,
    "Arrival": "2018-12-04",
    "Departure": "2018-12-08"
  },
  "PersonConfiguration": {
    "Adults": 2,
    "ChildrenAges": [
    ]
  },
  "OutputFilter":{
    "Attributes":[
      99
    ]
  }
  "Sort": {
    "Order": "Asc",
    "Field": "Score"
    } 
}' 'https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/scan'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/scan",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 0,
    "Currency": "SEK",
    "PageSize": 20,
    "Stay": {
      "ArrivalDaysMask": 0x7F,
      "DepartureDayMask": 0x7F, 
      "MinStayLength": 3,
      "MaxStayLength": 5,
      "Arrival": "2018-12-04",
      "Departure": "2018-12-08"
    },
    "PersonConfiguration": {
      "Adults": 2,
      "ChildrenAges": [
      ]
    },
    "Sort": {
      "Order": "Asc",
      "Field": "Score"
    }
  })  
});

Example of response:

{
  "SearchId": "1234abcd-a1b2-1234-a10f-abcd1234abcd",
  "TotalResults": 2,
  "Accommodations": [
    {
      "Id": "cbis:12345",
      "Name": "First hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=123456",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Namn",
            "Value": "First hotel"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": {
          "Latitude": 60.12345,
          "Longitude": 18.00000
        }
      },
      "Products": [
        {
          "Id": "pt:12345",
          "BookingKey": "2-C",
          "Name": "Standard Dubbelrum",
          "Content": {
            "PriceFrom": 0,
            "Images": [],
            "Information": [
              {
                "Id": 101,
                "Name": "Introduction",
                "Value": null
              },
              {
                "Id": 102,
                "Name": "Description",
                "Value": null
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "Score": 100,
          "ExampleArrival": "2018-12-04T00:00:00+01:00",
          "ExampleDeparture": "2018-12-08T00:00:00+01:00",
          "Extrabeds": 1,
          "MaxPopluationForAnyItem": 3,
          "MaxPopulation": 2,
          "OriginalPrice": 300,
          "Price": 300,
          "PromoCodeDescription": null
        },
        {
          "Id": "pt:23456",
          "BookingKey": "2-C",
          "Name": "Trippelrum",
          "Content": {
            "PriceFrom": 0,
            "Images": [],
            "Information": [
              {
                "Id": 101,
                "Name": "Introduction",
                "Value": null
              },
              {
                "Id": 102,
                "Name": "Description",
                "Value": null
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "Score": 65,
          "ExampleArrival": "2018-12-04T00:00:00+01:00",
          "ExampleDeparture": "2018-12-07T00:00:00+01:00",
          "Extrabeds": 0,
          "MaxPopluationForAnyItem": 3,
          "MaxPopulation": 3,
          "OriginalPrice": 250,
          "Price": 250,
          "PromoCodeDescription": null
        },
        {
          "Id": "pt:34567",
          "BookingKey": "2-C",
          "Name": "Superior Dubbelrum",
          "Content": {
            "PriceFrom": 0,
            "Images": [],
            "Information": [
              {
                "Id": 101,
                "Name": "Introduction",
                "Value": null
              },
              {
                "Id": 102,
                "Name": "Description",
                "Value": null
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "Score": 65,
          "ExampleArrival": "2018-12-04T00:00:00+01:00",
          "ExampleDeparture": "2018-12-07T00:00:00+01:00",
          "Extrabeds": 1,
          "MaxPopluationForAnyItem": 3,
          "MaxPopulation": 2,
          "OriginalPrice": 280,
          "Price": 280,
          "PromoCodeDescription": null
        }
      ]
    }
  ],
  "PromoCodeStatus": "None",
  "SearchContext": {
    "Arrival": "2018-12-04T00:00:00+01:00",
    "Departure": "2018-12-08T00:00:00+01:00",
    "OutputFilter": {
      "Attributes": [
        99
      ],
      "Categories": false,
      "Geos": false,
      "Pois": false,
      "Position": false
    },
    "ContentFilter": {
      "Geos": [],
      "Categories": [],
      "Pois": [],
      "Search": null,
      "Position": null,
      "Information": null,
      "Ids": []
    },
    "PageSize": 20,
    "Page": 0,
    "PersonConfiguration": {
      "Adults": 1,
      "ChildrenAges": []
    },
    "Currency": "EUR",
    "ArrivalDayMask": 127,
    "DepartureDayMask": 127,
    "MinStayLength": 3,
    "MaxStayLength": 5,
    "Sort": {
      "Order": "Desc",
      "Field": "Score"
    },
    "PromoCode": null
  },
  "ExpirationDate": "2018-11-20T12:00:00.1000000+01:00",
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

Use this method first to get a BookKey to be able to proceed with all other operations.

Search parameters

All parameters are submitted through an instance of the CabinSearchFilter object as described below.

Parameter Description
PointOfSalesId The point of sales that should be used. It defines the assortment that could be searched.
Currency The currency the basket search should deliver results for. It must match the currency your basket is in.
PageSize The number of results in the return object. It may not exceed 50 and suggested is between 10 and 20.
Page The page you would like to start with. Normally 0, it will give you the first page with the best matches
Stay The Stay object describes what types of stay results you would like to get.
Stay.ArrivalDayMask The arrival day mask, see DayMask below.
Stay.DepartureDayMask The departure day mask, see DayMask below.
Stay.MinStayLength The minimum length of stay you require.
Stay.MaxStayLength The maximum length of stay you require.
Stay.Arrival The suggested arrival date.
Stay.Departure The suggested departure date.

Using the Stay object

The arrival and departure makes up a sweet spot span where you would like to arrive. The search is performed with the focus on that area. However you can get results that partially matches that span.

The Score property will tell how good of a match a specific result was. It will also give you the best price for the specified stay that the item used to calculate the score. The example properties on that object will tell which ones it was.

Use the arrival/departure day mask to create queries to match like short week, weekends and such. For instance, use 0x18 to create results arriving on Thursday or Friday and use departure mask 0x61 to specify acceptable departures on Saturday, Sunday or Monday. That could be your weekend day filter.

Use the MinStayLength/MaxStayLength stay to specify an acceptable length of you stay. 7/7 will give you exactly seven days of stay. 2/3 will restrict the stay to 2 or 3 days. That could be used in conjunction with the week days filter. 1/7 will give you results where you could stay anywhere between 1 or 7 days - likely to be an expensive and possibly not helpful query

Keep in mind that this is only used to give you relevant stay dates as the result. You can use the get arrival dates and departure dates when you examine a specified result to create a bookable result that does not necessarily matches your original constraints.

Day mask

A bit mask describing which days that are valid for arriving at or depart at. The field is an integer but can also be represented in hex.

Hex Day Bin
0x01 Monday (0000001)
0x02 Tuesday (0000010)
0x04 Wednesday (0000100)
0x08 Thursday (0001000)
0x10 Friday (0010000)
0x20 Saturday (0100000)
0x40 Sunday (1000000)

Examples

Mask Meaning
0x7F Any day, this is the default if 0 is submitted.
0x18 Thursday or Friday.
0xF Monday, Tuesday, Wednesday, Thursday or Friday.

Sort definition

The sort definition is used to order the paged results you get.

Order Meaning
Asc Ascending - The item with the lowest field value first. Suggested when sorting by Price.
Desc Descending - The item the highest field value first. Suggested when sorting by Score.
Field Meaning
Name Sort by the name of the Cabin
Price Sort by example price
Random Sort by a random order.
Score Sort by the relevance of the example stay.

Suggested sort order is by Score/Descending. That will give you the most relevant items first.

The price may differ heavily if you are in a high season week and low season week. Ordering by Price is therefore not necessarily a good sorting for listing relevant results.

ContentFilter

The content filter specifies that the search result should be narrowed to certain results that only matches that filter. See Availability search for specification.

ContentOutputFilter

The output filter describes which content that should be included with the item. See the availability search for specifications.

This is POST request that requires a filter. You can see a bare minimum version of this search in the examples.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/scan

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Currency": "string", //string - Mandatory e.g SEK or EUR "PageSize": 0, //int Mandatory "Stay": { // Mandatory "ArrivalDaysMask": 0, //int - Optional - use only rightmost seven bits, defaults to 127 (all days) "DepartureDayMask": 0, //int - Optional - use only rightmost seven bits, defaults to 127 (all days) "MinStayLength": 0, // int - Mandatory "MaxStayLength": 0, // int - Mandatory "Arrival": "2018-11-23T15:23:15.087Z", //DateTime - Mandatory, conforms to ISO 8601 "Departure": "2018-11-23T15:23:15.088Z", //DateTime - Mandatory, conforms to ISO 8601 }, //List of configurations for guest numbers. Each item represents a "room". //Cannot be empty, must represent at least one guest "PersonConfigurations": [ { "Adults": 0, //int - represents number of adults "ChildrenAges": [ //List of ints - each int represents the age of a child guest 0 ] } ], "ContentFilter": { // Optional - See the ContentFilter section }, "OutputFilter": { // Optional - See the OutputFilter section }, "Sort": { // Optional - default sort is price ascending "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Score, Random }, "PromoCode": "string" // string - Optional }

Get

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
    "Page": 1, // Zero indexed so this is the second page
    "PageSize": 10,
    "Sort": {
      "Order": "Desc",
      "Field": "Score"
    },
    "SearchId": "1234abcd-a1b2-1234-a10f-abcd1234abcd",
    "ContentOutputFilter": {
      "Attributes": [
          99
      ],
      "Categories": false,
      "Geos": false,
      "Pois": false,
      "Position": false
    }
}' 'https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/get'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/get",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		  "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
  "Page": 1, // Zero indexed so this is the second page
  "PageSize": 10,
  "Sort": {
    "Order": "Desc",
    "Field": "Score"
  },
  "SearchId": "1234abcd-a1b2-1234-a10f-abcd1234abcd",
  "ContentOutputFilter": {
    "Attributes": [
        99
    ],
    "Categories": false,
    "Geos": false,
    "Pois": false,
    "Position": false
  }
  })  
});

This method is used to get a different page of the scan result as represented by the searchId you find in the initial scan. Each searchId has an expiry but this is not a guarantee of availability on results from previous pages.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/get

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "Page":1, //int mandatory - the pager is 0-indexed so 1 is the second page "PageSize": 0, //int Mandatory "Sort": { // Optional "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, "SearchId":"string", //string - Mandatory - the search Id of a still valid accommodation availability search "OutputFilter": { // Optional - See the OutputFilter section } }

Arrival dates

curl -X GET 
--header 'Accept: text/plain' 
--header 'apiKey:  APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/arrivaldates?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&firstArrival=2018-12-03&lastArrival=2018-12-05&personConfig.adults=2'

var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/arrivaldates?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&firstArrival=2018-12-03&lastArrival=2018-12-05&personConfig.adults=2",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

[
    "2018-12-03T00:00:00+01:00",
    "2018-12-04T00:00:00+01:00"
]

Get a set of valid arrival dates for a specified item based on your scan.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/arrivaldates

Query Parameters

Parameter Description
searchId From the result
bookKey From the result.Result[n].BookKey
firstArrival First acceptable date for the result.
lastArrival Last acceptable date for the result.
personConfig.adults Number of adults (usually be same as scan)
personConfig.childrenAges Ages of children (usually be same as scan)

Departure dates

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey:  APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/departuredates?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&arrival=2018-12-03&personConfig.adults=2'

var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/departuredates?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&arrival=2018-12-03&personConfig.adults=2",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

[
  "2018-12-04T00:00:00+01:00",
  "2018-12-05T00:00:00+01:00",
  "2018-12-06T00:00:00+01:00",
  "2018-12-07T00:00:00+01:00",
  "2018-12-08T00:00:00+01:00",
  "2018-12-09T00:00:00+01:00",
  "2018-12-10T00:00:00+01:00",
  "2018-12-11T00:00:00+01:00",
  "2018-12-12T00:00:00+01:00",
  "2018-12-13T00:00:00+01:00",
  "2018-12-14T00:00:00+01:00",
  "2018-12-15T00:00:00+01:00",
  "2018-12-16T00:00:00+01:00",
  "2018-12-17T00:00:00+01:00"
]

Get a set of valid departure dates for the specified item given the arrival date.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/departuredates

Query Parameters

Parameter Description
searchId From the result
bookKey From the result.Result[n].BookKey
arrival The specified arrival date from which you would like valid departure dates.
personConfig.adults Number of adults (usually be same as scan)
personConfig.childrenAges Ages of children (usually be same as scan)

Detailed Departure Info

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey:  APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/alldepartures?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&arrival=2018-12-03&personConfig.adults=2'

var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/alldepartures?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&arrival=2018-12-03&personConfig.adults=2",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

[
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "1.00:00:00",
    "Price": 60,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "2.00:00:00",
    "Price": 120,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "3.00:00:00",
    "Price": 180,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "4.00:00:00",
    "Price": 240,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "5.00:00:00",
    "Price": 500,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "6.00:00:00",
    "Price": 600,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "7.00:00:00",
    "Price": 700,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "8.00:00:00",
    "Price": 800,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "9.00:00:00",
    "Price": 900,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "10.00:00:00",
    "Price": 1000,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "11.00:00:00",
    "Price": 1100,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "12.00:00:00",
    "Price": 1200,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "13.00:00:00",
    "Price": 1300,
    "OriginalPrice": null
  },
  {
    "Arrival": "2018-12-03T00:00:00+01:00",
    "Stay": "14.00:00:00",
    "Price": 1400,
    "OriginalPrice": null
  }
]

Similar to the departure dates query, this call will return a more detailed list of departure information, with stay time from your requested arrival date and the lowest price of the placement.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/alldepartures

Query Parameters

Parameter Description
searchId From the result
bookKey From the result.Result[n].BookKey
arrival The specified arrival date from which you would like valid departure dates.
personConfig.adults Number of adults (usually be same as scan)
personConfig.childrenAges Ages of children (usually be same as scan)

Get bookable alternatives

curl -X GET --header 'Accept: application/json' --header 'apiKey:  APIKEY132456789EWOK' 
'https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/bookablealternatives?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&arrival=2018-12-03&personConfig.adults=2'

var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/bookablealternatives?searchId=1234abcd-a1b2-1234-a10f-abcd1234abcd&bookKey=2-C&arrival=2018-12-03&personConfig.adults=2",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

[
  {
    "BookId": 3,
    "DiscountInformation": null,
    "Arrival": "2018-12-04T00:00:00+01:00",
    "Departure": "2018-12-07T00:00:00+01:00",
    "Subproducts": [
      {
        "Name": "Frukost",
        "Currency": "EUR",
        "Description": null,
        "IncludedInPrice": true,
        "PayOnSite": false,
        "Price": 0
      }
    ],
    "OriginalPrice": null,
    "Price": 180,
    "RateInformation": {
      "Name": null,
      "CancellationLatest": null,
      "Terms": null
    }
  },
  {
    "BookId": 4,
    "DiscountInformation": null,
    "Arrival": "2018-12-04T00:00:00+01:00",
    "Departure": "2018-12-07T00:00:00+01:00",
    "Subproducts": [
      {
        "Name": "Frukost",
        "Currency": "EUR",
        "Description": null,
        "IncludedInPrice": true,
        "PayOnSite": false,
        "Price": 0
      }
    ],
    "OriginalPrice": null,
    "Price": 300,
    "RateInformation": {
      "Name": null,
      "CancellationLatest": "2018-06-10T02:00:00+02:00",
      "Terms": null
    }
  }
]

This call returns a list of valid alternatives to book. Use the BookId (different to the bookKey) when referring to this specific result when adding it to the fuzzy search basket.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/availability/accommodation/fuzzy/bookablealternatives

Query Parameters

Parameter Description
searchId From the result
bookKey From the result.Result[n].BookKey
arrival The specified arrival date
departure The specified departure date
personConfig.adults Number of adults (usually be same as scan)
personConfig.childrenAges Ages of children (usually be same as scan)

Availability - Activity

Availability - Activity calls provide information about the availability of activity products. The search will return products with availability, including content, pricing groups, as well as a Search ID with its Expiry.

The SearchId can be used to retrieve prior, cached searches in a much shorter amount of time for Activity Search if used before its Expiry. The object recalled by the search contains all the unfiltered information retrieved in the first search, so further or different filtering on content, etc. can be done in this call.

The SearchId and the BookKey of each activity quote are used in the basket operations to add the product found to the Basket

GET and POST operations

Activity

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 0,
   "Date": "2019-02-18",
   "Currency": "NOK",
   "PageSize": 20
 }' 'https://galaxy.citybreak.com/v5/api/availability/activity'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/activity",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Date": "2019-02-18",
	   "Currency": "NOK",
	   "PageSize": 20
	})  
});

Example of response:

{
  "ActivitySearch": {
    "PointOfSalesId": 0,
    "Date": "2019-02-18T00:00:00",
    "Currency": "NOK",
    "PageSize": 20,
    "Page": 0,
    "Sort": {
      "Order": "Asc",
      "Field": "Price"
    },
    "ContentFilter": null,
    "OutputFilter":{
      "Attributes":[99],
      "Categories": false,
      "Geos": false,
      "Pois": false,
      "Position": false
    },
    "PromoCode": null
  },
  "ActivityGroups": [
    {
      "Id": "cbis:12345",
      "Name": "Ski Lessons at Lake Tahoe",
      "Content": {
        "PriceFrom": 0,
        "Images": [                            
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=123",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Ski Lessons at Lake Tahoe"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      },
      "Activities": [
        {
          "Id": "cbis:1501474",
          "Name": "Ski Lessons for Beginners",
          "MaximumItemsBookable": null,
          "MinimumItemsBookable": 1,
          "Content": {
            "PriceFrom": 0,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Ski Lessons for Beginners"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "Occasions": [
            {
              "Start": "2019-02-18T09:00:00",
              "Duration": "03:00:00",
              "Quotes": [
                {
                  "BookKey": "123-T",
                  "AvailableCapacity": 4,
                  "Price": {
                    "PriceGroupCode": "ADT",
                    "PriceGroupName": "Adult",
                    "Age": null,
                    "Price": 1000,
                    "OriginalPrice": 1000,
                    "Currency": "NOK"
                  },
                  "BookingConditions": {
                    "Name": null,
                    "Terms": null
                  },
                  "DiscountInformation": {
                    "Name": null,
                    "Description": null
                  },
                  "IncludedAddons": []
                },
                {
                  "BookKey": "124-T",
                  "AvailableCapacity": 3,
                  "Price": {
                    "PriceGroupCode": "CHD",
                    "PriceGroupName": "Youth 7-15",
                    "Age": null,
                    "Price": 500,
                    "OriginalPrice": 500,
                    "Currency": "NOK"
                  },
                  "BookingConditions": {
                    "Name": null,
                    "Terms": null
                  },
                  "DiscountInformation": {
                    "Name": null,
                    "Description": null
                  },
                  "IncludedAddons": []
                },
                {
                  "BookKey": "125-T",
                  "AvailableCapacity": 3,
                  "Price": {
                    "PriceGroupCode": "CHD-DIS",
                    "PriceGroupName": "Youth 7-15",
                    "Age": null,
                    "Price": 410,
                    "OriginalPrice": 0,
                    "Currency": "NOK"
                  },
                  "BookingConditions": {
                    "Name": null,
                    "Terms": null
                  },
                  "DiscountInformation": {
                    "Name": "Sportlovet2019",
                    "Description": "Rabatt för Sportlovet"
                  },
                  "IncludedAddons": [
                    {
                      "Name": "Sportlovet 2019 Hatt",
                      "Content": {
                          "PriceFrom": 0,
                          "Images": [],
                          "Information": [
                              {
                                  "Id": 99,
                                  "Name": "Name",
                                  "Value": "Sportlovet 2019 Hatt"
                              }
                          ],
                          "Categories": null,
                          "Geos": null,
                          "Pois": null,
                          "Position": null
                      },
                      "Price": 10,
                      "Amount": 1,
                      "Currency": "NOK",
                      "PriceIncluded": true
                    }
                  ]
                }
              ]
            },
            {
              "Start": "2019-02-18T14:00:00",
              "Duration": "03:00:00",
              "Quotes": [
                {
                  "BookKey": "126-T",
                  "AvailableCapacity": 7,
                  "Price": {
                    "PriceGroupCode": "ADT",
                    "PriceGroupName": "Adult",
                    "Age": null,
                    "Price": 1000,
                    "OriginalPrice": 1000,
                    "Currency": "NOK"
                  },
                  "BookingConditions": {
                    "Name": null,
                    "Terms": null
                  },
                  "DiscountInformation": {
                    "Name": null,
                    "Description": null
                  },
                  "IncludedAddons": []
                }
              ]
            }
          ]
        },
        {
          "Id": "cbis:1501474",
          "Name": "Advanced Ski Lessons",
          "MaximumItemsBookable": null,
          "MinimumItemsBookable": 1,
          "Content": {
            "PriceFrom": 0,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Advanced Ski Lessons"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "Occasions": [
            {
              "Start": "2019-02-18T09:00:00",
              "Duration": "04:00:00",
              "Quotes": [
                {
                  "BookKey": "127-T",
                  "AvailableCapacity": 4,
                  "Price": {
                    "PriceGroupCode": "ADT",
                    "PriceGroupName": "Adult",
                    "Age": null,
                    "Price": 1100,
                    "OriginalPrice": 1100,
                    "Currency": "NOK"
                  },
                  "BookingConditions": {
                    "Name": null,
                    "Terms": null
                  },
                  "DiscountInformation": {
                    "Name": null,
                    "Description": null
                  },
                  "IncludedAddons": []
                }
              ]
            }
          ]
        }
      ],
      "TotalResults": 2
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "2121as12-1a2s-1s2a-2a1s-12as21sa12as",
  "ExpirationDate": "2019-01-29T15:15:46.2172447+01:00",
  "TotalResults": 2,
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as date. The filter can also include content filtering, such as only including those activities associated with a particular CBIS category or with certain attributes. Content filtering possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The return structure is a list of Activity Groups (such as ski lessons) which contain activities (e.g one for each skill level). Each activity contains Occasions, each of which defines a possible start date, time and duration for the Activity (e.g. morning lessons, afternoon lessons). Finally each occasion has a list of quotes, which are the bookable objects, in each of these you will find all the information related to price groups, prices and other pertinent information and the BookKey (e.g. one price for adults, another for children). The most important return values in the response are the SearchId and the BookKey found in each Quote object, they are used in the Basket, also pay attention to the ExpirationDate of the SearchId. It is also worth paying attention to the Minimum and Maximum Items to Book. These are often values set by external systems and if your basket item is outside these parameters it may fail to commit. A null value means unrestricted. Booking Conditions and Discount Information relate can contain specific supplier information or Campaign information respectively. IMPORTANT: Paging is 0-indexed.

HTTP Request

POST https://galaxy.citybreak.com/availability/activity

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Date": "2018-12-30", //DateTime - Mandatory "Currency": "string", //string - Mandatory e.g SEK or EUR "PageSize": 0, //int Mandatory, 0-Indexed "Sort": { // Optional - defaults to Price Ascending "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, "ContentFilter": { // Optional - See ContentFilter }, "OutputFilter": { // Optional - See OutputFilter }, "PromoCode": "string" // string - Optional }

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "Page": 0,
  "PageSize": 20,
  "SearchId": "2121as12-1a2s-1s2a-2a1s-12as21sa12as"
}' 'https://galaxy.citybreak.com/v5/api/availability/activity/get'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/activity/get",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "Page": 0,
    "PageSize": 20,
    "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh"
  })  
});

Example of response:

{
  "ActivitySearch": {
    "PointOfSalesId": 0,
    "Date": "2019-02-18T00:00:00",
    "Currency": "NOK",
    "PageSize": 20,
    "Page": 0,
    "Sort": {
      "Order": "Asc",
      "Field": "Price"
    },
    "ContentFilter": null,
    "OutputFilter": null
  },
  "ActivityGroups": [
    {
      "Id": "cbis:12345",
      "Name": "Off Piste Ski Lessons",
      "Content": {
        "PriceFrom": 0,
        "Images": [                            
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=123",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Off Piste Ski Lessons"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      },
      "Activities": [
        {
          "Id": "cbis:1501474",
          "Name": "Advanced Off Piste Ski Lessons",
          "MaximumItemsBookable": null,
          "MinimumItemsBookable": 2,
          "Content": {
            "PriceFrom": 0,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Advanced Off Piste Ski Lessons"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "Occasions": [
            {
              "Start": "2019-02-18T09:00:00",
              "Duration": "08:00:00",
              "Quotes": [
                {
                  "BookKey": "127-T",
                  "AvailableCapacity": 4,
                  "Price": {
                    "PriceGroupCode": "ADT",
                    "PriceGroupName": "Adult",
                    "Age": null,
                    "Price": 2100,
                    "OriginalPrice": 0,
                    "Currency": "NOK"
                  },
                  "BookingConditions": {
                    "Name": null,
                    "Terms": null
                  },
                  "DiscountInformation": {
                    "Name": null,
                    "Description": null
                  },
                  "IncludedAddons": []
                }
              ]
            }
          ]
        }
      ],
      "TotalResults": 1
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "2121as12-1a2s-1s2a-2a1s-12as21sa12as",
  "ExpirationDate": "2019-01-29T15:15:46.2172447+01:00",
  "TotalResults": 2,
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with a valid (non-expired) SearchId. The filter otherwise has the same constraints as in the original Activity availability search. You can see a bare minimum version of this search in the examples. IMPORTANT: Paging is 0-indexed.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/activity/get

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "Page":1, //int mandatory - the pager is 0-indexed so 1 is the second page "PageSize": 0, //int Mandatory "Sort": { // Optional "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, //string - Mandatory - the search Id of a still valid activity availability search "SearchId":"string", "OutputFilter": { // Optional - See OutputFilter } }

Calendar Search By Day

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 0,
  "Start": "2018-12-14",
  "End": "2018-12-16",
  "Currency": "DKK"
}' 'https://galaxy.citybreak.com/v5/api/availability/activity/calendar/byday'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/activity/calendar/byday",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 0,
    "Start": "2018-12-13",
    "End": "2018-12-16",
    "Currency": "DKK"
  })  
});

Example of response:

{
  "Days": [
    {
      "Date": "2018-12-14T00:00:00",
      "Activities": [
        "cbis:1234",
        "cbis:1235"
      ]
    },
    {
      "Date": "2018-12-14T00:00:00",
      "Activities": null
    },
    {
      "Date": "2018-12-15T00:00:00",
      "Activities": [
        "cbis:1234",
        "cbis:1235"
        "cbis:1236"
      ]
    },
    {
      "Date": "2018-12-16T00:00:00",
      "Activities": [
        "cbis:1234",
        "cbis:1236"
      ]
    }
  ],
  "PromoCodeStatus": "None",
  "CalendarContext": {
    "PointOfSalesId": 0,
    "Start": "2018-12-14T00:00:00",
    "End": "2018-12-16T00:00:00",
    "Currency": "DKK",
    "ContentFilter": {
      "Ids":[
          "cbis:1234",
          "cbis:1235"
          "cbis:1236"
        ]
    },
    "PromoCode": null
  },
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as the start and end dates of the calendar, the pointOfSalesId and the currency. As in other availability queries, the filter can also include a content filter, such as only those activities associated with a particular CBIS category or with certain attributes. This is especially handy if you want a very quick look at availability for a specific product or products over a range of days. Content possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The return of this call is a set of availble dates (if there is availability) an entity called Activities which is a set of the cbis IDs of the activities (as opposed to activity groups) available on that day. This is useful for, say, quickly displaying days on which you can find available activities. You can use the Product content call with if you also wish to populate a specific activity with content (check the relations field if you want the content of the encapsulating group)

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/activity/calendar/byday

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Start": "2018-12-14", //DateTime - Mandatory, conforms to ISO 8601 "End": "2018-12-16", //DateTime - Mandatory, conforms to ISO 8601 "Currency": "string", //string - Mandatory e.g SEK or EUR "ContentFilter": { // Optional - See ContentFilter }, "PromoCode": "string" // string - Optional }

Calendar Search By Product

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 0,
  "Start": "2019-02-16",
  "End": "2019-02-19",
  "Currency": "EUR",
  "ContentFilter": {
    "Ids": [
      "cbis:12345",
      "cbis:12346"
    ]
  },
  "OutputFilter":{
    "Attributes":[99],
    "Categories": false,
    "Geos": false,
    "Pois": false,
    "Position": false
  }
}' 'https://galaxy.citybreak.com/v5/api/availability/activity/calendar/byproduct'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/activity/calendar/byproduct",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 0,
    "Start": "2019-02-16",
    "End": "2019-02-19",
    "Currency": "EUR",
    "ContentFilter": {
      "Ids": [
      "cbis:12345",
      "cbis:12346"
      ]
    },
    "OutputFilter":{
      "Attributes":[99],
      "Categories": false,
      "Geos": false,
      "Pois": false,
      "Position": false
    }
  })  
});

Example of response:

{
  "CalendarContentContext": {
      "PointOfSalesId": 18280,
      "Start": "2019-02-16T00:00:00",
      "End": "2019-02-19T00:00:00",
      "Currency": "EUR",
      "ContentFilter": null,
      "OutputFilter": {
        "Attributes": [
          99
        ],
        "Categories": false,
        "Geos": false,
        "Pois": false,
        "Position": false
      },
      "PromoCode": null
  },
  "ActivityGroups": [
    {
      "Id": "cbis:123245",
      "Name": "Rappeling Down the Ice Wall in Pyhä-Luosto",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1235",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1235",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Rappeling Down the Ice Wall in Pyhä-Luosto"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      },
      "Activities": [
        {
          "Id": "cbis:12347",
          "Name": "Rappeling Down the Ice Wall in Pyhä-Luosto",
          "Content": {
            "PriceFrom": null,
            "Images": [],
              "Information": [
                {
                  "Id": 99,
                  "Name": "Name",
                  "Value": "Rappeling Down the Ice Wall in Pyhä-Luosto"
                }
              ],
              "Categories": null,
              "Geos": null,
              "Pois": null,
              "Position": null
          },
          "AvailableDates": [
            "2019-02-16T00:00:00Z",
            "2019-02-18T00:00:00Z",
            "2019-02-19T00:00:00Z"
          ]
        }
      ],
      "TotalResults": 1
    },
    {
      "Id": "cbis:123246",
      "Name": "Climbing up the Ice Wall in Pyhä-Luosto",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1234",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1234",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Climbing up the Ice Wall in Pyhä-Luosto"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      },
      "Activities": [
        {
          "Id": "cbis:12348",
          "Name": "Climbing up the Ice Wall in Pyhä-Luosto",
          "Content": {
            "PriceFrom": null,
            "Images": [],
              "Information": [
                {
                  "Id": 99,
                  "Name": "Name",
                  "Value": "Climbing up the Ice Wall in Pyhä-Luosto"
                }
              ],
              "Categories": null,
              "Geos": null,
              "Pois": null,
              "Position": null
          },
          "AvailableDates": [
            "2019-02-17T00:00:00Z",
            "2019-02-18T00:00:00Z",
            "2019-02-19T00:00:00Z"
          ]
        }
      ],
      "TotalResults": 1
    },
  ],
  "PromoCodeStatus": "None",
  "TotalResults": 2,
  "Operations": [
    {
      "System": "ExternalSystem",
      "Account": "ExternalAccount",
      "Action": "Search",
      "Duration": "00:00:01",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as the start and end dates of the calendar, the pointOfSalesId and the currency. As in other availability queries, the filter can also include a content filter, such as only those activities associated with a particular CBIS category or with certain attributes. As there is no paging for the calendar content search it is sensible to request the bare minimum both in terms of products searched and content returned. Content possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The return of this call the activity groups and activities that have availabilities within the time range you are looking for, instead of occasions and quotes you simply get a list of days the product is available.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/activity/calendar/byproduct

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Start": "2018-12-14", //DateTime - Mandatory, conforms to ISO 8601 "End": "2018-12-16", //DateTime - Mandatory, conforms to ISO 8601 "Currency": "string", //string - Mandatory e.g SEK or EUR "ContentFilter": { // Optional - See ContentFilter }, "OutputFilter": { // Optional - See OutputFilter }, "PromoCode": "string" // string - Optional }

Availability - Transport

Availability - Transport calls provide information about the availability of any type of transport products. The search will return products with availability, including content, pricing groups, included addons as well as a Search ID with its Expiry.

The SearchId can be used to retrieve prior, cached searches in a much shorter amount of time if used before its Expiry. The object recalled by the search contains all the unfiltered information retrieved in the first search, so further or different filtering on content, etc. can be done in this call.

The SearchId and the BookingKey of each quote are used in the basket operations to add the product found to the Basket

GET and POST operations

Transport

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 13723,
  "Currency": "NOK",
  "PageSize": 50,
  "ContentFilter": {
	  "Ids": [
		"cbis:822973"
	  ]
  },
  "Persons": [
    {
      "Code": "474",
      "Quantity": 1
    }
  ],
  "Routes": [
    {
      "DepartureLocationCode": "18431",
      "DepartureDate": "2020-09-17",
      "ArrivalLocationCode": "18430"
    },
    {
      "DepartureLocationCode": "18430",
      "DepartureDate": "2020-09-17",
      "ArrivalLocationCode": "18431"
    }
  ]
}' 'https://galaxy.citybreak.com/v5/api/availability/transport'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/transport",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		"Accept-Language": "en-US"
	},
	body: JSON.Stringify({
  "PointOfSalesId": 13723,
  "Currency": "NOK",
  "PageSize": 50,
  "ContentFilter": {
	  "Ids": [
		"cbis:822973"
	  ]
  },
  "Persons": [
    {
      "Code": "474",
      "Quantity": 1
    }
  ],
  "Routes": [
    {
      "DepartureLocationCode": "18431",
      "DepartureDate": "2020-09-17",
      "ArrivalLocationCode": "18430"
    },
    {
      "DepartureLocationCode": "18430",
      "DepartureDate": "2020-09-17",
      "ArrivalLocationCode": "18431"
    }
  ]
  })
});

Example of response:

{
  "TransportSearch": {
    "PointOfSalesId": 13723,
    "Currency": "NOK",
    "PageSize": 50,
    "Page": 0,
    "Sort": {
      "Order": "Asc",
      "Field": "Price"
    },
    "ContentFilter": {
      "Geos": [],
      "Categories": [],
      "Pois": [],
      "Search": null,
      "Position": null,
      "Information": null,
      "Ids": [
        "cbis:822973"
      ]
    },
    "Persons": [
      {
        "Code": "474",
        "Quantity": 1
      }
    ],
    "Vehicles": [],
    "Routes": [
      {
        "DepartureLocationCode": "18431",
        "DepartureDate": "2020-09-17T00:00:00",
        "ArrivalLocationCode": "18430"
      },
      {
        "DepartureLocationCode": "18430",
        "DepartureDate": "2020-09-17T00:00:00",
        "ArrivalLocationCode": "18431"
      }
    ],
    "PromoCode": null
  },
  "Locations": [
    {
      "Code": "0",
      "City": "Hellesylt",
      "Country": null,
      "Name": "Hellesylt",
      "Position": null,
      "State": null,
      "Regions": null
    }
  ],
  "Fares": [
    {
      "Code": "20GCF",
      "Name": "20GCF",
      "Content": {
        "Id": null,
        "Images": null,
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "20GCF"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      },
      "LuggageIncluded": null,
      "MarketingCarrierCode": "TF"
    },
    {
      "Code": "20GCFR",
      "Name": "20GCFR",
      "Content": {
        "Id": null,
        "Images": null,
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "20GCFR"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      },
      "LuggageIncluded": null,
      "MarketingCarrierCode": "TF"
    }
  ],
  "Cabins": [
    {
      "Code": "",
      "Name": null,
      "Content": {
        "Id": null,
        "Images": null,
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": null
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    }
  ],
  "Content": [
    {
      "Id": "cbis:822973",
      "Images": [
        {
          "Uri": "//images.test.citybreak.com/image.aspx?ImageId=4020176",
          "IsMain": false,
          "Name": null,
          "Copyright": null,
          "Description": null
        },
        {
          "Uri": "//images.test.citybreak.com/image.aspx?ImageId=4020185",
          "IsMain": true,
          "Name": null,
          "Copyright": null,
          "Description": null
        },
        {
          "Uri": "//images.test.citybreak.com/image.aspx?ImageId=4577969",
          "IsMain": false,
          "Name": null,
          "Copyright": null,
          "Description": null
        }
      ],
      "Information": [
        {
          "Id": 141,
          "Name": "Price from",
          "Value": "310"
        },
        {
          "Id": 297,
          "Name": "Zoom level",
          "Value": "14"
        },
        {
          "Id": 910,
          "Name": "UrlName",
          "Value": "Fjord_Cruise_Geirangerfjorden_bat_822973"
        },
        {
          "Id": 145,
          "Name": "Phone number (Booking)",
          "Value": "57631400"
        },
        {
          "Id": 147,
          "Name": "Country code (Booking)",
          "Value": "+47"
        },
        {
          "Id": 99,
          "Name": "Name",
          "Value": "Fjord Cruise Geirangerfjord"
        },
        {
          "Id": 101,
          "Name": "Introduction",
          "Value": "One of the most famous fjords in the world."
        },
        {
          "Id": 102,
          "Name": "Description",
          "Value": "Geirangerfjord is known as the real jewel of the Norwegian fjords. With its characteristic S shape, high waterfalls and abandoned mountain farms, the fjord landscape is included on UNESCO's list of World Heritage sites. Here you find unspoilt and beautiful nature and cultural experiences the whole year round!\r\n\r\nNB! When booking a vehicle, the driver is included in the price!\r\nNB! Select \"1 traveller\" when ordering the Carpackage! This product includes: car, driver and up to 4 passengers."
        },
        {
          "Id": 402,
          "Name": "Currency",
          "Value": "NOK"
        },
        {
          "Id": 415,
          "Name": "Price description",
          "Value": "Per person"
        },
        {
          "Id": 710,
          "Name": "Departure from",
          "Value": "Geiranger & Hellesylt"
        },
        {
          "Id": 100017,
          "Name": "Summer",
          "Value": "True"
        },
        {
          "Id": 100587,
          "Name": "All year",
          "Value": "False"
        },
        {
          "Id": 100588,
          "Name": "Winter",
          "Value": "False"
        },
        {
          "Id": 100738,
          "Name": "Fall",
          "Value": "True"
        },
        {
          "Id": 100739,
          "Name": "Spring",
          "Value": "True"
        },
        {
          "Id": 100847,
          "Name": "January",
          "Value": "False"
        },
        {
          "Id": 100848,
          "Name": "February",
          "Value": "False"
        },
        {
          "Id": 100849,
          "Name": "March",
          "Value": "False"
        },
        {
          "Id": 100850,
          "Name": "April",
          "Value": "False"
        },
        {
          "Id": 100851,
          "Name": "May",
          "Value": "True"
        },
        {
          "Id": 100852,
          "Name": "June",
          "Value": "True"
        },
        {
          "Id": 100853,
          "Name": "July",
          "Value": "True"
        },
        {
          "Id": 100854,
          "Name": "August",
          "Value": "True"
        },
        {
          "Id": 100855,
          "Name": "September",
          "Value": "True"
        },
        {
          "Id": 100856,
          "Name": "October",
          "Value": "True"
        },
        {
          "Id": 100857,
          "Name": "November",
          "Value": "False"
        },
        {
          "Id": 100858,
          "Name": "December",
          "Value": "False"
        },
        {
          "Id": 100939,
          "Name": "Monday",
          "Value": "True"
        },
        {
          "Id": 100940,
          "Name": "Tuesday",
          "Value": "True"
        },
        {
          "Id": 100941,
          "Name": "Wednesday",
          "Value": "True"
        },
        {
          "Id": 100942,
          "Name": "Thursday",
          "Value": "True"
        },
        {
          "Id": 100943,
          "Name": "Friday",
          "Value": "True"
        },
        {
          "Id": 100944,
          "Name": "Saturday",
          "Value": "True"
        },
        {
          "Id": 100945,
          "Name": "Sunday",
          "Value": "True"
        },
        {
          "Id": 102390,
          "Name": "All days",
          "Value": "False"
        },
        {
          "Id": 102391,
          "Name": "No (bicycles not allowed)",
          "Value": "False"
        },
        {
          "Id": 102392,
          "Name": "Yes (bicycles allowed)",
          "Value": "False"
        },
        {
          "Id": 102393,
          "Name": "Everyone",
          "Value": "False"
        },
        {
          "Id": 102394,
          "Name": "Family",
          "Value": "False"
        },
        {
          "Id": 102395,
          "Name": "The adventurous",
          "Value": "False"
        },
        {
          "Id": 102679,
          "Name": "One departure per day",
          "Value": "False"
        },
        {
          "Id": 102682,
          "Name": "Several departures per day",
          "Value": "True"
        },
        {
          "Id": 102683,
          "Name": "1-2 hours",
          "Value": "True"
        },
        {
          "Id": 102684,
          "Name": "2-4 hours",
          "Value": "False"
        },
        {
          "Id": 102685,
          "Name": "4-6 hours",
          "Value": "False"
        },
        {
          "Id": 102686,
          "Name": "One day",
          "Value": "False"
        },
        {
          "Id": 102687,
          "Name": "Several days",
          "Value": "False"
        }
      ],
      "Categories": [
        {
          "Id": 26397,
          "Path": "Aurland (Visit Flåm)"
        },
        {
          "Id": 26401,
          "Path": "To do"
        },
        {
          "Id": 26402,
          "Path": "Activities"
        },
        {
          "Id": 26403,
          "Path": "Fjord Cruise"
        },
        {
          "Id": 26397,
          "Path": "Aurland (Visit Flåm)"
        },
        {
          "Id": 26401,
          "Path": "To do"
        },
        {
          "Id": 26402,
          "Path": "Activities"
        },
        {
          "Id": 26397,
          "Path": "Aurland (Visit Flåm)"
        },
        {
          "Id": 26401,
          "Path": "To do"
        }
      ],
      "Geos": [
        {
          "Id": 76664,
          "Path": "[Aurland (Visit Flåm)]"
        },
        {
          "Id": 108308,
          "Path": "Norway"
        },
        {
          "Id": 86110,
          "Path": "Geirangerfjorden"
        }
      ],
      "Pois": [],
      "Position": {
        "Latitude": 62.1020583040084,
        "Longitude": 7.20629342263521
      }
    }
  ],
  "Carriers": [
    {
      "Code": "TF",
      "Name": "The Fjords",
      "Content": {
        "Id": null,
        "Images": null,
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "The Fjords"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    }
  ],
  "Vehicles": [
    {
      "Code": "GE1",
      "Name": "GE1",
      "Content": {
        "Id": null,
        "Images": null,
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "GE1"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    }
  ],
  "IncludedAddons": [],
  "Results": [
    {
      "BookKey": "896582862-T",
      "Price": {
        "Price": 470,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T09:30:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T10:35:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5203"
          }
        ],
        "FareCode": "20GCF",
        "IncludedAddons": []
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T11:00:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T12:05:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5204"
          }
        ],
        "FareCode": "20GCFR",
        "IncludedAddons": []
      }
    },
    {
      "BookKey": "43279953-T",
      "Price": {
        "Price": 470,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T09:30:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T10:35:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5203"
          }
        ],
        "FareCode": "20GCF",
        "IncludedAddons": []
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T14:00:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T15:05:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5208"
          }
        ],
        "FareCode": "20GCFR",
        "IncludedAddons": []
      }
    },
    {
      "BookKey": "1748076464-T",
      "Price": {
        "Price": 470,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T09:30:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T10:35:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5203"
          }
        ],
        "FareCode": "20GCF",
        "IncludedAddons": []
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T17:00:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T18:05:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5212"
          }
        ],
        "FareCode": "20GCFR",
        "IncludedAddons": []
      }
    },
    {
      "BookKey": "909609591-T",
      "Price": {
        "Price": 470,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T12:30:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T13:35:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5207"
          }
        ],
        "FareCode": "20GCF",
        "IncludedAddons": []
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T14:00:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T15:05:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5208"
          }
        ],
        "FareCode": "20GCFR",
        "IncludedAddons": []
      }
    },
    {
      "BookKey": "1717088448-T",
      "Price": {
        "Price": 470,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T12:30:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T13:35:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5207"
          }
        ],
        "FareCode": "20GCF",
        "IncludedAddons": []
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T17:00:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T18:05:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5212"
          }
        ],
        "FareCode": "20GCFR",
        "IncludedAddons": []
      }
    },
    {
      "BookKey": "1121434601-T",
      "Price": {
        "Price": 470,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T15:30:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T16:35:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5211"
          }
        ],
        "FareCode": "20GCF",
        "IncludedAddons": []
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "01:05:00",
        "CabinCode": "",
        "ContentCode": "cbis:822973",
        "Legs": [
          {
            "DepartureLocationCode": "0",
            "DepartureTime": "2020-09-17T17:00:00",
            "ArrivalLocationCode": "0",
            "ArrivalTime": "2020-09-17T18:05:00",
            "Duration": "01:05:00",
            "OperatingCarrierCode": "TF",
            "VehicleCode": "GE1",
            "TransportNumber": "5212"
          }
        ],
        "FareCode": "20GCFR",
        "IncludedAddons": []
      }
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "119b7042-0fb6-4918-9775-5b8854734c51",
  "ExpirationDate": "2020-09-11T13:07:36.0248923+02:00",
  "TotalResults": 6,
  "Operations": [
    {
      "System": "Inventory (The Fjords)",
      "Account": "Inventory Pakke (The Fjords)",
      "Action": "Search",
      "Duration": "00:00:23.3486751",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as person configuration and routes. One route has to have both arrival and deprature location codes as well as departure date. In order to preform a return trip search two routes need to be added in search request. The Most important return values in this response are the SearchId and the BookingKey used in the Basket, also pay attention to the ExpirationDate of the SearchId

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/transport

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Currency": "string", //string - Mandatory e.g SEK or EUR "PageSize": 0, //int Mandatory "Sort": { // Optional - defaults to Price Ascending "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, "ContentFilter": { // Optional - See ContentFilter }, "Persons": [ //Mandatory - Cannot be empty, must represent at least one guest { "Code": "string", //string - price group code - Mandatory "Quantity": 0 //int - number of persons with matching price group code - Mandatory } ], "Vehicles": [ //Optional - vehicle configuration { "Code": "string", //string - vehicle code - Mandatory if parent included "Quantity": 0 //int - number of vehicles with matching vehicle code - Mandatory if parent included } ], "Routes": [ //Mandatory - list of routes { "DepartureLocationCode": "string", //string - Mandatory "DepartureDate": "2020-07-21T09:45:20.179Z", //DateTime - Mandatory "ArrivalLocationCode": "string" //string - Mandatory } ], "PromoCode": "string" // string - Optional }

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "Page": 0,
  "PageSize": 20,
  "SearchId": "c2b2e3c4-53e0-41ff-8012-8c9da7fa053a"
}' 'https://galaxy.citybreak.com/v5/api/availability/transport/get'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/transport/get",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
	    "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "Page": 0,
    "PageSize": 20,
    "SearchId": "c2b2e3c4-53e0-41ff-8012-8c9da7fa053a"
  })  
});

Example of response:

{
  "TransportSearch": {
    "PointOfSalesId": 18724,
    "Currency": "NOK",
    "PageSize": 50,
    "Page": 0,
    "Sort": {
      "Order": "Asc",
      "Field": "Price"
    },
    "ContentFilter": null,
    "Persons": [
      {
        "Code": "997",
        "Quantity": 2
      }
    ],
    "Vehicles": [
      {
        "Code": "998",
        "Quantity": 1
      }
    ],
    "Routes": [
      {
        "DepartureLocationCode": "25130",
        "DepartureDate": "2020-08-17T00:00:00",
        "ArrivalLocationCode": "25140"
      },
      {
        "DepartureLocationCode": "25140",
        "DepartureDate": "2020-08-18T00:00:00",
        "ArrivalLocationCode": "25130"
      }
    ]
  },
  "Locations": [
    {
      "Code": "25130",
      "City": null,
      "Country": null,
      "Name": "Amsterdam",
      "Position": null,
      "State": null,
      "Regions": null
    },
    {
      "Code": "25140",
      "City": null,
      "Country": null,
      "Name": "Newcastle",
      "Position": null,
      "State": null,
      "Regions": null
    }
  ],
  "Fares": [
    {
      "Code": "SVAN",
      "Name": "DFDS",
      "Content": {
        "Images": null,
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "DFDS"
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "Choose from a range of cabins to suit your budget. From standard inside or sea view cabins, economy cabins or a premium commodore cabin with breakfast and free WiFi included.\r\nPlease note: Prices per cabin. Infants (0-3 years) can stay in the cabin in addition to the number of beds stated if the infant does not need a separate bed."
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      },
      "LuggageIncluded": null,
      "MarketingCarrierCode": "DFDS"
    }
  ],
  "Cabins": [
    {
      "Code": "B2",
      "Name": "2-bed inside cabin with bunk beds",
      "Content": {
        "Images": [
          {
            "Uri": "//resources.citybreak.com/online3/img/ferry/DFDS/B2.jpg",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "2-bed inside cabin with bunk beds"
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "• Internal standard cabin with 2 beds.\r\n• The cabin is designed for 1-2 people\r\n• Bunk beds\r\n• Shower and toilet"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    },
    {
      "Code": "BD",
      "Name": "2-bed inside cabin with double bed ",
      "Content": {
        "Images": [
          {
            "Uri": "//resources.citybreak.com/online3/img/ferry/DFDS/BD.jpg",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "2-bed inside cabin with double bed "
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "• Standard cabin\r\n• The cabin is for 1-2 people\r\n• Small double bed\r\n• Shower and toilet\r\n\r\nStandard Standard Cabin with Small Double Bed."
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    }
  ],
  "Content": [],
  "Carriers": [
    {
      "Code": "DFDS",
      "Name": "DFDS",
      "Content": {
        "Images": null,
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "DFDS"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    }
  ],
  "Vehicles": [],
  "IncludedAddons": [
    {
      "Code": "NCLCT/ADL_NCLCT/ADL_LandServices",
      "Name": "Land Services Excursion, for all passengers",
      "Content": {
        "Images": [],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Land Services Excursion, for all passengers"
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "LandServices Description"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    },
    {
      "Code": "NCLTC/ADL_NCLTC/ADL_LandServices",
      "Name": "Land Services Excursion, for all passengers",
      "Content": {
        "Images": [],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Land Services Excursion, for all passengers"
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "LandServices Description"
          }
        ],
        "Categories": null,
        "Geos": null,
        "Pois": null,
        "Position": null
      }
    }
  ],
  "Results": [
    {
      "BookKey": "1110008262-T",
      "Price": {
        "Price": 3060,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "15:45:00",
        "CabinCode": "B2",
        "Legs": [
          {
            "DepartureLocationCode": "25130",
            "DepartureTime": "2020-08-17T17:30:00",
            "ArrivalLocationCode": "25140",
            "ArrivalTime": "2020-08-18T09:15:00",
            "Duration": "15:45:00",
            "OperatingCarrierCode": "DFDS",
            "VehicleCode": null,
            "TransportNumber": "NLAMS"
          }
        ],
        "FareCode": "SVAN",
        "IncludedAddons": [
          {
            "AddonCode": "NCLCT/ADL_NCLCT/ADL_LandServices",
            "Price": 10,
            "Currency": "EUR",
            "PriceIncluded": true
          }
        ]
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": null
    },
    {
      "BookKey": "59730793-T",
      "Price": {
        "Price": 3140,
        "Currency": "NOK"
      },
      "OutboundJourney": {
        "Duration": "15:45:00",
        "CabinCode": "BD",
        "Legs": [
          {
            "DepartureLocationCode": "25130",
            "DepartureTime": "2020-08-17T17:30:00",
            "ArrivalLocationCode": "25140",
            "ArrivalTime": "2020-08-18T09:15:00",
            "Duration": "15:45:00",
            "OperatingCarrierCode": "DFDS",
            "VehicleCode": null,
            "TransportNumber": "NLAMS"
          }
        ],
        "FareCode": "SVAN",
        "IncludedAddons": [
          {
            "AddonCode": "NCLCT/ADL_NCLCT/ADL_LandServices",
            "Price": 10,
            "Currency": "EUR",
            "PriceIncluded": true
          }
        ]
      },
      "PromoCodeDescription": null,
      "HomeboundJourney": null
    },
    {
      "BookKey": "1600706669-T",
      "Price": {
        "Price": 3470,
        "Currency": "NOK"
      },
      "OutboundJourney": null,
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "16:45:00",
        "CabinCode": "B2",
        "Legs": [
          {
            "DepartureLocationCode": "25140",
            "DepartureTime": "2020-08-18T17:00:00",
            "ArrivalLocationCode": "25130",
            "ArrivalTime": "2020-08-19T09:45:00",
            "Duration": "16:45:00",
            "OperatingCarrierCode": "DFDS",
            "VehicleCode": null,
            "TransportNumber": "GBNEW"
          }
        ],
        "FareCode": "SVAN",
        "IncludedAddons": [
          {
            "AddonCode": "NCLTC/ADL_NCLTC/ADL_LandServices",
            "Price": 10,
            "Currency": "EUR",
            "PriceIncluded": true
          }
        ]
      }
    },
    {
      "BookKey": "293005052-T",
      "Price": {
        "Price": 3550,
        "Currency": "NOK"
      },
      "OutboundJourney": null,
      "PromoCodeDescription": null,
      "HomeboundJourney": {
        "Duration": "16:45:00",
        "CabinCode": "BD",
        "Legs": [
          {
            "DepartureLocationCode": "25140",
            "DepartureTime": "2020-08-18T17:00:00",
            "ArrivalLocationCode": "25130",
            "ArrivalTime": "2020-08-19T09:45:00",
            "Duration": "16:45:00",
            "OperatingCarrierCode": "DFDS",
            "VehicleCode": null,
            "TransportNumber": "GBNEW"
          }
        ],
        "FareCode": "SVAN",
        "IncludedAddons": [
          {
            "AddonCode": "NCLTC/ADL_NCLTC/ADL_LandServices",
            "Price": 10,
            "Currency": "EUR",
            "PriceIncluded": true
          }
        ]
      }
    }
  ],
  "PromoCodeStatus": "None",
  "SearchId": "c2b2e3c4-53e0-41ff-8012-8c9da7fa053a",
  "ExpirationDate": "2020-07-22T11:30:18.205109+02:00",
  "TotalResults": 23,
  "Operations": [
    {
      "System": "FerryGateway DFDS",
      "Account": "Ferry Gateway DFDS test EUR",
      "Action": "Search",
      "Duration": "00:00:08.0929013",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with a valid (non-expired) SearchId. The filter otherwise has the same constraints as in the original Transport availability search. You can see a bare minimum version of this search in the examples.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/transport/get

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "Page":0, //int mandatory - the pager is 0-indexed so 1 is the second page "PageSize": 0, //int Mandatory "Sort": { // Optional "Order": "Asc", //string - Mandatory if parent included "Field": "string" //string - Mandatory if parent included - Price, Name, Random }, //string - Mandatory - the search Id of a still valid accommodation availability search "SearchId":"string" }

Calendar Search By Day

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 13723,
  "Start": "2020-10-01",
  "End": "2020-10-07",
  "Currency": "NOK"
}' 'https://galaxy.citybreak.com/v5/api/availability/transport/calendar/byday'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/transport/calendar/byday",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 13723,
    "Start": "2020-10-01",
    "End": "2020-10-07",
    "Currency": "NOK"
  })  
});

Example of response:

{
  "Days": [
    {
      "Date": "2020-10-01T00:00:00",
      "Transports": [
        "cbis:1614826",
        "cbis:903744"
      ],
      "TransportDetails": [
        {
          "Id": "cbis:1614826",
          "Availability": 384,
          "PriceFrom": null,
          "StartDate": "2020-10-01T00:00:00+02:00"
        },
        {
          "Id": "cbis:903744",
          "Availability": 120,
          "PriceFrom": null,
          "StartDate": "2020-10-01T00:00:00+02:00"
        }
      ]
    },
    {
      "Date": "2020-10-02T00:00:00",
      "Transports": [
        "cbis:1614826",
        "cbis:903744"
      ],
      "TransportDetails": [
        {
          "Id": "cbis:1614826",
          "Availability": 384,
          "PriceFrom": null,
          "StartDate": "2020-10-02T00:00:00+02:00"
        },
        {
          "Id": "cbis:903744",
          "Availability": 120,
          "PriceFrom": null,
          "StartDate": "2020-10-02T00:00:00+02:00"
        }
      ]
    },
    {
      "Date": "2020-10-03T00:00:00",
      "Transports": [
        "cbis:1614826",
        "cbis:903744"
      ],
      "TransportDetails": [
        {
          "Id": "cbis:1614826",
          "Availability": 384,
          "PriceFrom": null,
          "StartDate": "2020-10-03T00:00:00+02:00"
        },
        {
          "Id": "cbis:903744",
          "Availability": 120,
          "PriceFrom": null,
          "StartDate": "2020-10-03T00:00:00+02:00"
        }
      ]
    },
    {
      "Date": "2020-10-04T00:00:00",
      "Transports": [
        "cbis:1614826",
        "cbis:903744"
      ],
      "TransportDetails": [
        {
          "Id": "cbis:1614826",
          "Availability": 384,
          "PriceFrom": null,
          "StartDate": "2020-10-04T00:00:00+02:00"
        },
        {
          "Id": "cbis:903744",
          "Availability": 120,
          "PriceFrom": null,
          "StartDate": "2020-10-04T00:00:00+02:00"
        }
      ]
    },
    {
      "Date": "2020-10-05T00:00:00",
      "Transports": [
        "cbis:1614826",
        "cbis:903744"
      ],
      "TransportDetails": [
        {
          "Id": "cbis:1614826",
          "Availability": 384,
          "PriceFrom": null,
          "StartDate": "2020-10-05T00:00:00+02:00"
        },
        {
          "Id": "cbis:903744",
          "Availability": 120,
          "PriceFrom": null,
          "StartDate": "2020-10-05T00:00:00+02:00"
        }
      ]
    },
    {
      "Date": "2020-10-06T00:00:00",
      "Transports": [
        "cbis:1614826",
        "cbis:903744"
      ],
      "TransportDetails": [
        {
          "Id": "cbis:1614826",
          "Availability": 384,
          "PriceFrom": null,
          "StartDate": "2020-10-06T00:00:00+02:00"
        },
        {
          "Id": "cbis:903744",
          "Availability": 120,
          "PriceFrom": null,
          "StartDate": "2020-10-06T00:00:00+02:00"
        }
      ]
    },
    {
      "Date": "2020-10-07T00:00:00",
      "Transports": [
        "cbis:1614826",
        "cbis:903744"
      ],
      "TransportDetails": [
        {
          "Id": "cbis:1614826",
          "Availability": 384,
          "PriceFrom": null,
          "StartDate": "2020-10-07T00:00:00+02:00"
        },
        {
          "Id": "cbis:903744",
          "Availability": 120,
          "PriceFrom": null,
          "StartDate": "2020-10-07T00:00:00+02:00"
        }
      ]
    },
  ],
  "PromoCodeStatus": "None",
  "CalendarContext": {
    "PointOfSalesId": 13723,
    "Start": "2020-10-01T00:00:00",
    "End": "2020-10-07T00:00:00",
    "Currency": "NOK",
    "ContentFilter": null,
    "PromoCode": null
  },
  "Operations": [
    {
      "System": "Inventory (The Fjords)",
      "Account": "Inventory Pakke (The Fjords)",
      "Action": "Search",
      "Duration": "00:00:00.4750171",
      "Success": true,
      "ErrorMessage": null
    },
    {
      "System": "Inventory (Flåmsbana)",
      "Account": "Inventory (Flåmsbana)",
      "Action": "Search",
      "Duration": "00:00:00.0649991",
      "Success": true,
      "ErrorMessage": null
    },
    {
      "System": "Inventory (Sognefjorden)",
      "Account": "Inventory Pakke (Sognefjorden)",
      "Action": "Search",
      "Duration": "00:00:00.1220060",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as the start and end dates of the calendar, the pointOfSalesId and the currency. As in other availability queries, the filter can also include a content filter, such as only those transport products associated with a particular CBIS category or with certain attributes. This is especially handy if you want a very quick look at availability for a specific product or products over a range of days. Content possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The return of this call is a set of available dates (if there is availability) an entity called Transports which is a set of the cbis IDs of the transport products available on that day. This is useful for, say, quickly displaying days on which you can find available transports. You can use the Product content call if you also wish to populate a specific transport with content.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/transport/calendar/byday

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 13723, //int - Mandatory "Start": "2020-10-01", //DateTime - Mandatory, conforms to ISO 8601 "End": "2020-10-07", //DateTime - Mandatory, conforms to ISO 8601 "Currency": "string", //string - Mandatory e.g SEK or EUR "ContentFilter": { // Optional - See ContentFilter }, "PromoCode": "string" // string - Optional }

Calendar Search By Product

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 13723,
  "Start": "2020-10-01",
  "End": "2020-10-07",
  "Currency": "NOK",
  "ContentFilter": {
    "Ids": [
      "cbis:1614826",
      "cbis:903744"
    ]
  }
}' 'https://galaxy.citybreak.com/v5/api/availability/transport/calendar/byproduct'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/transport/calendar/byproduct",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 13723,
    "Start": "2020-10-01",
    "End": "2020-10-07",
    "Currency": "NOK",
    "ContentFilter": {
      "Ids": [
        "cbis:1614826",
        "cbis:903744"
      ]
    }
  })  
});

Example of response:

{
  "CalendarContentContext": {
    "PointOfSalesId": 13723,
    "Start": "2020-10-01T00:00:00",
    "End": "2020-10-07T00:00:00",
    "Currency": "NOK",
    "ContentFilter": null,
    "PromoCode": null
  },
  "TransportActivityCalendars": [
    {
      "Id": "cbis:1614826",
      "Name": "Nærøyfjord Sightseeing B2B ",
      "References": [
        "cbis:1614826",
        "pt:497702"
      ],
      "Content": {
        "Id": "cbis:1614826",
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=4019784",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=4287044",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 297,
            "Name": "Zoom level",
            "Value": "17"
          },
          {
            "Id": 910,
            "Name": "UrlName",
            "Value": "Nryfjord_Sightseeing_B2B__1614826"
          },
          {
            "Id": 145,
            "Name": "Phone number (Booking)",
            "Value": "57631400"
          },
          {
            "Id": 147,
            "Name": "Country code (Booking)",
            "Value": "+47"
          },
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Nærøyfjord Sightseeing B2B "
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Experience the Aurland fjord and Nærøy fjord up close. We travel from Flåm to Gudvangen and make sure you get back to the starting-point when you desire. "
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "Experience the Aurlandsfjord and Nærøyfjord, which is on the UNESCO world heritage list up close. \r\nThe route between Flåm and Gudvangen is one of the most popular fjord areas in all of Norway! The spectacular Nærøyfjord is surrounding by steep mountains (up to 1400m high) and beautiful waterfalls. \r\n\r\nEnjoy the silence and nature up close from one of our sightseeing boats. \r\n\r\nChoose between many departures and assemble your journey as you please.  For our disabeld guests we recommend our Premium vessels with universal design.\r\n\r\nOn board our boats we serve refreshments and light meals. "
          },
          {
            "Id": 402,
            "Name": "Currency",
            "Value": "NOK"
          },
          {
            "Id": 415,
            "Name": "Price description",
            "Value": "per person"
          },
          {
            "Id": 902,
            "Name": "Duration",
            "Value": "3-4 hours"
          },
          {
            "Id": 710,
            "Name": "Departure from",
            "Value": "Flåm & Gudvangen"
          },
          {
            "Id": 100017,
            "Name": "Summer",
            "Value": "False"
          },
          {
            "Id": 100588,
            "Name": "Winter",
            "Value": "False"
          },
          {
            "Id": 100738,
            "Name": "Fall",
            "Value": "False"
          },
          {
            "Id": 100739,
            "Name": "Spring",
            "Value": "False"
          },
          {
            "Id": 100939,
            "Name": "Monday",
            "Value": "False"
          },
          {
            "Id": 100587,
            "Name": "All year",
            "Value": "True"
          },
          {
            "Id": 102391,
            "Name": "No (bicycles not allowed)",
            "Value": "False"
          },
          {
            "Id": 100940,
            "Name": "Tuesday",
            "Value": "False"
          },
          {
            "Id": 100941,
            "Name": "Wednesday",
            "Value": "False"
          },
          {
            "Id": 100942,
            "Name": "Thursday",
            "Value": "False"
          },
          {
            "Id": 100943,
            "Name": "Friday",
            "Value": "False"
          },
          {
            "Id": 100944,
            "Name": "Saturday",
            "Value": "False"
          },
          {
            "Id": 100945,
            "Name": "Sunday",
            "Value": "False"
          },
          {
            "Id": 102390,
            "Name": "All days",
            "Value": "True"
          },
          {
            "Id": 102392,
            "Name": "Yes (bicycles allowed)",
            "Value": "False"
          },
          {
            "Id": 102393,
            "Name": "Everyone",
            "Value": "True"
          },
          {
            "Id": 102394,
            "Name": "Family",
            "Value": "False"
          },
          {
            "Id": 102395,
            "Name": "The adventurous",
            "Value": "False"
          },
          {
            "Id": 100847,
            "Name": "January",
            "Value": "True"
          },
          {
            "Id": 100848,
            "Name": "February",
            "Value": "True"
          },
          {
            "Id": 100849,
            "Name": "March",
            "Value": "True"
          },
          {
            "Id": 100850,
            "Name": "April",
            "Value": "True"
          },
          {
            "Id": 100851,
            "Name": "May",
            "Value": "True"
          },
          {
            "Id": 100852,
            "Name": "June",
            "Value": "True"
          },
          {
            "Id": 100853,
            "Name": "July",
            "Value": "True"
          },
          {
            "Id": 100854,
            "Name": "August",
            "Value": "True"
          },
          {
            "Id": 100855,
            "Name": "September",
            "Value": "True"
          },
          {
            "Id": 100856,
            "Name": "October",
            "Value": "True"
          },
          {
            "Id": 100857,
            "Name": "November",
            "Value": "True"
          },
          {
            "Id": 100858,
            "Name": "December",
            "Value": "True"
          }
        ],
        "Categories": [
          {
            "Id": 26397,
            "Path": "Aurland (Visit Flåm)"
          },
          {
            "Id": 26401,
            "Path": "To do"
          },
          {
            "Id": 26402,
            "Path": "Activities"
          },
          {
            "Id": 26403,
            "Path": "Fjord Cruise"
          },
          {
            "Id": 26397,
            "Path": "Aurland (Visit Flåm)"
          },
          {
            "Id": 26401,
            "Path": "To do"
          },
          {
            "Id": 26402,
            "Path": "Activities"
          }
        ],
        "Geos": [
          {
            "Id": 76664,
            "Path": "[Aurland (Visit Flåm)]"
          },
          {
            "Id": 108308,
            "Path": "Norway"
          },
          {
            "Id": 80944,
            "Path": "Flåm"
          }
        ],
        "Pois": [],
        "Position": {
          "Latitude": 60.8628231038964,
          "Longitude": 7.11472034454346
        }
      },
      "AvailableDates": [
        "2020-10-01T00:00:00+02:00",
        "2020-10-02T00:00:00+02:00",
        "2020-10-03T00:00:00+02:00",
        "2020-10-04T00:00:00+02:00",
        "2020-10-05T00:00:00+02:00",
        "2020-10-06T00:00:00+02:00",
        "2020-10-07T00:00:00+02:00"
      ]
    },
    {
      "Id": "cbis:903744",
      "Name": "The Flåm Railway + hiking the Flåm valley",
      "References": [
        "cbis:903744",
        "pt:476556"
      ],
      "Content": {
        "Id": "cbis:903744",
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=3151120",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=4855502",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 141,
            "Name": "Price from",
            "Value": "370"
          },
          {
            "Id": 297,
            "Name": "Zoom level",
            "Value": "18"
          },
          {
            "Id": 910,
            "Name": "UrlName",
            "Value": "Ga_Flamsdalen_903744"
          },
          {
            "Id": 145,
            "Name": "Phone number (Booking)",
            "Value": "57631400"
          },
          {
            "Id": 147,
            "Name": "Country code (Booking)",
            "Value": "+47"
          },
          {
            "Id": 99,
            "Name": "Name",
            "Value": "The Flåm Railway + hiking the Flåm valley"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Explore the Flåm Valley on foot. "
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "Take the world famous Flåm Railway and from Myrdal station start descending the 20 km path through the fjord valley full of history and outstanding nature. \r\n\r\nIf your are planning on bringing your own bike, make sure you also reserve space for your bicycle!"
          },
          {
            "Id": 402,
            "Name": "Currency",
            "Value": "NOK"
          },
          {
            "Id": 415,
            "Name": "Price description",
            "Value": "per person"
          },
          {
            "Id": 1016,
            "Name": "Concierge high light",
            "Value": "False"
          },
          {
            "Id": 100017,
            "Name": "Summer",
            "Value": "True"
          },
          {
            "Id": 100587,
            "Name": "All year",
            "Value": "False"
          },
          {
            "Id": 100588,
            "Name": "Winter",
            "Value": "False"
          },
          {
            "Id": 100738,
            "Name": "Fall",
            "Value": "True"
          },
          {
            "Id": 100739,
            "Name": "Spring",
            "Value": "False"
          },
          {
            "Id": 100847,
            "Name": "January",
            "Value": "False"
          },
          {
            "Id": 100848,
            "Name": "February",
            "Value": "False"
          },
          {
            "Id": 100849,
            "Name": "March",
            "Value": "False"
          },
          {
            "Id": 100850,
            "Name": "April",
            "Value": "False"
          },
          {
            "Id": 100851,
            "Name": "May",
            "Value": "False"
          },
          {
            "Id": 100852,
            "Name": "June",
            "Value": "True"
          },
          {
            "Id": 100853,
            "Name": "July",
            "Value": "True"
          },
          {
            "Id": 100854,
            "Name": "August",
            "Value": "True"
          },
          {
            "Id": 100855,
            "Name": "September",
            "Value": "True"
          },
          {
            "Id": 100856,
            "Name": "October",
            "Value": "True"
          },
          {
            "Id": 100857,
            "Name": "November",
            "Value": "False"
          },
          {
            "Id": 100858,
            "Name": "December",
            "Value": "False"
          },
          {
            "Id": 100939,
            "Name": "Monday",
            "Value": "False"
          },
          {
            "Id": 100940,
            "Name": "Tuesday",
            "Value": "False"
          },
          {
            "Id": 100941,
            "Name": "Wednesday",
            "Value": "False"
          },
          {
            "Id": 100942,
            "Name": "Thursday",
            "Value": "False"
          },
          {
            "Id": 100943,
            "Name": "Friday",
            "Value": "False"
          },
          {
            "Id": 100944,
            "Name": "Saturday",
            "Value": "False"
          },
          {
            "Id": 100945,
            "Name": "Sunday",
            "Value": "False"
          },
          {
            "Id": 102390,
            "Name": "All days",
            "Value": "False"
          },
          {
            "Id": 102391,
            "Name": "No (bicycles not allowed)",
            "Value": "False"
          },
          {
            "Id": 102392,
            "Name": "Yes (bicycles allowed)",
            "Value": "False"
          },
          {
            "Id": 102393,
            "Name": "Everyone",
            "Value": "False"
          },
          {
            "Id": 102394,
            "Name": "Family",
            "Value": "False"
          },
          {
            "Id": 102395,
            "Name": "The adventurous",
            "Value": "False"
          },
          {
            "Id": 102679,
            "Name": "One departure per day",
            "Value": "False"
          },
          {
            "Id": 102682,
            "Name": "Several departures per day",
            "Value": "True"
          },
          {
            "Id": 102683,
            "Name": "1-2 hours",
            "Value": "False"
          },
          {
            "Id": 102684,
            "Name": "2-4 hours",
            "Value": "True"
          },
          {
            "Id": 102685,
            "Name": "4-6 hours",
            "Value": "False"
          },
          {
            "Id": 102686,
            "Name": "One day",
            "Value": "False"
          },
          {
            "Id": 102687,
            "Name": "Several days",
            "Value": "False"
          }
        ],
        "Categories": [
          {
            "Id": 26397,
            "Path": "Aurland (Visit Flåm)"
          },
          {
            "Id": 26401,
            "Path": "To do"
          },
          {
            "Id": 26402,
            "Path": "Activities"
          },
          {
            "Id": 26404,
            "Path": "The Flam Railway"
          },
          {
            "Id": 26397,
            "Path": "Aurland (Visit Flåm)"
          },
          {
            "Id": 26401,
            "Path": "To do"
          },
          {
            "Id": 26402,
            "Path": "Activities"
          },
          {
            "Id": 26397,
            "Path": "Aurland (Visit Flåm)"
          },
          {
            "Id": 26401,
            "Path": "To do"
          }
        ],
        "Geos": [
          {
            "Id": 76664,
            "Path": "[Aurland (Visit Flåm)]"
          },
          {
            "Id": 108308,
            "Path": "Norway"
          },
          {
            "Id": 80944,
            "Path": "Flåm"
          }
        ],
        "Pois": [],
        "Position": {
          "Latitude": 60.8630749407715,
          "Longitude": 7.11482355210421
        }
      },
      "AvailableDates": [
        "2020-10-01T00:00:00+02:00",
        "2020-10-02T00:00:00+02:00",
        "2020-10-03T00:00:00+02:00",
        "2020-10-04T00:00:00+02:00",
        "2020-10-05T00:00:00+02:00",
        "2020-10-06T00:00:00+02:00",
        "2020-10-07T00:00:00+02:00"
      ]
    }
  ],
  "PromoCodeStatus": "None",
  "TotalResults": 2,
  "Operations": [
    {
      "System": "Inventory (The Fjords)",
      "Account": "Inventory Pakke (The Fjords)",
      "Action": "Search",
      "Duration": "00:00:01.1570994",
      "Success": true,
      "ErrorMessage": null
    },
    {
      "System": "Inventory (Flåmsbana)",
      "Account": "Inventory (Flåmsbana)",
      "Action": "Search",
      "Duration": "00:00:00.1569712",
      "Success": true,
      "ErrorMessage": null
    },
    {
      "System": "Inventory (Sognefjorden)",
      "Account": "Inventory Pakke (Sognefjorden)",
      "Action": "Search",
      "Duration": "00:00:00.1982185",
      "Success": true,
      "ErrorMessage": null
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as the start and end dates of the calendar, the pointOfSalesId and the currency. As in other transport queries, the filter can also include a content filter, such as only those transport products associated with a particular CBIS category or with certain attributes. As there is no paging for the calendar content search it is sensible to request the bare minimum both in terms of products searched and content returned. Content possibilities can be found in the Content Section You can see a bare minimum version of this search in the examples. The return of this call is transport products that have availabilities within the time range you are looking for, instead of occasions and quotes you simply get a list of days the product is available.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/availability/transport/calendar/byproduct

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, //int - Mandatory "Start": "2018-12-14", //DateTime - Mandatory, conforms to ISO 8601 "End": "2018-12-16", //DateTime - Mandatory, conforms to ISO 8601 "Currency": "string", //string - Mandatory e.g SEK or EUR "ContentFilter": { // Optional - See ContentFilter }, "PromoCode": "string" // string - Optional }

Promo code

Promo code call validates entered promotion code for specified PointOfSalesId. In case Point of Sales is connected to more than one external account it is advised to send ProductId to avoid ambiguously checked promo codes and to ensure checking promo code per account.

Promo code

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 13633,
   "PromoCodeInfo": [
     {
       "PromoCode": "KOMTILBAKE2020",
       "ProductId": "cbis:1614826"
     }
   ]
 }' 'https://galaxy.citybreak.com/v5/api/promocode/validate'
var r = fetch("https://galaxy.citybreak.com/v5/api/promocode/validate",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 13633,
	   "PromoCodeInfo": [
	     {
	       "PromoCode": "KOMTILBAKE2020",
         "ProductId": "cbis:1614826"
	     }
	   ]
	})  
});

Example of response:

{
  "PointOfSalesId": 13633,
  "ValidationResult": [
    {
      "PromoCode": "KOMTILBAKE2020",
      "PromoCodeStatus": "Valid",
      "ProductId": null,
      "Operations": [
        {
          "System": "Xenon-63207",
          "Account": "Xenon-63207",
          "Action": "Search",
          "Duration": "00:00:00.1210295",
          "Success": true,
          "ErrorMessage": null
        }
      ]
    }
  ]
}

This is a POST request that validates the promotion code for specific PointOfSales.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/promocode/validate

Query Parameters

Parameter Description
request the POST request

{ "PointOfSalesId": 0, //int - Mandatory //List of promotion codes for validation //Cannot be empty, must represent at least one promotion code "PromoCodeInfo": [ { "PromoCode": "string", //Mandatory - promotion code //If Point of Sales is connected to multiple external accounts //user should specify this field to check promo code per account "ProductId": "string" //Optional - product filtering } ] }

Content Filter

Content filters used in availability queries. All individual filters are optional, i.e. you can filter just on Categories and Search

{ "Geos": [], "Categories": [], "Pois": [], "Search": "", "Position": {}, "Information": {}, "Ids": [] }

Categories, Geonodes, Pois

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 0,
   "Arrival": "2017-10-14",
   "Departure": "2017-10-15",
   "Currency": "SEK",
   "PageSize": 20,
   "PersonConfigurations": [
     {
       "Adults": 1,
       "ChildrenAges": [
         0
       ] 
     }
   ],
   ContentFilter{
    "Categories": [
		  123, 124
	  ],
	  "Geos": [
	  	123, 124
	   ],
	  "Pois": [
		123, 124
	  ]
   }
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Arrival": "2017-10-14",
	   "Departure": "2017-10-15",
	   "Currency": "SEK",
	   "PageSize": 20,
	   "PersonConfigurations": [
	     {
	       "Adults": 1,
	       "ChildrenAges": [
	         0
	       ] 
	     }
	   ],
    "ContentFilter"{
      "Categories": [
        123, 124
      ],
      "Geos": [
        123, 124
      ],
      "Pois": [
        123, 124
      ]
    }
	})  
});

Categories, Geonodes and Pois are list of integers. The example query can be translated to products (in category 123 OR 124) AND (in geonode 123 OR 124) AND (in poi 123 OR 124).

Parameters

Parameter Type Description
Categories int[] List of categories Ids.
Geos int[] List of geonodes Ids.
Pois int[] List of pois Ids.

Search in Name

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 0,
   "Arrival": "2017-10-14",
   "Departure": "2017-10-15",
   "Currency": "SEK",
   "PageSize": 20,
   "PersonConfigurations": [
     {
       "Adults": 1,
       "ChildrenAges": [
         0
       ] 
     }
   ],
   ContentFilter{
    "Search":"My Hotel"
   }
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Arrival": "2017-10-14",
	   "Departure": "2017-10-15",
	   "Currency": "SEK",
	   "PageSize": 20,
	   "PersonConfigurations": [
	     {
	       "Adults": 1,
	       "ChildrenAges": [
	         0
	       ] 
	     }
	   ],
    "ContentFilter"{
      "Search":"My Hotel"
    }
	})  
});

Shorthand to search in products name.

Parameters

Parameter Type Description
Search string String you are looking for, handles typos.

Position

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 0,
   "Arrival": "2017-10-14",
   "Departure": "2017-10-15",
   "Currency": "SEK",
   "PageSize": 20,
   "PersonConfigurations": [
     {
       "Adults": 1,
       "ChildrenAges": [
         0
       ] 
     }
   ],
   ContentFilter{
    "Position": {
      "Latitude": 57.7089,
      "Longitude": 11.9746,
      "Distance": 10
	  }
   }
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Arrival": "2017-10-14",
	   "Departure": "2017-10-15",
	   "Currency": "SEK",
	   "PageSize": 20,
	   "PersonConfigurations": [
	     {
	       "Adults": 1,
	       "ChildrenAges": [
	         0
	       ] 
	     }
	   ],
    "ContentFilter"{
      "Position": {
        "Latitude": 57.7089,
        "Longitude": 11.9746,
        "Distance": 10
      }
    }
	})  
});

Filter products by their position. You need to supply a reference point and a Distance (radius in Km).

Parameters

Parameter Type Description
Latitude double Latitude of reference point.
Longitude double Longitude of reference point.
Distance int Distance from reference point (km).

Ids

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
   "PointOfSalesId": 0,
   "Arrival": "2017-10-14",
   "Departure": "2017-10-15",
   "Currency": "SEK",
   "PageSize": 20,
   "PersonConfigurations": [
     {
       "Adults": 1,
       "ChildrenAges": [
         0
       ] 
     }
   ],
   ContentFilter{
      "Ids": [
        "cbis:12345", "ptg:987654"
      ]
   }
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Arrival": "2017-10-14",
	   "Departure": "2017-10-15",
	   "Currency": "SEK",
	   "PageSize": 20,
	   "PersonConfigurations": [
	     {
	       "Adults": 1,
	       "ChildrenAges": [
	         0
	       ] 
	     }
	   ],
    "ContentFilter"{
      "Ids": [
        "cbis:12345", "ptg:987654"
      ]
    }
	})  
});

Only return the products matching the ids supplied in Ids. These can be cbis product Id references (“cbis123456”) or any unique product reference as stored in CBIS (“ptg:12345”, “yourexternalref:12345”)

Parameters

Parameter Type Description
Ids string[] The product Ids.

Information

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
  "PointOfSalesId": 0,
  "Arrival": "2017-10-14",
  "Departure": "2017-10-15",
  "Currency": "SEK",
  "PageSize": 20,
  "PersonConfigurations": [
    {
      "Adults": 1,
      "ChildrenAges": [
        0
      ] 
    }
  ],
  ContentFilter{
      "Information": {
        "Operator": "AND",
        "Queries": [
          {
          "Id": 0,
          "Type": "Value",
          "Value": "string",
          "SubQuery": {
            "Operator": "OR",
            "Queries": [
              {
                "Id": 100059,
                "Type": "Value",
                "Value": "true"
              },
            "SubQuery": {}
            }
          }
        ]
      }
  }
}' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
	    "ApiKey": "APIKEY132456789EWOK",
	    "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
	   "PointOfSalesId": 0,
	   "Arrival": "2017-10-14",
	   "Departure": "2017-10-15",
	   "Currency": "SEK",
	   "PageSize": 20,
	   "PersonConfigurations": [
	     {
	       "Adults": 1,
	       "ChildrenAges": [
	         0
	       ] 
	     }
	   ],
"ContentFilter":{
  "Information": {
    "Operator": "AND",
    "Queries": [
      {
        "Id": 110,
        "Type": "Has",
        "Value": null
      },
      {
        "Id": 100651,
        "Type": "Value",
        "Value": "false",
        "SubQuery":{
          "Operator": "AND",
          "Queries": [
            {
              "Id": 100666,
              "Type": "Value",
              "Value": "false"
            },
            {
              "Id": 100670,
              "Type": "Value",
              "Value": "true"
            }
          ]
        }
      }
    ]
  }
}
	})  
});

Filter products by the content of the Information they carry. You can filter on the existence of an attribute or on its content. Subqueries are a bit tricky but essentially allow you to mix AND and OR operators. For example the sample query asks for products where the following boolean logic is met Has attribute 110 **OR** Attribute 100651 is false **OR** (100666 is false **AND** 100666 is true)

Operator

MatchType

Information & SubQuery objects

Parameter Type Description
Operator Operator The operator to apply between the queries.
Queries Query[] A list of query.

Query object

Parameter Type Description
Id int Attribute Id.
Type MatchType See above.
Value string The value.
SubQuery SubQuery See above.

Output Filter

curl -X POST 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d '{
    "PointOfSalesId": 0,
    "Arrival": "2017-10-14",
    "Departure": "2017-10-15",
    "Currency": "SEK",
    "PageSize": 20,
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          0
        ] 
      }
    ],
    "OutputFilter": { 
      "Attributes": [
        0
      ],
      "Categories": true,
      "Geos": true,
      "Pois": true,
      "Position": true
    }
 }' 'https://galaxy.citybreak.com/v5/api/availability/accommodation'
var r = fetch("https://galaxy.citybreak.com/v5/api/availability/accommodation",
{
	method: "POST",
	headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 0,
    "Arrival": "2017-10-14",
    "Departure": "2017-10-15",
    "Currency": "SEK",
    "PageSize": 20,
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          0
        ] 
      }
    ],
    "OutputFilter": { 
      "Attributes": [
        99
      ],
      "Categories": false,
      "Geos": true,
      "Pois": false,
      "Position": true
    }
	})  
});

Example of response:

{
  "AccommodationSearch": {
    "PointOfSalesId": 0,
    "Arrival": "2017-10-14T00:00:00Z",
    "Departure": "2017-10-15T00:00:00Z",
    "Currency": "SEK",
    "PageSize": 20,
    "Page": 1,
    "Sort": {
      "Order": 0,
      "Field": "Price"
    },
    "PersonConfigurations": [
      {
        "Adults": 1,
        "ChildrenAges": [
          0
        ]
      }
    ],
    "ContentFilter": null,
    "OutputFilter": null
  },
  "Accommodations": [
    {
      "Id": "cbis:12345",
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=101010101",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=101010101",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          }
        ],
        "Categories": null,
        "Geos": [
          {
            "Id": 12345,
            "Path": "Sweden"
          },
          {
            "Id": 12346,
            "Path": "Vastra Gotaland"
          },
          {
            "Id": 12347,
            "Path": "Goteborg"
          }
        ],
        "Pois": null,
        "Position": {
          "Latitude": 57.7089,
          "Longitude": 11.9746
        }
      },
      "Placements": [
        {
          "Price": {
            "Price": 450,
            "TotalPersons": 2,
            "Currency": "SEK",
            "DateStart": "2017-10-14T00:00:00Z",
            "DateEnd": "2017-10-15T00:00:00Z"
          },
          "Placements": [
            {
              "Name": "Dubbelrum med xbädd ÖSD",
              "Content": {
                "PriceFrom": null,
                "Images": [],
                "Information": [
                  {
                    "Id": 99,
                    "Name": "Name",
                    "Value": "Dubbelrum med xbädd ÖSD"
                  }
                ],
                "Categories": null,
                "Geos": null,
                "Pois": null,
                "Position": null
              },
              "IncludedAddons": [],
              "MaxPopopulation": 3,
              "MinPopulation": 1,
              "ExtraBeds": 1,
              "PersonConfiguration": {
                "Adults": 1,
                "ChildrenAges": [
                  1
                ]
              },
              "PricePeriods": [
                {
                  "DateStart": "2017-10-14T00:00:00",
                  "DateEnd": "2017-10-15T00:00:00",
                  "AdultPrice": 300,
                  "ChildPrice": 150,
                  "TotalPrice": 450,
                  "Currency": "SEK"
                }
              ],
              "BookingConditions": {
                "Name": null,
                "Terms": null
              }
            }
          ],
          "BookingKey": "18-A"
        }
      ],
      "TotalResults": 1
    }
  ],
  "SearchId": "aaaa1234-4321-1a2b-asdf-123456asdfgh",
  "ExpirationDate": "2018-09-15T09:15:46.0619347Z",
  "TotalResults": 1
}

Output filters used in Availability queries. All the properties in the filter relate to content. Each property is optional but Attributes is an inclusive filter, if no attributes to filter on are provided all attributes are sent, while the boolean properties such as Categories default to false (which will return null for that content property)

{ "OutputFilter": { // Optional // List of ints - Optional, defaults to showing all attributes if not included "Attributes": [ 0 ], "Categories": true, // bool - Optional, defaults to false if not included "Geos": true, // bool - Optional, defaults to false if not included "Pois": true, // bool - Optional, defaults to false if not included "Position": true // bool - Optional, defaults to false if not included } }

Parameters

Parameter Type Description
Attributes int[] List of ids of product attribute content to display.
Categories bool If true display product Category content
Geos bool If true display product Geonode content
Pois bool If true display Position of Interest content
Position bool If true display product Position lat and long

Content

Content calls provide information about several content types used by your org, Attributes, GeoNodes, Points of Interest and Categories. This can be useful when creating content filters on your site as each of these types are suitable for content filtering on Availability searches. As with other calls, these are available in the languages your organisation supports and has translated (for non-system content). You need the relevant pointOfSalesId for all these calls.

Product content

curl -X POST
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
--header 'apiKey: APIKEY132456789EWOK' 
-d 
'{
  "PointOfSalesId": 16697,
  "PageSize": 50,
  "Page": 0,
  "ContentFilter": {
    "Ids": [
      "cbis:1714422"
    ]
  }
}' 
'https://galaxy.citybreak.com/v5/api/content/product'
var r = fetch("https://galaxy.citybreak.com/v5/api/content/product",
{
	method: "POST",
	headers: {
	   "ApiKey": "APIKEY132456789EWOK",
	   "Accept": "application/json",
		 "Accept-Language": "en-US"
	},
	body: JSON.Stringify({
    "PointOfSalesId": 16697,
    "PageSize": 50,
    "Page": 0,
    "ContentFilter": {
      "Ids": [
        "cbis:1714422"
      ]
    }
  })  
});

Example of response:

{
  "Page": 0,
  "PageSize": 50,
  "TotalResults": 1,
  "Items": [
    {
      "Id": "cbis:1714422",
      "Name": "Scandic Hafjell",
      "ProductType": "Accommodation",
      "Content": {
        "Id": "cbis:1714422",
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860262",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860263",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860264",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860265",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860268",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860269",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860270",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860271",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860272",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860273",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=5860274",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=6661261",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=6661262",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=6661263",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 122,
            "Name": "Country (address)",
            "Value": "162"
          },
          {
            "Id": 130,
            "Name": "Number of rooms",
            "Value": "210"
          },
          {
            "Id": 131,
            "Name": "Number of floors",
            "Value": "3"
          },
          {
            "Id": 132,
            "Name": "Number of conference rooms",
            "Value": "12"
          },
          {
            "Id": 133,
            "Name": "Number of bars",
            "Value": "1"
          },
          {
            "Id": 151,
            "Name": "Classification",
            "Value": "4"
          },
          {
            "Id": 910,
            "Name": "UrlName",
            "Value": "Scandic_Hafjell_1714422"
          },
          {
            "Id": 117,
            "Name": "Street address 1",
            "Value": "Hunderveien 1 "
          },
          {
            "Id": 120,
            "Name": "Postal code",
            "Value": "2636"
          },
          {
            "Id": 121,
            "Name": "City (address)",
            "Value": "Øyer"
          },
          {
            "Id": 134,
            "Name": "Built in year",
            "Value": "1991"
          },
          {
            "Id": 135,
            "Name": "Last renovated year",
            "Value": "2017"
          },
          {
            "Id": 142,
            "Name": "Phone number (reception)",
            "Value": "61277777"
          },
          {
            "Id": 144,
            "Name": "Country code (reception)",
            "Value": "47"
          },
          {
            "Id": 99,
            "Name": "Name",
            "Value": "Scandic Hafjell"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Hafjell is the perfect starting point for activities and leisure."
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "The perfect meeting point for leisure and activities is just 2,5 hours from Oslo, with a central location in Hafjell and proximity to exciting activities. The hotel has many family rooms, and great facilities for entertaining young and old.\r\n\r\nThe hotel offers a barception and 24-hour shop throughout the year, with a selection of light meals, snacks and beverages. With an indoor pool, large playroom, sauna and modern fitness room, we have something for everyone.\r\n \r\nHafjell is the perfect starting point for activities and leisure. Our hotel is located only 700 metres from one of Norway’s largest alpine skiing facilities, Hafjell alpinsenter, and only 15 minutes from Lillehammer. This makes us the natural choice if you're looking for an active and exciting holiday. Hunderfossen family park, the bobsleigh and luge track, and great hiking trails make Hafjell a great destination, both in summer and winter."
          },
          {
            "Id": 103,
            "Name": "Directions",
            "Value": "Scandic Hafjell is located 2.5 hours from Oslo, and only 15 minutes north of Lillehammer. The hotel sits next to the highway E6, only 700 meters from Hafjell Alpine Centre. \r\n\r\nIf you wish to use public transport, we recommend taking the train to Lillehammer, and bus line 242 to Hafjell from Lillehammer. \r\nPlease see www.entur.no and www.innlandstrafikk.no for information and departure times."
          },
          {
            "Id": 100036,
            "Name": "Disability friendly",
            "Value": "True"
          },
          {
            "Id": 100037,
            "Name": "Pets allowed",
            "Value": "False"
          },
          {
            "Id": 100038,
            "Name": "Elevator",
            "Value": "True"
          },
          {
            "Id": 100039,
            "Name": "Parking nearby",
            "Value": "True"
          },
          {
            "Id": 100040,
            "Name": "Indoor pool",
            "Value": "True"
          },
          {
            "Id": 100043,
            "Name": "Sauna",
            "Value": "True"
          },
          {
            "Id": 100053,
            "Name": "Washing machine",
            "Value": "False"
          },
          {
            "Id": 100059,
            "Name": "TV",
            "Value": "False"
          },
          {
            "Id": 100062,
            "Name": "Refrigerator",
            "Value": "False"
          },
          {
            "Id": 100063,
            "Name": "Microwave",
            "Value": "False"
          },
          {
            "Id": 100071,
            "Name": "Fridge ",
            "Value": "False"
          },
          {
            "Id": 100074,
            "Name": "Dishwasher",
            "Value": "False"
          },
          {
            "Id": 100086,
            "Name": "Children's playground",
            "Value": "True"
          },
          {
            "Id": 100187,
            "Name": "Non smoking rooms",
            "Value": "True"
          },
          {
            "Id": 100188,
            "Name": "Non smoking",
            "Value": "False"
          },
          {
            "Id": 100208,
            "Name": "Allergy friendly room",
            "Value": "True"
          },
          {
            "Id": 100237,
            "Name": "Jacuzzi",
            "Value": "False"
          },
          {
            "Id": 100502,
            "Name": "Alpint",
            "Value": "True"
          },
          {
            "Id": 100540,
            "Name": "Billiard",
            "Value": "True"
          },
          {
            "Id": 100545,
            "Name": "Golf",
            "Value": "True"
          },
          {
            "Id": 100592,
            "Name": "Facilities for people with allergies",
            "Value": "False"
          },
          {
            "Id": 100599,
            "Name": "24 hours check-in",
            "Value": "True"
          },
          {
            "Id": 100606,
            "Name": "Breakfast",
            "Value": "True"
          },
          {
            "Id": 100624,
            "Name": "Air condition",
            "Value": "True"
          },
          {
            "Id": 100629,
            "Name": "Terrace",
            "Value": "False"
          },
          {
            "Id": 100635,
            "Name": "Fireplace",
            "Value": "False"
          },
          {
            "Id": 100752,
            "Name": "Luggage room",
            "Value": "True"
          },
          {
            "Id": 100767,
            "Name": "Mountain hiking",
            "Value": "True"
          },
          {
            "Id": 100826,
            "Name": "Close to mountains",
            "Value": "True"
          },
          {
            "Id": 100899,
            "Name": "Skibod",
            "Value": "True"
          },
          {
            "Id": 100928,
            "Name": "Games room",
            "Value": "True"
          },
          {
            "Id": 100929,
            "Name": "Ski in/Ski out",
            "Value": "False"
          },
          {
            "Id": 101383,
            "Name": "Indoor parking",
            "Value": "False"
          },
          {
            "Id": 101395,
            "Name": "Outdoor parking",
            "Value": "False"
          },
          {
            "Id": 101598,
            "Name": "All public areas non-smoking",
            "Value": "True"
          },
          {
            "Id": 101830,
            "Name": "Tumble dryer",
            "Value": "False"
          },
          {
            "Id": 101845,
            "Name": "WIFI",
            "Value": "True"
          },
          {
            "Id": 102045,
            "Name": "Close to center",
            "Value": "True"
          },
          {
            "Id": 102124,
            "Name": "Hiking",
            "Value": "False"
          },
          {
            "Id": 102267,
            "Name": "Snackbar",
            "Value": "True"
          },
          {
            "Id": 102272,
            "Name": "Cycling",
            "Value": "True"
          },
          {
            "Id": 102276,
            "Name": "Resort",
            "Value": "True"
          },
          {
            "Id": 102711,
            "Name": "Downhill biking",
            "Value": "False"
          },
          {
            "Id": 102712,
            "Name": "ski in/ ski out through transport slope",
            "Value": "False"
          }
        ],
        "Categories": [
          {
            "Id": 32039,
            "Path": "ALPINCO Hafjell och Kvitfjell"
          },
          {
            "Id": 32042,
            "Path": "Accommodation"
          },
          {
            "Id": 32062,
            "Path": "Hotels"
          }
        ],
        "Geos": [
          {
            "Id": 105257,
            "Path": "[ALPINCO Hafjell och Kvitfjell]"
          },
          {
            "Id": 105629,
            "Path": "Hafjell & Kvitfjell"
          },
          {
            "Id": 105260,
            "Path": "Hafjell"
          },
          {
            "Id": 105257,
            "Path": "[ALPINCO Hafjell och Kvitfjell]"
          },
          {
            "Id": 105629,
            "Path": "Hafjell & Kvitfjell"
          },
          {
            "Id": 105525,
            "Path": "Lillehammer"
          },
          {
            "Id": 105526,
            "Path": "Øyer"
          }
        ],
        "Pois": [],
        "Position": {
          "Latitude": 61.2417171,
          "Longitude": 10.4379985
        }
      },
      "Children": [
        {
          "Id": "pt:520359",
          "Name": "Scandic Hafjell BookVisit",
          "ProductType": "Accommodation",
          "Content": {
            "Id": null,
            "Images": [],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Scandic Hafjell BookVisit"
              },
              {
                "Id": 101,
                "Name": "Introduction",
                "Value": null
              },
              {
                "Id": 102,
                "Name": "Description",
                "Value": null
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          }
        }
      ]
    }
  ]
}

This is a POST request that requires a filter with some mandatory properties, such as PointOfSalesId, PageSize and Page. The filter can also include content filtering, such as only including those products associated with a particular CBIS category. Content filtering possibilities can be found in the Content Section. The filter can also include the list of specific product types which can be searched for, such as “Accommodation, “Transport” or “Activity”. You can see a bare minimum version of this search in the examples. The most important return value in this response is the ProductType that suggests the user which endpoints to use for a specific product.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/content/product

Query Parameters

Parameter Description
filter the POST filter
Accept-Language The language culture (e.g en-us)

{ "PointOfSalesId": 0, => int - Mandatory "PageSize": 0, => int - Mandatory "Page": 0, => int - Mandatory "ProductTypes": [ => Optional - list of possible product types to Search. "Accommodation" => Allowed values: "Accommodation", "Activity" and "Transport" ], "ContentFilter": { // Optional - See ContentFilter for more info. } }

Attributes

curl -X GET
--header 'apiKey: APIKEY132456789EWOK'  
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/content/attributes/{PointOfSalesId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/content/attributes/{PointOfSalesId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
	 "Accept-Language": "en-US"
  }  
});

Example of response:

[
  {
    "Id": 99,
    "Name": "Name",
    "Type": "String"
  },
  {
    "Id": 101,
    "Name": "Introduction",
    "Type": "String"
  },
  {
    "Id": 102,
    "Name": "Description",
    "Type": "String"
  },
  {
    "Id": 103,
    "Name": "Directions",
    "Type": "String"
  },
  {
    "Id": 104,
    "Name": "Opening hours",
    "Type": "String"
  },
   {
    "Id": 102728,
    "Name": "1 level apartment",
    "Type": "Boolean"
  },
  {
    "Id": 102729,
    "Name": "2 level apartment",
    "Type": "Boolean"
  },
  {
    "Id": 102732,
    "Name": "Cleaning included",
    "Type": "Boolean"
  },
  {
    "Id": 102733,
    "Name": "Shop",
    "Type": "Boolean"
  },
  {
    "Id": 102734,
    "Name": "Ski buses",
    "Type": "Boolean"
  }
]

Get localised Attribute information.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/content/attribute/{pointOfSaleId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
Accept-Language The language culture (e.g en-us)

GeoNodes

curl -X GET
--header 'apiKey: APIKEY132456789EWOK'  
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/content/geo/{pointOfSaleId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/content/geo/{pointOfSaleId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Id": 69962,
  "Children": [
    {
      "Id": 105634,
      "Children": []
    },
    {
      "Id": 106922,
      "Children": [
        {
          "Id": 106923,
          "Children": []
        }
      ]
    },
    {
      "Id": 70494,
      "Children": [
        {
          "Id": 70505,
          "Children": [
            {
              "Id": 70495,
              "Children": []
            }
          ]
        }
      ]
    }
  ]
}

Get the GeoNode tree. This is a nested list of client-defined geo-locations that can be associated with products, e.g. a hotel in Gothenburg might have both the node representing Sweden and the node representing Gothenburg included in its content, enabling you to filter on either.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/content/geo/{pointOfSaleId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
Accept-Language The language culture (e.g en-us)

Category

curl -X GET
--header 'apiKey: APIKEY132456789EWOK'  
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/content/category/{pointOfSaleId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/content/category/{pointOfSaleId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Id": 5946,
  "Children": [
    {
      "Id": 30701,
      "Children": [
        {
          "Id": 26219,
          "Children": [
            {
              "Id": 26218,
              "Children": []              
            }
          ]
        },
        {
          "Id": 26217,
          "Children": []
        },
        {
          "Id": 26220,
          "Children": [
            {
              "Id": 30610,
              "Children": []
            }
          ]
        }
      ],
    }
  ]
}

Get the Category tree. This is a nested list of client-defined categories that can be associated with products, e.g. a hotel might have both the node representing Hotel and the child node representing Boutique Hotel included in its content, enabling you to filter on either.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/content/category/{pointOfSaleId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
Accept-Language The language culture (e.g en-us)

Point Of Interest

curl -X GET
--header 'apiKey: APIKEY132456789EWOK'  
--header 'Accept: application/json' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/content/poi/{pointOfSaleId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/content/poi/{pointOfSaleId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
   "Accept-Language": "en-US"
  }  
});

Example of response:

[
  {
    "Id": 16,
    "Name": "Leksand",
    "Position": {
      "Longitude": 15.0032043457031,
      "Latitude": 60.7338905334473
    }
  },
  {
    "Id": 17,
    "Name": "Mora (Mora-Siljan flygplats)",
    "Position": {
      "Longitude": 14.5049390792847,
      "Latitude": 60.958568572998
    }
  },
  {
    "Id": 18,
    "Name": "Borlänge (Dala Airport)",
    "Position": {
      "Longitude": 15.5104637145996,
      "Latitude": 60.4233436584473
    }
  },
  {
    "Id": 8305,
    "Name": "Inlandsbanan",
    "Position": {
      "Longitude": 16.2033634185791,
      "Latitude": 64.113899230957
    }
  },
]

Get a list of Points of Interest. This is a mixed list of system and client-defined geographic Points of Interest that can be associated with products, e.g. a hotel might be nearby a train station or a key landmark and this information can be associated with the product and used for content filtering.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/content/poi/{pointOfSalesId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
Accept-Language The language culture (e.g en-us)

Languages

curl -X GET
--header 'apiKey: APIKEY132456789EWOK'  
--header 'Accept: application/json' 
'https://galaxy.citybreak.com/v5/api/content/language/{pointOfSaleId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/content/language/{pointOfSaleId}",
{
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json"
  }  
});

Example of response:

[
  "en-us",
  "sv-se",
  "fr-fr"
]

Get a list of languages available for a given point of sales.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/content/language/{pointOfSaleId}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.

Basket

Basket calls are the most complicated in the API workflow as they encapsulate the booking process in typical “shopping basket” object that can have many operations performed on it and which has a limited life span, connected as it is to availability/bookability of products, both internal to Citybreak and from external inventories. It is NOT a reservation but products in a basket are “held” for 60 mins from the time of the Accommodation or Activity Availability Search where possible (i.e. where external inventories allow).

Create Basket

curl -X POST 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' -d '{
  "PointOfSalesId": 1234570,
  "Currency": "SEK"
}' 'https://galaxy.citybreak.com/v5/api/basket/create'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/create",
{
  method:"POST"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  },
  body: JSON.Stringify({
    "PointOfSalesId": 1234570,
    "Currency": "SEK"
  })
});

Example of response:

{
  "BasketId": 12345678,
  "Success": true
}

Create a new basket object, you’ll need to preserve this ID in order to process further operations on the basket.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/basket/create

Parameters

Parameter Description
PointOfSalesId The point of sales identifier.
Currency The currency of the basket

Create Basket for hybrid checkout in Citybreak Online3

curl -X POST 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' -d '{
  "PointOfSalesId": 1234570,
  "Currency": "SEK",
  "Online3Session": {
    "OnlineId": 123456789
  }
}' 'https://galaxy.citybreak.com/v5/api/basket/create'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/create",
{
  method:"POST"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  },
  body: JSON.Stringify({
  "PointOfSalesId": 1234570,
  "Currency": "SEK",
  "Online3Session": {
    "OnlineId": 123456789
	}
  })
});

Example of response:

{
  "BasketId": 12345678,
  "Success": true
}

This alternative way to create a basket is used when you intend to link the customer basket to a Citybreak Online3 guide for customer details & payments.

By supplying the Online3 identifier, you’ll be able to transfer the Galaxy basket to an Online3 session using the HybridCheckoutUrl present in the Get Basket call. HTTP Post the user’s browser to the endpoint and it will redirect the user to the Online3 basket page.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/basket/create

Parameters

Parameter Description
PointOfSalesId The point of sales identifier.
Currency The currency of the basket.
Online3Session.OnlineId The online3 identifier.

Delete Basket

curl -X DELETE 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/basket/delete/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/delete/{basketId}",
{
  method:"DELETE"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
});

Example of response:

true

Delete a basket. This will remove all associated information attached to the basket as well.

HTTP Request

DELETE https://galaxy.citybreak.com/v5/api/basket/delete/{basketId}

Query Parameters

Parameter Description
basketId The Id of the basket to delete.

Get Basket

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/basket/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/{basketId}",
{
  method:"GET"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "BasketId": 48869100,
  "Groups": [
    {
      "Id": 1136433,
      "Name": "BookVisit Hotel",
      "Content": {
        "PriceFrom": 0,
        "Images": [
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=101010101010",
            "IsMain": true,
            "Name": null,
            "Copyright": null,
            "Description": null
          },
          {
            "Uri": "//images.citybreak.com/image.aspx?ImageId=1010101010",
            "IsMain": false,
            "Name": null,
            "Copyright": null,
            "Description": null
          }
        ],
        "Information": [
          {
            "Id": 99,
            "Name": "Name",
            "Value": "BookVisit Hotel"
          },
          {
            "Id": 101,
            "Name": "Introduction",
            "Value": "Leading e-commerce platform for the DMO and individual hotels in the Nordics."
          },
          {
            "Id": 102,
            "Name": "Description",
            "Value": "The absolute Leading e-commerce platform for the DMO and individual hotels in the Nordics!"
          },
          {
            "Id": 100038,
            "Name": "Elevator",
            "Value": "False"
          },
          {
            "Id": 100163,
            "Name": "Reception",
            "Value": "False"
          }
        ],
        "Categories": null,
        "Geos": [],
        "Pois": [],
        "Position": null
      },
      "Products": [
        {
          "BookItemId": 8,
          "Addons": [
            {
              "AddonId": "A:0-C:0-P:0",
              "NoUnits": 1,
              "IsExtraBed": false,
              "Name": null,
              "IsDeletable": false,
              "Price": {
                "Price": 150
                "Currency": "SEK"
              },
			  "PriceGroupName": "Adult"
            }
          ],
          "Persons": [
            {
              "Name": "Adult",
              "No": 1
            },
            {
              "Name": "Child 0-11",
              "No": 1
            }
          ],
          "Guests": [
            {
              "GuestLinkId": 6,
              "PriceGroupName": "Adult",
              "Guest": {
                "GuestId": 1,
                "NameFirst": "Test",
                "NameLast": "User",
                "Age": 35,
                "Sex": "F",
                "Salutation": "Ms"
              }
            },
            {
              "GuestLinkId": 7,
              "PriceGroupName": "Child 0-11",
              "Guest": {
                "GuestId": 2,
                "NameFirst": null,
                "NameLast": null,
                "Age": 0,
                "Sex": null,
                "Salutation": null
              }
            }
          ],
          "NoUnits": 1,
          "StartDate": "2017-10-14T00:00:00Z",
          "EndDate": "2017-10-15T00:00:00Z",
          "Content": {
            "PriceFrom": null,
            "Images": [
              {
                "Uri": null,
                "IsMain": false,
                "Name": null,
                "Copyright": null,
                "Description": null
              }
            ],
            "Information": [
              {
                "Id": 99,
                "Name": "Name",
                "Value": "Dubbelrum"
              }
            ],
            "Categories": null,
            "Geos": null,
            "Pois": null,
            "Position": null
          },
          "Name": "Dubbelrum",
          "IsDeletable": true,
          "Price": {
            "Price": 350,
            "Currency": "SEK"
          }
        }
      ],
      "Price": {
        "Price": 500,
        "Currency": "SEK"
      },
      "Position": null
    }
  ],
  "OkToBook": true,
  "TotalPrice": {
    "Price": 500,
    "Currency": "SEK"
  },
  "PointOfSalesId": 17692,
  "AutoCancellationDate": "9999-12-31T23:59:59.9999999",
  "CancellationInsurrances": [],
  "HybridCheckoutUrl": "https://book.youronlineguide.com/en/basket/galaxy/688fc85e-f57f-447d-8ceb-2b548455735f"
}

Get a basket. This will fetch a Basket along with all associated information attached to the Basket (the example has one booking added to it). This includes the product booked, the total price, possible cancellation insurances (can be added), OkToBook which will be checked before the Basket can be committed and Guest Information which is a separate entity to the number of people included and is used to track and record customer information (also can be added to the booking item later in the basket process). Of note is the BookItemId in the Products section, it is used to delete the item from the basket.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/basket

Query Parameters

Parameter Description
basketId The Id of the basket to get.

Find basket by session for hybrid checkout in Citybreak Online3

curl -X GET 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/basket/findByOnline3Session?pointOfSalesId={pointOfSalesId&online3Session={online3Session}&online3Id={online3Id}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/findByOnline3Session?pointOfSalesId={pointOfSalesId&online3Session={online3Session}&online3Id={online3Id}",
{
  method:"GET"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
});

Example of response:

48869100

In Online3 hybrid checkout setups, this locates an existing basket by an Online3 session id. Returns the basket id, if found.

HTTP Request

GET https://galaxy.citybreak.com/v5/api/basket/findByOnline3Session?pointOfSalesId={pointOfSalesId&online3Session={online3Session}&online3Id={online3Id}

Query Parameters

Parameter Description
pointOfSalesId The point of sales identifier.
online3Session The online 3 session.
online3Id The online 3 guide identifier

Add Accommodation Booking Item

curl -X PUT 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-US' -d '[
  {
    "BookKey": "1-A",
    "Amount" 2
  }, {
    "BookKey": "2-A",
    "Amount": 1
  }
]' 'https://galaxy.citybreak.com/v5/api/basket/add/accommodation/{basketId}/{searchId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/add/accommodation/{basketId}/{searchId}",
{
  method:"PUT"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  },
  body: JSON.Stringify(
    [
      {
        "BookKey": "1-A",
        "Amount": 1
      }, {
        "BookKey": "2-A",
        "Amount": 2
      }
    ])
});

Example of response:

{
  "Success": true,
  "BookItemIds": [1,2]
}

Adds booking items to the basket, you must first have checked for the Accommodation Availability of a property or properties and obtained the search Id and the bookingKey of the products you wish to add to the basket.

PUT https://galaxy.citybreak.com/v5/api/basket/add/accommodation

Query Parameters

Parameter Description
basketId The Id of the basket.
searchId The search Id returned by the Accommodation Availability Response
BookKey The key of the booking item to add to the basket, found in Availability Response
Amount The amount to book for this item

Add Placement Accommodation Booking Item

curl -X PUT 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/basket/add/accommodation/placement/{basketId}/{searchId}/{bookKey}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/add/accommodation/placement/{basketId}/{searchId}/{bookKey}",
{
  method:"PUT"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Success": true,
  "BookItemIds": [1,2]
}

Add a booking item to the basket, you must first have checked for the Placement Accommodation Availability of a property or properties and obtained the search Id and the bookingKey of the product you wish to add to the basket.

PUT https://galaxy.citybreak.com/v5/api/basket/add/accommodation/placement

Query Parameters

Parameter Description
basketId The Id of the basket.
searchId The search Id returned by the Accommodation
bookKey The key of the booking item (product) to add to the basket, found in the Accommodation Availability Search

Add Fuzzy Accommodation Booking Item

curl -X PUT 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/basket/add/accommodation/fuzzy/{basketId}/{searchId}/{bookId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/add/accommodation/fuzzy/{basketId}/{searchId}/{bookId}",
{
  method:"PUT"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
});

Example of response:

{
  "Success": true,
  "BookItemIds": [1,2]
}

Specifically for the Fuzzy search, to add a booking item to the basket you must first have checked for the Fuzzy Availability of a property or properties and obtained the search Id and the bookId of the product you wish to add to the basket. NOTE: the bookId is obtained from the BookableAlternatives and is a separate entity from the bookKey used in the regular basket operation

PUT https://galaxy.citybreak.com/v5/api/basket/add/accommodation/fuzzy/

Query Parameters

Parameter Description
basketId The Id of the basket.
searchId The search Id returned by the Availability Response
bookId The Id of the booking item (product) to add to the basket, found in the Fuzzy Availability Response

Add Activity Booking Item

curl -X PUT 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' -d '[
  {
    "BookKey": "1-T",
    "Amount" 2
  }, {
    "BookKey": "2-T",
    "Amount": 1
  }
]' 'https://galaxy.citybreak.com/v5/api/basket/add/activity/{basketId}/{searchId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/add/activity/{basketId}/{searchId}",
{
  method:"PUT"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  },
  body: JSON.Stringify(
    [
      {
        "BookKey": "1-T",
        "Amount": 1
      }, {
        "BookKey": "2-T",
        "Amount": 2
      }
    ])
});

Example of response:

{
  "Success": true,
  "BookItemIds": [1,2]
}

Add a booking item to the basket, you must first have checked for the Availability of an activity and obtained the search Id and the bookingKey of the product you wish to add to the basket.

PUT https://galaxy.citybreak.com/v5/api/basket/add/activity

Parameters

Parameter Description
basketId The Id of the basket.
searchId The search Id returned by the Availability Response
BookKey The key of the booking item to add to the basket, found in Availability Response
Amount The amount to book for this item

Add Transport Booking Item

curl -X PUT 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' -d '[
  "1022591899-T",
  "411043540-T"
]' 'https://galaxy.citybreak.com/v5/api/basket/add/transport/{basketId}/{searchId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/add/transport/{basketId}/{searchId}",
{
  method:"PUT"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  },
  body: JSON.Stringify(
    [
      "1022591899-T",
      "411043540-T"
    ])
});

Example of response:

{
  "Success": true,
  "BookItemIds": [1,2],
  "Errors": null
}

Add a booking item to the basket, you must first have checked for the Availability of a transport and obtained the search Id and the bookingKey of the product you wish to add to the basket.

PUT https://galaxy.citybreak.com/v5/api/basket/add/transport

Parameters

Parameter Description
basketId The Id of the basket.
searchId The search Id returned by the Availability Response
BookKeys The keys of the booking items to add to the basket, found in Availability Response

Delete Booking Item

curl -X DELETE 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/basket/deleteItem/{basketId}/{bookItemId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/deleteItem/{basketId}/{bookItemId}",
{
  method:"DELETE"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
});

Example of response:

true

Delete a booking item from the basket. In the Get Basket response you can find the bookItemId (this is different to the booking key and is specific to the basket)

HTTP Request

DELETE https://galaxy.citybreak.com/v5/api/basket/deleteItem

Query Parameters

Parameter Description
basketId The Id of the basket.
bookItemId The Id of the booking item to delete from the basket

Toggle Cancellation Insurance

curl -X PUT 
--header 'Accept: application/json' 
--header 'apiKey: APIKEY132456789EWOK' 
--header 'Accept-Language: en-us' 
'https://galaxy.citybreak.com/v5/api/basket/cancellation/{basketId}/{cancellationId}/{true|false}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/cancellation/{basketId}/{cancellationId}/{true|false}",
{
  method:"PUT"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
});

Example of response:

no content

If your basket has a set of cancellation insurances you can use this call to add one (true) or switch it off (false)

HTTP Request

PUT https://galaxy.citybreak.com/v5/api/basket/cancellation

Query Parameters

Parameter Description
basketId The Id of the basket.
cancellationId The Id of the cancellation insurance to toggle
state true (added) or false (not added)

Update Customer Information

curl -X POST 
--header 'Content-Type: application/json' 
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-us' -d '{
   "NameFirst": "Test",
   "NameLast": "User",
   "Salutation": "Ms",
   "CustomerType": "Private",
   "Culture": "en-US",
   "Address": { 
     "StreetAddress1": "Test Road 123",
     "PostalCode": "41111",
     "City": "Gothenburg",
     "CountryCode": "SE"
   },
   "Email": "testuser@visit.com",
   "SendEmailConfirmation": true,
   "PhoneMobile": { 
     "CountryCode": "46",
     "AreaCode": "07",
     "Number": "2222222"
   }
 }' 'https://galaxy.citybreak.com/v5/api/basket/customer/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/customer/{basketId}",
{
  method:"POST"
  headers: {
    "ApiKey": "APIKEY132456789EWOK",
    "Accept": "application/json",
    "Accept-Language": "en-US"
  }  
  body: JSON.Stringify({
    "NameFirst": "Test",
    "NameLast": "User",
    "Salutation": "Ms",
    "CustomerType": "Private",
    "Culture": "en-US",
    "Address": {
      "StreetAddress1": "Test Road 123",
      "PostalCode": "41111",
      "City": "Gothenburg",
      "CountryCode": "SE"
    },
    "Email": "testuser@visit.com",
    "SendEmailConfirmation": true,
    "PhoneMobile": {
      "CountryCode": "46",
      "AreaCode": "07",
      "Number": "2222222"
    }
  }
}
});

Example of response:

no content

To commit a Basket you will need to provide customer information. This is fairly standard: name, address, email. phone, etc. for the person conducting the booking (not necessarily the Guests). The SendEmailConfirmation field is used to trigger whether to send an email with the changes to the customer.

HTTP Request

POST https://galaxy.citybreak.com/v5/api/basket/customer

Query Parameters

Parameter Description