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:
- Suppliers
- Business Model
- Fees
- Commissions
- Payment regulation
- Payment options
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": []
}
]
}' '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": []
}
]
})
});
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": []
}
],
"ContentFilter": null,
"OutputFilter": null,
"PromoCode": null,
"OffersOnly": false,
"OfferIds": []
},
"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": []
},
"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,
"PriorityAgreement": false,
"Offer": 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": []
},
"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,
"PriorityAgreement": false,
"Offer": 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 - PriorityAgreement, 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
]
}
],
"ContentFilter": { // Optional - See ContentFilter
},
"OutputFilter": { // Optional - See OutputFilter
},
"PromoCode": "string", // string - Optional
"OffersOnly": true, // bool - Optional - whether to return results with offers only
"OfferIds": [ // Optional - list of offers to filter results with
"string" // string - Mandatory if parent included
],
"BasketId": null // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
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. |
Desc | Descending - The item the highest field value first. |
Field | Meaning |
---|---|
PriorityAgreement | Sort by priority agreement. |
Name | Sort by name. |
Price | Sort by price. |
Random | Sort by a random order. |
Get Previous Search
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": []
}
],
"ContentFilter": null,
"OutputFilter": null,
"PromoCode": null,
"OffersOnly": false,
"OfferIds": []
},
"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,
"PriorityAgreement": false,
"Offer": 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,
"PriorityAgreement": false,
"Offer": 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": []
}
]
}' '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": []
}
]
})
});
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": []
}
],
"ContentFilter": null,
"OutputFilter": null,
"PromoCode": null,
"OffersOnly": false,
"OfferIds": []
},
"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": []
},
"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,
"PriorityAgreement": false,
"Offer": 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": []
},
"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,
"PriorityAgreement": false,
"Offer": 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 - PriorityAgreement, 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
]
}
],
"ContentFilter": { // Optional - See ContentFilter
},
"OutputFilter": { // Optional - See OutputFilter
},
"PromoCode": "string", // string - Optional
"OffersOnly": true, // bool - Optional - whether to return results with offers only
"OfferIds": [ // Optional - list of offers to filter results with
"string" // string - Mandatory if parent included
],
"BasketId": null // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
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. |
Desc | Descending - The item the highest field value first. |
Field | Meaning |
---|---|
PriorityAgreement | Sort by priority agreement. |
Name | Sort by name. |
Price | Sort by price. |
Random | Sort by a random order. |
Get Previous Search
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": []
}
],
"ContentFilter": null,
"OutputFilter": null,
"PromoCode": null,
"OffersOnly": false,
"OfferIds": []
},
"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,
"PriorityAgreement": false,
"Offer": 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,
"PriorityAgreement": false,
"Offer": 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
}
}
Calendar Search
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": "Single room",
"PriceFrom": 100,
"StayLenghts": [1, 2]
},
{
"Id": "pt:54322",
"Name": "Double room",
"PriceFrom": 100,
"StayLenghts": [1, 2]
}
]
},
{
"Id": "ptg:2345678",
"Name": "Citybreak Hotell",
"Products": [
{
"Id": "pt:65432",
"Name": "Double room",
"PriceFrom": null,
"StayLenghts": [7, 14]
}
]
}
]
},
{
"Date": "2018-11-10T00:00:00",
"Groups": [
{
"Id": "ptg:1234567",
"Name": "Visit Hotell",
"Products": [
{
"Id": "pt:54321",
"Name": "Double room",
"PriceFrom": 100,
"StayLenghts": [1, 2]
}
]
}
]
}
],
"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. There can also be a from price available, if supported by the external system.
HTTP Request
POST https://galaxy.citybreak.com/v5/api/availability/accommodation/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
"OffersOnly": true, // bool - Optional - whether to return results with offers only
"OfferIds": [ // Optional - list of offers to filter results with
"string" // string - Mandatory if parent included
],
"BasketId": null // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
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
"BasketId": null // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
Get Previous Search
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
"BasketId": null, // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
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
"BasketId": null, // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
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": [],
"AvailableCapacity": 50
},
"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": [],
"AvailableCapacity": 40
}
},
{
"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": [],
"AvailableCapacity": 60
},
"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": [],
"AvailableCapacity": 0
}
},
{
"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": [],
"AvailableCapacity": 30
},
"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": [],
"AvailableCapacity": 50
}
},
{
"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": [],
"AvailableCapacity": 25
},
"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": [],
"AvailableCapacity": 35
}
},
{
"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": [],
"AvailableCapacity": 55
},
"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": [],
"AvailableCapacity": 75
}
},
{
"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": [],
"AvailableCapacity": 85
},
"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": [],
"AvailableCapacity": 95
}
}
],
"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
"BasketId": null // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
Get Previous Search
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
}
],
"AvailableCapacity": 50
},
"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
}
],
"AvailableCapacity": 60
},
"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
}
],
"AvailableCapacity": 75
}
},
{
"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
}
],
"AvailableCapacity": 85
}
}
],
"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
"BasketId": null, // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
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
"BasketId": null, // int. Mandatory only for search with reuse capacity. Represents basket id for loaded reservation - See Load Reservation to Basket for Edit
"BookItemId": null // int. Mandatory only for search with reuse capacity. Represents basket product id in basket which should be replaced using reuse capacity.
}
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": 110,
"Type": "Has"
},
{
"SubQuery":{
"Operator": "OR",
"Queries": [
{
"Id": 100666,
"Type": "Value",
"Value": "false"
},
{
"Id": 100670,
"Type": "Value",
"Value": "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
]
}
],
"ContentFilter":{
"Information": {
"Operator": "AND",
"Queries": [
{
"Id": 110,
"Type": "Has"
},
{
"SubQuery":{
"Operator": "OR",
"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 **AND** (100666 is false **OR** 100670 is true)
Operator
- AND
- OR
MatchType
- Value (exact match, requires
Value
) - Fuzzy (approx match, requires
Value
) - Range (mathematical range, requires
Value
: [1:10], ]1;10[, >3, <10 etc…) - Has (has the attribute)
- Hasnt (has not the attribute)
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,
"Images": 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,
"Images": 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
"Images": true // bool - Optional, defaults to true if not included, for backward compatibility
}
}
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 |
Images | bool | If true display product Image content |
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.
You can sort the result by specifying the SortFilter
property, see Sort Filter for more info.
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.
},
"SortFilter": [] // Optional - See SortFilter 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. |
Offers
curl -X POST
--header 'Content-Type: application/json'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
--header 'apiKey: APIKEY132456789EWOK'
-d
'{
"PointOfSalesId": 16697,
"ContentFilter": {
"Ids": [
"cbis:1374301"
]
}
}'
'https://galaxy.citybreak.com/v5/api/content/offer'
var r = fetch("https://galaxy.citybreak.com/v5/api/content/offer",
{
method: "POST",
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
},
body: JSON.Stringify({
"PointOfSalesId": 16697,
"ContentFilter": {
"Ids": [
"cbis:1374301"
]
}
})
});
Example of response:
[
{
"Id": "rc:197335",
"Name": "Hiking in the mountains",
"Content": {
"Id": "rc:197335",
"Images": [
{
"Uri": "//images.test.citybreak.com/Image.aspx?imageid=6883588",
"IsMain": true,
"Name": null,
"Copyright": null,
"Description": null
}
],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "Hiking in the mountains"
},
{
"Id": 101,
"Name": "Introduction",
"Value": "Test introduction."
},
{
"Id": 102,
"Name": "Description",
"Value": null
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"Products": [
{
"Id": "cbis:1374301",
"Name": "STF Nora/Åkerby Herrgård Hotel"
}
]
},
{
"Id": "rc:215603",
"Name": "Berglagen in the nature",
"Content": {
"Id": "rc:215603",
"Images": [
{
"Uri": "//images.test.citybreak.com/Image.aspx?imageid=6888284",
"IsMain": true,
"Name": null,
"Copyright": null,
"Description": null
}
],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "Berglagen in the nature"
},
{
"Id": 101,
"Name": "Introduction",
"Value": "Test introduction."
},
{
"Id": 102,
"Name": "Description",
"Value": null
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"Products": [
{
"Id": "cbis:1374301",
"Name": "STF Nora/Åkerby Herrgård Hotel"
}
]
}
]
This is a POST request that requires a mandatory PointOfSalesId filter and returns all available offers. 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. You can see a bare minimum version of this search in the examples. Each offer returned contains a list of product references that is part of the offer.
HTTP Request
POST https://galaxy.citybreak.com/v5/api/content/offer
Query Parameters
Parameter | Description |
---|---|
filter | the POST filter |
Accept-Language | The language culture (e.g en-us) |
{
"PointOfSalesId": 0, => int - Mandatory
"ContentFilter": { // Optional - See ContentFilter for more info.
}
}
Sort Filter
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,
"SortFilter": [{
"Field": "Name",
"Order": "Asc"
}]
}'
'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,
"SortFilter": [{
"Field": "Name",
"Order": "Asc"
}]
})
});
Order products by the supplied fields. Optionally, you can provide multiple sorting objects to sort by multiple levels in decreasing order of importance. Supported fields are:
- Name
- Id
- ExpiresAt
- PublishAt
- Occasions
- Information (need to supply AttributeId)
- Position (need to supply Latitude & Longitude)
- Random (provide a RandomSeed to ensure consistent results & paging)
Parameters
Parameter | Type | Description |
---|---|---|
Field | string | Name of the field you want to order by. |
Order | Order | Either Asc or Desc |
AttributeId | int | The attribute id of the information field you want to sort on |
Latitude | double | The latitude of the reference point to sort on position |
Longitude | double | The longitude of the reference point to sort on position |
RandomSeed | string | The seed to use for Random sorting to ensure consistent results & paging |
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 |
Accept-Language | The language culture (e.g en-us) |
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. |
Accept-Language | The language culture (e.g en-us) |
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,
"Offer": {
"Id": "rc:215603",
"Name": "Hiking in the mountains",
"Content": {
"Id": "rc:215603",
"Images": [
{
"Uri": "//images.test.citybreak.com/Image.aspx?imageid=6888284",
"IsMain": true,
"Name": null,
"Copyright": null,
"Description": null
}
],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "Hiking in the mountains"
},
{
"Id": 101,
"Name": "Introduction",
"Value": "Test introduction."
},
{
"Id": 102,
"Name": "Description",
"Value": null
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"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 |
---|---|
basketId | The Id of the basket. |
Get Customer Information
curl -X GET
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-US'
'https://galaxy.citybreak.com/v5/api/basket/customer/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/customer/{basketId}",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
});
Example of response:
{
"NameFirst": "Test",
"NameLast": "User",
"Salutation": null,
"CustomerNumber": null,
"CustomerType": 1,
"Culture": "en-US",
"CivicRegistrationNumber": null,
"Company": null,
"CompanyDepartment": null,
"Address": {
"StreetAddress1": "Test Road 123",
"StreetAddress2": null,
"StreetAddress3": null,
"PostalCode": "41111",
"City": "Gothenburg",
"CountryCode": "SE",
"State": null
},
"Email": "testuser@visit.com",
"PhoneHome": {
"CountryCode": null,
"AreaCode": null,
"Number": null
},
"PhoneWork": {
"CountryCode": null,
"AreaCode": null,
"Number": null
},
"PhoneMobile": {
"CountryCode": "46",
"AreaCode": "07",
"Number": "2222222"
}
}
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/basket/customer
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
Commit Basket
curl -X POST
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-US'
'https://galaxy.citybreak.com/v5/api/basket/commit/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/commit/{basketId}",
{
method:"POST"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
});
Example of response:
int32
This is the method used to start a commit job for a basket. You only need to provide the Basket Id for this call. As there may be many products from different internal and external providers this is essentially a two step async operation. Once you have committed the basket you can query Commit Status to get the status of the job and the ReservationID
and BookingCode
if it is completed. Before you may commit a basket, there is some information you must provide first. Add at least one Booking Item (Accommodation, Fuzzy Accommodation or Activity) and provide Customer Information.
The return value is a job number with which you can check the status of commit
HTTP Request
POST https://galaxy.citybreak.com/v5/api/basket/commit/{basketId}
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
Accept-Language | The language culture (e.g en-us) |
Commit Status
curl -X GET
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-US'
'https://galaxy.citybreak.com/v5/api/basket/commit/status/{commitJobId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/commit/status/{commitJobId}",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json"
"Accept-Language": "en-US"
}
});
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": 1234567,
"BookingCode": "EWOK12"
}
Gets the ResvversionId
(reservation version id) and BookingCode
, important for Reservation calls, and the status of a commit job. Get the commit job id when you make the Commit.
HTTP Request
GET https://galaxy.citybreak.com/v5/api/basket/commit/status/id
Query Parameters
Parameter | Description |
---|---|
id | The Id of the commit job returned from Commit Basket |
Add Guest
curl -X POST
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-us'
'https://galaxy.citybreak.com/v5/api/basket/guests/add/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/guests/add/{basketId}",
{
method:"POST"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
body: JSON.Stringify([
{
"GuestId": 1,
"NameFirst": "Test",
"NameLast": "User",
"Age": 35,
"Sex": "F",
"Salutation": "Ms"
}
]
);
Returns Response Code 204 if successful. Add a guest to a Booking Item, this is not the same as Customer Information. The Guest ID in the filter must match one in the Basket or be 0 to create a new guest
HTTP Request
GET https://galaxy.citybreak.com/v5/api/basket/guests/add
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
Addon products
curl -X GET
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-us'
'https://galaxy.citybreak.com/v5/api/basket/addon/{basketId}/{bookItemId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/addon/{basketId}/{bookItemId}",
{
method:"GET"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
);
Example of response
{
"BookItemId": 1,
"ProductName": "DFDS Københavnbåten",
"AddonGroups": [
{
"Name": "7 Seas Breakfast",
"Content": {
"Images": [
{
"Uri": "",
"IsMain": false,
"Name": null,
"Copyright": null,
"Description": null
},
{
"Uri": "BFAST",
"IsMain": false,
"Name": null,
"Copyright": null,
"Description": null
}
],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "7 Seas Breakfast"
},
{
"Id": 102,
"Name": "Description",
"Value": "Start your day as you mean to continue with our hearty breakfast buffet in our 7 seas restaurant. Opt for a cooked breakfast, or a continental option. Choose from a range of hot and cold breakfast favourites, including eggs, sausages, toast, cereal, pastries, fruit and much more. \n\nAnd as it’s all-you-can-eat you can visit the buffet table as many times as you wish!"
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"AddonGroups": [
{
"Name": "Breakfast, for all passengers",
"Content": {
"Images": [],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "Breakfast, for all passengers"
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"AddonGroups": [],
"AvailableAddons": [
{
"Name": "7 Seas Breakfast, Breakfast, for all passengers",
"Content": {
"Images": [],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "7 Seas Breakfast, Breakfast, for all passengers"
},
{
"Id": 102,
"Name": "Description",
"Value": "Description"
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"PricegroupName": null,
"MinimumPricegroupAge": null,
"MaximumPricegroupAge": null,
"Price": {
"Price": 298,
"Currency": "NOK"
},
"AddonId": "A:14548579.0-C:0-P:0",
"MinimumNumberOfUnits": 0,
"MaximumNumberOfUnits": 1
}
]
}
],
"AvailableAddons": []
},
{
"Name": "Other",
"Content": {
"Images": [],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "Other"
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"AddonGroups": [],
"AvailableAddons": [
{
"Name": "1/2 bottle of Sparkling Wine, peanuts & grapes",
"Content": {
"Images": [],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "1/2 bottle of Sparkling Wine, peanuts & grapes"
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"PricegroupName": null,
"MinimumPricegroupAge": null,
"MaximumPricegroupAge": null,
"Price": {
"Price": 229,
"Currency": "NOK"
},
"AddonId": "A:14548579.1-C:0-P:0",
"MinimumNumberOfUnits": 0,
"MaximumNumberOfUnits": 1
},
{
"Name": "1/1 bottle of Champagne, peanuts & grapes",
"Content": {
"Images": [],
"Information": [
{
"Id": 99,
"Name": "Name",
"Value": "1/1 bottle of Champagne, peanuts & grapes"
}
],
"Categories": null,
"Geos": null,
"Pois": null,
"Position": null
},
"PricegroupName": null,
"MinimumPricegroupAge": null,
"MaximumPricegroupAge": null,
"Price": {
"Price": 510,
"Currency": "NOK"
},
"AddonId": "A:14548579.2-C:0-P:0",
"MinimumNumberOfUnits": 0,
"MaximumNumberOfUnits": 1
}
]
}
],
"AvailableAddons": []
}
Once a product is added to the basket, all mandatory included sub products are also included. There may however be addon products that are optional.
These calls allows you to get a list of available addons.
The main product is refered to by its ID in the basket, the BookItemId
.
You can get all the addons for a given basket or a given product in a basket.
Addons might be priced by pricegroup, which is indicated by the fields PricegroupName
, MinimumPricegroupAge
and MaximumPricegroupAge
.
The quantity available to book is indicated by the fields MinimumNumberOfUnits
and MaximumNumberOfUnits
.
HTTP Requests
GET https://galaxy.citybreak.com/v5/api/basket/addon/{basketId}/{bookItemId}
GET https://galaxy.citybreak.com/v5/api/basket/addon/{basketId}
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
bookItemId | The Id of the booking item on which to operate |
Add addon product
curl -X POST
--header 'Content-Type: application/json'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
--header 'apiKey: APIKEY132456789EWOK' -d '{
"Queries": [
{
"BookItemId": 1,
"AddonId": "A:14548579.1-C:0-P:0",
"Quantity": 1
}
]
}' 'https://galaxy.citybreak.com/v5/api/basket/addon/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/addon/{basketId}",
{
method:"POST"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
body: JSON.Stringify(
{
"Queries": [
{
"BookItemId": 1,
"AddonId": "A:14548579.1-C:0-P:0",
"Quantity": 1
}
]
}
);
The example call will add 1 sparkling wine to the item with BookItemId
1. Set the quantity to 0 to remove the addon.
The quantity available to book is indicated by the fields MinimumNumberOfUnits
and MaximumNumberOfUnits
from the Addon products call.
HTTP Requests
POST https://galaxy.citybreak.com/v5/api/basket/addon/{basketId}
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
Queries | List of addons to add |
BookItemId | Id in the basket of the product which should receive the addon |
AddonId | Id of the addon to add |
Quantity | Amount to book |
Get supplier messages
curl -X GET
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
'https://galaxy.citybreak.com/v5/api/basket/suppliermessage/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/suppliermessage/{basketId}",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json"
"Accept-Language": "en-US"
}
});
Example of Response
[
{
"SupplierName": "HafjellKvitfjell Booking AS - Hytter",
"SupplierId": 54705,
"Message": null
}
]
It is possible to send a note to the supplier while acting on the basket. This call will result in a list of available suppliers and the configured messages.
HTTP Request
GET https://galaxy.citybreak.com/v5/api/basket/suppliermessage/{basketId}
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
Set supplier messages
curl -X POST
--header 'Content-Type: application/json'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
--header 'apiKey: APIKEY132456789EWOK' -d '[
{
"SupplierId": 54705,
"Message": "Will arrive late."
}
]' 'https://galaxy.citybreak.com/v5/api/basket/suppliermessage/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/suppliermessage/{basketId}",
{
method:"POST"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
body: JSON.Stringify([
{
"SupplierId": 54705,
"Message": "Will arrive late."
}
]
);
Update the messages by posting to the same url The example will set the message to the supplier. You can update one or more messages to the suppliers with a single post.
Update Cancellation Insurance status
curl -X PUT
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
'https://galaxy.citybreak.com/v5/api/basket/cancellation/{basketId}/{insuranceId}/{state}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/cancellation/{basketId}/{insuranceId}/{state}",
{
method:"PUT"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
);
If an cancellation insurance is available, you can find a reference in the basket to it.
/* parts of the basket */
"CancellationInsurances": [
{
"Name": "Avbestillingsforsikring ",
"Description": "",
"Id": 97,
"CurrentCost": 500,
"Currency": "NOK",
"Selected": false,
"PreSelect": false,
"CanBeChanged": true,
"Introduction": "",
"CancellationInsuranceProducts": []
}
]
The state is either true
or false
.
The basket price will reflect the new total.
The insurance is usually based on the types of products that are included in the
basket right now. It could be fixed per booking, fixed per product or a percentage
of the product cost. Hence the CurrentCost
.
Get Complementary Information
curl -X GET
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
'https://galaxy.citybreak.com/v5/api/basket/complementary/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/complementary/{basketId}",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json"
"Accept-Language": "en-US"
}
});
Example of Response
{
"BasketId": 123456,
"Products": [
{
"ProductName": "Generic Activity",
"ItemId": "1",
"ComplementaryInfo": [
{
"Code": "#COMP-3",
"Value": "",
"Type": "Boolean",
"IsRequired": true,
"Label": "Require a guide?",
"Comment": null,
"Message": null,
"Constraints": null
}
],
"Persons": [
{
"ItemId": "db2bca44-e134-4709-b604-61e8baa798f4",
"ComplementaryInfo": [
{
"Code": "#COMP-0",
"Value": "",
"Type": "Date",
"IsRequired": false,
"Label": "Estimated Arrival Date",
"Comment": null,
"Message": null,
"Constraints": {
"MaxStringLength": null,
"MinStringLength": null,
"MinIntValue": null,
"MaxIntValue": null,
"MinDecimalValue": null,
"MaxDecimalValue": null,
"MinDateValue": "0001-01-01T00:00:00",
"MaxDateValue": "9999-12-31T00:00:00",
"MaxImageHeightInPx": null,
"MaxImageWidthInPx": null,
"MaxImageSizeInBytes": null
}
}
]
}
],
"AddOns": [
{
"AddOnName": "Helmet",
"ItemId": "2",
"ComplementaryInfo": [
{
"Code": "#COMP-1",
"Value": "",
"Type": "Integer",
"IsRequired": false,
"Label": "Helmet Size",
"Comment": null,
"Message": null,
"Constraints": {
"MaxStringLength": null,
"MinStringLength": null,
"MinIntValue": 1,
"MaxIntValue": 20,
"MinDecimalValue": null,
"MaxDecimalValue": null,
"MinDateValue": null,
"MaxDateValue": null,
"MaxImageHeightInPx": null,
"MaxImageWidthInPx": null,
"MaxImageSizeInBytes": null
}
}
],
}
]
}
]
}
Complementary info for products can be retrieved from a basket. This information is often used for things like arrival dates, the names of participants in an activity or any other information that the activity supplier might require in the booking.
Complementary info can be required or optional and is typed. Currently supported types are Boolean, Integer, Decimal, String, Date and ImageLink. Complementary info may also come with constraints depending on type. If any update attempts are made to info that conflicts with these type restrictions or constraints they will not be successful.
Each Complement is attached to either the main product, the persons who are attached to the product (this may not refer to any specific person but simply the idea of a participant or guest) or to the add on product. These objects are identified by their ItemId
(for products and add ons this ItemId is equivalent to the BookItemId in the Get Basket call), each complementary that is attached to an item will also have a unique Code
within that context. These two identifiers are important for updating the Value
HTTP Request
GET https://galaxy.citybreak.com/v5/api/basket/complementary/{basketId}
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
Set Complementary Information
curl -X POST
--header 'Content-Type: application/json'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
--header 'apiKey: APIKEY132456789EWOK' -d '[
{
"BookItemId": "f18658ea-6cbd-41cf-b243-30799e3e0598",
"Code": "#COMP-0",
"Value": "2019-04-01"
},
{
"BookItemId": "2",
"Code": "#COMP-1",
"Value": "1000"
},
{
"BookItemId": "1",
"Code": "#COMP-3",
"Value": "This is not a Boolean"
}
]' 'https://galaxy.citybreak.com/v5/api/basket/complementary/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/complementary/{basketId}",
{
method:"POST"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
body: JSON.Stringify([
{
"BookItemId": "f18658ea-6cbd-41cf-b243-30799e3e0598",
"Code": "#COMP-0",
"Value": "2019-04-01"
},
{
"BookItemId": "2",
"Code": "#COMP-1",
"Value": "1000"
},
{
"BookItemId": "1",
"Code": "#COMP-3",
"Value": "This is not a Boolean"
}
]
);
Example of Response
[
{
"Code": "#COMP-0",
"ItemId": "f18658ea-6cbd-41cf-b243-30799e3e0598",
"Success": true,
"Error": ""
},
{
"Code": "#COMP-1",
"ItemId": "2",
"Success": false,
"Error": "Value - 1000 - must be between 1 and 20"
},
{
"Code": "#COMP-3",
"ItemId": "1",
"Success": false,
"Error": "Value - This is not a Boolean - must be a Boolean"
}
]
When setting complementary information you need the basketId
of the booking you wish to update and for each complementary, the ItemId
and Code
. It is important to take note of the type of the information and if there are any constraints. Valid updates will be made, invalid ones won’t. The return type is a list of successful and unsuccessful updates along with a reason why an update failed if Success
is false. To the right you can see one successful and two unsuccessful updates in the examples.
The update object is fairly simple:
[
{
"ItemId": "f18658ea-6cbd-41cf-b243-30799e3e0598",
"Code": "#COMP-0",
"Value": "2019-04-01"
}
]
HTTP Request
POST https://galaxy.citybreak.com/v5/api/basket/complementary/{basketId}
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
list of updates | the POST body with updates |
Get payment methods
curl -X GET
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
'https://galaxy.citybreak.com/v5/api/basket/payment/{basketId}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/payment/{basketId}",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json"
"Accept-Language": "en-US"
}
});
Example of Response
{
"PaymentMethods": [
{
"Id": 1234,
"Cost": 1050,
"Currency": "EUR",
"Name": "Pay later"
},
{
"Id": 1235,
"Cost": 1050,
"Currency": "EUR",
"Name": "Virtual Credit Card"
}
]
}
Returns a list of configured payment methods, available to this basket.
HTTP Request
GET https://galaxy.citybreak.com/v5/api/basket/payment/{basketId}
Query Parameters
Parameter | Description |
---|---|
basketId | The Id of the basket. |
Set payment method “Pay Later”
curl -X POST
--header 'Content-Type: application/json'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
--header 'apiKey: APIKEY132456789EWOK' 'https://galaxy.citybreak.com/v5/api/basket/payment/{basketId}/paylater/{paymentMethodId}/{cost}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/payment/{basketId}/paylater/{paymentMethodId}/{cost}",
{
method:"POST"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
);
Selects “Pay Later” as the basket payment method. This is the default payment method and does not have to be explicitly set, unless you need to switch from a previously selected payment method.
Set payment method “Virtual Credit Card”
curl -X POST
--header 'Content-Type: application/json'
--header 'Accept: application/json'
--header 'Accept-Language: en-us'
--header 'apiKey: APIKEY132456789EWOK' -d '{
"CardType": "VISA",
"CardNumber": "4111111111111111",
"SecurityCode": "123",
"ExpirationYear": 2030,
"ExpirationMonth": 1,
"CardHolder": "Test Testperson"
}' 'https://galaxy.citybreak.com/v5/api/basket/payment/{basketId}/virtualcreditcard/{paymentMethodId}/{cost}'
var r = fetch("https://galaxy.citybreak.com/v5/api/basket/payment/{basketId}/virtualcreditcard/{paymentMethodId}/{cost}",
{
method:"POST"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
body: JSON.Stringify({
"CardType": "VISA",
"CardNumber": "4111111111111111",
"SecurityCode": "123",
"ExpirationYear": 2030,
"ExpirationMonth": 1,
"CardHolder": "Test Testperson"
}
);
Selects “Virtual Credit Card” as the basket payment method. This is a credit card guarantee method sent as-is to the external systems involved in a reservation.
Supported Card Types for BookVisit users
Use the following abbreviations for CardType
field. (BookVisit users only)
Name | Abbreviation |
---|---|
American Express | AMEX |
Visa | VISA |
Mastercard | MAST |
Diners Club | DINE |
JCB | JCB |
Reservation
Reservation calls provide information on, and the ability to cancel, bookings that have been commited. The BookingCode
is a universal reference for a reservation while the ReservationVersionId
will show you the different versions of the booking if things have been changed
GET and POST operations
Get Reservation
curl -X GET
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
'https://galaxy.citybreak.com/v5/api/reservation/{bookingCode}'
var r = fetch("https://galaxy.citybreak.com/v5/api/reservation/{bookingCode}",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json"
}
});
Example of response:
[
{
"BookingCode": "EWOK12",
"ReservationVersionId": 1234567,
"Version": 1,
"Created": "2017-09-27T13:12:54.1938577Z"
},
{
"BookingCode": "EWOK12",
"ReservationVersionId": 1234568,
"Version": 2,
"Created": "2017-09-27T13:14:54.4237553Z"
}
]
Gets all the versions of a booking that have been created with a Booking Code
HTTP Request
GET https://galaxy.citybreak.com/v5/api/reservation
Query Parameters
Parameter | Description |
---|---|
BookingCode | The code representing the reservation returned from Commit Status |
Get Reservation Version
curl -X GET
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
'https://galaxy.citybreak.com/v5/api/reservation/version/{reservationVersionId}}'
var r = fetch("https://galaxy.citybreak.com/v5/api/reservation/version/{reservationVersionId}",
{
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-05T15:48:05.997Z",
"Customer": {
"NameFirst": "Test",
"NameLast": "User",
"Salutation": null,
"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,
"ProductVat": 18.11,
"ExternalBookingCode": "16215808"
}
],
"Id": 153663,
"Name": "BookVisit Hotel"
}
]
}
Gets all the information about a booking by version
HTTP Request
GET https://galaxy.citybreak.com/v5/api/reservation/version
Query Parameters
Parameter | Description |
---|---|
reservationVersionId | The Id for the specific version of the Reservation |
Get Latest Reservation Version
curl -X GET
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
'https://galaxy.citybreak.com/v5/api/reservation/latest/{bookingCode}'
var r = fetch("https://galaxy.citybreak.com/v5/api/reservation/latest/{bookingCode}",
{
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-05T15:48:05.997Z",
"Customer": {
"NameFirst": "Test",
"NameLast": "User",
"Salutation": null,
"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,
"ProductVat": 18.11,
"ExternalBookingCode": "16215808"
}
],
"Id": 153663,
"Name": "BookVisit Hotel"
}
]
}
Gets all the information about a booking by version
HTTP Request
GET https://galaxy.citybreak.com/v5/api/reservation/latest
Query Parameters
Parameter | Description |
---|---|
BookingCode | The code representing the reservation returned from Commit Status |
Cancel Reservation
curl -X POST
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
--header 'Accept-Language: en-US'
'https://galaxy.citybreak.com/v5/api/reservation/cancel/{bookingCode}'
var r = fetch("https://galaxy.citybreak.com/v5/api/reservation/cancel/{bookingCode}",
{
method: "POST",
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
});
Example of response: int32
This will cancel a reservation. 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/{bookingCode}
Query Parameters
Parameter | Description |
---|---|
BookingCode | The code representing the reservation returned from Commit Status |
Accept-Language | The language culture (e.g en-us) |
Load Reservation to Basket for Edit
curl -X POST
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
'https://galaxy.citybreak.com/v5/api/reservation/edit/{bookingCode}'
var r = fetch("https://galaxy.citybreak.com/v5/api/reservation/edit/{bookingCode}",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json",
"Accept-Language": "en-US"
}
});
Example of response: int32
Loads reservation to basket and returns basket id. Use this basket id to add or remove products. Most amendments scenarios require a new booking version. This means that you need to delete the product and add a new product to the booking to get a new booking version. If you want to replace product with reusing capacity you can add basket id and basket product id to the search query. If you have loaded a basket/reservation and don’t close it by doing a new commit you need to delete the basket to open it again.
HTTP Request
POST https://galaxy.citybreak.com/v5/api/reservation/edit/{bookingCode}
Query Parameters
Parameter | Description |
---|---|
BookingCode | The code representing the reservation returned from Commit Status |
Accept-Language | The language culture (e.g en-us) |
Country Code
Country Code calls provide information about available country codes for your API key. There are two calls, one to provide all available country codes and one HEAD call to check if a specified country code is supported.
GET and HEAD operations
Country Code
curl -X GET
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
'https://galaxy.citybreak.com/v5/api/countrycode'
var r = fetch("https://galaxy.citybreak.com/v5/api/countrycode",
{
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json"
}
});
Example of response:
[
"SE",
"US"
]
Gets all available country codes for a specified API key.
HTTP Request
GET https://galaxy.citybreak.com/v5/api/countrycode
Check Country Code
curl -X HEAD
--header 'Accept: application/json'
--header 'apiKey: APIKEY132456789EWOK'
'https://galaxy.citybreak.com/v5/api/countrycode/{CountryCode}'
var r = fetch("https://galaxy.citybreak.com/v5/api/countrycode/{CountryCode}",
{
method: "HEAD"
headers: {
"ApiKey": "APIKEY132456789EWOK",
"Accept": "application/json"
}
});
Example of response:
{}
Returns a 200 status code if country code is supported, otherwise 404.
HTTP Request
HEAD https://galaxy.citybreak.com/v5/api/countrycode/{CountryCode}
Errors
The API uses the following error codes:
Error Code | Meaning |
---|---|
400 | Bad Request – Could not understand your request |
401 | Unauthorized – Your API key is not valid for this call |
404 | Not Found – Could not find what you are looking for |
405 | Method Not Allowed – Method not supported for this request |
500 | Internal Server Error – Server trouble, try again later. If recurring, contact us. |
503 | Service Unavailable – Offline for maintanance. Please try again later. |
Breaking changes
From V4 to V5
-
Response from endpoints
basket/addon/{basketId}
andbasket/addon/{basketId}/{bookItemId}
are now restructured to return addon groups which contain available addons. -
Response from endpoints
availability/accommodation/placement/calendar
andavailability/activity/calendar/byday
now return only available dates, therefore isAvailble flag is removed.
From V3 to V4
-
Accommodation availability search with placement (the previous default) has endpoints moved from
availability/accommodation
,availability/accommodation/get
andbasket/add/accommodation
toavailability/accommodation/placement
,availability/accommodation/placement/get
andbasket/add/accommodation/placement
. -
Accommodation availability search without placement (the new default) has endpoints moved from
availability/accommodation/noplacement
,availability/accommodation/noplacement/get
andbasket/add/accommodation/noplacement
toavailability/accommodation
,availability/accommodation/get
andbasket/add/accommodation
. -
basket/{basketId}
no longer includes anyVatAmount
fields since it was incorrectly showing product tax and did not account for tour operator margin schemes. -
basket/{basketId}
product addons integer fieldsBookItemId
,PriceGroupId
andAddonId
have been replaced by a string fieldAddonId
. -
basket/addon/{basketId}
andbasket/addon/{basketId}/{bookItemId}
available addons are further simplified and now provides you with a total price,MinimumNumberOfUnits
andMaximumNumberOfUnits
. The integer fieldsAddonId
andPriceGroupId
are replaced by a string fieldAddonId
. Addons DELETE verb is removed, you can remove addons by posting zero toQuantity
. -
availability/accommodation/placement
,availability/accommodation/placement/get
,availability/accommodation
andavailability/accommodation/get
now include list of mandatory addons that have been renamed from IncludedSubProducts to IncludedAddons. -
reservation/cancel/info
was removed. Use theLastCancellation
field fromreservation/latest
instead. -
basket/commit/async
has moved tobasket/commit
and replaced the previous synchronous commit call, pollbasket/commit/status/{id}
to check status. -
reservation/cancel
is now asynchronous, pollbasket/commit/status/{id}
to check status. -
availability/accommodation/fuzzy/scan
,availability/accommodation
,availability/accommodation/placement
,availability/accommodation/calendar
,availability/activity
,availability/activity/calendar/byproduct
andavailability/activity/calendar/byday
now includes a list ofOperations
which will indicate the duration, success and error message, if any, on all the systems involved in the search.
From V2 to V3
-
basket/create
now expects a JSON body containing the parameters PointOfSalesId and Currency instead ofbasket/create/{pointofSalesId}/{currency}
query string. -
Get Previous Search now has an endpoint of
availability/accommodation/get
instead ofavailability/get
. -
basket/add/accommodation
andbasket/add/accommodation/fuzzy
now returns an object with Success and BookItemIds list instead of just a success bool. -
reservation/cancel/info/{bookingCode}
has been deprecated and will be removed in the future. Use theLastCancellation
field fromreservation/latest
instead. -
Optional products
are now calledaddons
and have been refactored to be easier to use. The call updating the addons has been splitted in an update and a delete call to give you more control. Booked addons are now found in the basket.