Detalhes do pacote

amadeus

amadeus4dev12.5kMIT11.0.0

Node library for the Amadeus travel APIs

amadeus, travel, api, apis

readme (leia-me)

Amadeus Node SDK

Module Version Build and Deploy Maintainability Dependencies Discord

Amadeus provides a rich set of APIs for the travel industry. For more details, check out the Amadeus for Developers Portal or the SDK class reference.

Installation

This module has been tested using Node LTS versions. You can install it using Yarn or NPM.

npm install amadeus --save

Getting Started

To make your first API call, you will need to register for an Amadeus Developer Account and set up your first application.

const Amadeus = require('amadeus');

const amadeus = new Amadeus({
  clientId: 'REPLACE_BY_YOUR_API_KEY',
  clientSecret: 'REPLACE_BY_YOUR_API_SECRET'
});

amadeus.shopping.flightOffersSearch.get({
    originLocationCode: 'SYD',
    destinationLocationCode: 'BKK',
    departureDate: '2022-06-01',
    adults: '2'
}).then(function(response){
  console.log(response.data);
}).catch(function(responseError){
  console.log(responseError.code);
});

Examples

You can find all the endpoints in self-contained code examples.

Initialization

The client can be initialized directly.

// Initialize using parameters
const amadeus = new Amadeus({
  clientId: 'REPLACE_BY_YOUR_API_KEY',
  clientSecret: 'REPLACE_BY_YOUR_API_SECRET'
});

Alternatively, it can be initialized without any parameters if the environment variables AMADEUS_CLIENT_ID and AMADEUS_CLIENT_SECRET are present.

const amadeus = new Amadeus();

Your credentials can be found on the Amadeus dashboard.

By default, the SDK environment is set to test environment. To switch to a production (pay-as-you-go) environment, please switch the hostname as follows:

const amadeus = new Amadeus({
  hostname: 'production'
});

Documentation

Amadeus has a large set of APIs, and our documentation is here to get you started today. Head over to our reference documentation for in-depth information about every SDK method, its arguments and return types.

Making API calls

This library conveniently maps every API path to a similar path. For example, GET /v2/reference-data/urls/checkin-links?airlineCode=BA would be:

amadeus.referenceData.urls.checkinLinks.get({ airlineCode: 'BA' });

Similarly, to select a resource by ID, you can pass in the ID to the singular path. For example, GET /v1/shopping/hotelOffers/123/ would be:

amadeus.shopping.hotelOffer('123').get(...);

You can make any arbitrary GET API call directly with the .client.get method as well:

amadeus.client.get('/v2/reference-data/urls/checkin-links', { airlineCode: 'BA' });

Or, with a POST using .client.post method:

amadeus.client.post('/v1/shopping/flight-offers/pricing', { data });

Promises

Every API call returns a Promise that either resolves or rejects.

Every resolved API call returns a Response object containing a body attribute with the raw response. If the API call contained a JSON response, it will parse the JSON into the result attribute. If this data contains a data key, that will be made available in data attribute.

For a failed API call, it returns a ResponseErrorobject containing the (parsed or unparsed) response, the request, and an error code.

amadeus.referenceData.urls.checkinLinks.get({
  airlineCode: 'BA'
}).then(function(response){
  console.log(response.body);   //=> The raw body
  console.log(response.result); //=> The fully parsed result
  console.log(response.data);   //=> The data attribute taken from the result
}).catch(function(error){
  console.log(error.response); //=> The response object with (un)parsed data
  console.log(error.response.request); //=> The details of the request made
  console.log(error.code); //=> A unique error code to identify the type of error
});

Pagination

If an API endpoint supports pagination, the other pages are available under the .next, .previous, .last and .first methods.

amadeus.referenceData.locations.get({
  keyword: 'LON',
  subType: 'AIRPORT,CITY'
}).then(function(response){
  console.log(response.data); // first page
  return amadeus.next(response);
}).then(function(nextResponse){
  console.log(nextResponse.data); // second page
});

If a page is not available, the response will resolve to null.

Logging & Debugging

The SDK makes it easy to add your own logger that is compatible with the default console.

const amadeus = new Amadeus({
  clientId: 'REPLACE_BY_YOUR_API_KEY',
  clientSecret: 'REPLACE_BY_YOUR_API_SECRET',
  logger: new MyConsole()
});

Additionally, to enable more verbose logging, you can set the appropriate level on your own logger. The easiest way would be to enable debugging via a parameter during initialization, or using the AMADEUS_LOG_LEVEL environment variable. The available options are silent (default), warn, and debug.

const amadeus = new Amadeus({
  clientId: 'REPLACE_BY_YOUR_API_KEY',
  clientSecret: 'REPLACE_BY_YOUR_API_SECRET',
  logLevel: 'debug'
});

List of supported endpoints

//Airport Routes 
amadeus.airport.directDestinations.get({
     departureAirportCode: 'CDG',
})

//Airline Routes
//find all destinations served by a given airline
amadeus.airline.destinations.get({
     airlineCode: 'BA',
 })

// Flight Inspiration Search
amadeus.shopping.flightDestinations.get({
  origin : 'MAD'
})

// Flight Cheapest Date Search
amadeus.shopping.flightDates.get({
  origin : 'MAD',
  destination : 'MUC'
})

// Flight Offers Search GET
amadeus.shopping.flightOffersSearch.get({
  originLocationCode: 'SYD',
  destinationLocationCode: 'BKK',
  departureDate: '2022-11-01',
  adults: '2'
})

// Flight Offers Search POST
// A full example can be found at https://github.com/amadeus4dev/amadeus-code-examples
amadeus.shopping.flightOffersSearch.post(body)

// Flight Offers Price
amadeus.shopping.flightOffersSearch.get({
    originLocationCode: 'SYD',
    destinationLocationCode: 'BKK',
    departureDate: '2022-11-01',
    adults: '1'
}).then(function(response){
    return amadeus.shopping.flightOffers.pricing.post(
      {
        'data': {
          'type': 'flight-offers-pricing',
          'flightOffers': [response.data[0]]
        }
      }
    )
}).then(function(response){
    console.log(response.data);
}).catch(function(responseError){
    console.log(responseError);
});

// Flight Offers Price with additional parameters
// for example: check additional baggage options 
amadeus.shopping.flightOffers.pricing.post(body ,{include: 'bags'});

// Flight Create Orders
// To book the flight-offer(s) returned by the Flight Offers Price
// and create a flight-order with travelers' information.
// A full example can be found at https://git.io/JtnYo
amadeus.booking.flightOrders.post(
  {
    'type': 'flight-order',
    'flightOffers': [priced-offers],
    'travelers': []
  }
);

// Retrieve flight order with ID 'XXX'. This ID comes from the
// Flight Create Orders API, which is a temporary ID in test environment.
amadeus.booking.flightOrder('XXX').get()

// Cancel flight order with ID 'XXX'. This ID comes from the
// Flight Create Orders API, which is a temporary ID in test environment.
amadeus.booking.flightOrder('XXX').delete()

// Flight SeatMap Display
// To retrieve the seat map of each flight included
// in flight offers for MAD-NYC flight on 2021-08-01
amadeus.shopping.flightOffersSearch.get({
  originLocationCode: 'SYD',
  destinationLocationCode: 'BKK',
  departureDate: '2022-11-01',
  adults: '1'
}).then(function(response){
    return amadeus.shopping.seatmaps.post(
      {
        'data': [response.data[0]]
      }
    );
}).then(function(response){
    console.log(response.data);
}).catch(function(responseError){
    console.log(responseError);
});
// To retrieve the seat map for flight order with ID 'XXX'
amadeus.shopping.seatmaps.get({
  'flight-orderId': 'XXX'
});

// Flight Availabilities Search
amadeus.shopping.availability.flightAvailabilities.post(body);

// Branded Fares Upsell 
amadeus.shopping.flightOffers.upselling.post(body);

// Flight Choice Prediction
amadeus.shopping.flightOffersSearch.get({
    originLocationCode: 'SYD',
    destinationLocationCode: 'BKK',
    departureDate: '2022-11-01',
    adults: '2'
}).then(function(response){
    return amadeus.shopping.flightOffers.prediction.post(response);
}).then(function(response){
    console.log(response.data);
}).catch(function(responseError){
    console.log(responseError);
});

// Flight Checkin Links
amadeus.referenceData.urls.checkinLinks.get({
  airlineCode : 'BA'
})

// Airline Code Lookup
amadeus.referenceData.airlines.get({
  airlineCodes : 'U2'
})

// Airports and City Search (autocomplete)
// Find all the cities and airports starting by 'LON'
amadeus.referenceData.locations.get({
  keyword : 'LON',
  subType : Amadeus.location.any
})

// Get a specific city or airport based on its id
amadeus.referenceData.location('ALHR').get()

// Airport Nearest Relevant Airport (for London)
amadeus.referenceData.locations.airports.get({
  longitude : 0.1278,
  latitude  : 51.5074
})

// Flight Most Booked Destinations
amadeus.travel.analytics.airTraffic.booked.get({
  originCityCode : 'MAD',
  period : '2017-08'
}

// Flight Most Traveled Destinations
amadeus.travel.analytics.airTraffic.traveled.get({
  originCityCode : 'MAD',
  period : '2017-01'
})

// Flight Busiest Traveling Period
amadeus.travel.analytics.airTraffic.busiestPeriod.get({
  cityCode: 'MAD',
  period: '2017',
  direction: Amadeus.direction.arriving
})

// City Search API
// finds cities that match a specific word or string of letters. 
// Return a list of cities matching a keyword 'Paris'
amadeus.referenceData.locations.cities.get({
  keyword: 'Paris'
})

//Hotel Name Autocomplete API
//Autocomplete a hotel search field
amadeus.referenceData.locations.hotel.get({
     keyword: 'PARI',
     subType: 'HOTEL_GDS'
})

//Hotel List API 
//Get list of hotels by city code
amadeus.referenceData.locations.hotels.byCity.get({
      cityCode: 'PAR'
    })

//Get List of hotels by Geocode
amadeus.referenceData.locations.hotels.byGeocode.get({
      latitude: 48.83152,
      longitude: 2.24691
    })

//Get List of hotels by hotelIds
amadeus.referenceData.locations.hotels.byHotels.get({
      hotelIds: 'ACPAR245'
    })

// Hotel Search API V3
// Get list of available offers in specific hotels by hotel ids
amadeus.shopping.hotelOffersSearch.get({
    hotelIds: 'RTPAR001',
    adults: '2'
})
// Check offer conditions of a specific offer id
amadeus.shopping.hotelOfferSearch('XXX').get()

// Hotel Booking API v2
amadeus.booking.hotelOrders.post(
  {
    'data': {
        'type': 'hotel-order',
        'guests': [],
        'travelAgent': {},
        'roomAssociations': [],
        'payment': {}
    }
  }
)


// Hotel Booking API v1
amadeus.booking.hotelBookings.post(
  {
    'data': {
      'offerId': 'XXXX',
      'guests': [],
      'payments': [],
      'rooms': []
    }
  }
)

// On-Demand Flight Status
// What's the current status of my flight?
amadeus.schedule.flights.get({
  carrierCode: 'AZ',
  flightNumber: '319',
  scheduledDepartureDate: '2021-03-13'
})


// Points of Interest
// What are the popular places in Barcelona (based a geo location and a radius)
amadeus.referenceData.locations.pointsOfInterest.get({
  latitude : 41.397158,
  longitude : 2.160873
})

// What are the popular places in Barcelona? (based on a square)
amadeus.referenceData.locations.pointsOfInterest.bySquare.get({
  north: 41.397158,
  west: 2.160873,
  south: 41.394582,
  east: 2.177181
})

// Extract the information about point of interest with ID '9CB40CB5D0'
amadeus.referenceData.locations.pointOfInterest('9CB40CB5D0').get()

// Location Score
amadeus.location.analytics.categoryRatedAreas.get({
  latitude : 41.397158,
  longitude : 2.160873
})

// Tours and Activities
// What are the best tours and activities in Barcelona?
amadeus.shopping.activities.get({
  latitude: 41.397158,
  longitude: 2.160873
})

// What are the best tours and activities in Barcelona? (based on a Square)
amadeus.shopping.activities.bySquare.get({
  north: 41.397158,
  west: 2.160873,
  south: 41.394582,
  east: 2.177181
})

// Extract the information about an activity with ID '56777'
amadeus.shopping.activity('56777').get()

// Hotel Ratings
// Get Sentiment Analysis of reviews about Holiday Inn Paris Notre Dame.
amadeus.eReputation.hotelSentiments.get({
  hotelIds: 'XKPARC12'
})

// Trip Purpose Prediction
// Forecast traveler purpose, Business or Leisure, together with the probability in the context of search & shopping.
amadeus.travel.predictions.tripPurpose.get({
  originLocationCode: 'NYC',
  destinationLocationCode: 'MAD',
  departureDate: '2021-04-01',
  returnDate: '2021-04-08'
})

// Flight Delay Prediction
// This machine learning API is based on a prediction model that takes the input of the user - time, carrier, airport and aircraft information;
// and predict the segment where the flight is likely to lay.
amadeus.travel.predictions.flightDelay.get({
  originLocationCode: 'BRU',
  destinationLocationCode: 'FRA',
  departureDate: '2020-01-14',
  departureTime: '11:05:00',
  arrivalDate: '2020-01-14',
  arrivalTime: '12:10:00',
  aircraftCode: '32A',
  carrierCode: 'LH',
  flightNumber: '1009',
  duration: 'PT1H05M'
})

// Airport On-time Performance
// Get the percentage of on-time flight departures from JFK
amadeus.airport.predictions.onTime.get({
  airportCode: 'JFK',
  date: '2022-18-01'
})

// Travel Recommendations
amadeus.referenceData.recommendedLocations.get({
  cityCodes: 'PAR',
  travelerCountryCode: 'FR'
})

// Flight Price Analysis
amadeus.analytics.itineraryPriceMetrics.get({
   originIataCode: 'MAD',
   destinationIataCode: 'CDG',
   departureDate: '2022-03-13',
 })

//Cars & Transfers APIs
// Transfer Search API: Search Transfer
amadeus.shopping.transferOffers.post(body);

// Transfer Book API: Book a transfer based on the offer id
amadeus.ordering.transferOrders.post(body, offerId='2094123123');

// Transfer Management API: Cancel a transfer based on the order id & confirmation number
amadeus.ordering.transferOrder('XXX').transfers.cancellation.post({}, confirmNbr='12345');

Development & Contributing

Want to contribute? Read our Contributors Guide for guidance on installing and running this code in a development environment.

License

This library is released under the MIT License.

Help

You can find us on StackOverflow or join our developer community on Discord.

changelog (log de mudanças)

Changelog

11.0.0 - 2024-10-14

Decommissioned Trip Parser API

JSON body is now stringified before sent to the POST API calls. Thanks to Mohammed Alsammarrai for his contribution!

10.1.0 - 2024-06-24

Add support for the Hotel Booking API v2

10.0.0 - 2024-04-17

Decommissioned Safe Place API

Removed bluebird from dependencies, Big thanks to Mohammed Alsammarrai for his contribution!

Minor code improvement, Big thanks to Mohammed Alsammarrai for his contribution!

9.1.0 - 2023-12-11

Add support for additional parameters with Flight Offers Price API

9.0.0 - 2023-09-06

Decommissioned Travel Restrictions API v2

8.1.0 - 2023-06-23

Add support for the Transfer Search API

Add support for the Transfer Booking API

Add support for the Transfer Management API

8.0.0 - 2023-01-30

Decommissioned Travel Restrictions API v1

Decommissioned Hotel Search API v2

Fixed #174 SDK reference documentation is back

Fixed #183 Update comparisons in condition statements

Minor updates in How to Release in contribution guide

7.1.0 - 2022-11-08

Add support for Travel Restrictions API v2

Fix pagination issue

Add SonarCloud support

7.0.0 - 2022-07-19

Decommission Trip Parser API v2

Update versions of dependencies

  • @babel/cli from ^7.4.4 to ^7.18.6
  • @babel/core from ^7.4.5 to ^7.18.6
  • @babel/preset-env from ^7.4.5 to ^7.18.6
  • babel-plugin-add-module-exports from ^0.2.1 to ^1.0.4
  • documentation from ^11.0.0 to ^13.2.5
  • bluebird from ^3.5.1 to ^3.7.2
  • qs from ^6.9.1 to ^6.11.0

Add support for the City Search API

Add support for the Hotel Name Autocomplete API

Add support for the Airline Routes API

Add support for the Trip Parser API v3

6.0.0 - 2022-05-20

Decommission AI-Generated Photos API

Fix the initialization of client without parameters

Add X-HTTP-Method-Override in HTTP headers for 6 endpoints

Add support for the Airport Routes API

Add support for the Travel Restrictions API

Add support for the Hotel Search API V3

Add support for the Hotel List API

5.7.1 - 2021-11-30

Migrate to Github Actions

5.7.0 - 2021-05-19

Add support for the Flight Availabilities Search API

Add support for the Branded Fares Upsell API

5.6.1 - 2021-02-01

Fix unwanted exception on DELETE method of Flight Order Management API

5.6.0 - 2020-12-03

Update Node versions in Travis configuration to Node LTS versions

5.5.0 - 2020-11-11

Add support for the Flight Price Analysis API

5.4.0 - 2020-10-01

Add support for the Tours and Activities API

5.3.0 - 2020-09-15

Add support for the On-Demand Flight Status API

5.2.0 - 2020-07-30

Adding Travel Recommendations API

5.1.0 - 2020-06-11

Adding Safe Place API

5.0.0 - 2020-05-21

Decommission Flight Low-Fare Search API

Decommission Flight Choice Prediction v1

Adding Flight Choice Prediction v2

The input of Flight Choice Prediction v2 is the result of Flight Offers Search API - in v1 the input was the result of Flight Low-Fare Search

Adding support for POI API's retrieve endpoint

4.0.0 - 2020-03-25

Add support for the Flight Offers Price API

The Flight Offers Price API confirms the flight price (including taxes and fees) and availability for a given flight returned by the Flight Offers Search API. The API also returns pricing for ancillary products (additional bags, extra legroom, etc.) and the payment information details needed for booking.

Add support for the Flight Create Orders API

The Flight Create Orders API is a flight booking API that lets you perform the final booking for a desired flight and ancillary products (additional bags, extra legroom, etc.). The API returns a unique ID for the flight order and reservation details. This API is used to perform the final booking on confirmed fares returned by the Flight Offers Price API.

Add support for the Flight Order Management API

The Flight Order Management API lets you consult bookings created through the Flight Create Orders API. Using the booking ID generated by Flight Create Orders, Flight Order Management returns the last-updated version of the booking record with any post-booking modifications including but not limited to ticket information, form of payment or other remarks.

Add support for the Hotel Booking API

The Amadeus Hotel Booking API lets you complete bookings at over 150,000 hotels and accommodations around the world. To complete bookings, you must first use the Amadeus Hotel Search API to search for hotel deals, select the desired offer and confirm the final price and availability. You can then use the Hotel Booking API to complete the reservation by providing an offer id, guest information and payment information.

Add support for the SeatMap Display API

SeatMap Display API allows you to get information to display airplane cabin plan from a Flight Offer in order for the traveler to be able to choose his seat during the flight booking flow thanks to POST method. In addition GET method allows you to display airplane cabin plan from an existing Flight Order.

Remove support for Most Searched Destinations

Add support for the Trip Parser API

The Trip Parser API parses information from various booking confirmation emails and returns a standardized, structured travel itinerary. The API can extract relevant information from a wide variety of flight, hotel, rental car and rail providers’ confirmation emails by first identifying the provider and then using a database of provider-specific email structures to determine which information to extract. The API then returns a link to the JSON structure of the itinerary.

3.3.0 - 2020-02-14

Add support for the Flight Offers Search

The Flight Offers Search API is a flight search API that returns cheap flights between two airports for a given number of passengers and for a given date or date range. The API returns airline name, price and fare details, as well as additional information like baggage allowance, prices for additional baggage and departure terminal.

Add support for the AI-Generated Photos

The AI-Generated Photos API returns a link to download a rendered image of a landscape. The image size is 512x512 pixels and the currently available image categories are BEACH and MOUNTAIN. The link to download the AI-generated picture is valid for 24 hours. This API is an experimental project created by the Amadeus AI Lab using the Nvidia StyleGAN framework. This API is free to use and we welcome any feedback you may have about improvements.

Add support for the Flight Delay Prediction

The Flight Delay Prediction API returns the probability that a given flight will be delayed by four possible delay lengths: less than 30 minutes, 30-60 minutes, 60-120 minutes and over 120 minutes/cancellation. The API receives flight information and applies a machine-learning model trained with Amadeus historical data to determine the probability of flight delay.

Add support for the Airport On-Time Performance

The Airport On-Time Performance API returns the estimated percentage of on-time flight departures for a given airport and date. The API receives the 3-letter IATA airport code and departure date and applies a machine-learning model trained with Amadeus historical data to estimate the overall airport on-time performance. This API is in currently in beta and only returns accurate data for airports located in the U.S.

Add support for the Trip Purpose Prediction

The Trip Purpose Prediction API returns the probability of whether a round-trip flight itinerary is for business or leisure travel. The API takes flight dates, departure city and arrival city and then applies a machine-learning model trained with Amadeus historical data to determine the probability that the itinerary is for business or leisure travel. This API is useful for gaining insight and optimizing the search and shopping experience.

3.2.0 - 2019-10-16

Add support for the Flight Choice Prediction API

The Flight Choice Prediction API allows developers to forecast traveler choices in the context of search & shopping. Exposing machine learning & AI services for travel, this API consumes the output of the Flight Low-fare Search API and returns augmented content with probabilities of choices for each flight offers.

Add support for the Hotel Ratings API

The Hotel Ratings API provides hotel ratings based on automated sentiment analysis algorithm applied on the online reviews. Apart from an overall rating for a hotel also provides ratings for different categories of each (e.g.: staff, pool, internet, location). This provides a key content information for decision making during a shopping experience being able to compare how good a hotel is compared to others, sort hotels by ratings, filter by categories or recommend a hotel based on the trip context.

Fix an issue with the POST method that was not adding the right Content-Type.

3.2.0 - 2019-07-31

Hotel Ratings API

New version of the Node SDK to support a new endpoint:

3.1.0 - 2019-04-08

Points of interest API

New version of the Node SDK to support a new endpoint:

3.0.0 - 2019-01-22

Hotel Search v2 has been deployed (Hotel Search v1 is now deprecated)

General

  • Remove the support for Hotel Search v1
  • URLs for all three endpoints have been simplified for ease-of-use and consistency Find Hotels

    Find Hotels - 1st endpoint

  • The parameter hotels has been renamed to hotelIds

    View Hotel Rooms - 2nd endpoint

  • Update from amadeus.shopping.hotel('IALONCHO').hotelOffers.get() to amadeus.shopping.hotelOffersByHotel.get({hotelId : 'IALONCHO'})
  • Now get all images in ‘View Hotels Rooms’ endpoint using the view parameter as FULL_ALL_IMAGES

    View Room Details - 3rd endpoint

  • Updated from amadeus.shopping.hotel('IALONCHO').offer('XXX').get() to amadeus.shopping.hotelOffer('XXX').get()
  • Image category added under Media in the response
  • Hotel distance added in the response
  • Response now refers to the common HotelOffer object model

2.0.0 - 2018-10-12

Flight Most Searched Destinations: Redesign of the API - Split the previous endpoint in 2 endpoints:

  • 1st endpoint to find the most searched destinations
  • 2nd endpoint to have more data about a dedicated origin & destination

Flight Most Booked Destinations:

  • Rename origin to originCityCode

Flight Most Traveled Destinations:

  • Rename origin in originCityCode

Flight Check-in Links:

  • Rename airline to airlineCode

Airport & City Search:

  • Remove parameter onlyMajor

Airport Nearest Relevant:

  • Add radius as parameter

Airline Code Lookup:

  • Regroup parameters IATACode and ICAOCode under the same name airlineCodes

1.1.0 - 2018-08-01

Release 1.1.0.

  • Support of 3 new endpoints

1.0.1 - 2018-04-19

Remove Beta tag

1.0.0 - 2018-04-19

Release 1.0.0

1.0.0-beta7 - 2018-04-19

Fix most traveled destination API

1.0.0-beta6 - 2018-04-06

Remove node shrinkwrap

1.0.0-beta5 - 2018-04-06

Set default log level to silent

1.0.0-beta4 - 2018-04-03

Updates hostname for production server

1.0.0-beta3 - 2018-03-28

Add support for Amadeus's specific Accept request header.

1.0.0-beta2 - 2018-03-28

Update singular endpoints to use singular names.

For example:

GET /v1/shopping/hotels/SMPARCOL/hotel-offers

becomes

amadeus.shopping.hotel('SMPARCOL').hotelOffers.get()

1.0.0-beta1 - 2018-03-27

  • First Beta release with support for all the initial API endpoints

1.0.0 - 2017-12-01

  • Initial release