Node wrapper for the TourCMS API.
- Installation
- Usage
- API methods
The easiest way to install is via npm which will install node-tourcms and all dependencies.
npm install tourcms
Require tourcms
var TourCMSApi = require('tourcms');
Create a new tourcms
API object, passing in your API credentials
var TourCMS = new TourCMSApi({
channelId: YOUR_CHANNEL_ID,
apiKey: 'YOUR_API_KEY',
marketplaceId: YOUR_MARKETPLACE_ID
});
Then call one of the API methods below.
The wrapper uses xml2js to automatically convert the response XML into a JavaScript object, some effort is also made to ensure things that might be arrays, are.
Check the current API rate limit status (limit is 2000 requests per channel per hour at the time of writing this readme)
http://www.tourcms.com/support/api/mp/rate_limit_status.php
TourCMS.apiRateLimitStatus({
channelId: 3930,
callback: function(response) {
console.log(response);
}
})
Provides an interface for calling APIs that don't yet have a specific wrapper function.
E.g. to simulate API Rate Limit Status (above):
TourCMS.genericRequest({
channelId: 3930,
path: '/api/rate_limit_status.xml',
callback: function(response) {
console.log(response);
}
})
Can also provide a verb
(default is 'GET') and postData
, which - if provided - must be an object representing the XML data to post to the API.
List of staff members connected to the channel requested. To be use only for operators, no travel agents.
http://www.tourcms.com/support/api/mp/staff_members_list.php
TourCMS.listStaffMembers({
channelId: 3930,
callback: function(response) {
console.log(response);
}
})
List the Channels (supplier brands) connected, to be used by Agents/Affiliates.
http://www.tourcms.com/support/api/mp/channels_list.php
TourCMS.listChannels({
callback: function(response) {
console.log(response);
}
})
Show details on a specific channel.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/channel_show.php
TourCMS.showChannel({
channelId: 3930,
callback: function(response) {
console.log(response);
}
})
List top 50 Channels by number of unique visitor clicks (or check performance for a specific channel).
Optonally supply a channelId
to just return a specific Channel.
http://www.tourcms.com/support/api/mp/channels_performance.php
TourCMS.channelPerformance({
channelId: 3930,
callback: function(response) {
console.log(response);
}
});
Search Tours by various criteria (see list below), includes a subset of the information held about each tour. Good for displaying a selection of tours to a customer.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_search.php
TourCMS.searchTours({
channelId: 3930,
qs: {
k: 'rafting',
order: 'price_down'
},
callback: function(response) {
console.log(response);
}
});
List Tours, quicker and not pagenated versus Search Tours, however returns less data. Ideal for exporting from TourCMS.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tours_list.php
TourCMS.listTours({
channelId: 3930,
callback: function(response) {
console.log(response);
}
});
Return full details on a specific Tour (i.e. more than the subset of data returned by "Search Tours").
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_show.php
TourCMS.showTour({
tourId: 1,
callback: function(response) {
console.log(response);
}
});
Update tour, currently supports updating the tour_url
only.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_update.php
TourCMS.updateTour({
tour: {
tourId: 1,
tour_url: '/tours/example_tour_1/'
},
callback: function(response) {
console.log(response);
}
});
List the dates available for a specific tour.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_datesdeals_show.php
TourCMS.showTourDatesDeals({
channelId: 3930,
tourId: 1,
qs: {
has_offer: 1,
distinct_start_dates: 1
},
callback: function(response) {
console.log("Found " + response.dates_and_prices.date.length + " dates.");
}
});
Gives an overview of the departures for a specific date, good starter for a "Today" type screen.
Includes the running tours, details on their departure including number of bookings & spaces.
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.getDeparturesOverview({
date: new Date(),
callback: function(response) {
console.log(response);
}
});
Show a specific departure, designed for staff managing bookings, dates and prices rather than displaying to customers.
Includes the loaded rates, spaces, special offer details, bookings etc.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_datesprices_dep_manage_show.php
TourCMS.showDeparture({
channelId: 3930,
tourId: 1,
departureId: 8117,
callback: function(response) {
console.log(response);
}
});
Update a departure prices, spaces, special offer etc.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_datesprices_dep_manage_update.php
TourCMS.updateDeparture({
departure: {
tour_id: 6,
departure_id: 4954,
special_offer: {
offer_price: 45,
offer_note: "Early booking discount"
}
},
callback: function(response) {
console.log(response);
}
});
Check availability for a specific date and number of people on a specific tour.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_checkavail.php
The following example checks availability for 2 people on the first rate (e.g. usually "2 Adults") on the 1st Jan 2016 on Tour ID 1, Channel 3930.
TourCMS.checkTourAvailability({
channelId: 3930,
qs: {
id: 1,
date: '2016-08-01',
r1: 3
},
callback: function(response) {
//Loop through each component and output its component key
response.available_components.component.forEach(function(component) {
console.log(component.component_key);
});
}
});
Check for Option availability.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/tour_checkavail_options.php
TourCMS.checkOptionAvailability({
channelId: 3930,
qs: {
booking_id: 12662,
tour_component_id: 8052295
},
callback: function(response) {
//console.info(response.available_components.options.option);
var options = [].concat(response.available_components.options.option);
[].forEach.call(options, function(opt) {
console.log("Option: "+opt.option_name);
[].forEach.call(opt.quantities_and_prices.selection, function(sel) {
console.log(" Quantities possible: "+sel.quantity);
});
});
}
});
Get details on a promotional code. Useful for checking whether a promo code is valid for a certain channel, and if so, whether a membership number or similar is required to verify the promo.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/promo_show.php
The following example tries to show promo code 'TENPERCENT' on Channel 3930.
TourCMS.showPromo({
channelId: 3930,
promo: 'TENPERCENT',
callback: function(response) {
console.log(response);
}
});
http://www.tourcms.com/support/api/mp/booking_search.php
The following example searches for bookings made in the first two weeks of January 2016.
TourCMS.searchBookings({
channelId: 3930,
qs: {
made_date_start: "2016-01-01",
made_date_end: "2016-01-14"
},
callback: function(response) {
console.log(response);
}
});
http://www.tourcms.com/support/api/mp/booking_show.php
TourCMS.showBooking({
bookingId: 8449,
callback: function(response) {
console.log(response.booking);
}
});
Get a URL for use in retrieving a new booking key, ensures marketplace data (clicks, referrer) is maintained on the final booking / customer record.
Only for use by Tour Operators (mandatory step), not required when the API is being used by Marketplace Agents.
http://www.tourcms.com/support/api/mp/booking_getkey.php
TourCMS.getBookingRedirectUrl({
responseUrl: "http://www.example.com",
callback: function(response) {
console.log(response);
}
});
Create a temporary booking, holding off stock for the customer
http://www.tourcms.com/support/api/mp/booking_start_new.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.startNewBooking({
channelId: 3930,
booking: {
booking_key: "BOOKING_KEY_HERE",
total_customers: 1,
components: {
component: [
{
component_key: "COMPONENT_KEY_HERE",
}
]
}
},
callback: function(response) {
console.log(response);
}
});
Convert a temporary booking created with Start new booking into a live booking
http://www.tourcms.com/support/api/mp/booking_commit_new.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
The following example commits booking 1234 and suppresses sending of any email that would usually trigger
TourCMS.commitBooking({
channelId: 3930,
booking: {
booking_id: 1234,
suppress_email: 1
},
callback: function(response) {
console.log(response);
}
});
http://www.tourcms.com/support/api/mp/booking_update.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.updateBooking({
channelId: 3930,
booking: {
booking_id: 1234,
customer_special_request: "Please can we have a ground floor room"
},
callback: function(response) {
console.log(response);
}
});
http://www.tourcms.com/support/api/mp/booking_note_new.php
The following example will add a note "Building Node wrapper" of type AUDIT to booking 8451 on Channel 3930.
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.addNoteToBooking({
channelId: 3930,
booking: {
booking_id: 8451,
note: {
type: "AUDIT",
text: "Building Node wrapper"
}
},
callback: function(response) {
console.log(response);
}
});
Cancel a non-temporary booking (to remove temporary bookings use "Delete booking")
http://www.tourcms.com/support/api/mp/booking_cancel.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
The following example cancels booking 8451 on Channel 3930 while adding a note explaining the reason.
TourCMS.cancelBooking({
channelId: 3930,
booking: {
booking_id: 8451,
note: "Building Node wrapper"
},
callback: function(response) {
console.log(response);
}
});
Delete a temporary booking
http://www.tourcms.com/support/api/mp/booking_delete.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.deleteBooking({
channelId: 3930,
bookingId: 8452,
callback: function(response) {
console.log(response);
}
});
Add a Tour (with or without Options) to a booking, or add Options to an existing Tour that is already on a booking.
http://www.tourcms.com/support/api/mp/booking_add_component.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.addBookingComponent({
channelId: 3930,
booking: {
booking_id: 12920,
component: {
component_key: 'Rjqb+vKn6H5rawI+mt/m56vQ9P6ju1aKv2XO9gZ2OxykgCsUAbrdap/7CTxDKl+p'
}
},
callback: function(response) {
console.info(response);
}
});
Remove a tour from a regular (i.e. non-temporary, non-archived) booking.
http://www.tourcms.com/support/api/mp/booking_remove_component.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.removeBookingComponent({
channelId: 3930,
booking: {
booking_id: 12920,
component: {
component_id: 8286001
}
},
callback: function(response) {
console.info(response);
}
});
Change some details of a particular booking component (tour/option/fee).
http://www.tourcms.com/support/api/mp/booking_update_component.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.updateBookingComponent({
channelId: 3930,
booking: {
booking_id: 12920,
component: {
component_id: 8286216,
sale_quantity: 3
}
},
callback: function(response) {
console.info(response);
}
});
Send one of the pre-configured email templates.
http://www.tourcms.com/support/api/mp/booking_send_email.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.sendBookingEmail({
channelId: 3930,
booking: {
booking_id: 12920,
email_type: 1
},
callback: function(response) {
console.info(response);
}
});
http://www.tourcms.com/support/api/mp/voucher_redemption.php
Get a list of bookings and any of their components that are due to start today that match a voucher barcode. Response includes keys that can be used to redeem the voucher.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/voucher_search.php
The following example matches bookings with a voucher string, booking ID or agent ref matching the text "VOUCHER_STRING_HERE" on Channel 3930 and wideDates enabled (by default the API only searches for bookings for today).
TourCMS.searchVouchers({
channelId: 3930,
voucherString: "VOUCHER_STRING_HERE",
wideDates: 1,
callback: function(response) {
console.log("Found " + response.booking.length + " bookings")
}
});
Redeem / check in the client on a component (tour) on a booking, optionally specify a note to store on the booking.
If a channelId
is not provided, the one passed in the initial configuration will be used.
http://www.tourcms.com/support/api/mp/voucher_redeem.php
TourCMS.redeemVoucher({
channelId: 3930,
key: 'jZh9eZuLQwUdEZ6FqDHmHqy4lYV6xWa5wV2iOuw1A7M=',
note: 'Any free text regarding the redemption',
callback: function(response, status) {
console.log(response);
}
});
Store details of a new payment on a booking sales ledger. Allows Tour Operators to integrate their own payment methods and update the TourCMS sales ledger automatically.
http://www.tourcms.com/support/api/mp/payment_create.php
This example adds a payment of value 10 in the Channel default currency to Booking 8400.
TourCMS.createPayment({
channelId: 3930,
payment: {
booking_id: "8400",
payment_value: "10",
},
callback: function(response, status) {
console.log(response);
}
});
Spreedly specific version of the previous method, to call this method you should have created a Spreedly payment token representing the card you wish to charge.
http://www.tourcms.com/support/api/mp/spreedly_payment_create.php
This example adds a payment of value 10 in the Channel default currency to Booking 8400 using the Spreedly payment method represented by SPREEDLY_PAYMENT_METHOD_TOKEN.
TourCMS.createSpreedlyPayment({
channelId: 3930,
payment: {
spreedly_payment_method: "SPREEDLY_PAYMENT_METHOD_TOKEN",
booking_id: "8400",
payment_value: "10",
currency: "GBP"
},
callback: function(response, status) {
console.log(response);
}
});
List of payments made during a specifif period and/or from staff member.
http://www.tourcms.com/support/api/mp/payments_list.php
This example shows booking id, value and currency payments.
TourCMS.listPayments({
channelId: 3930,
qs: {
from_date: "2018-03-23",
to_date: "2018-03-26"
},
callback: function(response, status) {
if (response.total_payments == 0)
console.log("No payments made");
else{
//Loop through each component and output its component key
response.payments.payment.forEach(function(payment) {
console.log("Booking " + payment.booking_id + ": " + payment.payment_value + "(" + payment.payment_currency + ")");
});
}
}
});
Show details on a specific customer
http://www.tourcms.com/support/api/mp/customer_show.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.showCustomer({
channelId: 3930,
customerId: 3766892,
callback: function(response) {
console.log(response);
}
});
For agents/affiliates only, create a new customer & enquiry in an operators account
http://www.tourcms.com/support/api/mp/enquiry_create.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.createEnquiry({
channelId: 3930,
enquiry: {
firstname: "Joe",
surname: "Bloggs",
email: "test@example.com",
enquiry_type: "General enquiry",
enquiry_detail: "Enquiry text goes here"
},
callback: function(response) {
console.log(response);
}
});
http://www.tourcms.com/support/api/mp/enquiry_search.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
The following example lists all enquiries made in the first two weeks of January.
TourCMS.searchEnquiries({
channelId: 3930,
qs: {
made_date_start: "2016-01-01",
made_date_end: "2016-01-14"
},
callback: function(response) {
console.log(response);
}
});
Update some of the details on a customer record
http://www.tourcms.com/support/api/mp/customer_update.php
If a channelId
is not provided, the one passed in the initial configuration will be used.
TourCMS.updateCustomer({
channelId: 3930,
customer: {
customer_id: "12345",
firstname: "Joseph"
},
callback: function(response) {
console.log(response);
}
});