NAV
javascript

Introduction

Welcome to the Grand Canyon OnePoint API service. This API can be used to check availbility and book reservations on Papillon Helicopters, Grand Canyon Airlines, Grand Canyon Helicopters, and Scenic Airlines.

The service presents a single endpoint (https://api.grandcanyononepoint.com/) and all messages should be POSTed there as JSON. We typically provide a single set of authentiation credentials and - initially - place your account into 'test' mode. This permits developers to build integrations against production data and eliminate remapping resources for production.

Authentication

Nearly every call in the GCOP API requires a valid sessionKey, which will be generated for you by the "authenticate" message. By default session keys expire 24 hours from the time they are created. As a developer, you are free to override this default with either a shorter or longer expiration depending on your needs. Note that requesting a password reset from our technical support staff will cause all currently-issued session keys to be invalidated.

Request Fields

To get an security key POST the following request filling in the appropriate fields with your information: Note that the lifetime key is optional. By default the session key will expire in 24 hours from its creation. However, you are free to define how long you wish this session key to be valid. Values are in seconds.

{
  "request":"authenticate",
  "userName":"yourUserName",
  "password":"yourPassword",
  "agencyID":"yourAgencyID",
  "lifetime":86400
}

Field Optional Description
request no Defines what action is being requested
userName no Your user name provided for you by our integration team
password no The password provided by the integration team
agencyID no The UUID agency identifer, you guessed it, also provided by the integration team
lifetime yes The number of seconds that you want this session to live. Default: 86400 (24 hours) if not specified.

Response Fields

You should get a result similar to the following:

{
  "success": 1,
  "errors": [],
  "sessionKey": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJQYXBpbGxvbkdyb3VwIiwic3ViIjoiRGlyZWN0Q29ubmVjdEFjY2VzcyIsImF1ZCI6ImQ0OGQ3MDA4LTA2ZTktMTFlOC1iYTg5LTBlZDVmODlmNzE4YiIsImV4cCI6MTU1NDgzNjA4NiwibmJmIjoxNTIzMzAwMDg2LCJpYXQiOjE1MjMzMDAwODZ9.801602c0b13d246cce4c88f8a1e5a35d9d6b00ddeb66510ed8dbfe423b9e5587"
}
Field Description
success Defines success or failure
sessionKey The session key generated by your request for use in subsequent calls.

Errors

The 'success' field is the primary indicator if the call requested succeeded or not.

{
  "success": 0,
  "errors" : {
    message: "An error message describing what went wrong.",
    "code": 801092
  }
}

Errors are rendered using a simple datamodel illustrated here. All calls are entirely succesful or complete failure. All responses from our API contain a "success" field that will be either 1 or 0 depending on the call's success or failure. An error will also provide a message describing the problem and an error code. Should you run into any odd or unsolveable errors we will need both the message and the error code.

Products Catalog

Product Universes

{
  "sessionKey":"yourSessionKey",
  "request":"listProductUniverses"
}

The above command returns JSON structured like this:

{
  "success": 1,
  "universe": [
    {
      "name": "Universe name #1",
      "uuid": "25280c6a-b58a-493b-bd24-7adb497c1fe7"
    },
    {
      "name": "Universe name #2",
      "uuid": "7f7b624b-e21f-487c-bd3f-bce724fbda7f"
    }
  ]
}

In our API, the term 'Universe' and 'Category' are often used interchangably. A product universe is simply a collection of products that share a common attribute. In the case of the most current version of our API the universes group together the tours that are offered by our different brands. Thus all tours offered by Grand Canyon Helicopters will be contained within a single universe as would all products by Scenic Airlines. The only exception to this rule is that we may, from time to time, create a universe to house promotional tours.

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.

Response Fields

Field Description
success Defines success or failure
universe An array of Universe Objects detailing the product universe to which the agency is subscribed.

Universe Object Structure

Field Description
name Defines the name of the product universe/category.
uuid The unique identifier of that category.

Product Universe Contents

{
  "request":"showProductUniverse",
  "sessionKey":"yourSessionKey",
  "universeID":"aProductUniverseUUID"
}

The above command returns JSON structured like this:

{
  "success": 1,
  "universeID": "25280c6a-b58a-493b-bd24-7adb497c1fe7",
  "products": [
      {
        "name": "Grand Celebration",
        "code": "PBW4",
        "productID": "925d8ee4-6bb6-4779-b8b5-aaa23498ea08",
        "cityCode": "LAS",
        "airportCode": "BVU"
      },
    ...
    ...

Each product universe will contain a list of productIDs and some meta information about that product such as the name, originating city & airport code, as well as the products code (similar to product SKU).

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
universeID no A valid product universe UUID

Response Fields

Field Description
success Defines success or failure
universeID The UUID of the product universe requested for listing.
products An array of Product Objects.

Product Object Structure:

Field Description
name The brochure name of the tour/product.
code The brochure code / tour code / sku of the product
productID The API uuid for this particular product
cityCode The IATA city code identifiying the departing city for this tour
airportCode The IATA airport code defining the departing airport for this tour (if relevant). If this tour is not by aerial conveyance then it will just match the cityCode.

Get All Categories & Products

{
  "request":"getEntireCatalog",
  "sessionKey":"yourSessionKey"
}

The above command returns JSON structured like this:

{
  "success": 1,
  "catalog": [
      {
        "name": "To West Rim External",
        "uuid": "25280c6a-b58a-493b-bd24-7adb497c1fe7",
        "products": [
            {
              "name": "Grand Celebration G1",
              "code": "PBW4",
              "productID": "925d8ee4-6bb6-4779-b8b5-aaa23498ea08",
              "cityCode": "LAS",
              "airportCode": "BVU"
            },
            {
              "name": "Golden Eagle G1",
              "code": "PBW1",
              "productID": "c456c056-06e7-11e8-ba89-0ed5f89f718b",
              "cityCode": "LAS",
              "airportCode": "BVU"
           }
        ],
    },
    {
      "name": "To South Rim External",
      "uuid": "7f7b624b-e21f-487c-bd3f-bce724fbda7f",
      "products": [
        {
          "name": "Canyon Conniessour G1",
          "code": "SBG4",
          "productID": "e0f2e7df-0a21-4cec-a5f2-e1da4e53c487",
          "cityCode": "LAS",
          "airportCode": "BVU"
        },
        ...
        ...

By far the easiest and most direct way to find all the products and categories an agency is subscribed to is the "getEntireCatalog" call. Primarily a convenience feature, it wraps the functionality of both "listProductUniverses" and "showProductUniverse" into a single result.

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.

Response Fields

Field Description
success Defines success or failure
catalog A list of product universe lists with their products nested inside.

Universe Structure:

Field Description
name Defines the name of the product universe/category.
uuid The unique identifier of that category.
products A list of Product Objects that belong to its parent category.

Get Product Descriptions

{
  "request":"getDescription",
  "sessionKey":"yourSessionKey",
  "productID":"productUUID"
}

The above command returns JSON structured like this:

{
  "success":1,
  "shortDesc":"A undecorated short line of description that will be less that 350 characters",
  "longDesc":"A possibly lengthy description that may contain simple html formatting like bold, paragraph, and the like",
  "textAvailable":true,
  "imagesAvailable":false,
  "duration": 540,
  "bookingCutoff": 240,
  "minCancellation": 2880,
  "hash":"e914a315882e3a7df45fa19bf10ec8633d1c1403"
}

The call will return several fields that, at the moment, return a short and long description of the product id passed in. In addition we provide a hash of the values so that consumers can quickly check to see if either the descriptions or images have changed. If the hash does not match your stored hash you should consider that all fields in the return values have changed.

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
productID no The UUID of the product for which the description should be fetched.

Response Fields

Field Type Description
success int Defines success or failure
shortDesc string An undecorated string containing a very short description of the product (350 chr or less)
longDesc string A detailed description of the product, may contain basic html elements.
textAvailable boolean True if the text description for this product is available.
imagesAvailable boolean True if images for this product is available.
duration int The total duration of the experience in minutes.
bookingCutoff int The minimum amount of notice (in minutes) required between booking and the the experience start.
minCancellation int The minimum amount of notice required to cancel a reservation for the product.
hash string A hash representing the state of the images and descriptions. If it changes, consider all the descriptive content invalid.

Availability & Price

Our tours, availability structure, and pricing are built around a day model and are contingent upon how many passengers you are looking for. While this might seem strange, one must understand that - for the most part - our tours and experiences are operated on smaller and more personal aircraft; thus we make every effort to ensure that groups and families are not separated. Thus it is important for us to know how many of each (adult vs child) are planning to take the experience so we can validate space for them.

When presented with the requirement (eg: 2 adults, 1 child, on August 10) we will process your request and return ONLY the itineraries that match your criteria.

The "getCalendar" request is the only exception to this rule. The "getCalendar" call will show you all itineraries that have at least 2 seats available.

Request

{
  "request": "checkAvailability",
  "sessionKey": "yourSessionKey",
  "productID": "aProductUUID",
  "adult": 1,
  "child": 1,
  "date": "YYYY-MM-DD",
  "withHotels": true
}

Response

{
  "success": 1,
  "Attributes": [{
    "AttributeId": "test1",
    "Name": "ext1"
  }, {
    "AttributeId": "1a119a38-ffbe-11e7-ba89-0ed5f89f718b",
    "Name": "Special Service Notes"
  }, {
    "AttributeId": "2dea9802-ffbe-11e7-ba89-0ed5f89f718b",
    "Name": "VoucherID"
  }],
  "Itineraries": [{
    "ItineraryID": 390,
    "NoAdults": 1,
    "NoChildren": 1,
    "StartRangeTime": "06:30",
    "EndRangeTime": "06:30",
    "EstPickupTime": false,
    "PickupClass": "PC303",
    "AdultPrice": 259,
    "AdultFees": 85,
    "ChildPrice": 239,
    "ChildFees": 85,
    "TotalPrice": 668,
    "DeptTime": "Early Bird Fare at 06:30"
  }, 
  ...
  ...
  {
    "ItineraryID": 1080,
    "NoAdults": 1,
    "NoChildren": 1,
    "StartRangeTime": "18:00",
    "EndRangeTime": "18:00",
    "EstPickupTime": false,
    "PickupClass": "PC304",
    "AdultPrice": 294,
    "AdultFees": 85,
    "ChildPrice": 274,
    "ChildFees": 85,
    "TotalPrice": 738,
    "DeptTime": "Sunset Fare at 18:00"
  }],
  "PickupServiceAvailable": true,
  "PickupClassHotelList": {
    "PC303": [{
      "id": "1067",
      "lable": "Alexis Park",
      "estimatedMinsPrior": 80
    }, {
      "id": "1070",
      "lable": "Americana 5 At Industrial Rd",
      "estimatedMinsPrior": 75
    }, {
      "id": "1232",
      "lable": "Americas Best Value Inn",
      "estimatedMinsPrior": 75
    }, {
      "id": "1843",
      "lable": "Aria Resort",
      "estimatedMinsPrior": 90
    }, {
      "id": "192",
      "lable": "Arizona Charlie's (Boulder Hwy)",
      "estimatedMinsPrior": 65
    }, {
      "id": "193",
      "lable": "Arizona Charlie's (Decatur)",
      "estimatedMinsPrior": 125
    }, {
      "id": "1505",
      "lable": "Artisan Hotel Boutique",
      "estimatedMinsPrior": 90
    },
    ...
  }
}

This call will return all available itineraries for a specific day, any additional attributes necessary to book the product, and if desired or necessary the hotel pickup lists (yes, potentially plural).

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
productID no The UUID of the product you want to check availability for
adult no The integer number of adults
child no The integer number of children
date no The date that you need to look at in Year-Month-Day format eg 2019-06-02
withHotels yes Include the hotel pickup class definitions in the result

Response Fields

Root Response Object

Field Description
success Defines success or failure
Attributes An array of attributes that can, but do not have to, contain additional information. We use these fields to satisfy different integration requirements client by client. Some fields such as the voucher id are common among many implemenations. This should be a point of discussion during integration.
Itineraries An array of available itineraries for this specific day.
PickupServiceAvailable A boolean that informs if we offer hotel pickup service on this product.
PickupClassHotelList An object whose keys are the titles of Pickup Classes. Contained inside each pickup class is a list of hotels services by that pickup class.

Attributes

Field Description
AttributeId The UUID assigned to this partiuclar attribute.
Name The label of this particular field.

Itineraries

Field Description
ItineraryID An integer id representing this specific itinerary. Additionally, it's also the number of minutes elapsed since midnight (00:00) of the departing day.
NoAdults Number of adults as specified in the request
NoChildren Number of children as specified in the request
StartTimeRange Effectively the departure time of this itineary in 24hr format.
EndRangeTime Depreciated, originally our itineraries covered a time span. This is no longer true and this field may be removed in future versions.
PickupClass Defines the pickup class hotel list to use when displaying a choice of hotel pickups. If pickup is not available on the product this will be boolean false.
AdultPrice The base price per adult guest
AdultFees The fees per adult
ChildPrice The base price per child guest
ChildFees The fees per child
TotalPrice The purchase total for this itinerary based of on the total of adults, children, and associated fees.
DeptTime An english describing both the fare type and the departure time

Pickup Classes

All itineraries return a PickupClass value in their itineraries and that value serves as a lookup for values in the PickupClassHotelList. This is necessary because pickup availability and the estimated mins before pickup can change from itinerary to itinerary due to known weather patterns, traffic patterns, airspace congestion, shuttle size, and a variety of other variables. We do our best to ensure that passengers spend as little time in shuttles and as much time as possible on their actual experince.

Field Description
{PickupClass ID} An array of hotels at which pickup occurs.

Hotel Structure

Field Description
id A potentially alphanumeric code representing a specific hotel
label An english language label for the hotel, usually the hotel name.
estimatedMinsPrior The time the pickup will occur represented by the number of mins to subtract from the departure time of the guests' selected itinerary.

Single Product Request

{
  "request":"checkAvailabilitySpan",
  "sessionKey":"",
  "productID":"925d8ee4-6bb6-4779-b8b5-aaa23498ea08",
  "adult": 1,
  "child": 1,
  "startDate": "2018-06-01",
  "endDate":"2018-06-30",
  "withHotels": true
}

Single Product Response

{
  "PickupClassHotelList": {
    "PC303": [{
      "id": "1067",
      "lable": "Alexis Park",
      "estimatedMinsPrior": 80
    }, {
      "id": "1070",
      "lable": "Americana 5 At Industrial Rd",
      "estimatedMinsPrior": 75
    }
    ...
  },
  "Dates": {
    "2018-06-01": [
      {
        "ItineraryID": 390,
        "NoAdults": 1,
        "NoChildren": 1,
        "StartRangeTime": "06:30",
        "EndRangeTime": "06:30",
        "EstPickupTime": false,
        "PickupClass": "PC303",
        "AdultPrice": 259,
        "AdultFees": 85,
        "ChildPrice": 239,
        "ChildFees": 85,
        "TotalPrice": 668,
        "DeptTime": "Early Bird Fare at 06:30",
    }, ...]
    ...
    ...
    "2018-06-30": [{
      "ItineraryID": 390,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "06:30",
      "EndRangeTime": "06:30",
      "EstPickupTime": false,
      "PickupClass": "PC303",
      "AdultPrice": 259,
      "AdultFees": 85,
      "ChildPrice": 239,
      "ChildFees": 85,
      "TotalPrice": 668,
      "DeptTime": "Early Bird Fare at 06:30"
    },

Multi-Product Request

{
  "request":"checkAvailabilitySpan",
  "sessionKey":"",
  "productList":"925d8ee4-6bb6-4779-b8b5-aaa23498ea08,925d8ee4-6bb6-4779-b8b5-aaa23498ea08,925d8ee4-6bb6-4779-b8b5-aaa23498ea08",
  "adult": 1,
  "child": 1,
  "startDate": "2018-06-01",
  "endDate":"2018-06-30",
  "withHotels": true
}

Multi-Product Response

{
  "success":1,
  "errors":{},
  "productList":["925d8ee4-6bb6-4779-b8b5-aaa23498ea08","925d8ee4-6bb6-4779-b8b5-aaa23498ea08","925d8ee4-6bb6-4779-b8b5-aaa23498ea08"],
  "productAvailability":{
    "925d8ee4-6bb6-4779-b8b5-aaa23498ea08": {
      "PickupClassHotelList":{
        ... see single product response
      },
      "Dates":{
        ... see single product response
      }
    }
  }
}

In addition to the single day search, developers can now get batch availability by specifying a start date and an end date. Note that the end date is INCLUSIVE! Currently the distance between the start date and end date cannot exceed 180 days.

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
productID no The UUID of the product for which you want to check availability
productList yes If checking multiple products provide a comma sepearted list of UUIDs
adult no The integer number of adults
child no The integer number of children
startDate no The starting date for the search formatted in YYYY-MM-DD (eg. 2019-06-01)
endDate no The ending date (inclusive) of the search also in YYYY-MM-DD
withHotels yes Include the hotel pickup class definitions in the result

Response Fields

Root Response Object

Field Description
success Defines success or failure
PickupClassHotelList An object whose keys are the titles of Pickup Classes. Contained inside each pickup class is a list of hotels services by that pickup class.
Dates An object whose keys are the dates returned in the search, starting at startDate and ending with endDate

Date Specific Object

Field Description
{YYYY-MM-DD} An array of Itineraries that match, for the date specified in the key, the adult/child availability criteria.

For the description of the itinerary object see 'Single Day Availability' search documentation above.

Get Calendar

Request

{
  "request":"getCalendar",
  "sessionKey":"",
  "productID":"925d8ee4-6bb6-4779-b8b5-aaa23498ea08",
  "month":6,
  "year":2018
}

Response

{
  "success": 1,
  "dayArray": {
    "1": [{
      "ItineraryID": 390,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "06:30",
      "EndRangeTime": "06:30",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 259,
      "AdultFees": 85,
      "ChildPrice": 239,
      "ChildFees": 85,
      "TotalPrice": 668,
      "DeptTime": "Early Bird Fare at 06:30",
      "seatsAvailable": 44
    }, {
      "ItineraryID": 1095,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "18:15",
      "EndRangeTime": "18:15",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 294,
      "AdultFees": 85,
      "ChildPrice": 274,
      "ChildFees": 85,
      "TotalPrice": 738,
      "DeptTime": "Sunset Fare at 18:15",
      "seatsAvailable": 54
    }],
    ...
    "30": [{
      "ItineraryID": 390,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "06:30",
      "EndRangeTime": "06:30",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 259,
      "AdultFees": 85,
      "ChildPrice": 239,
      "ChildFees": 85,
      "TotalPrice": 668,
      "DeptTime": "Early Bird Fare at 06:30",
      "seatsAvailable": 46
    }, {
      "ItineraryID": 1110,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "18:30",
      "EndRangeTime": "18:30",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 294,
      "AdultFees": 85,
      "ChildPrice": 274,
      "ChildFees": 85,
      "TotalPrice": 738,
      "DeptTime": "Sunset Fare at 18:30",
      "seatsAvailable": 54
    }]
  },
  "dateArray": {
    "2018-06-01": [{
      "ItineraryID": 390,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "06:30",
      "EndRangeTime": "06:30",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 259,
      "AdultFees": 85,
      "ChildPrice": 239,
      "ChildFees": 85,
      "TotalPrice": 668,
      "DeptTime": "Early Bird Fare at 06:30",
      "seatsAvailable": 44
    }, {
      "ItineraryID": 555,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "09:15",
      "EndRangeTime": "09:15",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 284,
      "AdultFees": 85,
      "ChildPrice": 264,
      "ChildFees": 85,
      "TotalPrice": 718,
      "DeptTime": "Prime Time Fare at 09:15",
      "seatsAvailable": 37
    }],
    ...
    "2018-06-30": [{
      "ItineraryID": 390,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "06:30",
      "EndRangeTime": "06:30",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 259,
      "AdultFees": 85,
      "ChildPrice": 239,
      "ChildFees": 85,
      "TotalPrice": 668,
      "DeptTime": "Early Bird Fare at 06:30",
      "seatsAvailable": 46
    }, {
      "ItineraryID": 1110,
      "NoAdults": 1,
      "NoChildren": 1,
      "StartRangeTime": "18:30",
      "EndRangeTime": "18:30",
      "EstPickupTime": false,
      "PickupClass": false,
      "AdultPrice": 294,
      "AdultFees": 85,
      "ChildPrice": 274,
      "ChildFees": 85,
      "TotalPrice": 738,
      "DeptTime": "Sunset Fare at 18:30",
      "seatsAvailable": 54
    }]
  }
}    

This is the only availability and pricing check function that does NOT require a number of adults and children and is intended, primarily, to get a sense of the available departure time and prices for a calendar month.

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
productID no The UUID of the product you want to check availability for
month no An integer representing the month requested
year no A integer representing the year requested

Response Fields

Root Response Object

Field Description
success Defines success or failure
dayArray An object who's keys represent the day of the month searched for. Each one contains an array of Itineraries for the day in question.
dateArray The exact same information in dayArray but the object keys are the date in YYYY-MM-DD format for convenience.

In both cases see 'Single Day Availability Search' for an explaination of the contents of the itinerary object.

Making Reservations

There are two different workflows for making reservations through our API. The workflow that is relevant to you depends on if your agency has billing/voucher privileges with our activity providers.

Billing/Voucher Workflow

  1. Create a Quote : This guarantees the prices on a product for a specific day for a specific number of guests.
    • It is rare but possible for the price of an itinerary to change between the time you run your check availability call and the time you create a quote. The availability and pricing information presented in the quote is authoritative.
    • Quotes have a specific liftime and can expire.
    • This step does NOT guarantee seating availability, only price.
  2. Process the Reservation : This step pulls the seats out of inventory and creates a reservation number.
    • This step guarantees seating availability.
    • Reservations must be paid within the alloted time or they will expire and be automatically cancelled.

Create Quote

Request

{
  "request": "quote",
  "sessionKey": "yourSessionKey",
  "productID": "925d8ee4-6bb6-4779-b8b5-aaa23498ea08",
  "adult": "1",
  "child": "1",
  "date": "2018-05-22",
  "withHotels": true  
}

Response

{
  "success": 1,
  "Attributes": [{
    "AttributeId": "test1",
    "Name": "ext1"
  }, {
    "AttributeId": "1a119a38-ffbe-11e7-ba89-0ed5f89f718b",
    "Name": "At what hotel are the guests staying"
  }, {
    "AttributeId": "2dea9802-ffbe-11e7-ba89-0ed5f89f718b",
    "Name": "VoucherID"
  }],
  "Itineraries": [{
    "ItineraryID": 390,
    "NoAdults": 1,
    "NoChildren": 1,
    "StartRangeTime": "06:30",
    "EndRangeTime": "06:30",
    "EstPickupTime": false,
    "PickupClass": "PC303",
    "AdultPrice": 259,
    "AdultFees": 85,
    "ChildPrice": 239,
    "ChildFees": 85,
    "TotalPrice": 668,
    "DeptTime": "Early Bird Fare at 06:30",
    "seatsAvailable": 44
  }, 
  ...
  ...
  {
    "ItineraryID": 1080,
    "NoAdults": 1,
    "NoChildren": 1,
    "StartRangeTime": "18:00",
    "EndRangeTime": "18:00",
    "EstPickupTime": false,
    "PickupClass": "PC304",
    "AdultPrice": 294,
    "AdultFees": 85,
    "ChildPrice": 274,
    "ChildFees": 85,
    "TotalPrice": 738,
    "DeptTime": "Sunset Fare at 18:00",
    "seatsAvailable": 54
  }],
  "PickupServiceAvailable": true,
  "PickupClassHotelList": {
    "PC303": [{
      "id": "1067",
      "lable": "Alexis Park",
      "estimatedMinsPrior": 80
    }, {
      "id": "1070",
      "lable": "Americana 5 At Industrial Rd",
      "estimatedMinsPrior": 75
    },
    ...
    ...
    {
      "id": "1523",
      "lable": "Wynn Las Vegas",
      "estimatedMinsPrior": 115
    }]
  },
  "QuoteID": "9f79b180-1dd5-11b2-bb1a-6f0d4cb7849e",
  "QuoteCreated": 1523321695,
  "QuoteExpires": 1523322895,
  "date": "2018-05-22"
}


Does the format of the quote response look familiar? If you're thinking that it looks a great deal like the "Single Day Availability Search" you would be correct. 99% of the format is identical. However, it's the differences that are very important.

A few notes about Quotes:

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
productID no The UUID of the product you want to check availability for
adult no The integer number of adults
child no The integer number of children
date no The date that you need to look at in Year-Month-Day format eg 2019-06-02
withHotels yes Include the hotel pickup class definitions in the result

Response Fields

Root Response Object

Field Description
success Defines success or failure
Attributes See the "Single Day Availability Search for an explanation."
Itineraries See the "Single Day Availability Search for an explanation."
PickupServiceAvailable See the "Single Day Availability Search for an explanation."
PickupClassHotelList See the "Single Day Availability Search for an explanation."
QuoteID This the UUID of this specific quote. You will need this during the reservation phase of this process.

Reserve Seats

Request

{
  "request":"reserve",
  "quoteID":"9f442ae0-1dd5-11b2-ac02-bd9d5c5a9c61",
  "sessionKey": "yourSessionKey",
  "itineraryID":555,
  "hotelID": 1441,
  "masterFirstName":"Roper",
  "masterLastName":"Clayton",
  "emailAddress":"coy@papillon.com",
  "phoneNumber":"7024085411",
  "markup": {
    "adult":440,
    "child":420
  },
  "paxArray": [
    {
      "FirstName": "Coy",
      "LastName": "Clayton",
      "BodyWeight": "280",
      "Type": "Adult"
    },
    {
      "FirstName": "Logan",
      "LastName": "Fischer",
      "BodyWeight": "55",
      "Type": "Child"
    }
  ],
  "attribArray": [
    {
      "id": "2dea9802-ffbe-11e7-ba89-0ed5f89f718b",
      "value": "XV298107-1290-20091"
    },
    {
      "id": "1a119a38-ffbe-11e7-ba89-0ed5f89f718b",
      "value": "Luxor"
    }
  ]
}

Response

{
  "orl": "2459828",
  "hotel": "Hilton Grand Vacation Suites At The Flamingo",
  "pickup": "Outside - Main Entrance",
  "pickupTime": "07:30",
  "adultNetRate": 369,
  "childNetRate": 349,
  "adultSaleRate": 440,
  "childSaleRate": 420,
  "totalSale": 860,
  "quoteID": "9f7a0700-1dd5-11b2-8ce1-a3abbdc3c9df",
  "resExpires": true,
  "resExpireAfter": 1523324855,
  "success": 1,
  "errors": []
}

This call its the call that guarantees seats! This is the call that generates an actual, living, breathing reservation. It's powerful, but not overly complex. There are a few things to keep in mind, however.

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
quoteID no The UUID of a valid, unexpired quote that matches the pax count, and date exactly.
itineraryID no The integer itineraryID of the time you wish to book
hotelID yes The hotelID that identifies where the guest is staying. Optional only if the product does NOT provide hotel pickup. For consistency you may provide this field as boolean false if you would like to send it regardless.
masterFirstName no The primary contact's first name. This will be the name that the reservation is searchable under.
masterLastName no The primary contact's last name.
emailAddress no The primary contact's email address.
phoneNumber no The primary contact's best reach phone number, often cell phone number, in the event of inclement weather or other such unlikely disruption.
markup yes An json object that defines the target SALE price. See Below*
paxArray no An array of javascript object(s) that describe the names and weights of the guests to travel. See Below*
attribArray no An array of objects that describe the values for various custom attributes as defined in the availability and quote stages.

Markup Object

API useres are free to define their own sale prices based on our variable net rate. This is accomplished by submitting a 'markup' object along with the 'reserve' request. The sale price is a price ABOVE the net rate that has been quoted to you. For example, if we deliver $240 adult & $220 child net rate you may include a markup object that says you want to charge $260 adult and $240 child. This configuration would result in a $20 adult / $20 child commission back to you.

Field Optional Description
adult no A price that you wish to charge for a adult.
child no A price that you wish to charge for a child.

In all cases the adult and child value may NOT be less that the net rate quoted to you for the specific itinerary.

paxArray

The paxArray (short for Passenger Array) defines the information that we need about every person traveling on this reservation. Each person represents a different passenger object within the paxArray array. Passenger are defined like this:

Field Optional Description
FirstName no The first name of the passenger
LastName no The last name of the passenger
BodyWeight no The passengers weight in US Pounds (lbs) only please.
Type no The passenger type either 'Adult' or 'Child'

Note that the system will count the number of adults and number of children and validate that against the number of adults and children used to build the quote.

attribArray During both the quote and availability phase there were fields marked "Attributes". Each attribute was associated with a UUID. To provide values for those attributes add 1 json object (as defined below) to the attribArray. 1 object per attribute.

Field Optional Description
id no The UUID of the attribute for which you are providing a value
value no The value of that attribute.

Response Fields

Field Description
success Defines success or failure
orl Provides the Order Reservation Locator, or Reservation Number in general parlance.
hotel The hotel at which the guest will be picked up at.
pickup The specific pickup point for the guests
pickupTime The time at which the guests will be picked up in 24hour format.
adultNetRate The total Net Rate (including fees) quoted and booked for adults on this reservation
childNetRate The total Net Rate (including fees) quoted and booked for children on this reservation if applicable
totalSale The final amount that will be billed or charged to a credit card
quoteID The ID of the quote used to create this reservation
resExpires A boolean indicating if the reservation expires. Voucher/billing agencies reservations do not expire and, in fact, the rest of the fields are irrelevant to you.
resExpiresAfter A unix timestamp indicating when the reservation will expire if left unpaid.
ccPaymentReady In most cases this will be true indicating that we have a credit card payment session waiting to be paid. In the unlikely event that this is false a payment session can be initiated using the 'pay' call.
ccPaymentLink A link to our payment processing gateway that can be used to submit payment on this reservation.
ccPaymentExpires The unix timestamp after which the payment link will die and be unavailable. Another payment session and link can be created using the 'pay' call.

Cancel a Booking

Request

{
  "sessionKey": "your session key",
  "request":"cancel",
  "ResLocator":"2459829"
}

Response

{
  "success": 1,
  "ResLocator": "2459829"
}

Sometimes things just don't work out. The client decides they don't like to fly, are afraid of heights, or cancel for any number of reasons. That is what this 'cancel' call is used for. There are a couple caveats in its use however. Iterated below:

Request Fields

Field Optional Description
request no Defines what action is being requested
sessionKey no Your session key generated by a call to the 'authenticate' function.
ResLocator no the ORL/Reservation number you wish to cancel

Response Fields

Field Description
success Defines success or failure
ResLocator The ResLocator submitted in the request