The purpose of the developer portal is to ensure that you, as a developer, has access to all the information necessary to design and build robust applications that can utilize the full power offered by the APIs.
Before you start designing and building your application, you should read and understand the information on the following pages.
In most cases you will build one of the applications listed in the Applications section. Each application implements a number of use cases. All use cases can be found in the Use cases section. If your application will do something different than what is described in any of the available use cases, then you should ensure that your use cases have been approved by Avinode or SchedAero before you start building your application. You should also ensure that all use cases that your application will implement are included in your API subscription.
We are more than happy to discuss the different business cases that your application will handle and offer any insights we might have in relation to these.
You will have access to the Sandbox environment and should use this during development and testing. If you have any questions during this phase you should not hesitate contacting our API Support. Before finishing implementation, you should verify that your application conforms to all items on the implementation check lists that are applicable to your application. These check lists are available in this documentation.
When your application is ready, we will do a review to ensure that your application uses the APIs in the best possible way before it will be allowed to access our live environment.
All API services are based on the REST architectural style and they are all stateless. All calls to the APIs require a secure HTTPS connection. Supported security protocol is TLS 1.2.
Accessing the APIs require an active API connection.
Each API connection have a set of permissions that restricts which operations that can be called.
Each API connection is connected to one Avinode or SchedAero member’s company account. This is used to determine which company accounts’s data the API connection can access and potentially update. If the application needs to handle data for multiple companies, it needs to handle multiple API connections.
API connections are currently created and maintained by the Avinode and SchedAero support staff.
If different kinds of applications are implemented, each application should be able to use separate API connections.
API connections that are not used for 60 days are automatically deactivated.
Several HTTP headers are required in every request to authenticate and provide other details about the call.
This required field is a unique token identifying the calling application.
The value for the API token should not be editable by the users of the application. It is preferably hard coded into the application.
X-Avinode-ApiToken: 229B8C9E-B3F2-4FA6-8BAE-71DF00943C0E
This required field must contain the unique token that identifies the API connection that should be used for this call. When sending this is the HTTP header the token must be prefixed by the word ‘Bearer’ in the style of OAUTH tokens.
Also when using the Sandbox Swagger page, the ‘Bearer’ prefix needs to be added before the token.
Authorization: Bearer mF_9.B5f-4.1JqMklj3498dfoFWrw-89qnavn.8234Klnj843jw09ksU
To optimize speed of your application or website, consider using GZIP compression. For example, when calling the aircraft search API and requesting a lot of additional data, using GZIP can significantly decrease response times.
Accept-Encoding: gzip
This required field must contain a timestamp formatted as per ISO-8601. This is the time of creation for the message. The call will be rejected if this time is off by more than 5 minutes when the message is received. So it is important that the clock used by the application is up to date at all times.
X-Avinode-SentTimestamp: 2016-01-19T08:10:06.135Z
Some API operations support sending a personal Avinode Marketplace account username. This means that this person will be registered as the user doing the action of the operation. For example when responding to an RFQ, the system will show the provided user (first name and last name) as the user responding to the quote. This will be visible to the broker in the Avinode request emails as well as in the Trips pages.
The documentation page for each operation handling this HTTP header will have information about this.
X-Avinode-ActAsAccount: johnsmith64
This should always be populated with the name and version of the calling application.
X-Avinode-Product: Smart Flight Finder v2.3
The APIs use conventional HTTP response codes to indicate success or failure of each API call. In general, codes in the 2xx range indicate success, codes in the 4xx range indicate an error that resulted from the provided information (e.g. a required parameter was missing, an authorization failed, etc.), and codes in the 5xx range indicate an API server error.
200 |
200OK |
201 |
201Created. The server created one or more entities as a result of the call. |
400 |
400Bad Request. The request was somehow invalid (e.g. bad timestamp, etc.). |
401 |
401Unauthorized. No authentication or authentication invalid. |
403 |
403Authorization failure (e.g. no permissions, rate limit exceeded, etc.). |
404 |
404Not found. The application requested a resource that does not exist. |
422 |
422Entity invalid. Validation failure, relationship failure, or state failure. |
500 |
500Internal failure. |
501 |
501Not Implemented. The called operation is disabled, or not yet implemented. |
503 |
503Service too busy. |
504 |
504Service temporary unavailable. |
The number of calls that one API connection can make per hour is limited. Every API response will include the following HTTP headers.
After the number of calls has reached the rate limit, all calls to that service will be denied with the HTTP 403 response code until the next hour starts.
X-Rate-Limit-Limit |
X-Rate-Limit-LimitThe rate limit for the service that was invoked. This is the allowed number of calls per hour. |
X-Rate-Limit-Remaining |
X-Rate-Limit-RemainingThe remaining number of calls allowed within the current hour. |
X-Rate-Limit-Reset |
X-Rate-Limit-ResetThe number of seconds until the call counter is reset (i.e. the next hour starts). |
Dates and times are formatted according to ISO 8601.
Currency codes use the three letter code defined in ISO 4217. Price conversions are based Forex data updated daily from Xignite.
Country codes use the two letter code defined in ISO 3166-1 alpha-2.
Province codes use the format defined in ISO 3166-2. Each code consists of two parts, separated by a hyphen. The first part is the two letter country code and the second part is a up to three letter code specifying the region in that country. For example “US-FL” for Florida.
For some operations, there is information available that will only be included in the operation output if it is requested when making the API call. This extra information is requested by specifying one or more values in the operation’s field[operation] URL parameter. The documentation page for each operation have information about the available sparse fields.
Unless specifically stated in this documentation, the format of any object’s identifier is unspecified and can change at any time. So an operation that currently returns an id that looks like “abc-12345678” may change to, for example, “1234-ABCD-5678-EF90”. So the application should not try to extract parts of the these ids for any reason. If the format of an id changes, the API operations using this id as input will continue to support previous formats.
The application should not display any API generated ids to the user, unless this documentation specifically states that the particular id can be displayed.
Data entered in string properties must conform to the following rules.
\n
) or carriage return and line feed (\r\n
).\
) then it must be escaped with an additional backslash character (\\
)."
) then this must be escaped with a backslash character (\"
).Data returned in string properties should be display correctly to the users of the application, according to the rules above.
Most additions and updates to the APIs will be backwards compatible. Any major changes impacting live applications will be communicated some time before the change is made, giving you ample time to make the necessary changes. This time is regulated in the API contracts. Information about additions and updates are listed on the Change log page.
New properties can, at any time, be added to an operations output. The application must be able to handle this without breaking.
If a call to the API fails for some reason, any retry policy should be sensibly implemented. This would most likely include concepts like exponential back-off, maximum number of retries etc. For some operations, retries are not allowed. The documentation page for each operation may have information about the recommended retry policy.
No automatic tests are allowed to make calls to the API. This applies to all types of automatic testing like load tests, integration test suites etc. All logic generating calls to the API must be replaced by mockups when running automatic tests. This is true for both the live system and the sandbox environment.
The contracts in place for each member or partner using the APIs regulates how the APIs can be used, and how the data returned by the APIs can be handeld. Paragraphs regulating the following can be included.
Calling any API operations in any repetitive or automated fashion for the purpose of harvesting information is strictly forbidden.
All items on this check list must be true in order for an application to be allowed to call the live Avinode Marketplace environment.
Date are formatted YYYY-MM-DD
2015-05-19
Times are formatted HH:MM.
23:57
Timestamps are formatted YYYY-MM-DDThh:mm:ss.sssZ
and are always UTC times.
2015-12-17T19:56:03.148Z
Each Avinode member and Avinode partner implementing APIs will get access to the Sandbox. This environment should be used during development and testing. Making development or testing related calls to the live environment is strictly forbidden.
The online interface for the Sandbox server can be accessed by browsing to https://sandbox.avinode.com. The online interface can be used to create data (RFQs, quotes, empty legs, etc.) needed for testing and also for viewing data created through the API.
The Sandbox environment can at any time be used by several Avinode customers and partners that are developing and testing their software. Each company or partner have their own company accounts, user accounts, aircraft and API connections. However, due to the collaborative nature of the Avinode Marketplace, publishing information (e.g. empty legs, Tripboard posts etc.) and sending messages (e.g. RFQs) will potentially make them visible to other developers using the Sandbox.
The sandbox server is rebuilt with a fresh database at least once a week. This means that data changed or created during tests will be deleted. If you have some data that you want to persist then please contact us and we will try to add this data to the build scripts. Usually the weekly data reset occurs between 6-8 AM UTC on Mondays.
We strive to keep the Sandbox available at all times but occasionally we need to take it down for short periods to do maintenance, deploy new code, etc. If you experience longer down-times than one hour, then please contact us and we will try to fix the problem as soon as possible.
Any data that exist in the Sandbox server (e.g. company names, aircraft information etc.) may not be extracted or disclosed to any third party. This is regulated in the API contracts.
As long as your application has access to the live environment, you will also have access to the Sandbox environment. When you update your application, you should use this to verify that your application still functions properly.
Any instance of the application built or deployed for development or testing purposes should be restricted from calling the live API servers and also from consuming webhook notifications delivered by the live API servers.
The operations available in the API can be viewed and tested on the Sandbox Swagger page.
https://sandbox.avinode.com/swagger/AvinodeGroup.jsp?urls.primaryName=Avinode
The Swagger page has information about the JSON format returned by all the available API operations and also the the JSON format expected by any POST and PUT operation. The Request body – Edit Value section shows the JSON code and the Model tab displays more detailed information about each JSON property.
The Swagger page can be used to make test calls to the API operations available on the Sandbox. By entering the API Token and the Authorization Token in the form at the top of the page and any operation’s required input, the operation can be called and the Swagger page will display the response.
Please note; on the Swagger page the Authorization Token should be entered with the ‘Bearer’ prefix.
The APIs can be used to power a number of different applications. This section has information about some of the most common applications and some best practices for how to implement them.
This is an application used by operators and marketing agents to automatically upload fleet availability information to the Avinode Marketplace. Having up to date availability information promotes the generation of high quality RFQs from the buyers in the Marketplace. This application is often integrated into fleet management software and ofter software used to keep track of aircraft movements and activities.
The Seller: Availability upload page has detailed information on how to implement this application.
This is an application used by sellers to handle RFQs that buyers in the Marketplace send to them. When the seller handles the RFQs, the responses are automatically communicated to the buyers in the Marketplace. This application is often integrated into quoting tools and fleet management software.
The Seller: Trip messaging page has detailed information on how to implement this application.
This is an application that a company makes available to their end-clients. The application offers the end-clients the possibility to find information about available lift for trips they are planning. The information can include aircraft details, flight times, estimated prices, etc. The end-client can then send a request to the company owning the application for the lift options that are of interest.
The End-client: Trip search page has detailed information on how to implement this application.
This is an application that a company makes available to their end-clients. The application offers the end-clients the possibility to find information about available lift for trips they are planning. The information can include aircraft details, flight times, estimated prices, etc. The end-client can then request the lift options that are of interest. This information will be available as a lead in the Avinode Marketplace. The lead will have information about the trip the end-client is planning, the options the end-client has requested, and the end-client’s contact information. The company owning the app can then access the lead directly in the Avinode Marketplace and use all the Marketplace features to find a suitable solution for the end-client.
This application is implemented in one or more front ends, and in most cases, also includes a back end. Front ends are, in most cases, web interfaces on the company’s web site or native mobile apps. The back end can be implemented with any technology preferred by the company, for example, Java, .NET, PHP, Python, Ruby, Go, etc. Using a back end is recommended and required if the front end is a web interface. For a native mobile app it would be possible for a front end to just communicate directly with the Avinode API servers.
The information presented to the end-client can be based on all aircraft available in the Avinode Marketplace or a subset of these. Brokers implementing this application usually base the information on all aircraft, while operators usually base the information on their own fleet.
This diagram describes the basic workflow of the application.
The Airport API can be used to create features enabling the end-client to find airports by entering airport or city names. The Airport API also returns the airport codes that are required when calling other API operations.
The application can use a different source for airport information. However, this may increases the risk of errors if that source has some airport code information that does not match the airport code information available through the API services.
This page contains more information about how to use the Airport search operation.
The end-client specifies trip details like airports, dates and times. The application then calls the aircraft search API service and presents the result as options to the end-client.
This page contains more information about how to implement this.
The end-client reviews the options, selects one or more of these, and sends a booking request.
This page contains more information about how to implement this.
Without explicit approval from Avinode, any information that can easily identify operators may not be displayed to the end-client.
The application may only store data that is required to complete the business transaction with the end-client. So, for example, if the APIs returned information for 100 aircraft and the end-client makes a request for 2 of these, then any information about the other 98 aircraft may not be stored in the application’s back-end storage.
All items on this check list must be true in order for an application of this type to be allowed to call the live Avinode Marketplace environment.
This is an application that can be used by operators and marketing agents to automatically upload aircraft availability information to the Avinode Marketplace. Each aircraft marketed in the Avinode Marketplace has a schedule and this schedule contains information about the aircraft’s activities like passenger flights, ferry flights, maintenance etc. Each activity holds information about the start time and position of the aircraft and also the end time and position. This information is then used by various functions in the Avinode Marketplace.
This application is often integrated into fleet management software and other software used to keep track of aircraft movements and activities. The majority of the fleet management software used by professionals in the charter jet market has the ability to automatically send availability data to the Avinode Marketplace through an application like this.
A complete schedule must be sent in each call. Any schedule data that exist in the Avinode Marketplace before the call, and that is not included in the call, will be removed.
A schedule is ideally continuous. That means that the start airport of one activity is the same airport as the end airport of the previous activity. It is possible to upload a schedule that isn’t continuous, but this might affect the Marketplace’s ability to show and use the correct availability for that aircraft.
Activities that overlap in time should be avoided. However sending an activity that starts the exact same time as the previous ends is OK. It is possible to upload overlapping activities, but this might affect the Marketplace’s ability to show and use the correct availability for that aircraft.
Time gaps between the activities are OK. So the start time of one activity does not have to be right after end time of the previous activity. If there is a time gap between two activities, the Marketplace will consider the aircraft to be on-ground available at the end airport of the first activity during this gap.
In addition to sending all future activities, the uploaded data should also at least contain the most recent activity that has an end time in the past. This to ensure that the current position of the aircraft is always known. An easier approach might be to always send, for example, one month of the most recent historical data in each call and hopefully this data will contain at least one activity that ends in the past.
It is possible to upload activities that will be automatically published as empty legs in the Avinode Marketplace. Providing additional marketing information for these empty legs makes them more attractive to potential buyers.
The service should be called on a regular interval. The recommended frequency is to send data for each aircraft once every 5 minutes. If the call frequency is configurable in the calling software it should not be possible to configure this to send more frequently than once every 5 minutes. The Avinode Marketplace informs buyers how fresh the schedule data is so the service should be called regularly without long periods of not sending data.
It is highly recommended to send the tripId (lift id) from each quote request, with the corresponding booked trip activity in the availability upload. This is done to get valuable statistics on which requests end up as a booked trip. More information about how to implement this is found on the PUT /schedules
operation page.
The application uploads schedule information by periodically calling the PUT /schedules
operation for each of the aircraft in the operator’s fleet. More information about how to implement this operation is found on the PUT /schedules
operation page.
Important! Most applications of this type must be able to handle multiple API connections. Here are the recommended best practices.
All items on this check list must be true in order for an application of this type to be allowed to call the live Avinode Marketplace environment.
Buyers use the Avinode Marketplace to find suitable aircraft for their customers’ trips. Buyers normally send request for quotes (RFQs) to multiple sellers for each trip. The sellers can use the online Avinode Marketplace to respond to these RFQs. Using an application like this, the RFQs can be downloaded into the application which can be used as an external quoting tool. The seller can then create a quote in the application and send it to the buyer by uploading it back to the Avinode Marketplace. Alternatively, the RFQ can be declined if the seller has no availability for this trip or can’t perform it for some other reason.
This application can be used by sellers (i.e. operators and marketing agents).
This application is implemented in many of the existing software tools used by sellers to keep track of their aviation charter requests.
This data model shows the top level seller trip messaging related objects and their relationships. It should be used when storing this type of data. This model enables the buyer and seller to use messages to communicate with each other to share information and ask and answer any questions that may arise around this trip. It also enables the seller to, not only respond to the actual requested lift, but to also add additional quotes for alternate aircraft or routes.
An RFQ is what a buyer sends to the seller when they want to ask for quotes for a specific trip. It contains information about who the buyer is and the itinerary of the trip. One RFQ can:
Each lift represents something the buyer has specifically asked to get a quote for. It can be an actual aircraft (i.e. a tail number) , a type (e.g. Falcon 7X) or a category (e.g. Heavy Jet). One lift can:
A lift can be associated to an empty leg that the seller previously have published in the Avinode Marketplace. This indicates that the buyer would like to utilize this empty leg for this trip. One empty leg can:
A message is a text message from either the buyer or the seller. It contains information about when the message was added and by which person at what company. A message can:
Quotes are offers that the seller has communicated to the buyer. A quote contains information about what kind of lift the quote is for, the itinerary (may differ from the requested itinerary in the RFQ) and the price offered to the buyer. A quote may be “Avinode Generated”. This means that Avinode has used the aircraft performance and pricing information, provided by the seller, to generate a quote on behalf of the seller. A quote can:
A buyer has the possibility to cancel a trip. The seller will then be notified that the RFQ has been updated/canceled. A canceled request cannot be responded to, so this should be highlighted to the user, saving them from quoting trips that are no longer valid. Read more about retrieving RFQs in the following section.
The application subscribes to webhook notifications and is notified when there is a new RFQ available or when an RFQ has been updated. The application then downloads the RFQ information by calling the appropriate API operations.
These pages contains more information about how to implement this.
In order for an application to be allowed to download RFQs, it must also upload responses back to the Avinode Marketplace.
The seller can then respond to the RFQ by uploading quotes. Alternatively the seller can decline the RFQ or parts of it.
This page contains more information about how to implement this.
Important! Applications handling trip messaging for multiple company accounts needs to be able to handle multiple API connections. Here is the recommended best practice.
All items on this check list must be true in order for an application of this type to be allowed to call the live Avinode Marketplace environment.
This service can be used to find and retrieve information about empty legs marketed in the Avinode Marketplace.
This operation can be used to find empty legs that could be of interest given the input parameters sent to the operation. The input can be a start airport and/or an end airport along with a time span. The API algorithm tries to find empty legs available in that time span that can be of interest given the input parameters. So if the entered input is from Paris to Rome the API might return an empty leg from London to Rome since Paris is almost on that route.
The operator can in this case fly empty from London to Paris, pick up the passengers and fly them from Paris to Rome. The operator can then make some money on this otherwise non-profitable flight from London to Rome.
Similar matches are made if only the start airport or only the end airport is specified in the input. For example if the start airport is in San Fransisco and no end airport is specified, then an empty leg from Los Angeles to New York can be returned since it is a relatively short distance between Los Angeles and San Fransisco compared with the total distance of the empty leg.
The results are returned in the order where the empty leg that the service considers to be the best match is returned at the top of the response.
This operation can be used to create subscriptions (a.k.a. watches) for empty legs. The subscription contains information about airports or regions. When an empty leg matching the subscription settings is created or updated in the Avinode Marketplace, a notification will be sent to the remote system holding the subscription. A subscription can for example be for all empty legs from Spain to the United States. This subscription will not use the advanced matching algorithm that the POST /emptylegs/search operation does. It will only consider empty legs exactly matching the subscription.
This page contains more information about how to implement this:
This operation can be used to get information about the subscription with the given id.
This operation can be used to update the settings for the subscription with the given id. It can also be used to inactivate the subscription.
This operation can be used to initiate notifications for all existing empty legs matching the subscription settings of the subscription with the given id. This operation should only be used once initially when a subscription is set up to get information about the existing empty legs.
This operation must under certain conditions be used to report back to Avinode that an empty leg has been viewed. For example if the APIs power an empty leg list on a web page and a visitor to the web page clicks an empty leg to view more information about it.
This operation can be used to get information about a specific empty leg. A reference to this operation is included in the payload of an empty leg notification.
This page contains more information about how to use the operation
There are two fields in the response that contains price information. The prices are estimates of what it would cost to fly from the start airport to the end airport specified in the empty leg. Costs for potential positioning flight are not included.
This will only be returned if the seller of the empty leg has explicitly set a price for the empty leg or if they have provided Avinode with a special empty leg pricing profile that is used to give an estimated price.
This is a price calculated with the pricing profile that the operator has provided to Avinode for calculating normal charter requests. This price should only be used as a rough indication of what the final price could be.
In some cases the seller of the empty leg provides Avinode with their actual scheduled departure and arrival times of the flight. In other cases they provide a wider period of time that they consider to be the marketing window where this empty leg can be used. The startDate and endDate fields contain the times that the operator has provided. If the time span between startDate and endDate is close to what it would take to fly from startAirport to endAirport (see the flightTime field) then it is most likely the actual scheduled departure and arrival times. If the time span is significantly longer (e.g. double the flight time or more) then the startDate and endDate are probably the start and end of the empty leg’s marketing window. If the startDate and endDate refers to a marketing window it less likely that the empty leg can be utilized for a flight outside these times. If the startDate and endDate refers to actual scheduled departure and arrival times then it is more likely that the seller can adjust the departure time to accommodate a flight close in time to the provided times.
Brokered empty legs are empty legs where seller of the empty leg is a broker and not the operator or an, by Avinode, approved marketing agent of the aircraft.
The API connection used to call the service have settings that can change the behavior of the service.
A special setting is needed in order for the service to return information that can identify the operator or the company marketing the empty leg. With this set the aircraft tail number, the name of the company marketing the empty leg and AOC information will be returned in the result. This setting will only be enabled for use cases that are approved by Avinode.
Calling the service in any repetitive or automated fashion to collect empty leg information is not allowed.
As a seller, I want to download RFQ information to my application
This use case should be implemented when the seller wants to view RFQs in the application.
The Seller: Download RFQ page has detailed information how to implement this use case.
As a seller, I want to respond to an RFQ
This use case should be implemented when the seller wants to respond to an RFQ.
The Seller: Respond to RFQ page has detailed information how to implement this use case.
As an end-client, I want to find options for my trip
This use case should be implemented when the end-client wants to find and view available options for a trip.
The End-client: Find trip options page has detailed information how to implement this use case.
As a seller, I want to be notified about new RFQs and download them to my application
This use case should be implemented when the seller wants to view RFQs in the application. The relationships between the different types of data in this use case is described on the Seller trip messaging page.
Webhooks and notifications
To be notified of each new, updated or canceled RFQ in the application, it should implement a webhook and subscribe to trip messages. The webhook endpoint will receive notifications continuously as soon as you get a new quote request, or whenever there are changes made to an existing RFQ. Read more about how to set up webhooks on the Webhooks and notifications page and about how to subscribe to buyer message notifications here.
The application should complete the following 4 steps when downloading RFQ related data for an RFQ that has not been previously downloaded.
The GET /rfqs/{id}
operation is called to get the basic RFQ details. The RFQ always contains:
The RFQ may also contain:
If the RFQ contains requested lift, then each requested lift may contain:
The GET /rfqs/{id}
page has more information about the data returned by this operation.
The GET /tripmsgs/{id}
operation is then called to get the details of each text message (links.tripmsgs). For each text message the following information always exist:
The GET /tripmsgs/{id}
page has more information about the data returned by this operation.
The GET /quotes/{id}
operation is then called to get the details of each quote (sellerLift.links.quotes). The GET /quotes/{id}
page has more information about the data returned by this operation.
The GET /emptylegs/{id}
operation is then called to get the details of any requested empty legs (sellerLift.links.emptylegs). The GET /emptylegs/{id}
page has more information about the data returned by this operation.
If the application calls the GET /rfqs/{id}
operation for an RFQ that has previously been downloaded, then it should look for the following updates:
All items on this check list must be true in order for an application implementing this use case to be allowed to call the live Avinode Marketplace environment.
GET /rfqs/{id}
operation containing multiple sellerLift (i.e. the buyer has requested quotes for more than one of the sellers aircraft for this trip).As a seller, I want to respond to an RFQ
This use case should be implemented when the seller wants to respond to an RFQ. The application should use the different actions that was returned when the RFQ was downloaded with the GET /rfqs/{id}
operation.
The application should call the sellerLift.actions.submitQuote action.
The application should call the sellerLift.actions.decline action.
The application should call the actions.submitQuote action.
The application should call the actions.decline action.
POST /tripmsgs/{requestId}/submitQuote
page.POST /tripmsgs/{requestId}/decline
page.For each RFQ the seller should ideally at least complete one of these.
As long as the seller hasn’t completed this, the buyer will see this RFQ as unanswered or partially unanswered. So the buyer would still expect more information from the seller.
All items on this check list must be true in order for an application implementing this use case to be allowed to call the live Avinode Marketplace environment.
As an end-client, I want to find options for my trip
This use case should be implemented when the end-client wants to find and view available options for a trip.
The application should call the POST /searches
operation with details about the trip itinerary and potentially also other criteria like what type of aircraft is of interest etc. The operation then evaluates different routing options for all available aircraft in the Avinode Marketplace, calculates estimated prices, etc. The operation then returns the full result, or optionally, it can return results aggregated on for example an aircraft type level. More information about available input parameters, and what can be included in the output, is described on the POST /searches
page.
As an end-client, I want to create a booking request
This use case should be implemented when the end-client wants to create a booking request. The booking request will be available as a lead in the Avinode Marketplace for the company owning the API connection that was used.
The application should call the POST /leads
operation with details about what the end-client has requested, and also the end-client’s contact information.
In order to create a booking request for a specific aircraft, the end-client must have selected one or more aircraft from the trip options available in the result created in the End-client: Find trip options use case.
If the end-client has been presented with options on a aircraft type och aircraft category level, a booking request can be created for one or more aircraft types or aircraft categories. For example, the end-client can create a booking request for a light jet.
An application can use webhooks to subscribe to different kinds of notifications. The application must have an online service that can receive the notifications. A webhook is always set up for a specific company account and will only generate notifications for that company.
Subscribing to notifications for a particular company account is done by calling one of these operations, using an API connection set up for this company.
POST /webhooks/settings
operation to create a new active webhook.PUT /webhooks/settings/{id}
operation to activate an existing, previously deactivated webhook.Unsubscribing to notifications is done by calling this operation.
PUT /webhooks/settings/{id}
operation to deactivate the webhookA webhook subscribes to a notification category. For each category, different types of notifications can be sent.
If a seller subscribes to this notification category, the seller will receive a notification each time a buyer has sent some kind of communication to the seller. More information can be found on the Buyer message notifications page.
If a buyer subscribes to this notification category, the buyer will receive a notification each time a seller has sent some kind of communication to the buyer. More information can be found on the Seller message notifications page.
If a seller or buyer subscribes to this notification category, they will receive a notification each time they themselves have sent some kind of communication to the buyer/seller. This can be used to display messages in a chat history. More information can be found on the Other message notifications page.
When subscribing to this notification category, a notification will be sent each time an empty leg, matching a watch, is created, updated, or deleted. More information can be found on the Empty leg notifications page.
When subscribing to this notification category, a notification will be sent each time there is a new client lead sent into Avinode. This could be originating from an Avinode web app or a custom end-client facing app using the POST /leads operation.
To fetch the end-client lead call operation GET /leads/{id}
using the link provided in the notification payload.
See POST /webhooks/settings
operation page for details on how to subscribe to this type of notification.
When the webhook is triggered by an event, a notification will be delivered to the application’s online service. The notification is a JSON message sent in an HTTPS POST call to the URL specified in the webhook settings. The API servers will repeatedly try to deliver the notification to the application’s service until the notification has been consumed successfully. However, if the service has not successfully consumed it after 48 hours, the API servers will stop trying to deliver it.
The consuming service must be able to handle that additional JSON properties can be added at any time. Existing JSON properties will however not be changed. More detailed information about the payload format can be found on each notification category page.
To report that the notification has been successfully consumed, the service must reply with an HTTP 200
code. The service should consume the call as quickly as possible. If the notification delivery times out before the remote system has responded, the notification will be considered undelivered and it will be rescheduled for delivery at a later time. So ideally, the service consuming the notification will just save it and immediately end the call by responding with an HTTP 200
code. The service consuming notifications must also be designed to be able to consume multiple parallel notification calls.
After the notification has been consumed, the application can execute any business logic to handle the notification.
It is recommend that the service is set up to authenticate the incoming notification calls. Two types of authentication are supported.
An OAuth key and OAuth secret is set up in the webhook settings. From these an OAuth signature is generated sent along with each notification call. The method used to generate the OAuth signature is described on this page. https://dev.twitter.com/oauth/overview/creating-signatures
A username and password is set up in the web-hook settings. These are formatted according to the Basic HTTP Authentication method. Once the server responds with an HTTP 401
“Unauthorized”, it is sent along with the subsequent notification call in the Authorization header.
A username and password is set up in the web-hook settings. These are formatted according to the Basic HTTP Authentication method and sent along with each notification call in the Authorization header.
Applications handling webhook notifications for multiple company accounts needs to be able to handle multiple webhooks and the notifications generated by these. Here are the recommended best practices.
All items on this check list must be true in order for an application to be allowed to subscribe to and consume webhook notifications from the live environment.
If the seller subscribes to this notification category, the seller will receive a notification each time a buyer has sent some kind of communication to the seller. Currently only one type of buyer message notification exist, but in the future additional types may exist.
Notifications of this type are sent when:
After this notification has been consumed, the application can download the RFQ information as described in the Seller download RFQ use case.
The application should always use the URL provided in the notification payload when downloading the RFQ.
If the buyer sent a new text message, this will be listed in the RFQ under data.links.tripmsgs, together with all messages associated with this RFQ. The application can download the message by calling the GET /tripmsgs/{id}
operation using the buyer message URL provided in the RFQ.
See POST /webhooks/settings
operation page for details on how to subscribe to this type of notification.
To avoid calling the API twice to download the full buyer message you can add the query param “buyermessages” to the request. This will list all buyer messages in full directly in the RFQ. See more info at GET /rfqs/{id}
{
"id": "arfq-12345678",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-12345678",
"type": "rfqs"
}
Subscribing to this notification category, the seller or buyer will receive a notification each time they perform some type of activity in a trip, such as accepting or declining a quote or cancelling a trip.
Notifications of this type are sent when:
After this notification has been consumed, the application can download the trip message information by calling the GET /tripmsgs/{id}
operation.
The application should always use the URL provided in the notification payload when downloading the information.
See POST /webhooks/settings
operation page for details on how to subscribe to this type of notification.
See POST /webhooks/settings
operation page for details on how to subscribe to this type of notification.
{
"id": "asellermsg-12345678",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-12345678",
"type": "tripmsgs"
}
If the buyer subscribes to this notification category, the buyer will receive a notification each time a seller has sent some kind of communication to the buyer. Currently only one type of seller message notification exist, but in the future additional types may exist.
Notifications of this type are sent when:
After this notification has been consumed, the application can download the trip message information by calling the GET /tripmsgs/{id}
operation.
The application should always use the URL provided in the notification payload when downloading the information.
See POST /webhooks/settings
operation page for details on how to subscribe to this type of notification.
{
"id": "asellermsg-12345678",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-12345678",
"type": "tripmsgs"
}
When subscribing to this notification category, the application will receive different types of notifications related to events concerning empty legs.
Currently only one type of empty leg notification exist, but in the future additional types may exist.
Notifications of this type are sent for empty legs matching any of the empty leg watches set up for the company. These events will trigger a notification.
After this notification has been consumed, the GET /emptylegs/{id}
operation can be called to get the empty leg details. The GET /emptylegs/{id}
page has more information on how to get empty leg details. The operation will return a HTTP 404
if the empty leg has been unpublished by the seller.
The application should always use the URL provided in the notification payload when getting the empty leg details.
See POST /webhooks/settings
operation page for details on how to subscribe to this type of notification.
{
"id":"el-123456789",
"href":"https://services.avinode.com/api/emptylegs/el-123456789",
"type":"emptylegs"
}
This operation can be used in for example an airport lookup widget.
You can search airports using a text filter to match the airport code or name etc., or using Geo-location data and a max distance (radius). It is not possible to combine filter search with location search.
The results will be sorted by airport popularity based on usage data from the Avinode marketplace.
Calling the service in any repetitive or automated fashion to collect airport information is not allowed.
filter |
filterThe filter input parameter can be used to send a string of text to the operation. The string of text must be at least 3 characters long. The operation will return airports where the string of text can be found in the airport’s ICAO/IATA/FAA code, name, city, country or any of the keywords associated with the airport. The airport information is in English but some keywords have been added to certain airports to enable lookup using native names etc. For example the keyword “москва” is associated with the Moscow airports in Russia and “münchen” is associated with the Munich airports in Germany. |
filterMatchType |
filterMatchTypeHow to match the given criteria.
|
countries |
countriesLimit results to airports only in the given countries. Send 2 character ISO country code, comma delimited for multiple. |
maxDistance |
maxDistanceThe maxDistance parameter is specified in nautical miles (NM) and the latitude and longitude parameters in degrees (°). If this parameter is not specified, the default value of 500 NM will be used. When specified together with a filter value, this parameter will be ignored. It is not possible to combine filter search with location search.
|
latitude |
latitudeDecimal form (e.g. -74.0608). |
longitude |
longitudeDecimal form (e.g. -74.0608). |
helioptional |
helioptionalThe heli parameter specifies if the output should contain heliports. If this parameter is not specified, the heliports will be omitted from the output. |
militaryoptional |
militaryoptionalThe military parameter specifies if the output should contain airports that are classified as military airports. If this parameter is not specified, the military airports will be included in the output. |
page[number] and page[size]optional |
page[number] and page[size]optionalBy default the service returns the first 30 results. This can be changed by specifying the page[number] and page[size] input parameters. The returned pagination object holds some useful information.
|
positionoptional |
positionoptionalRequesting this will add information about the airport’s longitude and latitude. |
classificationoptional |
classificationoptionalRequesting this will return information about the airport classification in the airportType output property, and what kind of landing facility it is in the landingFacility output property. |
The results are returned in order of popularity. The most popular airport is returned at the top of the response. The popularity is based on usage data from the Avinode Marketplace.
When searching using Geo-location, it’s worth noting that the size of the search area set by the maxDistance parameter, might affect the top results more than just changing the Geo-location parameters.
airportType |
airportTypeThis holds information about the airport classification. Valid values for the code property in airportType are CIVIL, MILITARY, JOINT, NON_STANDARD and UNKNOWN. |
landingFacility |
landingFacilityThis holds information about what kind of landing facility this is. Valid values for the code property in landingFacility are AIRPORT, HELIPAD, SEAPLANE_BASE and UNKNOWN. |
GET /airports/search
This operation can be used to get information for an airport. This operation is mostly used when an airport is returned in some other API operation and additional information about the airport needs to be retrieved.
Calling the service in any repetitive or automated fashion to collect airport information is not allowed.
id |
idThe id input parameter accepts both the NumericId format (e.g. “aport-5948”) and the plain number format (e.g. “5948”). The preferred way is to use the NumericId format. |
positionoptional |
positionoptionalRequesting this will add information about the airport’s longitude and latitude. |
GET /airport/{id}
This operation is used to get information about an empty leg that has been published in the Avinode Marketplace.
id |
idThis is the id of the empty leg that the operation will get information for. |
amenitiesoptional |
amenitiesoptionalWhen requesting this, the result will, if available, also include information about the aircraft’s amenities. |
calculatedpriceoptional |
calculatedpriceoptionalWhen requesting this, the result will also include an automatically calculated price based on the aircraft pricing profile. It should be considered a preliminary price. |
categorydetailsoptional |
categorydetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft category. |
flighttimeoptional |
flighttimeoptionalWhen requesting this, the result will also include information related to the flight time and distance of this empty leg. |
homebaseoptional |
homebaseoptionalWhen requesting this, the result will also include information about the aircraft’s homebase airport. |
insuranceoptional |
insuranceoptionalWhen requesting this, the result will, if available, also include insurance information for the aircraft. |
liftaocoptional |
liftaocoptionalWhen requesting this, the result will also include information about the operator’s AOC. |
perfdetailsoptional |
perfdetailsoptionalWhen requesting this, the result will also include information about the aircraft’s performance details. |
safetyoptional |
safetyoptionalRequesting this will add information about the operator’s safety ratings. |
sellercontactinfooptional |
sellercontactinfooptionalRequesting this will also add the seller contact info. |
sellerstatsoptional |
sellerstatsoptionalWhen requesting this, the result will, if available, also include information about the seller’s response statistics. |
taildetailsoptional |
taildetailsoptionalWhen requesting this, the result will also include additional information about the aircraft. |
tailphotosoptional |
tailphotosoptionalWhen requesting this, the result will, if available, also include links to photos of the actual aircraft. |
typedetailsoptional |
typedetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft type. |
typephotosoptional |
typephotosoptionalWhen requesting this, the result will, if available, also include links to generic photos of the aircraft type. |
GET /emptylegs/{id}
Here is an example of the response from a successful call to this operation.
lift.aircraftCategory |
lift.aircraftCategoryThis is the category of the aircraft that this empty leg was published for. |
lift.aircraftType |
lift.aircraftTypeThis is the type of the aircraft that this empty leg was published for. |
lift.aircraftTail |
lift.aircraftTailThis is the tail number of the specific aircraft that this empty leg was published for. |
lift.maxPax |
lift.maxPaxThis is the maximum number of passengers for the aircraft that this empty leg was published for. |
lift.ownAircraft |
lift.ownAircraftThis is true if the empty leg was published for an aircraft that is marketed by the company calling this operation. |
price.price, price.currency |
price.price, price.currencyThis is the price the seller of this empty leg has entered. It should be considered a preliminary price. |
price.convertedPrice, price.conversionCurrency |
price.convertedPrice, price.conversionCurrencyThis is the price converted to the preferred currency of the API connection calling this operation. |
calculatedPrice.price, calculatedPrice.currency |
calculatedPrice.price, calculatedPrice.currencyIf there is a valid pricing profile in Avinode for the requested aircraft and lift, this will be the calculated price and currency according to it. It should be considered a preliminary price. |
calculatedPrice.convertedPrice, calculatedPrice.conversionCurrency |
calculatedPrice.convertedPrice, calculatedPrice.conversionCurrencyIf there is a valid pricing profile in Avinode for the requested aircraft and lift, this will be the calculated price converted to the preferred currency of the API connection calling this operation. |
startAirport, endAirport |
startAirport, endAirportThis is the start airport and the end airport for this empty leg. |
startDate, endDate |
startDate, endDateIn some cases the seller of the empty leg provides Avinode with their actual scheduled departure and arrival times of the flight. In other cases they provide a wider period of time that they consider to be the marketing window where this empty leg can be used. The startDate and endDate fields contain the times that the operator has provided. If the time span between startDate and endDate is close to what it would take to fly from startAirport to endAirport, then it is most likely the actual scheduled departure and arrival times. If the time span is significantly longer (e.g. double the flight time or more), then the startDate and endDate are probably the start and end of the empty leg’s marketing window. If the startDate and endDate refers to a marketing window, it is less likely that the empty leg can be utilized for a flight outside these times. If the startDate and endDate refers to actual scheduled departure and arrival times, then it is more likely that the seller can adjust the departure time to accommodate a flight close in time to the provided times. |
brokered |
brokeredThis is true if the empty leg isn’t published by the the company marketing the aircraft in the Avinode Marketplace. Only the company that has a valid AOC for the aircraft or a company with a signed marketing agreement with the AOC holder can market the aircraft in the Avinode Marketplace. Buyer’s of brokered empty legs are recommended to preform the necessary steps to verify the validity of the empty leg. |
sellerCompany |
sellerCompanyThis is the company that has published the empty leg in the Avinode Marketplace. |
sellerVerified |
sellerVerifiedThis is true if the seller has verified that this empty leg is available for charter. |
ownEmptyLeg |
ownEmptyLegThis is true if the empty leg was published by the company calling this operation. |
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "el-123456",
"href": "https://sandbox.avinode.com/api/emptylegs/el-123456",
"type": "emptylegs",
"lift": {
"id": "91D2C1E0-E8FC-47AB-84C5-9778BDF44CBC",
"links": {
"emptylegs": [{
"id": "el-123456",
"href": "https://sandbox.avinode.com/api/emptylegs/el-123456",
"type": "emptylegs"
}]
},
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftTail": "SE-123A",
"maxPax": 12,
"ownAircraft": true
},
"price": {
"currency": "EUR",
"price": 40000,
"conversionCurrency": "USD",
"convertedPrice": 45154,
"priceAsString": "45 154"
},
"calculatedPrice": {
"currency": "EUR",
"price": 41500,
"conversionCurrency": "USD",
"convertedPrice": 46847,
"priceAsString": "46 847"
},
"startAirport": {
"id": "aport-6310",
"name": "DUBAI INTL",
"city": "DUBAI",
"country": {
"code": "AE",
"name": "United Arab Emirates"
},
"icao": "OMDB",
"iata": "DXB"
},
"endAirport": {
"id": "aport-3915",
"name": "INDIRA GANDHI INTL",
"city": "DELHI (NEW DELHI)",
"country": {
"code": "IN",
"name": "India"
},
"icao": "VIDP",
"iata": "DEL"
},
"startDate": {
"dateTimeUTC": "2016-10-24T06:00:00Z",
"dateTimeLocal": "2016-10-24T10:00:00+04:00"
},
"endDate": {
"dateTimeUTC": "2016-10-24T15:30:00Z",
"dateTimeLocal": "2016-10-24T21:00:00+05:30"
},
"brokered": false,
"sellerCompany": {
"id": "16D90630-7344-4A73-9689-8A10CE5E6ABC",
"displayName": "Globex Air Charter"
},
"sellerVerified": true,
"ownEmptyLeg": true
}
}
This operation is used to create empty leg watches. Creating a watch is a way to subscribe to empty legs that meet the criteria set up in the watch.
By default, an empty leg must meet all the criteria defined in the watch properties in order to be a match. However, for some properties, if any of the criteria within that property is met, the criterion for that base property is considered to be met. Properties like this have information about this in the property descriptions below.
Read more about the empty leg notification payload here, and how to setup the webhook settings to receive the notifications here.
uniqueName |
uniqueNameA name for this watch. All watches set up for one member company must have unique names.
|
active |
activeIf this watch should trigger notifications, or not. |
watchedSegments |
watchedSegmentsA list of segments for this watch. Se Watched segments section below for more information about possible values for this property. |
watchedSegments.start, watchedSegments.end |
watchedSegments.start, watchedSegments.endThe start and end airport or region for this segment.
|
priced |
pricedIf the watch should only consider empty legs with a price. |
verified |
verifiedIf the watch should only consider empty legs with that have been verified for charter. |
lifts, lifts.aircraftCategory |
lifts, lifts.aircraftCategoryA list of fixed wing aircraft categories. This criterion is considered met if any of the specified categories is a match to the lift of the empty leg. This property should be omitted if the watch should not filter on aircraft category. |
daysOutoptional |
daysOutoptionalIf this is specified, then the watch will only consider empty legs that are within this number of days into the future. If an empty leg is created and the departure time is 10 days into the future, a watch with daysOut = 7 will not immediately trigger a notification. However, three days later, when the empty leg is within the daysOut span, the notification will be triggered. |
This is the list of segments for this watch. At least one segment should be specified. Each segment has a start and an end. Both the start and end can be specified by defining either an airport or a region.
airport |
airportSpecifying an airport should be done by sending one airport code. The recommended code to send is the ICAO code. If the application calling this operation does not have access to the ICAO code then the IATA or FAA code should be sent.
|
icaoPrefix |
icaoPrefixA region can be specified by a valid ICAO prefix. For example “M” for Central America or “EG” for United Kingdom. |
countryCode |
countryCodeA region can be specified by a country code (2 letter ISO).
|
provinceCode |
provinceCodeA region can be specified by a province code. Currently only US states and Canadian provinces are supported. |
POST /emptylegs/watches
The calling application should make sure to store the returned data.id
. This id must be used when updating or inactivating this watch.
{
"uniqueName": "London to Arizona, US or Antartica",
"active": true,
"watchedSegments": [{
"start": {
"airport": {
"icao": "EGGW"
}
},
"end": {
"provinceCode": "AZ",
"countryCode": "US"
}
},
{
"start": {
"airport": {
"icao": "EGGW"
}
},
"end": {
"countryCode": "AQ"
}
},
{
"start": {
"airport": {
"icao": "ESGG"
}
},
"end": {
"icaoPrefix": "M"
}
}
],
"priced": true,
"verified": true,
"lifts": [{
"aircraftCategory": "Heavy Jet"
},
{
"aircraftCategory": "Ultra long range"
}
],
"daysOut": 7
}
This operation can be used to find empty legs that could be of interest given the input parameters sent to the operation. The input can be a start airport and/or an end airport along with a time span. The API algorithm tries to find empty legs available in that time span that can be of interest given the input parameters. So if the entered input is from Paris to Rome the API might return an empty leg from London to Rome since Paris is almost on that route.
The operator can in this case fly empty from London to Paris, pick up the passengers and fly them from Paris to Rome. The operator can then make some money on this otherwise non-profitable flight from London to Rome.
Similar matches are made if only the start airport or only the end airport is specified in the input. For example if the start airport is in San Francisco and no end airport is specified, then an empty leg from Los Angeles to New York can be returned since it is a relatively short distance between Los Angeles and San Francisco compared with the total distance of the empty leg.
Optional values |
Optional valuesamenities, calculatedprice, categorydetails, flighttime, homebase, insurance, liftaoc, perfdetails, safety, sellercontactinfo, sellerstats, taildetails, tailphotos, typedetails, typephotos See detailed descriptions at |
startAirport |
startAirportThe departure airport. |
endAirport |
endAirportThe end airport. |
date |
dateThe date in format yyyy-mm-dd. |
numberOfDaysFlexibility |
numberOfDaysFlexibilityThe flight date flexibility in number of days. |
requiredPartnerships |
requiredPartnershipsThe unique name of any list of operator partnerships setup in Avinode. This will return flights only from these operators. |
passengers |
passengersThe number of passengers. |
POST /emptylegs/search
Here is an example of a JSON payload.
{
"startAirport": {
"icao": "UKBB",
"iata": "",
"faa": ""
},
"endAirport": {
"icao": "LEBL",
"iata": "",
"faa": ""
},
"date": "2018-10-20",
"numberOfDaysFlexibility": "0",
"requiredPartnerships": ["My key operators"],
"passengers": "1"
}
results.id |
results.id |
results.href |
results.href |
results.type |
results.type |
results.startAirport |
results.startAirport |
results.endAirport |
results.endAirport |
results.startDate |
results.startDate |
results.endDate |
results.endDate |
results.brokered |
results.brokered |
results.sellerVerified |
results.sellerVerified |
results.ownEmptyLeg |
results.ownEmptyLeg |
Here is an example of the response from a successful call to this operation.
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "asearch-27390358",
"href": "https://sandbox.avinode.com/api/searches/asearch-27390358",
"type": "searches",
"results": [
{
"id": "el-123456",
"href": "https://sandbox.avinode.com/api/emptylegs/el-123456",
"type": "emptylegs",
"lift": {
"id": "el-123456",
"href": "https://sandbox.avinode.com/api/emptylegs/el-123456",
"type": "emptylegs",
"links": {
"emptylegs": [
{
"id": "el-123456",
"href": "https://sandbox.avinode.com/api/emptylegs/el-123456",
"type": "emptylegs"
}
]
},
"aircraftCategory": "Light jet",
"aircraftType": "Citation CJ4",
"aircraftSuperType": "Citation CJ4",
"maxPax": 9,
"ownAircraft": false
},
"startAirport": {
"id": "aport-659",
"href": "https://sandbox.avinode.com/api/airports/aport-659",
"type": "airports",
"name": "WEVELGEM",
"city": "KORTRIJK WEVELGEM",
"country": {
"code": "BE",
"name": "Belgium"
},
"icao": "EBKT",
"iata": "KJK"
},
"endAirport": {
"id": "aport-5872",
"href": "https://sandbox.avinode.com/api/airports/aport-5872",
"type": "airports",
"name": "MALAGA",
"city": "MALAGA",
"country": {
"code": "ES",
"name": "Spain"
},
"icao": "LEMG",
"iata": "AGP"
},
"startDate": {
"dateTimeUTC": "2018-10-20T06:10:00Z",
"dateTimeLocal": "2018-10-20T07:10:00+01:00"
},
"endDate": {
"dateTimeUTC": "2018-10-20T09:00:00Z",
"dateTimeLocal": "2018-10-20T10:00:00+01:00"
},
"brokered": false,
"sellerVerified": true,
"ownEmptyLeg": false
}
]
}
}
This operation can be used to create leads in the Avinode Marketplace. A lead may only be created when an end-user requests to be contacted in regard to an empty leg or one or more of the results returned in an POST /searches
operation. The operation returns information about the seller.
Only one lead per search result can be created.
searchId |
searchIdThis is the search id and should be populated with the value found in the result from the Only one lead request call per searchId can be made. |
sellerQuoteIds |
sellerQuoteIdsThis OR the inquiryLift property should be specified. This should be used if the end-client requests an aircraft. This is a set of one or more ids, specifying the options selected by the end-client. These ids can be found in the result from the |
inquiryLift, inquiryLift.aircraftType, inquiryLift.aircraftCategory, priceExpectation, leadCurrency |
inquiryLift, inquiryLift.aircraftType, inquiryLift.aircraftCategory, priceExpectation, leadCurrencyThis OR the sellerQuoteIds property should be specified. This should be used if the end-client requests an aircraft type or aircraft category. The priceExpectation property should contain the price that was presented to the end-client for this option. This price should be in the currency specified in the leadCurrency property. |
leadAddress |
leadAddressThis is the address information for the end-client. |
leadAddress.countrySelection.selectedValue |
leadAddress.countrySelection.selectedValueThis is the country of the end-clients address and should be specified by sending the two letter country code (ISO 3166-1 alpha-2). |
leadContactInfo |
leadContactInfoThis is the contact information for the end-client. |
leadMessage |
leadMessageThis is a text message that the end-client has specified. |
leadLocale |
leadLocaleThis is a preferred locale of the end-client. |
campaignIdentifier |
campaignIdentifierThis property can be used for tracking reasons if, for example, the lead was created in relation to a marketing campaign. |
clientIdentifier |
clientIdentifierThis value is created by the application calling the operation and should identify the specific lead. It must be unique for each created lead. If the operation is called multiple times with the same clientIdentifier, only the first call will create a lead. All other calls will simply return the same data that the first call returned. |
If the lead was created for one or more aircraft (i.e. not type or category), the details of the sellers marketing the aircraft is returned. Note that this information should not be displayed to the end-client. It is only intended to be stored in the applications back-end, and made available to the users of the company owning the application.
Creating leads in any repetitive or automated fashion to collect information is not allowed.
POST /leads
In the first example, the end-client has selected two aircraft options from the search result returned by the POST /searches
operation
{
"searchId": "asearch-12345678",
"sellerQuoteIds": [
"asearchhit-912345678",
"asearchhit-912345699"
],
"leadAddress": {
"countrySelection": {
"searchValue": "US"
},
"description": "Work",
"street": "123 Main Street",
"street2": "Suite 1234",
"postCode": "12345",
"city": "Seattle"
},
"leadContactInfo": {
"name": "John Smith Jr",
"title": "Dr",
"url": "http://www.smithandsons.test",
"emailAddresses": [
{
"type": "Work",
"emailAddress": "john@smithandsons.test"
}
],
"phoneNumbers": [
{
"type": "Work",
"phoneNumber": "+123456789"
}
]
},
"leadCurrency": "USD",
"leadMessage": "I want to bring my dog.",
"leadLocale": "en",
"campaignIdentifier": "Super Bowl",
"clientIdentifier": "lead83248"
}
In the second example, the end-client was presented with options on a aircraft category level and wants to create a booking request for a light jet.
{
"searchId": "asearch-12345678",
"inquiryLift": [
{
"aircraftCategory": "Light jet",
"priceExpectation": 8450
}
],
"leadAddress": {
"countrySelection": {
"searchValue": "US"
},
"description": "Work",
"street": "123 Main Street",
"street2": "Suite 1234",
"postCode": "12345",
"city": "Seattle"
},
"leadContactInfo": {
"name": "John Smith Jr",
"title": "Dr",
"url": "http://www.smithandsons.test",
"emailAddresses": [
{
"type": "Work",
"emailAddress": "john@smithandsons.test"
}
],
"phoneNumbers": [
{
"type": "Work",
"phoneNumber": "+123456789"
}
]
},
"leadCurrency": "USD",
"leadMessage": "I want to bring my dog.",
"leadLocale": "en",
"campaignIdentifier": "Super Bowl",
"clientIdentifier": "lead83248"
}
This operation is used to get information about a quote.
id |
idThis is the id of the quote that the operation will get information for. |
liftaocoptional |
liftaocoptionalWhen requesting this, the result will also include information about the operator’s AOC. |
sellerstatsoptional |
sellerstatsoptionalWhen requesting this, the result will, if available, also include information about the seller’s response statistics. |
typedetailsoptional |
typedetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft type. |
categorydetailsoptional |
categorydetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft category. |
typephotosoptional |
typephotosoptionalWhen requesting this, the result will, if available, also include links to generic photos of the aircraft type. |
tailphotosoptional |
tailphotosoptionalWhen requesting this, the result will, if available, also include links to photos of the actual aircraft. |
perfdetailsoptional |
perfdetailsoptionalWhen requesting this, the result will also include information about the aircraft’s performance details. |
taildetailsoptional |
taildetailsoptionalWhen requesting this, the result will also include additional information about the aircraft. |
amenitiesoptional |
amenitiesoptionalWhen requesting this, the result will, if available, also include information about the aircraft’s amenities. |
insuranceoptional |
insuranceoptionalWhen requesting this, the result will, if available, also include insurance information for the aircraft. |
GET /quotes/{id}
Here is an example of the response from the operation from a successful call. This is an example of a quote created by Avinode, on behalf of Globex Air Charter, for their Gulfstream N12345. The quote was originally presented to a buyer, as a part of a search result, when the buyer was looking for a suitable aircraft for a trip from London to Paris.
createdOn |
createdOnThe time when this quote was created. |
sellerCompany |
sellerCompanyInformation about the company marketing the aircraft this quote was created for. |
sellerPrice.price, sellerPrice.currency |
sellerPrice.price, sellerPrice.currencyThe total price for the offer in this quote. |
sellerPrice.convertedPrice, sellerPrice.conversionCurrency |
sellerPrice.convertedPrice, sellerPrice.conversionCurrencyThis is the price converted to the preferred currency of the API connection calling this operation. |
sellerMessage |
sellerMessageAny message the seller has entered for this quote. |
avinodeGenerated |
avinodeGeneratedThis is true if this quote was generated by Avinode on behalf of the seller. |
reservable |
reservableThis is true if the seller guarantees that the offer in this quote is available at this price. |
lift.aircraftCategory, lift.aircraftType, lift.aircraftTail |
lift.aircraftCategory, lift.aircraftType, lift.aircraftTailThis is the lift that is offered in this quote. At least one of these properties will be populated.
|
lift.maxPax |
lift.maxPaxThis is the maximum number of passengers for the offered lift. |
lift.ownAircraft |
lift.ownAircraftThis is true if the offered lift is marketed by the company calling this operation. |
segments |
segmentsThis is the itinerary for the trip offered in this quote. It contains a list of segments (aka legs). It may or may not include information about positioning flights. |
segment.startAirport, segment.endAirport |
segment.startAirport, segment.endAirportThis is the start airport and the end airport for the segment. The available airport codes for the airport is returned. If no airport codes are returned, the searchValue property contains free text information about the segment’s start or end point. This can happen if the offer in the quote is for a helicopter trip. |
segment.departureDateTime, segment.arrivalDateTime |
segment.departureDateTime, segment.arrivalDateTimeThis is the departure time from the start airport and the arrival time at the end airport. At least one of these will always be populated.
|
segment.blockMinutes |
segment.blockMinutesThis is the number of minutes for this segment, including taxi time. |
segment.flightMinutes |
segment.flightMinutesThis is the number actual in air flight minutes for this segment. |
segment.fuelMinutes |
segment.fuelMinutesThis is the number of minutes the aircraft is not moving during a fuel stop. |
segment.paxCount |
segment.paxCountThe number of passengers for this segment. This can be zero if the quote is for a cargo trip or if it is not yet specified how many passengers there will be on this segment. |
segment.paxSegment |
segment.paxSegmentThis is true if the segment is one of the business segments of this trip. |
segment.distanceNM |
segment.distanceNMThe distance between the start airport and the end airport in nautical miles. |
segment.fuelStopCount |
segment.fuelStopCountThis is the number of fuel stops estimated for this segment. |
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "aquote-78978978",
"href": "https://sandbox.avinode.com/api/quotes/aquote-78978978",
"type": "quotes",
"createdOn": "2016-08-09T11:17:21Z",
"sellerCompany": {
"id": "456B0E06-BCDF-4CC0-AFD7-1F3F8ECAABCD",
"displayName": "Globex Air Charter"
},
"sellerPrice": {
"currency": "EUR",
"price": 14400,
"conversionCurrency": "EUR",
"convertedPrice": 14400
},
"sellerMessage": "",
"avinodeGenerated": true,
"reservable": false,
"lift": {
"id": "FFACED64-ABCD-4292-BCAB-32B102EDD9AB",
"aircraftCategory": "Ultra long range",
"aircraftType": "Gulfstream G-V",
"aircraftTail": "N12345",
"maxPax": 9,
"ownAircraft": true
},
"segments": [
{
"startAirport": {
"id": "aport-5955",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT"
},
"endAirport": {
"id": "aport-6401",
"name": "LUTON",
"city": "LONDON (LUTON)",
"country": {
"code": "GB",
"name": "United Kingdom"
},
"icao": "EGGW",
"iata": "LTN"
},
"departureDateTime": {
"dateTimeUTC": "2016-08-17T05:55:00Z",
"dateTimeLocal": "2016-08-17T07:55:00+02:00",
"calculated": true
},
"arrivalDateTime": {
"dateTimeUTC": "2016-08-17T07:30:00Z",
"dateTimeLocal": "2016-08-17T08:30:00+01:00",
"calculated": true
},
"blockMinutes": 95,
"flightMinutes": 85,
"fuelMinutes": 0,
"paxCount": 0,
"paxSegment": false,
"distanceNM": 602,
"fuelStopCount": 0
},
{
"startAirport": {
"id": "aport-6401",
"name": "LUTON",
"city": "LONDON (LUTON)",
"country": {
"code": "GB",
"name": "United Kingdom"
},
"icao": "EGGW",
"iata": "LTN"
},
"endAirport": {
"id": "aport-3378",
"name": "LE BOURGET",
"city": "PARIS",
"country": {
"code": "FR",
"name": "France"
},
"icao": "LFPB",
"iata": "LBG"
},
"departureDateTime": {
"dateTimeUTC": "2016-08-17T08:00:00Z",
"dateTimeLocal": "2016-08-17T09:00:00+01:00",
"calculated": false
},
"arrivalDateTime": {
"dateTimeUTC": "2016-08-17T08:40:00Z",
"dateTimeLocal": "2016-08-17T10:40:00+02:00",
"calculated": true
},
"blockMinutes": 40,
"flightMinutes": 30,
"fuelMinutes": 0,
"paxCount": 2,
"paxSegment": true,
"distanceNM": 207,
"fuelStopCount": 0
},
{
"startAirport": {
"id": "aport-3378",
"name": "LE BOURGET",
"city": "PARIS",
"country": {
"code": "FR",
"name": "France"
},
"icao": "LFPB",
"iata": "LBG"
},
"endAirport": {
"id": "aport-5955",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT"
},
"departureDateTime": {
"dateTimeUTC": "2016-08-17T09:10:00Z",
"dateTimeLocal": "2016-08-17T11:10:00+02:00",
"calculated": true
},
"arrivalDateTime": {
"dateTimeUTC": "2016-08-17T10:55:00Z",
"dateTimeLocal": "2016-08-17T12:55:00+02:00",
"calculated": true
},
"blockMinutes": 105,
"flightMinutes": 95,
"fuelMinutes": 0,
"paxCount": 0,
"paxSegment": false,
"distanceNM": 679,
"fuelStopCount": 0
}
]
}
}
This operation is used to get information about an RFQ.
Looking for how to handle canceled RFQs? Scroll down to the Output section to find what to look for in the response.
id |
idThis is the id of the RFQ that the operation will get information for. |
liftaocoptional |
liftaocoptionalWhen requesting this, the result will also include information about the operator’s AOC. |
sellerstatsoptional |
sellerstatsoptionalWhen requesting this, the result will, if available, also include information about the seller’s response statistics. |
typedetailsoptional |
typedetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft type. |
categorydetailsoptional |
categorydetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft category. |
typephotosoptional |
typephotosoptionalWhen requesting this, the result will, if available, also include links to generic photos of the aircraft type. |
tailphotosoptional |
tailphotosoptionalWhen requesting this, the result will, if available, also include links to photos of the actual aircraft. |
perfdetailsoptional |
perfdetailsoptionalWhen requesting this, the result will also include information about the aircraft’s performance details. |
taildetails |
taildetailsWhen requesting this, the result will also include additional information about the aircraft. |
amenitiesoptional |
amenitiesoptionalWhen requesting this, the result will, if available, also include information about the aircraft’s amenities. |
insuranceoptional |
insuranceoptionalWhen requesting this, the result will, if available, also include insurance information for the aircraft. |
homebaseoptional |
homebaseoptionalWhen requesting this, the result will also include information about the aircraft’s homebase airport. |
officeoptional |
officeoptionalRequesting this will add information about the buyer’s primary office to the operation output. |
safetyoptional |
safetyoptionalRequesting this will add information about the operator’s safety ratings. |
aviquoteoptional |
aviquoteoptionalRequesting this will add information about the quote that Avinode generated on behalf of the seller for this RFQ. |
buyermessagesoptional |
buyermessagesoptionalRequesting this will add information on all buyer messages. (see second output example below) |
GET /rfqs/{id}
Here is an example of the response from a successful call to this operation. In this example the broker John Smith at Acme Charter Broker has requested quotes from Globex Air Charter, for a round trip from ESSD to ESGG and back. The buyer has requested a quote for Globex Air Charter’s Gulfstream N12345 and also for an empty leg that Globex Air Charter has posted for their Challenger N54321.
links |
linksThis is a list of links to other resources related to this RFQ.
|
links.tripmsgs |
links.tripmsgsThese are messages added by the buyer or seller. The application can download them by calling the |
actions |
actionsThis is a list of actions that can be performed on this RFQ by making API calls to the specified actions. |
actions.submitQuote |
actions.submitQuoteThis is the action that should be used to upload quotes that aren’t direct replies to any of the lift requested by the buyer. |
actions.decline |
actions.declineThis is the action that should be used to decline the entire RFQ. |
actions.searchInAvinode |
actions.searchInAvinodeThis action is used to automatically launch a browser window to rerun the search for this trip in Avinode. |
createdOn |
createdOnThe time when this RFQ was created. |
buyerCompany |
buyerCompanyInformation about the company requesting quotes for this trip. |
buyerAccount |
buyerAccountInformation about the person requesting quotes for this trip. |
sellerCompany |
sellerCompanyInformation about the company that this RFQ was sent to. |
sellerLift |
sellerLiftThe response can contain one or more sellerLift. Each sellerLift represents what lift the buyer has asked to get quotes for. |
sellerLift.links |
sellerLift.linksThis is a list of links to other resources related to this sellerLift. |
sellerLift.links.quotes |
sellerLift.links.quotesAny quotes associated with this sellerLift. The application can download these quotes by calling the |
sellerLift.links.emptylegs |
sellerLift.links.emptylegsThis is a list of empty legs associated with the sellerLift. This exists if the buyer has requested an empty leg. The application can download these empty legs by calling the |
sellerLift.actions |
sellerLift.actionsThis is a list of actions that can be performed for this specific sellerLift. |
sellerLift.actions.submitQuote |
sellerLift.actions.submitQuoteThis is the action that should be used to upload quotes that are direct replies to one of the sellerLift requested by the buyer. |
sellerLift.actions.decline |
sellerLift.actions.declineThis is the action that should be used to decline a specific sellerLift requested by the buyer. |
sellerLift.aircraftCategory, sellerLift.aircraftType, sellerLift.aircraftTail |
sellerLift.aircraftCategory, sellerLift.aircraftType, sellerLift.aircraftTailThis is the lift that the buyer has specifically requested a quote for. At least one of these properties will be populated.
|
sellerLift.avinodeQuote |
sellerLift.avinodeQuoteIf the query parameter aviquote was requested, this property will contain additional information about the quote that Avinode generated on behalf of the seller for this RFQ. For exampel the cost for positioning legs required to do this flight. |
sellerLift.avinodeQuote.segments |
sellerLift.avinodeQuote.segmentsThis segments section is a more detailed itinerary for the trip the buyer is requesting quotes for. It contains a list of segments (aka legs), including any positioning legs required to do the requested flight. |
sellerLift.sourcingDisplayStatus, sellerLift.sourcingStatus |
sellerLift.sourcingDisplayStatus, sellerLift.sourcingStatusThis will tell the status of the quote request.
|
segments |
segmentsThis is the itinerary for the trip the buyer is requesting quotes for. It contains a list of segments (aka legs). |
segments.startAirport, segments.endAirport |
segments.startAirport, segments.endAirportThis is the start airport and the end airport for the segment. The available airport codes for the airport is returned. If no airport codes are returned, the searchValue property contains free text information about the segment’s start or end point. This can happen if the RFQ is a request for a helicopter trip. |
segments.dateTime |
segments.dateTimeThis is either the departure time from the start airport or the arrival time at the end airport. If the segments.dateTime.local property is false, then the specified time is an UTC time. Otherwise, it is the local time of the airport that the time is specified for. |
segments.paxCount |
segments.paxCountThe number of passengers the buyer has indicated for this segment. This can be zero if the RFQ is for a cargo trip or if the buyer not yet knows how many passengers there will be on this segment. |
segments.paxSegment |
segments.paxSegmentThis is true if the segment is one of the business segments of this trip. |
buyerMessagesoptional |
buyerMessagesoptionalAll messages from the buyer for this trip. |
buyerMessages.messageTypeoptional |
buyerMessages.messageTypeoptionalMessage types can be:
|
buyerMessages.cancelReasonoptional |
buyerMessages.cancelReasonoptionalWhen a buyer cancels a trip they can provide a reason by selecting from the following options:
|
tripId |
tripIdThis is the id of the requested trip. The same TripID that can be seen in the Marketplace Trips Selling/Buying pages. |
canceled |
canceledIf the trip has been canceled by the requester, this property will be set to true. |
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": [
{
"id": "arfq-1000000009",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000009",
"type": "rfqs",
"links": {
"tripmsgs": [
{
"id": "abuyermsg-1000000010",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000010",
"type": "tripmsgs"
}
]
},
"actions": {
"searchInAvinode": {
"type": "searchInAvinode",
"description": "Start a search in Avinode",
"httpMethod": "GET",
"href": "https://sandbox.avinode.com/marketplace/mvc/search/load/arfq-1000000009?source=api"
},
"submitQuote": {
"type": "submitQuote",
"description": "Submit a quote",
"httpMethod": "POST",
"href": "https://sandbox.avinode.com/api/tripmsgs/arfq-1000000009/submitQuote"
},
"decline": {
"type": "decline",
"description": "Decline",
"httpMethod": "POST",
"href": "https://sandbox.avinode.com/api/tripmsgs/arfq-1000000009/decline"
},
"viewInAvinode": {
"type": "viewInAvinode",
"description": "View in Avinode",
"httpMethod": "GET",
"href": "https://sandbox.avinode.com/marketplace/mvc/trips/selling/rfq?source=api&rfq=arfq-1000000009"
}
},
"createdOn": "2018-10-02T09:54:18Z",
"buyerCompany": {
"id": "F2341E00-D226-403C-8805-0A43F18E95F0",
"displayName": "Acme Charter Broker",
"contactInfo": {
"emails": [
"hq@acb.test"
],
"phone": "+44123456789",
"mobilePhone": "+44987654321",
"url": "www.acb.test",
"office": "Acme Charter Broker",
"address": "221B Baker Street\n12345 London\nUnited Kingdom",
"detailedAddress": {
"street": "221B Baker Street",
"postBox": "",
"postCode": "12345",
"city": "London",
"country": {
"code": "UK",
"name": "United Kingdom"
}
}
}
},
"buyerAccount": {
"id": "3F530A28-355F-48E9-854C-F9455C1760DF",
"displayName": "John Smith",
"contactInfo": {
"emails": [
"john.smith@acb.test"
],
"phone": "+44123456789",
"mobilePhone": "+44987654321",
},
"preferredCurrency": "EUR"
},
"sellerCompany": {
"id": "EBCEE19F-6A31-46FE-9847-4972F57460CE",
"displayName": "Globex Air Charter",
"contactInfo": {
"emails": [
"info@globex.test"
],
"phone": "+1123123123",
"mobilePhone": "+1123123123",
"url": "www.globex.test",
"office": "Globex Air Charter",
"address": "Box#1234\n12345 TestCity\nMalta",
"detailedAddress": {
"street": "TestStreet 123",
"postBox": "Box#1234",
"postCode": "12345",
"city": "TestCity",
"country": {
"code": "MT",
"name": "Malta"
}
}
}
},
"sellerLift": [
{
"id": "asellerlift-42134678",
"links": {
"quotes": [
{
"id": "aquote-1000000014",
"href": "https://sandbox.avinode.com/api/quotes/aquote-1000000014",
"type": "quotes"
}
]
},
"actions": {
"submitQuote": {
"type": "submitQuote",
"description": "Submit a quote",
"httpMethod": "POST",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellerlift-42134678/submitQuote"
},
"decline": {
"type": "decline",
"description": "Decline",
"httpMethod": "POST",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellerlift-42134678/decline"
}
},
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftSuperType": "Global Express/XRS",
"aircraftTail": "SBY-658ZK",
"maxPax": 12,
"ownAircraft": true,
"suggestedByAvinode": false,
"sourcingDisplayStatus": "Unanswered",
"sourcingStatus": 1
}
],
"segments": [
{
"startAirport": {
"selectedValue": 5948,
"searchValue": "ESSD",
"icao": "ESSD",
"iata": "BLE"
},
"endAirport": {
"selectedValue": 5955,
"searchValue": "ESGG",
"icao": "ESGG",
"iata": "GOT"
},
"dateTime": {
"date": "2018-10-03",
"time": "09:00",
"departure": true,
"local": true
},
"paxCount": "2",
"paxSegment": true,
"startAirportDetails": {
"id": "aport-5948",
"href": "https://sandbox.avinode.com/api/airports/aport-5948",
"type": "airports",
"name": "BORLANGE",
"city": "BORLANGE",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESSD",
"iata": "BLE"
},
"endAirportDetails": {
"id": "aport-5955",
"href": "https://sandbox.avinode.com/api/airports/aport-5955",
"type": "airports",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT"
},
"departureDateTime": {
"dateTimeUTC": "2018-10-03T07:00:00Z",
"dateTimeLocal": "2018-10-03T09:00:00+02:00"
}
},
{
"startAirport": {
"selectedValue": 5955,
"searchValue": "ESGG",
"icao": "ESGG",
"iata": "GOT"
},
"endAirport": {
"selectedValue": 5948,
"searchValue": "ESSD",
"icao": "ESSD",
"iata": "BLE"
},
"dateTime": {
"date": "2018-10-03",
"time": "17:00",
"departure": true,
"local": true
},
"paxCount": "2",
"paxSegment": true,
"startAirportDetails": {
"id": "aport-5955",
"href": "https://sandbox.avinode.com/api/airports/aport-5955",
"type": "airports",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT"
},
"endAirportDetails": {
"id": "aport-5948",
"href": "https://sandbox.avinode.com/api/airports/aport-5948",
"type": "airports",
"name": "BORLANGE",
"city": "BORLANGE",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESSD",
"iata": "BLE"
},
"departureDateTime": {
"dateTimeUTC": "2018-10-03T15:00:00Z",
"dateTimeLocal": "2018-10-03T17:00:00+02:00"
}
}
],
"tripId": "Y2AW5H"
}
]
}
This output example shows the response when requesting buyermessages of a trip that was eventually canceled by the buyer.
...
],
"buyerMessages": [
{
"id": "abuyermsg-1000000004",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000004",
"type": "tripmsgs",
"liftIds": [
"asellerlift-43277696",
"asellerlift-43277697",
"asellerlift-43277698"
],
"createdOn": "2018-11-26T14:50:16Z",
"message": "Can you give a quote, please",
"buyerAccount": {
"id": "3F530A28-355F-48E9-854C-F9455C1760DF",
"displayName": "Fervent Almeida",
"contactInfo": {
"emails": [
"Fervent.Almeida@AvinodeGroup.com"
],
"phone": "",
"mobilePhone": ""
},
"preferredCurrency": "EUR"
},
"messageType": "REQUEST"
},
{
"id": "abuyermsg-1000000005",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000005",
"type": "tripmsgs",
"liftIds": [],
"createdOn": "2018-11-26T14:50:52Z",
"message": "Hi, can they bring five dogs onboard?",
"buyerAccount": {
"id": "3F530A28-355F-48E9-854C-F9455C1760DF",
"displayName": "Fervent Almeida",
"contactInfo": {
"emails": [
"Fervent.Almeida@AvinodeGroup.com"
],
"phone": "",
"mobilePhone": ""
},
"preferredCurrency": "EUR"
},
"messageType": "CHAT"
},
{
"id": "abuyermsg-1000000006",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000006",
"type": "tripmsgs",
"liftIds": [],
"createdOn": "2018-11-26T14:51:56Z",
"message": "Sorry, my client changed their mind!",
"buyerAccount": {
"id": "3F530A28-355F-48E9-854C-F9455C1760DF",
"displayName": "Fervent Almeida",
"contactInfo": {
"emails": [
"Fervent.Almeida@AvinodeGroup.com"
],
"phone": "",
"mobilePhone": ""
},
"preferredCurrency": "EUR"
},
"messageType": "CANCELED",
"cancelReason": "Canceled by client"
}
],
"tripId": "BATDYC",
"canceled": true
}
}
This operation is used to create an RFQ to be sent to operators in Avinode marketplace. It requires one or more search hit ID’s from a recent aircraft search result, representing the lifts requested OR specific lift and segments criteria.
Also see the POST /leads
operation, to have the RFQ posted to your Avinode account as a client lead instead.
X-Avinode-ActAsAccount |
X-Avinode-ActAsAccountIf the person initiating this action has a personal Avinode Marketplace user account, then the username for that user account should be sent in this HTTP header. The buyer will then see the name of the person that preformed this action. |
tripId |
tripIdThe trip ID of an existing trip to associate this RFQ to. If omitted, a new trip will be created. Note! Always send the tripId if there is one, to avoid creating unnecessary trips. For example, if you send 10 requests to different operators for one journey, there will be 10 different RFQ id’s but one common trip ID. This is the same value as the Trip ID visible in Avinode trips pages. |
searchResultIds |
searchResultIdsThis is a set of one or more id’s, specifying the options selected by the end-client. These id’s can be found in the result from the Only one RQF per search result can be created, although multiple search hit id’s can be sent at once in this array. |
aircraftTailsoptional |
aircraftTailsoptionalSpecify the aircraft tail(s) from the chosen lifts in the search result. |
buyerMessage |
buyerMessageText message to the seller company. |
buyerNotificationSettings |
buyerNotificationSettings |
criteria.requiredLift.emptyLegId |
criteria.requiredLift.emptyLegIdThe empty leg id if the requested lift is an empty leg. |
criteria.requiredPartnerships |
criteria.requiredPartnershipsIf required partnerships are setup in Avinode, the exact name of this partnership list should be sent here. |
segments.startAirport |
segments.startAirportThe departure airport. |
segments.endAirport |
segments.endAirportThe arrival airport. |
segments.dateTime |
segments.dateTimeThe departure date and time. |
segments.paxTBD |
segments.paxTBDIf the end client has not yet provided the exact number of passengers, this Boolean value can be set to true. |
segments.timeTBD |
segments.timeTBDIf the end client has not yet provided the exact time of departure, this Boolean value can be set to true. |
POST /rfqs
This one is using a search id and specific search hit id’s.
{
"buyerMessage" : "Hi, I would like to book this flight. /Em",
"searchResultIds" : [ "asearchhit-4544550324", "asearchhit-4544550377" ]
}
This one is using criteria and segments. It’s an additional request sent on an existing trip, hence providing the tripId.
{
"tripId" : "QWE123",
"buyerMessage": "Hi, I would like to book this flight. /Em",
"buyerNotificationSettings": "",
"criteria": {
"requiredLift": [{
"aircraftCategory": "Heavy jet",
"aircraftType": "Falcon 2000",
"aircraftTail": "N367SM",
"maxPax": 10,
"ownAircraft": false
}],
"requiredPartnerships": [],
"maxFuelStopsPerSegment": 0,
"includeLiftUpgrades": true,
"maxInitialPositioningTimeMinutes": 0,
"minimumYearOfMake": 2001
},
"segments": [{
"startAirport": {
"icao": "KMIA"
},
"endAirport": {
"icao": "KTEB"
},
"clientIdentifier": "",
"dateTime": {
"date": "2019-05-13",
"time": "11:00",
"departure": false,
"local": true
},
"paxCount": "7",
"paxSegment": true,
"paxTBD": true,
"timeTBD": false
}]
}
Here is an example of the response from a successful call to this operation.
id |
idThe id for this trip. |
actions.cancel |
actions.cancelUse this action to cancel the whole trip, including all associated RFQ’s. |
rfqs.id |
rfqs.idThe RFQ id |
rfqs.links.tripmsgs |
rfqs.links.tripmsgsAny buyer messages associated to this RFQ. |
rfqs.actions.cancel |
rfqs.actions.cancelUse this action to cancel this specific RFQ. |
rfqs.actions.viewInAvinode |
rfqs.actions.viewInAvinodeUse this action to view this trip in Avinode Trips Buying page. |
rfqs.createdOn |
rfqs.createdOnThe time when this RFQ was created. |
rfqs.buyerCompany |
rfqs.buyerCompanyInformation about the company requesting quotes for this trip. |
rfqs.buyerAccount |
rfqs.buyerAccountInformation about the person requesting quotes for this trip. |
rfqs.sellerCompany |
rfqs.sellerCompanyInformation about the company that this RFQ was sent to. |
rfqs.sellerLift |
rfqs.sellerLiftThe response can contain one or more sellerLift. Each sellerLift represents what lift the buyer has asked to get quotes for. |
rfqs.segments |
rfqs.segmentsThis is the itinerary for the trip the buyer is requesting quotes for. It contains a list of segments (aka legs). |
tripId |
tripIdThe trip id associated with this trip. This is the same id as the TripID visible in Avinode Trips pages. |
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "atrip-1000000091",
"href": "https://sandbox.avinode.com/api/trips/atrip-1000000091",
"type": "trips",
"actions": {
"cancel": {
"type": "cancel",
"description": "Cancel",
"httpMethod": "PUT",
"href": "https://sandbox.avinode.com/api/trips/atrip-1000000091/cancel"
}
},
"rfqs": [
{
"id": "arfq-1000000097",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000097",
"type": "rfqs",
"links": {
"tripmsgs": [
{
"id": "abuyermsg-1000000119",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000119",
"type": "tripmsgs"
}
]
},
"actions": {
"cancel": {
"type": "cancel",
"description": "Cancel",
"httpMethod": "PUT",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000097/cancel"
}
},
"createdOn": "2019-04-03T12:31:46Z",
"buyerCompany": {
"id": "416B11AC-7B76-4354-BA54-EEF2BECAB439",
"companyId": 11722,
"displayName": "Emelie-operator",
"contactInfo": {
"emails": [
"hq@Emelieoperator.com"
],
"phone": "+25 79 900 05 57",
"mobilePhone": "+41 449 159 671",
"url": "https://www.avinode.com",
"office": "",
"address": "Odinsgatan 10\n156 32 Gscvzdceee\nSweden",
"detailedAddress": {
"street": "Odinsgatan 10",
"postBox": "",
"postCode": "156 32",
"city": "Gscvzdceee",
"country": {
"code": "SE",
"name": "Sweden"
}
}
}
},
"buyerAccount": {
"id": "E5717E4F-C695-4ED8-A20A-18B1B94A1628",
"accountId": 158102,
"displayName": "The Connection",
"contactInfo": {
"emails": [
"aiitwu@srwzkza.com"
],
"phone": "",
"mobilePhone": ""
},
"preferredCurrency": "EUR"
},
"sellerCompany": {
"id": "225F7C28-7777-47DB-9D1F-E6254824144B",
"companyId": 795,
"displayName": "Air Shotland",
"contactInfo": {
"emails": [
"hq@sdsdsdsd.com"
],
"phone": "+661777671042",
"mobilePhone": "+613577707164",
"url": "www.sdsdsdsd.com",
"office": "",
"address": "3 Colvilles Place\nP99 5LE Dknljwg\nUnited Kingdom",
"detailedAddress": {
"street": "3 Colvilles Place",
"postBox": "",
"postCode": "777 5LE",
"city": "Dknljwg",
"country": {
"code": "GB",
"name": "United Kingdom"
}
}
}
},
"sellerLift": [
{
"id": "asellerlift-45483145",
"links": {
"quotes": [
{
"id": "aquote-1000000112",
"href": "https://sandbox.avinode.com/api/quotes/aquote-1000000112",
"type": "quotes"
}
]
},
"aircraftCategory": "Heavy jet",
"aircraftType": "Legacy 650",
"aircraftSuperType": "Legacy 600/650",
"marketedAircraftId": 77777,
"aircraftTail": "G-SUGR",
"maxPax": 13,
"ownAircraft": false,
"suggestedByAvinode": false,
"sourcingDisplayStatus": "Unanswered",
"sourcingStatus": 1,
"syncState": "asellerlift-45483145"
}
],
"segments": [
{
"startAirport": {
"selectedValue": 6401,
"searchValue": "EGGW",
"icao": "EGGW",
"iata": "LTN"
},
"endAirport": {
"selectedValue": 14267,
"searchValue": "KTEB",
"icao": "KTEB",
"iata": "TEB",
"faa": "TEB"
},
"dateTime": {
"date": "2019-05-13",
"time": "11:00",
"departure": false,
"local": false
},
"paxCount": "7",
"paxSegment": true,
"paxTBD": false,
"timeTBD": false,
"startAirportDetails": {
"id": "aport-6401",
"href": "https://sandbox.avinode.com/api/airports/aport-6401",
"type": "airports",
"name": "LUTON",
"city": "LONDON (LUTON)",
"country": {
"code": "GB",
"name": "United Kingdom"
},
"icao": "EGGW",
"iata": "LTN",
"airportId": 6401
},
"endAirportDetails": {
"id": "aport-14267",
"href": "https://sandbox.avinode.com/api/airports/aport-14267",
"type": "airports",
"name": "TETERBORO",
"city": "TETERBORO",
"country": {
"code": "US",
"name": "United States"
},
"icao": "KTEB",
"iata": "TEB",
"faa": "TEB",
"airportId": 14267,
"province": {
"code": "NJ",
"name": "New Jersey"
}
},
"arrivalDateTime": {
"dateTimeUTC": "2019-05-13T11:00:00Z",
"dateTimeLocal": "2019-05-13T07:00:00-04:00"
}
}
],
"tripId": "KJRUEZ"
}
],
"tripId": "KJRUEZ"
}
}
This operation is used when a buyer want to cancel an individual quote request, or a whole trip. Cancelling a trip cannot be undone and any further communication on the request is disabled. All sellers involved will be notified the trip/RFQ has been canceled.
id |
idThis is either:
|
PUT /trips/{id}/cancel
PUT /rfqs/{id}/cancel
X-Avinode-ActAsAccount |
X-Avinode-ActAsAccountIf the person initiating this action has a personal Avinode Marketplace user account, then the username for that user account should be sent in this HTTP header. The buyer will then see the name of the person that preformed this action. |
id |
idThis is either:
|
type |
typeThis is either:
|
href |
hrefAn URL to the resource in Avinode, present in the RFQ data. |
messageToSeller |
messageToSellerA text message to the seller. |
reason |
reasonChoose one of the reasons for cancellation:
|
{
"id": "atrip-1000000200",
"type": "trip",
"href": "https://sandbox.avinode.com/api/trips/atrip-1000000200",
"messageToSeller": "Sorry, itinerary was changed. /Em",
"reason": "CHANGED"
}
{
"id": "arfq-1000000064",
"type": "arfq",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000064",
"messageToSeller": "Sorry, this was canceled last minute. /Em",
"reason": "BY_CLIENT"
}
rfqs |
rfqsAll RFQ’s included in this trip. |
rfqs.sellerLift.sourcingDisplayStatus, rfqs.sellerLift.sourcingStatus |
rfqs.sellerLift.sourcingDisplayStatus, rfqs.sellerLift.sourcingStatusThis will tell the status of the quote request.
|
rfqs.tripId |
rfqs.tripIdThis is the id of the requested trip. One trip can contain many RFQ’s. This is the same as Marketplace TripID, visible to users in Avinode Trips Selling/Buying pages. |
rfqs.canceled |
rfqs.canceledSet to true if the RFQ has been canceled. |
tripId |
tripIdThis is the id of the requested trip. One trip can contain many RFQ’s. This is the same as Marketplace TripID, visible to users in Avinode Trips Selling/Buying pages. |
canceled |
canceledSet to true if the trip has been canceled at trip level. |
This trip, including all RFQ’s associated, was cancelled using the trip id. Note the property canceled == true at the end of the response, in this case at trip level as well as RFQ level .
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "atrip-1000000200",
"href": "https://sandbox.avinode.com/api/trips/atrip-1000000200",
"type": "trips",
"links": {
"tripmsgs": [{
"id": "asellermsg-1000000012",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-1000000012",
"type": "tripmsgs"
}, {
"id": "asellermsg-1000000011",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-1000000011",
"type": "tripmsgs"
}]
},
"actions": {
"viewInAvinode": {
"type": "viewInAvinode",
"description": "View in Avinode",
"httpMethod": "GET",
"href": "https://sandbox.avinode.com/marketplace/mvc/trips/buying/atrip-1000000200?source=api"
}
},
"rfqs": [{
"id": "arfq-1000000154",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000154",
"type": "rfqs",
"links": {
"tripmsgs": [{
"id": "abuyermsg-1000000172",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000172",
"type": "tripmsgs"
}, {
"id": "abuyermsg-1000000174",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000174",
"type": "tripmsgs"
}]
},
"actions": {
"viewInAvinode": {
"type": "viewInAvinode",
"description": "View in Avinode",
"httpMethod": "GET",
"href": "https://sandbox.avinode.com/marketplace/mvc/trips/buying/atrip-1000000200?source=api"
}
},
"createdOn": "2019-05-09T12:05:23Z",
"buyerCompany": {
"id": "750ED6BB-2AA7-4C9D-A313-78A9CA125F08",
"companyId": 11725,
"displayName": "A-broker",
"contactInfo": {
"emails": [
"hq@broker.com"
],
"phone": "+71 48 157 04 36",
"mobilePhone": "+34 049 121 450",
"url": "",
"office": "",
"address": "Odinsgatan 10\n693 81 Osphbwcwyi\nSweden",
"detailedAddress": {
"street": "Odinsgatan 10",
"postBox": "",
"postCode": "693 81",
"city": "Osphbwcwyi",
"country": {
"code": "SE",
"name": "Sweden"
}
}
}
},
"buyerAccount": {
"id": "3F530A28-355F-48E9-854C-F9455C1760DF",
"accountId": 144052,
"displayName": "Fervent Almeida",
"contactInfo": {
"emails": [
"Fervent.Almeida@AvinodeGroup.com"
],
"phone": "+92 01 030 17 60",
"mobilePhone": "+88 696 910 739"
},
"preferredCurrency": "EUR"
},
"sellerCompany": {
"id": "416B11AC-7B76-4354-BA54-EEF2BECAB439",
"companyId": 11722,
"displayName": "An-operator",
"contactInfo": {
"emails": [
"hq@operator.com"
],
"phone": "+42 31 449 41 71",
"mobilePhone": "+30 966 761 366",
"url": "https://www.avinode.com",
"office": "",
"address": "Odinsgatan 10\n435 74 Xnrsinpatl\nSweden",
"detailedAddress": {
"street": "Odinsgatan 10",
"postBox": "",
"postCode": "435 74",
"city": "Xnrsinpatl",
"country": {
"code": "SE",
"name": "Sweden"
}
}
}
},
"sellerLift": [{
"id": "asellerlift-46197021",
"links": {
"quotes": [{
"id": "aquote-1000000178",
"href": "https://sandbox.avinode.com/api/quotes/aquote-1000000178",
"type": "quotes"
}]
},
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftSuperType": "Global Express/XRS",
"marketedAircraftId": 63596,
"aircraftTail": "T-ESLA",
"maxPax": 12,
"ownAircraft": false,
"suggestedByAvinode": false,
"sourcingDisplayStatus": "Canceled",
"sourcingStatus": 3,
"syncState": "abuyermsg-1000000174"
}, {
"id": "asellerlift-46197020",
"links": {
"quotes": [{
"id": "aquote-1000000177",
"href": "https://sandbox.avinode.com/api/quotes/aquote-1000000177",
"type": "quotes"
}]
},
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftSuperType": "Global Express/XRS",
"marketedAircraftId": 63597,
"aircraftTail": "T-USLA",
"maxPax": 12,
"ownAircraft": false,
"suggestedByAvinode": false,
"sourcingDisplayStatus": "Canceled",
"sourcingStatus": 3,
"syncState": "abuyermsg-1000000174"
}],
"segments": [{
"startAirport": {
"selectedValue": 5955,
"searchValue": "ESGG",
"icao": "ESGG",
"iata": "GOT"
},
"endAirport": {
"selectedValue": 5971,
"searchValue": "ESNQ",
"icao": "ESNQ",
"iata": "KRN"
},
"dateTime": {
"date": "2019-05-17",
"time": "09:00",
"departure": true,
"local": true
},
"paxCount": "2",
"paxSegment": true,
"paxTBD": false,
"timeTBD": false,
"startAirportDetails": {
"id": "aport-5955",
"href": "https://sandbox.avinode.com/api/airports/aport-5955",
"type": "airports",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT",
"airportId": 5955
},
"endAirportDetails": {
"id": "aport-5971",
"href": "https://sandbox.avinode.com/api/airports/aport-5971",
"type": "airports",
"name": "KIRUNA",
"city": "KIRUNA",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESNQ",
"iata": "KRN",
"airportId": 5971
},
"departureDateTime": {
"dateTimeUTC": "2019-05-17T07:00:00Z",
"dateTimeLocal": "2019-05-17T09:00:00+02:00"
}
}],
"tripId": "S44VD2",
"canceled": true
}],
"canceled": true,
"tripId": "S44VD2"
}
}
This operation is used to find lift available to perform the given itinerary. It calculates and returns preliminary quotes for each of the aircraft. The routes and prices are, in most cases, calculated based on the aircraft pricing information, aircraft performance details, availability information, etc., provided by the companies marketing the aircraft in the Avinode Marketplace. Alternatively, the route and pricing may have been calculated by an external module controlled by the seller.
Search results will be sorted by price in ascending order.
To optimize performance of you application, especially when requesting multiple optional data attributes in the search query – please ensure you are requesting GZIP compression to decrease response times. See API Basics for more info.
criteria.requiredLift |
criteria.requiredLiftThis is a list of the lift that the search algorithm should consider. It can be a combination of values of one or more of the following properties.
|
criteria.requiredPartnershipsoptional |
criteria.requiredPartnershipsoptionalThe unique name of the list of partnerships setup in Avinode. This will return flights only from those operators. |
criteria.maxFuelStopsPerSegmentoptional |
criteria.maxFuelStopsPerSegmentoptionalThe max number of fuel stops the search algorithm should allow for any lift. |
criteria.maxInitialPositioningTimeMinutesoptional |
criteria.maxInitialPositioningTimeMinutesoptionalMaximum time for initial positioning in number of minutes. |
criteria.minimumYearOfMakeoptional |
criteria.minimumYearOfMakeoptionalMinimum aircraft year of make (year as a number ex. 2019) |
segments |
segmentsThis is the itinerary. It should only include passenger or cargo segments. |
segment.startAirport, segment.endAirport |
segment.startAirport, segment.endAirportThis is the start airport and the end airport for the segment. |
segment.dateTime |
segment.dateTimeThis is either the departure time from the start airport or the arrival time at the end airport. If the segment.dateTime.local property is set to false, then the specified time will be treated as an UTC time. Otherwise, it will be treated as the local time of the airport that the time is specified for. |
segment.paxCount |
segment.paxCountThe number of passengers for this segment. This should be set to zero for a cargo segments. |
outputCurrencies |
outputCurrenciesThis is the list of additional currencies that the prices will be converted to. Quotes for specific aircraft are always returned in the currency the seller has defined for the aircraft. Prices are also always converted to the default currency set for the API connection. |
liftaocoptional |
liftaocoptionalWhen requesting this, the result will also include information about the operator’s AOC. |
sellerstatsoptional |
sellerstatsoptionalWhen requesting this, the result will, if available, also include information about the seller’s response statistics. |
typedetailsoptional |
typedetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft type. |
categorydetailsoptional |
categorydetailsoptionalWhen requesting this, the result will also include detailed information about the aircraft category. |
typephotosoptional |
typephotosoptionalWhen requesting this, the result will, if available, also include links to generic photos of the aircraft type. |
tailphotosoptional |
tailphotosoptionalWhen requesting this, the result will, if available, also include links to photos of the actual aircraft. |
perfdetailsoptional |
perfdetailsoptionalWhen requesting this, the result will also include information about the aircraft’s performance details. |
taildetailsoptional |
taildetailsoptionalWhen requesting this, the result will also include additional information about the aircraft. |
amenitiesoptional |
amenitiesoptionalWhen requesting this, the result will, if available, also include information about the aircraft’s amenities. |
insuranceoptional |
insuranceoptionalWhen requesting this, the result will, if available, also include insurance information for the aircraft. |
homebaseoptional |
homebaseoptionalWhen requesting this, the result will also include information about the aircraft’s homebase airport. |
startpositionoptional |
startpositionoptionalWhen requesting this, the result will also include information about where the aircraft is positioned from to perform the first passenger segment. |
safetyoptional |
safetyoptionalWhen requesting this, the result will, if available, also include information about any safety ratings held by the operator of this aircraft. |
scheduleoptional |
scheduleoptionalWhen requesting this, the result will, if available, also include information about when the seller last updated the availability information for this aircraft. |
POST /searches
In the first example the caller is looking for any available aircraft for a one way from ESSA to ESGG, for one passenger, departing from ESSA at 09:00 local time on Nov 30.
{
"segments": [
{
"startAirport": {
"icao": "ESSA"
},
"endAirport": {
"icao": "ESGG"
},
"dateTime": {
"date": "2017-11-30",
"time": "09:00",
"departure": true,
"local": true
},
"paxCount": "1"
}
]
}
In the second example the caller is looking for mid-size or heavy jets for a round trip from EGGW to KTEB and back, for 7 passengers, arriving at KTEB at 11:00 UTC on Dec 13 and departing from KTEB the next day at 22:00 UTC. The caller is only looking for aircraft that can make the trip without fuel stops. The caller is requesting that prices are also converted to British Pounds.
{
"criteria": {
"requiredLift": [
{
"aircraftCategory": "Midsize jet"
},
{
"aircraftCategory": "Heavy jet"
}
],
"requiredPartnerships": [
"My partnerships"
],
"maxFuelStopsPerSegment": 0
"maxInitialPositioningTimeMinutes": 120,
"minimumYearOfMake": 2001
},
"segments": [
{
"startAirport": {
"icao": "EGGW"
},
"endAirport": {
"icao": "KTEB"
},
"dateTime": {
"date": "2017-12-13",
"time": "11:00",
"departure": false,
"local": false
},
"paxCount": "7"
},
{
"startAirport": {
"icao": "KTEB"
},
"endAirport": {
"icao": "EGGW"
},
"dateTime": {
"date": "2017-12-14",
"time": "22:00",
"departure": true,
"local": false
},
"paxCount": "7"
}
],
"outputCurrencies": [
"GBP"
]
}
Here is an example of the response from a successful call to this operation. It is based on the first input example above. This example only includes a small subset of the actual result since it would include hundreds of quotes.
quote.sellerCompanyoptional |
quote.sellerCompanyoptionalThis is the company marketing the aircraft. |
quote.sellerPrice |
quote.sellerPriceThis is the price including the commission the company calling this operation has configured in their company profile in Avinode. |
quote.sellerPriceWithoutCommission |
quote.sellerPriceWithoutCommissionThis is the price offered by the seller. |
quote.convertedPricesoptional |
quote.convertedPricesoptionalThis is the quote.sellerPrice converted to the currencies specified in the outputCurrencies input property. |
quote.avinodeGenerated |
quote.avinodeGeneratedThis indicates if the quote was generated by Avinode based on the performance and pricing details supplied by the seller. If false, the quote was generated by an external quoting module. |
quote.reservable |
quote.reservableWhen this is false, the quote should be considered a preliminary quote. |
quote.lift.aircraftCategory |
quote.lift.aircraftCategoryThis is the category the aircraft belongs to. |
quote.lift.aircraftType |
quote.lift.aircraftTypeThis is the aircraft type. |
quote.lift.maxPax |
quote.lift.maxPaxThis is the maximum number of passengers this aircraft can carry. |
quote.lift.aircraftTailoptional |
quote.lift.aircraftTailoptionalThis is the tail number of the aircraft. This property will only be included if the API connection calling the operation is configured to include detailed operator information. |
quote.lift.aircraftTailDetailsoptional |
quote.lift.aircraftTailDetailsoptionalThis is detailed aircraft information like year of make, amenities, insurance information, and dates when the aircraft was refurbished. |
quote.lift.liftPerformanceoptional |
quote.lift.liftPerformanceoptionalThis is the performance details for the aircraft. |
quote.lift.aircraftCertificateoptional |
quote.lift.aircraftCertificateoptionalThis is information about the Air operator’s certificate (AOC) for this aircraft. This property will only be included if the API connection calling the operation is configured to include detailed operator information. |
quote.lift.sellerStatisticsoptional |
quote.lift.sellerStatisticsoptionalThis is the response statistics for the seller. |
quote.lift.tailPhotosoptional |
quote.lift.tailPhotosoptionalThis is a set of photos that the seller has provided for this aircraft. |
quote.lift.typePhotosoptional |
quote.lift.typePhotosoptionalThis is a set of photos that the aircraft manufacturer has provided for this aircraft type. |
quote.lift.homebaseoptional |
quote.lift.homebaseoptionalThis is the airport where this aircraft has its homebase. |
quote.lift.ownerApprovalRequiredoptional |
quote.lift.ownerApprovalRequiredoptionalThis indicates if case by case owner approval is required for this aircraft. |
quote.lift.safetyRatingsoptional |
quote.lift.safetyRatingsoptionalThis is information about any safety ratings held by the operator of this aircraft. |
quote.segments |
quote.segmentsThis is the set of flight segments that this quote is for. |
startPosition, startPositionAvailableFrom, startPositionAvailableTooptional |
startPosition, startPositionAvailableFrom, startPositionAvailableTooptionalThis is information about where the aircraft is positioned from to perform the first passenger segment, and the times the aircraft is scheduled to be at this airport. |
scheduledUpdatedOnoptional |
scheduledUpdatedOnoptionalThis is the time the seller of the aircraft last updated the aircraft’s availability in the Avinode Marketplace. |
initialPositioningMinutesoptional |
initialPositioningMinutesoptionalThis is the time it will take for the aircraft to position to the departure airport for the first passenger segment. |
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "asearch-23456789",
"href": "https://sandbox.avinode.com/api/searches/asearch-23456789",
"type": "searches",
"results": [
{
"id": "asearchhit-922300011",
"quote": {
"sellerCompany": {
"id": "ABDC0889-13D6-490E-A830-A93FABCD8433",
"displayName": "Acme Air",
"icaoDesignator": "ACA"
},
"sellerPrice": {
"currency": "EUR",
"price": 7300,
"conversionCurrency": "EUR",
"convertedPrice": 7300,
"priceAsString": "7300"
},
"sellerPriceWithoutCommission": {
"currency": "EUR",
"price": 7300,
"conversionCurrency": "EUR",
"convertedPrice": 7300,
"priceAsString": "7300"
},
"convertedPrices": [
{
"currency": "EUR",
"price": 7300,
"conversionCurrency": "SEK",
"convertedPrice": 69307.66,
}
],
"avinodeGenerated": true,
"reservable": false,
"lift": {
"id": "7947FDC6-3118-4377-A6A1-6BBABCD0B41F",
"aircraftCategory": "Light jet",
"aircraftType": "Citation CJ2",
"aircraftTypeDetails": {
"id": "F662640A-69DF-41AC-BC22-969ADCD24F96",
"type": "aircrafttypes"
},
"aircraftCategoryDetails": {
"id": "acat-220"
},
"aircraftTail": "SP-KCK",
"aircraftTailDetails": {
"yearOfMake": 2003,
"interiorRefurbished": "2013-04-01",
"exteriorRefurbished": "2014-02-22",
"amenities": [
"110V Outlet",
"Certified lav seat",
"Coffee pot",
"Dishware",
"Freon air conditioning",
"Glassware",
"Ice bin",
"Lavatory",
"Leather seats",
"Partial galley"
],
"insurance": {
"monetaryAmount": {
"currency": "EUR",
"price": 50000000,
"conversionCurrency": "EUR",
"convertedPrice": 50000000,
"priceAsString": "50000000"
}
}
},
"liftPerformance": {
"maxRangeNM": "1200",
"cruiseSpeedKnots": "400"
},
"aircraftCertificate": {
"certificateNumber": "A-1234",
"issuingCountry": {
"code": "PL",
"name": "Poland"
}
},
"maxPax": 6,
"sellerStatistics": {
"averagePriceDiscrepancyPercent": 5,
"quoteCount": 3025,
"underPricedQuoteCount": 1069,
"underPricedQuoteAveragePercent": 5.29,
"overPricedQuoteCount": 1593,
"overPricedQuoteAveragePercent": 8.85
},
"tailPhotos": [],
"typePhotos": [
{
"type": "EXTERIOR",
"copies": [
{
"size": "LARGE",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/fdrruh.zjo.jpg",
"anonymized": null
},
{
"size": "MEDIUM",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/fdrruh.zjo.jpg",
"anonymized": null
},
{
"size": "SMALL",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/fdrruh.zjo_30.jpg",
"anonymized": null
},
{
"size": "THUMBNAIL",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/fdrruh.zjo_31.jpg",
"anonymized": null
}
]
},
{
"type": "INTERIOR",
"copies": [
{
"size": "LARGE",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/ac5fvv.ulg.jpg",
"anonymized": null
},
{
"size": "MEDIUM",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/ac5fvv.ulg.jpg",
"anonymized": null
},
{
"size": "SMALL",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/ac5fvv.ulg_30.jpg",
"anonymized": null
},
{
"size": "THUMBNAIL",
"url": "https://sandbox.avinode.com/mediafiles/store/2582/ac5fvv.ulg_31.jpg",
"anonymized": null
}
]
}
],
"homebase": {
"id": "aport-5449",
"name": "WARSAW FREDERIC CHOPIN",
"city": "WARSAW",
"country": {
"code": "PL",
"name": "Poland"
},
"icao": "EPWA",
"iata": "WAW"
},
"ownerApprovalRequired": false,
"safetyRatings": [
{
"standard": "ARGUS",
"levelCode": "GOLD",
"levelDisplayName": "Gold"
}
]
},
"segments": [
{
"startAirport": {
"id": "aport-6002",
"name": "ARLANDA",
"city": "STOCKHOLM",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESSA",
"iata": "ARN"
},
"endAirport": {
"id": "aport-5955",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT"
},
"departureDateTime": {
"dateTimeUTC": "2017-11-30T08:00:00Z",
"dateTimeLocal": "2017-11-30T09:00:00+01:00",
"calculated": false
},
"arrivalDateTime": {
"dateTimeUTC": "2017-11-30T08:58:00Z",
"dateTimeLocal": "2017-11-30T09:58:00+01:00",
"calculated": true
},
"timeTBD": false,
"blockMinutes": 58,
"flightMinutes": 46,
"fuelMinutes": 0,
"paxCount": 1,
"paxSegment": true,
"distanceNM": 212,
"fuelStopCount": 0
}
]
},
"startPosition": {
"id": "aport-5449",
"name": "WARSAW FREDERIC CHOPIN",
"city": "WARSAW",
"country": {
"code": "PL",
"name": "Poland"
},
"icao": "EPWA",
"iata": "WAW"
},
"startPositionAvailableFrom": {
"dateTimeUTC": "2017-11-23T05:20:00Z",
"dateTimeLocal": "2017-11-23T06:20:00+01:00"
},
"startPositionAvailableTo": {
"dateTimeUTC": "2017-12-07T05:20:00Z",
"dateTimeLocal": "2017-12-07T06:20:00+01:00"
},
"scheduledUpdatedOn": "2017-03-23T03:03:08Z",
"initialPositioningMinutes": 100
},
... more results ...
]
}
}
This operation is used to upload schedule information for one aircraft.
lift.aircraftTail |
lift.aircraftTailThe tail number of the aircraft. This must exactly match the tail number specified in the Avinode Marketplace. |
activities |
activitiesThis is an list of all activities for this aircraft. An activity is a representation of something an aircraft does that affects its availability. It can for example be a passenger flight, ferry flight, scheduled maintenance, hold lines, options etc. Every activity has a start and an end airport, begin and end time and an activity type that indicates what kind of activity it is. Passenger flight activities should also include the number of passengers. For non flight activities, both start and end airport should be set to the same airport. |
activity.activityId |
activity.activityIdThis is the id that the application calling this operation has for this activity. It is important that the id for one specific activity is the same in each consecutive call. The id must be unique (i.e. no two activities for one aircraft can have the same id). Sending an activityId is required. |
activity.tripId |
activity.tripIdThis is the id of the requested trip, equivalent to the lift id without the prefix [asellerlift-]12345678. It is recommended to save this id from the incoming Avinode RFQs, so that once they become booked trips, it can be sent in the corresponding activity here. This is done to get valuable statistics on which requests end up as a booked trip. |
activity.externalTripIdoptional |
activity.externalTripIdoptionalIf this activity is part of a trip (e.g. one of the activities in a round-trip or a positioning flight for a passenger flight), then this is the id that the application calling this operation has for this trip. If this activity is not part of a trip then this id should be omitted. |
activity.activityType |
activity.activityTypeEach activity must have an activity type that specifies what kind of activity it is. This will be used to determine how this activity should affect the aircraft’s availability. What values to send is up to the application calling this operation. The value cannot be longer than 20 characters. The sent value will also be shown when the Avinode Member views the schedule data in the Marketplace’s online web interface. Each Avinode member company maintains a mapping table for their activity types where each activity type is mapped to one of the items in the list below. New non-mapped activity types will be automatically created in the mapping table when sent for the first time. They will then by default be mapped to Occupied. The member can at any time log in to the Avinode Marketplace and change their mappings. Here is a list of the available interpretations an activity type can be mapped to.
|
activity.startAirport, activity.endAirport |
activity.startAirport, activity.endAirportThese are the airports where the aircraft is positioned at the start and end of this activity. Specifying airport should be done by sending one airport code. The recommended code to send is the ICAO code. If the application calling this operation does not have access to the ICAO code then the IATA or FAA code should be sent. |
activity.startDateTime, activity.endDateTime |
activity.startDateTime, activity.endDateTimeThese are the dates and times when the activity starts and ends. The times should be sent as UTC times. |
activity.paxCount |
activity.paxCountThe number of passengers for this activity. If there are no passengers then 0 should be sent. |
activity.note |
activity.noteA plain text message that is displayed when the Avinode Member views the schedule data in the Marketplace’s online web interface. |
activity.price |
activity.priceIf this activity is an empty leg then this should be a target price that uploading company can imagine accepting for this empty leg. |
activity.currency |
activity.currencyThe three letter code (ISO 4217) for the currency that the price is specified in. |
activity.flightRegulations |
activity.flightRegulationsFor each Avinode member company a regulation code mapping table exist similar to the one used for activity types. What values to send is up to the application calling this operation. The code sent in flightRegulations will be mapped to one of the following.
|
activity.flightRegulationsDescription |
activity.flightRegulationsDescriptionA plain text description of the regulation code sent in flightRegulations. Max 255 characters. |
activity.marketingStartDateTime, activity.marketingEndDateTime |
activity.marketingStartDateTime, activity.marketingEndDateTimeThese are the marketing start and end times for an empty leg activity. These define when the aircraft is available to fly this empty leg. The maximum allowed time span is five days. A longer span than five days will result in the empty leg not being available to the market. If two empty legs with overlapping marketing time spans are uploaded for the same aircraft then only one of the empty legs will available to the market. Uploading consecutive empty legs from and to the same airports to circumvent the five day span limit is not allowed. The times should be sent as UTC times. |
activity.marketingVerified |
activity.marketingVerifiedThis should be set to true for all empty leg activities that the Avinode member company has actively verified as marketable. Actively verified means that someone has manually marked this activity as a sell-able empty leg. Verified empty legs will be treated with a higher priority in the Avinode Marketplace and are more likely to attract business than non verified empty legs. Operators that markets empty legs where it turns out the empty leg is not really available to the market will get a bad reputation and buyers will eventually be less likely to show interest in that operator’s real empty legs. Automatically marking all empty legs as verified is not allowed. |
activity.marketingMessage |
activity.marketingMessageA plain text message that will be displayed to buyers interested in this empty leg. Some characters must to be escaped or sent as their HTML character entity name or number (same rules as for the note field above). |
activity.services |
activity.servicesThis is a list of services that is connected to this activity. It could be FBOs, catering, handling, fuel etc. |
activity.service.serviceProviderId |
activity.service.serviceProviderIdThis is the id that the application calling this operation has for this service provider. |
activity.service.serviceProviderName |
activity.service.serviceProviderNameThis is the name that the application calling this operation has for this service provider. |
activity.service.airport |
activity.service.airportThis is the airport where this service will be consumed. |
activity.service.serviceType |
activity.service.serviceTypeThis is the type of service. One of these must be sent.
|
activity.service.serviceFor |
activity.service.serviceForThis is for who this service is offered. One of these must be sent.
|
activity.service.note |
activity.service.noteA plain text message with additional information about this service. Some characters must to be escaped or sent as their HTML character entity name or number (same rules as for the note field above). |
activity.service.dataSource |
activity.service.dataSourceThis is the data source from which the application calling this operation gets this information. One of these must be sent.
|
PUT /schedules
Here is an example of a JSON payload. Normally a schedule will contain a lot more activities but in this example a schedule containing four activities for aircraft N12345 is uploaded. The first three belongs to the same trip. The trip starts with an empty leg from KMIA to KLAX followed by a passenger flight to KSFO. The trip is then ends after the aircraft returns to KMIA the day after. The last activity in the input data is a multi day maintenance at KMIA.
{
"lift": {
"aircraftTail": "N12345"
},
"activities": [
{
"activityId": "a-10001",
"externalTripId": "t-1001",
"tripId": "12345678",
"activityType": "EmptyLeg",
"startAirport": {
"icao": "KMIA"
},
"endAirport": {
"icao": "KLAX"
},
"startDateTime": "2016-03-05T15:00Z",
"endDateTime": "2016-03-05T20:12Z",
"paxCount": 0,
"note": "Positioning to pick up customer",
"price": 10000,
"currency": "USD",
"flightRegulations": "135",
"flightRegulationsDescription": "Charter flight",
"marketingStartDateTime": "2016-03-04T18:00Z",
"marketingEndDateTime": "2016-03-05T20:12Z",
"marketingVerified": true,
"marketingMessage": "Good deal!",
"services": [
{
"serviceProviderId": "81766",
"serviceProviderName": "GROUND ACE",
"airport": {
"icao": "KLAX"
},
"serviceType": "FBO",
"serviceFor": "ALL",
"note": "Our special rates apply",
"dataSource": "UNIVERSAL"
},
{
"serviceProviderId": "SP8345",
"serviceProviderName": "Mega Fuel",
"airport": {
"icao": "KLAX"
},
"serviceType": "FUEL",
"serviceFor": "OTHER",
"dataSource": "PROPRIETARY"
}
]
},
{
"activityId": "a-10002",
"externalTripId": "t-1001",
"tripId": "12345678",
"activityType": "PassengerFlight",
"startAirport": {
"icao": "KLAX"
},
"endAirport": {
"icao": "KSFO"
},
"startDateTime": "2016-03-05T21:00Z",
"endDateTime": "2016-03-05T22:02Z",
"paxCount": 1,
"note": "Customer will bring two dogs.",
"flightRegulations": "135",
"flightRegulationsDescription": "Charter flight"
},
{
"activityId": "a-10003",
"externalTripId": "t-1001",
"activityType": "Positioning",
"startAirport": {
"icao": "KSFO"
},
"endAirport": {
"icao": "KMIA"
},
"startDateTime": "2016-03-06T17:00Z",
"endDateTime": "2016-03-06T22:43Z",
"paxCount": 0,
"flightRegulations": "135",
"flightRegulationsDescription": "Charter flight"
},
{
"activityId": "a-10004",
"activityType": "Maintenance",
"startAirport": {
"icao": "KMIA"
},
"endAirport": {
"icao": "KMIA"
},
"startDateTime": "2016-03-07T16:00Z",
"endDateTime": "2016-03-18T02:00Z",
"paxCount": 0
}
]
}
The JSON returned by the operation can contain errors and warnings. If it contains errors then the entire call failed and the existing schedule data in the Avinode Marketplace was not updated. If it contains only warnings then the schedule data in the Avinode Marketplace was updated. Only the data for the activity generating the warning will be affected, so any activities not generating any warnings will always be successfully uploaded. Depending on the severity of the warning the activity might still be included but for some warnings the activity will be omitted.
The status and output from the last call for each aircraft should be made available to the users of the application calling this operation. This to facilitate that the necessary corrections can be made as quickly as possible.
If a call to this operation fails, no retries should be done. The application should just wait until it is time for the the next periodic call.
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"type": "schedules"
}
}
If a call to this operation fails, no retries should be done. The application should just wait until it is time for the the next periodic call.
This operation is used to get information about a trip message.
id |
idThis is the id of the trip message that the operation will get information for. |
GET /tripmsgs/{id}
lift |
liftIf this message is related to a requested lift in the RFQ, then this property will have information about which requested lift this message is for. |
lift.id |
lift.idThis is the id of the requested lift. |
lift.aircraftCategory |
lift.aircraftCategoryThis is the category of the lift. |
lift.aircraftType |
lift.aircraftTypeThis is the type of the lift. |
lift.maxPax |
lift.maxPaxThis is the maximum number of passengers for the lift. |
lift.sourcingDisplayStatus, lift.sourcingStatus |
lift.sourcingDisplayStatus, lift.sourcingStatusThis will tell the status of the quote request.
|
createdOn |
createdOnThe time when this message was created. |
message |
messageThis is the actual text message. |
sellerCompany |
sellerCompanyInformation about the company that received the RFQ that this message is associated with. |
buyerCompany |
buyerCompanyInformation about the company that sent the RFQ that this message is associated with. |
buyerAccount, sellerAccount |
buyerAccount, sellerAccountInformation about the person that wrote this message. |
tripId |
tripIdThis is the id of the requested trip. One trip can contain many lifts. This is the same as Marketplace TripID, visible to users in Avinode Trips Selling/Buying pages. |
messageTypeoptional |
messageTypeoptionalMessage types can be:
|
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "asellermsg-1000000015",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-1000000015",
"type": "tripmsgs",
"links": {
"rfqs": [
{
"id": "arfq-1000000072",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000072",
"type": "rfqs"
}
],
"trips": [
{
"id": "atrip-1000000082",
"href": "https://sandbox.avinode.com/api/trips/atrip-1000000082",
"type": "trips"
}
]
},
"lift": [
{
"id": "asellerlift-46338026",
"links": {
"quotes": [
{
"id": "aquote-1000000079",
"href": "https://sandbox.avinode.com/api/quotes/aquote-1000000079",
"type": "quotes"
}
]
},
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftSuperType": "Global Express/XRS",
"marketedAircraftId": 63596,
"aircraftTail": "T-ESLA",
"maxPax": 12,
"ownAircraft": false,
"suggestedByAvinode": false,
"sourcingDisplayStatus": "Unanswered",
"sourcingStatus": 1,
"syncState": "asellerlift-46338026"
}
],
"createdOn": "2019-05-16T14:44:59Z",
"message": "Seller is writing a message to the buyer here...",
"sellerCompany": {
"id": "416B11AC-7B76-4354-BA54-EEF2BECAB439",
"companyId": 11722,
"displayName": "An-operator"
},
"sellerAccount": {
"id": "3610246F-E69D-40CA-BBA1-A854B57D6989",
"accountId": 158103,
"displayName": "Kindhearted Tesla"
},
"buyerCompany": {
"id": "750ED6BB-2AA7-4C9D-A313-78A9CA125F08",
"companyId": 11725,
"displayName": "A-broker"
},
"buyerAccount": {
"id": "3F530A28-355F-48E9-854C-F9455C1760DF",
"accountId": 144052,
"displayName": "Fervent Almeida"
},
"tripId": "Q9L73U"
}
}
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "abuyermsg-1000000083",
"href": "https://sandbox.avinode.com/api/tripmsgs/abuyermsg-1000000083",
"type": "tripmsgs",
"links": {
"rfqs": [
{
"id": "arfq-1000000072",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000072",
"type": "rfqs"
}
],
"trips": [
{
"id": "atrip-1000000082",
"href": "https://sandbox.avinode.com/api/trips/atrip-1000000082",
"type": "trips"
}
]
},
"lift": [],
"createdOn": "2019-05-16T14:33:23Z",
"message": "Hey, we really appreciate your quick response on our request!",
"sellerCompany": {
"id": "416B11AC-7B76-4354-BA54-EEF2BECAB439",
"companyId": 11722,
"displayName": "An-operator"
},
"buyerCompany": {
"id": "750ED6BB-2AA7-4C9D-A313-78A9CA125F08",
"companyId": 11725,
"displayName": "A-broker"
},
"buyerAccount": {
"id": "3340C34B-92BA-452F-8BB9-F6C774D934A5",
"accountId": 161678,
"displayName": "Emmy Lou"
},
"tripId": "Q9L73U",
"messageType": "CHAT"
}
}
This operation is used to send a chat message associated with an RFQ. It can be sent by either a seller or a buyer. This message will be displayed on the Trip pages in Avinode and be highlighted to users as an unread message.
If the message recipient has an active webhook setting in Avinode subscribed to trip messages, this operation will also trigger a notification message. Read more about webhooks and notifications here.
id |
idThis is either:
All chat messages will be associated with their RFQ id. |
X-Avinode-ActAsAccount |
X-Avinode-ActAsAccountIf the person initiating this action has a personal Avinode Marketplace user account, then the username for that user account should be sent in this HTTP header. The buyer will then see the name of the person that preformed this action. |
POST /tripmsgs/{requestId}/chat
message |
messageThe actual text message. |
suppressNotification |
suppressNotificationIf this is true the API servers will not send an email to the buyer informing about this update to the RFQ. |
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "asellermsg-1000000009",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-1000000009",
"type": "tripmsgs",
"links": {
"rfqs": [
{
"id": "arfq-1000000034",
"href": "https://sandbox.avinode.com/api/rfqs/arfq-1000000034",
"type": "rfqs"
}
]
},
"lift": [
{
"id": "asellerlift-45483075",
"links": {
"quotes": [
{
"id": "aquote-1000000041",
"href": "https://sandbox.avinode.com/api/quotes/aquote-1000000041",
"type": "quotes"
}
]
},
"actions": {
"submitQuote": {
"type": "submitQuote",
"description": "Submit a quote",
"httpMethod": "POST",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellerlift-45483075/submitQuote"
},
"decline": {
"type": "decline",
"description": "Decline",
"httpMethod": "POST",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellerlift-45483075/decline"
}
},
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftSuperType": "Global Express/XRS",
"marketedAircraftId": 63596,
"aircraftTail": "T-ESLA",
"maxPax": 12,
"ownAircraft": true,
"suggestedByAvinode": false,
"sourcingDisplayStatus": "Unanswered",
"sourcingStatus": 1,
"syncState": "asellerlift-45483075"
}
],
"createdOn": "2019-04-01T14:04:11Z",
"message": "Hey we can fly..",
"sellerCompany": {
"id": "416B11AC-7B76-4354-BA54-EEF2BECAB439",
"companyId": 11722,
"displayName": "Emelie-operator"
},
"sellerAccount": {
"id": "E5717E4F-C695-4ED8-A20A-18B1B94A1628",
"accountId": 158102,
"displayName": "Nikola Tesla"
},
"buyerCompany": {
"id": "750ED6BB-2AA7-4C9D-A313-78A9CA125F08",
"companyId": 11725,
"displayName": "Emelie-broker"
},
"buyerAccount": {
"id": "3F530A28-355F-48E9-854C-F9455C1760DF",
"accountId": 144052,
"displayName": "Fervent Almeida"
},
"tripId": "5VCLUW"
}
}
This operation is used to either:
id |
idThis is either:
|
X-Avinode-ActAsAccount |
X-Avinode-ActAsAccountIf the person initiating this action has a personal Avinode Marketplace user account, then the username for that user account should be sent in this HTTP header. The buyer will then see the name of the person that preformed this action. |
POST /tripmsgs/{requestId}/submitQuote
message |
messageA text message to accompany the quote. |
suppressNotification |
suppressNotificationIf this is true the API servers will not send an email to the buyer informing about this quote. |
quote.segments |
quote.segmentsThis is the itinerary for the trip offered in this quote. It contains a list of segments (aka legs). It may or may not include information about positioning flights. It may be different from the itinerary requested in the RFQ. |
quote.segment.startAirport, quote.segment.endAirport |
quote.segment.startAirport, quote.segment.endAirportThis is the start airport and the end airport for the segment. |
quote.segment.dateTime |
quote.segment.dateTimeThis is either the departure time from the start airport or the arrival time at the end airport. If the quote.segment.dateTime.local property is false, then the specified time is an UTC time. Otherwise, it is the local time of the airport that the time is specified for. |
quote.segment.paxCount |
quote.segment.paxCountThe number of passengers for this segment. This can be zero if the quote is for a cargo trip or if it is not yet specified how many passengers there will be on this segment. |
quote.segment.paxSegment |
quote.segment.paxSegmentThis should be set to true for all passenger segments. |
quote.segment.showToBuyer |
quote.segment.showToBuyerIf this segment should be presented to the buyer or not. Passenger segments will always be presented to the buyer, regardless of this setting. |
quote.segment.distanceNM |
quote.segment.distanceNMThe distance between the start airport and the end airport in nautical miles. |
quote.segment.blockTimeMinutes |
quote.segment.blockTimeMinutesThis is the number of minutes for this segment, including taxi time. |
quote.segment.flightMinutes |
quote.segment.flightMinutesThis is the number actual in air flight minutes for this segment. |
quote.lift.aircraftCategory, quote.lift.aircraftType, quote.lift.aircraftTail |
quote.lift.aircraftCategory, quote.lift.aircraftType, quote.lift.aircraftTailThis is the lift that is offered in this quote. At least one of these properties should be populated.
Only aircraft marketed in the Avinode Marketplace by the company calling this operation can be specified in quote.lift.aircraftTail and this must exactly match the tail number specified for this aircraft in the Avinode Marketplace. |
quote.messageForBuyer |
quote.messageForBuyerA text message with additional information about the price, availability conditions, etc. |
quote.totalPrice, quote.currencyCode |
quote.totalPrice, quote.currencyCodeThis is the total price for the offer in this quote. |
quote.sellerUniqueQuoteIdentifier |
quote.sellerUniqueQuoteIdentifierThis is the quote identifier that the calling application has for this quote. It must be unique for the calling company. |
quote.lineItemsoptional |
quote.lineItemsoptionalThis is the line items used by the operator to calculate the price for this quote. They will be listed in the price details as “Quoted price breakdown”, underneath the original “Avinode price breakdown” on the Trips Selling page. Note! It’s optional to make this information visible to the buyer, by setting “visibleToBuyer” to true for each line item. |
quote.lineItems.visibleToBuyer |
quote.lineItems.visibleToBuyerIf set to true this item will be visible to the buyer in Avinode. |
quote.lineItems.displayName |
quote.lineItems.displayNameThe name of the line item. |
quote.lineItems.description |
quote.lineItems.descriptionA description of the line item. |
quote.lineItems.type |
quote.lineItems.typeThe type of the line item. |
quote.lineItems.price |
quote.lineItems.priceThe total price of this line item. |
quote.lineItems.formattedUnitPrice |
quote.lineItems.formattedUnitPriceThe unit price of the line item. |
quote.lineItems.formattedQuantity |
quote.lineItems.formattedQuantityThe quantity of this type of line item. |
quote.attachments |
quote.attachments
|
{
"message": "We are pleased to give you the following offer. /Maria",
"suppressNotification": false,
"quote": {
"segments": [
{
"startAirport": {
"icao": "ESGG"
},
"endAirport": {
"icao": "EGGW"
},
"dateTime": {
"date": "2016-08-17",
"time": "05:30",
"departure": true,
"local": false
},
"paxCount": "0",
"paxSegment": false,
"showToBuyer": false,
"distanceNM": 602,
"blockTimeMinutes": 100,
"flightMinutes": 90
},
{
"startAirport": {
"icao": "EGGW"
},
"endAirport": {
"icao": "LFPB"
},
"dateTime": {
"date": "2016-08-17",
"time": "08:00",
"departure": true,
"local": false
},
"paxCount": "2",
"paxSegment": true,
"showToBuyer": true,
"distanceNM": 207,
"blockTimeMinutes": 53,
"flightMinutes": 43
},
{
"startAirport": {
"icao": "LFPB"
},
"endAirport": {
"icao": "ESGG"
},
"dateTime": {
"date": "2016-08-17",
"time": "11:00",
"departure": true,
"local": false
},
"paxCount": "0",
"paxSegment": false,
"showToBuyer": false,
"distanceNM": 679,
"blockTimeMinutes": 118,
"flightMinutes": 108
}
],
"lift": {
"aircraftTail": "N12345"
},
"messageForBuyer" : "Price does not include de-icing.",
"currencyCode": "EUR",
"sellerUniqueQuoteIdentifier": "Q#18272",
"totalPrice": 15100,
"lineItems": [{
"visibleToBuyer": false,
"displayName": "My own line item",
"description": "",
"type": "My type",
"price": 5000,
"formattedUnitPrice": "5,000.00",
"formattedQuantity": "1"
}, {
"visibleToBuyer": false,
"displayName": "Another line item",
"description": "",
"type": "My type",
"price": 4700,
"formattedUnitPrice": "4,700.00",
"formattedQuantity": "1"
}],
"attachments": [{
"mimeType": "application/pdf",
"name": "Quote123.pdf",
"type": "Quote",
"uri": "https://sandbox.avinode.com/marketplace/mvc/resource/quote/attachment/Quote123.pdf",
"data": "abc123!?$*&()'-=@~.......",
"temporaryAttachmentId": "string"
}]
}
}
The calling application should:
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "asellermsg-20202020",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-20202020",
"type": "tripmsgs",
"links": {
"trips": [
{
"id": "atrip-21212121",
"href": "https://sandbox.avinode.com/api/trips/atrip-21212121",
"type": "trips"
}
]
},
"lift": [
{
"id": "3F05702B-9331-4FED-A18A-0BEB11067A8E",
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftTail": "SBQ-166BZ",
"maxPax": 12,
"ownAircraft": true
}
],
"createdOn": "2016-10-21T21:43:00Z",
"message": "We are pleased to give you the following offer. /Maria",
"rfqAccepted": true,
"sellerQuote": {
"id": "aquote-97979797",
"href": "https://sandbox.avinode.com/api/quotes/aquote-97979797",
"type": "quotes",
"createdOn": "2016-10-21T21:43:00Z",
"sellerCompany": {
"id": "16D90630-7344-4A73-9689-8A10CE5EABCD",
"displayName": "Globex Air Charter"
},
"sellerAccount": {
"id": "A34AB9F4-316B-4702-A6AF-EEF0F5909876",
"displayName": "Maria Martinez"
},
"sellerPrice": {
"currency": "EUR",
"price": 15100,
"conversionCurrency": null,
"convertedPrice": null
},
"sellerMessage": "We are pleased to give you the following offer. /Maria",
"avinodeGenerated": false,
"reservable": false,
"lift": {
"id": "3F05702B-9331-4FED-A18A-0BEB110AABB",
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftTail": "N98765",
"maxPax": 12,
"ownAircraft": true
},
"segments": [
{
"startAirport": {
"id": "aport-5955",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT"
},
"endAirport": {
"id": "aport-6401",
"name": "LUTON",
"city": "LONDON (LUTON)",
"country": {
"code": "GB",
"name": "United Kingdom"
},
"icao": "EGGW",
"iata": "LTN"
},
"departureDateTime": {
"dateTimeUTC": "2016-08-17T05:30:00Z",
"dateTimeLocal": "2016-08-17T07:30:00+02:00",
"calculated": true
},
"arrivalDateTime": {
"dateTimeUTC": "2016-08-17T07:10:00Z",
"dateTimeLocal": "2016-08-17T08:10:00+01:00",
"calculated": true
},
"blockMinutes": 100,
"flightMinutes": 90,
"paxCount": 0,
"paxSegment": false,
"distanceNM": 602
},
{
"startAirport": {
"id": "aport-6401",
"name": "LUTON",
"city": "LONDON (LUTON)",
"country": {
"code": "GB",
"name": "United Kingdom"
},
"icao": "EGGW",
"iata": "LTN"
},
"endAirport": {
"id": "aport-3378",
"name": "LE BOURGET",
"city": "PARIS",
"country": {
"code": "FR",
"name": "France"
},
"icao": "LFPB",
"iata": "LBG"
},
"departureDateTime": {
"dateTimeUTC": "2016-08-17T08:00:00Z",
"dateTimeLocal": "2016-08-17T09:00:00+01:00",
"calculated": false
},
"arrivalDateTime": {
"dateTimeUTC": "2016-08-17T08:53:00Z",
"dateTimeLocal": "2016-08-17T10:53:00+02:00",
"calculated": true
},
"blockMinutes": 53,
"flightMinutes": 43,
"paxCount": 2,
"paxSegment": true,
"distanceNM": 207
},
{
"startAirport": {
"id": "aport-3378",
"name": "LE BOURGET",
"city": "PARIS",
"country": {
"code": "FR",
"name": "France"
},
"icao": "LFPB",
"iata": "LBG"
},
"endAirport": {
"id": "aport-5955",
"name": "LANDVETTER",
"city": "GOTEBORG",
"country": {
"code": "SE",
"name": "Sweden"
},
"icao": "ESGG",
"iata": "GOT"
},
"departureDateTime": {
"dateTimeUTC": "2016-08-17T11:00:00Z",
"dateTimeLocal": "2016-08-17T13:00:00+02:00",
"calculated": true
},
"arrivalDateTime": {
"dateTimeUTC": "2016-08-17T12:58:00Z",
"dateTimeLocal": "2016-08-17T14:58:00+02:00",
"calculated": true
},
"blockMinutes": 118,
"flightMinutes": 108,
"paxCount": 0,
"paxSegment": false,
"distanceNM": 679
}
]
},
"sellerCompany": {
"id": "16D90630-7344-4A73-9689-8A10CE5EABCD",
"displayName": "Globex Air Charter"
},
"sellerAccount": {
"id": "A34AB9F4-316B-4702-A6AF-EEF0F5909876",
"displayName": "Maria Martinez"
},
"buyerCompany": {
"id": "7145AD1A-9A56-49C2-8F27-E8546A551234",
"displayName": "Acme Charter Broker"
},
"buyerAccount": {
"id": "FDF25615-13A7-4A12-9465-4DCBCE5A5678",
"displayName": "John Smith"
},
"tripId": "2MZH9W"
}
}
This operation is used to decline an entire RFQ or a requested lift in an RFQ.
id |
idThis is either:
|
X-Avinode-ActAsAccount |
X-Avinode-ActAsAccountIf the person initiating this action has a personal Avinode Marketplace user account, then the username for that user account should be sent in this HTTP header. The buyer will then see the name of the person that preformed this action. |
POST /tripmsgs/{requestId}/decline
message |
messageA text message explaining the reason for declining. |
suppressNotification |
suppressNotificationIf this is true the API servers will not send an email to the buyer informing about this update to the RFQ. |
{
"message": "Sorry, we have no available aircraft for this trip.",
"suppressNotification": false
}
The calling application should make sure the returned tripmsgs.id is associated with the sent message stored in the application’s data model.
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "asellermsg-19191919",
"href": "https://sandbox.avinode.com/api/tripmsgs/asellermsg-19191919",
"type": "tripmsgs",
"links": {
"trips": [
{
"id": "atrip-21212121",
"href": "https://sandbox.avinode.com/api/trips/atrip-21212121",
"type": "trips"
}
]
},
"lift": [
{
"id": "asellerlift-36363636",
"aircraftCategory": "Ultra long range",
"aircraftType": "Global Express",
"aircraftTail": "N98765",
"maxPax": 12,
"ownAircraft": true
}
],
"createdOn": "2016-10-21T21:11:08Z",
"message": "Sorry, we have no available aircraft for this trip.",
"rfqAccepted": false,
"sellerCompany": {
"id": "16D90630-7344-4A73-9689-8A10CE5EABCD",
"displayName": "Globex Air Charter"
},
"sellerAccount": {
"id": "A34AB9F4-316B-4702-A6AF-EEF0F5909876",
"displayName": "Maria Martinez"
},
"buyerCompany": {
"id": "7145AD1A-9A56-49C2-8F27-E8546A551234",
"displayName": "Acme Charter Broker"
},
"buyerAccount": {
"id": "FDF25615-13A7-4A12-9465-4DCBCE5A5678",
"displayName": "John Smith"
}
}
}
This operation is used to create a new web-hook setting.
targetURI |
targetURIThis is the address of the service that the application has set up to handle notifications. The service consuming the call must support SSL (https) and use a trusted (i.e. not self-signed) SSL certificate. One company cannot create multiple webhooks with the same targetURI. |
displayName |
displayNameThis is a name for this webhook. The recommended naming convention is “[application name] – [notification category]”. |
active |
activeThis is the status of the webhook. Active webhooks will generate notifications, inactive will not. |
clientIdentifier |
clientIdentifierThis is either:
|
clientSecret |
clientSecretThis is either:
|
clientAuthenticationType |
clientAuthenticationTypeThis sets the type of authentication that will be used when notifications are delivered. These are the valid values.
|
eventTypes |
eventTypesThis specifies which categories of notifications that this webhook subscribes to. These are the valid values.
|
POST /webhooks/settings
In this example an application called GoldFMS creates a webhook to subscribe to all notifications in the Buyer Message category. All webhooks are created for the company associated with the API connection that is used to make this API call. This means that Buyer Message notifications for this company will be delivered by this webhook.
{
"targetURI": "https://notifications.goldfms.com/notifications",
"displayName": "GoldFMS - Buyer messages",
"active": true,
"clientIdentifier": "acmejet",
"clientSecret": "ks7U5twP",
"clientAuthenticationType": "BASIC",
"eventTypes": [
"TripMessagesBuyer"
]
}
The application creating the web-hook should always store and keep track of all ids of any created web-hooks. The id will be used when the application updates a web-hook. For example for inactivating or reactivating or changing any of the other settings. The PUT /webhooks/settings/{id}
operation is used for updating a web-hook.
To list all current web-hook settings on a company, use the GET /webhooks/settings/
operation.
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": {
"id": "whs-123456",
"href": "https://sandbox.avinode.com/api/webhooks/settings/whs-123456",
"type": "settings",
"targetURI": "https://notifications.goldfms.com/notifications",
"displayName": "GoldFMS - Buyer messages",
"active": "true"
}
}
This operation is used to update an existing webhook.
id |
idThis is the id of the existing webhook that the operation will update. |
PUT /webhooks/settings/{id}
This operation uses the same payload as the POST /webhooks/settings
operation.
This operation is used to list all your current web-hook settings.
GET /webhooks/settings
{
"meta": {
"errors": [],
"warnings": [],
"infos": []
},
"data": [
{
"id": "whs-1000000056",
"href": "https://sandbox.avinode.com/api/webhooks/settings/whs-1000000056",
"type": "settings",
"targetURI": "https://www.test-hook.now",
"displayName": "Empty leg webhook",
"active": "true"
},
{
"id": "whs-287",
"href": "https://sandbox.avinode.com/api/webhooks/settings/whs-287",
"type": "settings",
"targetURI": "https://webhook.site/524a0077-0a67-4ba6-a4a3-37b8aa1a25ee",
"displayName": "Trip messages Buyer",
"active": "true"
}
]
}
The Avinode Web Apps are widget type apps that can be installed by Avinode members on an existing web page. There a two types of web apps: Search web apps, and Empty leg web apps.
Search Web App
This web app is designed to add a lead generator to a company’s web site. Visitors are presented with a search form where they can submit their desired itinerary. The web app then displays available aircraft categories and/or aircraft types with aircraft details, pictures and information about estimated flight times and prices. The visitor can then proceed to request a more detailed quote for one or more of these options. These requests end up as leads and are available to the Avinode member in the Trips pages in the Avinode Marketplace. This web app can be powered by all the aircraft in the Avinode Marketplace or a subset of these, for example only the fleet of one operator.
Empty Leg Web App
Visitors can search for empty legs published in the Avinode Marketplace. The visitor can also submit a request for one or more of these empty legs. These requests end up as leads and are available to the Avinode member in the Trips pages in the Avinode Marketplace. This web app can be powered by all the empty legs in the Avinode Marketplace or a subset of these, for example only the empty legs published by one operator.
Branding and settings
In most cases some additional styling will be required to make the web app match the Avinode member’s brand. This styling is done inside the Avinode system when setting up the web app, and can be changed by the owner of the app at any time. Find all settings for your web app by clicking on the web app in the web app listing.
In the Avinode system, go to the Company menu to find the Apps page. On this page you will see all your web apps. Note, you can create as many web apps as you like.
Select the “New” button. Fill in a name for your new web app and hit “Save”. You will now see the created web app in the list.
UI settings
The looks of the web app can be customized. Select the Web UI tab in the configuration pages for you web app. Here you can select colors and which search features that you like to have enabled in the web app. Changing the colors will update the preview, but the appearance for the web app will first be updated after you hit “Save”.
To ensure good quality results we only provide the best options in our web apps. Logged into Avinode, you will be able to find more options for flexible end clients.
The web apps can return either type or category aggregates. By default aircraft are excluded according to the following criteria:
Commission
This is the commission, in percent, that will be added to the prices displayed to the visitor. This is by default set to 10 %.
Send confirmation to end client
By default, a confirmation email is sent to the visitor after the visitor has requested a more detailed quote. With this setting, the Avinode member can decide if such a confirmation email should be sent or not.
Privacy Policy link
Setting this will enforce the user to accept your privacy policy, to be provided via a link.
Languages
The Avinode member can configure the languages to be available in the web app. Names and descriptions of the different aircraft categories can be translated.
If your website uses multiple domains for different languages, then you should setup one web app for each domain and keep only this specific language in the settings. If you choose to have multiple languages in the same web app, the default language will always be English (the default language cannot be changed).
These are the supported languages:
• English – Great Britain
• English – United States
• Russian
• German
• French
• Spanish
• Italian
• Dutch
• Portuguese – Brazil
• Chinese
Categories
The Avinode member can configure the aircraft categories available in the web app under the Categories tab.
Safety rating filter
With this setting only aircraft with a certain safety rating will be included in search results.
Contact Info
This is the contact information to the Avinode member that will be displayed in the web app.
Show price in search results
This setting can exclude all prices from the web apps, instead allowing the end client to inquire for price.
Exclude category results
This setting can be used to omit the aircraft category result page. The visitor will then only see the aircraft model results.
Fleet filter
This setting decides which aircraft in the Avinode Marketplace that will be considered when compiling the results. The default fleet filter includes all aircraft in the Avinode Marketplace.
Other filter options
To further adjust the default filtering of search results, talk to your sales manager on the best way to do this.
Embedding a web app to your own page is as simple as inserting a code fragment. The code fragment you should use is available in the “Embed” tab under the web app settings.
On this page you will find a grey box with a code to be inserted on your page.
The first “div” element is the element where the web app will be injected. Place this element on the page where you like the web app to be. The second part with the script should be placed in the end of your “body”. This is all you have to do to get the web app included in your page.
By providing your Google Analytics ID under the Embed tab you will be able to track the following events from inside the web app:
No further configuration is needed. See the example below on what it should look like in your Google Analytics account once a few different events are being tracked.
The following manual will guide you through the step-by-step process of taking your new iOS mobile app from setup to distribution.
We recommend that you read through each section of the guide before beginning work on the process described in that chapter. This may take a few extra minutes, but we assure you that it will save you some headaches in the long run.
This section of the manual will quickly explain how the iOS mobile app setup works, what you will need to do at each stage of the process and what you can expect. Please note: This chapter is not intended to function as a guide. We recommend you use this overview for planning only and advise that you read each section of the manual thoroughly before proceeding.
The first thing you will need to do once you have purchased a white-label mobile app from Avinode is to setup an iOS Developer Account with Apple.
Getting an iOS Developer Account account can be a time consuming process requiring corporate verification, submission of documentation and Apple review and approval. This process, while not terribly complicated, can take up to three weeks so, in order to expedite the setup process, we require that you begin your iOS Developer Account setup before moving on to step two.
Yes, in fact, we recommend that you proceed to step 2 as soon as you have submitted your account application to Apple.
The processing of your App Store account application can be a rather long process. When you apply to Apple they will ask you for very specific information about your company. It is important that info you provide is completely accurate. This will save you a lot of time and frustration in the long run. There are several steps in the application process. Once you have finished the initial online form you will be instructed to wait while Apple reviews your application. Apple will then request documents from your provided contact people. After which you will again be instructed to wait. If all goes well you will eventually receive an email directing you to a link where you can finally complete your account setup and purchase your membership in App Store. This marks the completion of the account setup process; at this point your account is nearly ready to host your new iOS mobile app.
In the second stage of setup we will need you to provide us with information in order to set up your app. As previously mentioned, this information falls into three distinct categories, technical information, design specifications, and written documentation
In order to personalize your app we will need you to provide your logo, specified app color, a landing page image, and an icon for both the App Store and the iPhone. Detailed information about these graphical elements can be found in chapter 2.1 of this manual.
At the time of submission App Store requires that you include your app’s name, a description of the application, keywords, copyright information, contact information, a support URL, and your developer name. This cannot be edited once it has been submitted so it is important that you submit this information exactly as you wish to see it displayed. Specific information about this documentation can be found in chapter 2.2 of this manual.
In addition, to adding your Avinode contact as a team member on your App Store account and as a user in App Store Connect, you will also need to provide Avinode with some technical documentation including your iOS distribution certificate, and your App Store distribution provisioning profile. Step-by-step instructions for how to obtain these documents is provided in chapter 2.3.
Once you have finalized your App Store setup and submitted the required information to Avinode you can sit back and relax. Your Avinode contact will continue the process of setting up and submitting your app to App Store. The setup, submission and approval process can take up to five weeks, based on app approval time estimates from App Store.
The first step in the process of getting your new iPhone application ready for its public debut is to sign up for an App Store account. Important! You need to enrolling as an organisation. This is a straight forward process and you can follow the steps in this process provided by Apple. If you already have an iOS Developer account you can continue to the next part of this manual.
Start here:
If you have reached the midway point in your App Store Account Application process then you are now ready to complete sections 2.1 and 2.2 of this chapter. Once you have completed your App Store enrollment as described in the section Setup iOS Developer Account then you can proceed to section 2.3 Technical Requirements.
In order to customize your iPhone App we will need the following design elements from you.
Please provide a RGB color that you wish to use for your app. The tint color will affect buttons, titles, link color and highlighted colors.
Please provide a logo for placement in Search view and About us page. When considering your logo choice please keep in mind that this will be placed on a white background.
The logo should be in the PNG image format and have a transparent background. Following sizes are required:
Device or context | Icon size |
---|---|
iPhone 6, 7, 8 (Plus), XS Max | 870 x 204 px |
iPhone 5, 6, 7, 8, X, XR, XS | 580 x 136 px |
Please provide a landing image in PNG image format, to be displayed when the app starts up. The image cannot contain any transparency. Following sizes are required:
Device | Portrait size |
---|---|
iPhone XS Max | 1242 x 2688 px |
iPhone XR | 828 x 1792 px |
iPhone X, XS | 1125 x 2436 px |
iPhone 6, 7, 8 (Plus) | 1242 x 2208 px |
iPhone 6, 7, 8 | 750 x 1334 px |
iPhone 5s | 640 x 1136 px |
We will need you to provide your app icon in three sizes to fit the current Apple formatting scheme. The icons should be in PNG image format, flattened with no transparency. Square with no rounded corners. Following sizes are required:
Device or context | Icon size |
---|---|
App Store | 1024 x 1024 px |
iPhone 6, 7, 8 (Plus), XS Max | 180 x 180 px |
iPhone 5s, 6, 7, 8, X, XS, XR | 120 x 120 px |
Please indicate which currency you would like to appear as the default setting in your app. Supported currencies:
AUD Australian Dollar | HRK Croatian Kuna | NZD New Zealand Dollar |
BGN Bulgarian Lev | IDR Indonesian Rupiah | PHP Philippine Peso |
BRL Brazilian Real | ILS Israeli New Shekel | PLN Polish Zloty |
CAD Canadian Dollar | INR Indian Rupee | RON Romanian New Leu |
CHF Swiss Franc | ISK Iceland Krona | RUB Russian Rouble |
CNY Chinese Yuan Renminbi | JPY Japanese Yen | SEK Swedish Krona |
CZK Czech Koruna | KRW Korean Won | SGD Singapore Dollar |
DKK Danish Krone | LTL Lithuanian Litas | SKK Slovak Koruna |
EUR Euro | LVL Latvian Lats | THB Thai Baht |
GBP British Pound Sterling | MXN Mexican Peso | TRY Turkish Lira |
HKD Hong Kong Dollar | MYR Malaysian Ringgit | USD US Dollar |
HUF Hungarian Forint | NOK Norwegian Kroner | ZAR South African Rand |
Please indicate which languages you would like to support. The language is automatically detected by the system. If the application detect a language which you do not support, your application will fall back on the English language. * Supported languages: English (default) German, Spanish, Portuguese, Russian, French, Italian, Dutch.
Please provide your terms and conditions to use in your app. This document must be in the PDF format.
Please indicate whether or not you would like to include a brief description of aviation safety procedures and how safety auditing works, along with information about what this means for the end user. This text is provided by Avinode.
Please indicate whether or not you would like to include an option which will let your users choose from your custom categories in search form.
Please indicate whether or not your would like to include an option which will let your users search empty legs.
Please indicate whether or not you would like to have a description of your company in the app. If so, please provide us with the text you want to present. You will also need to translate this text to the different languages you support (see 2.1.6).
This section will describe the various written components we need from you for use in App Store.
This name will be displayed in App Store for this app and all future apps you develop and post with this account.
Please indicate the name you wish your app to have in App Store.
Due to space limitations within the iPhone interface, if your app name exceeds 13 characters then you will need to provide an alternate to the app name from 2.2.2 to be used in the iPhone
We will need a description of the app to be shown in App Store. Keep in mind that this text should have a light sales tone, but still detail the features and functionality of your app. Please see the attached example below:
* Example:
[App Name] by [Company Name]
Description
Empty Legs anytime, anywhere at the tap of your fingers. [App Name] for iPhone makes it possible for you to search, view and request empty legs from wherever
you are, whenever you want. Keen to try private charter, but not sure about the price? Empty Legs can provide you with a cost effective alternative to traditional air charter. Because they are pre-scheduled, unoccupied flights, Empty Legs can be booked for a greatly reduced rate, giving you the opportunity to fly to your destination in comfort and style.Features:
- GPS based search
- Favorite airports function
- Tailored Empty Leg Highlights scroll
- Real-time availability data
- Map view
- Send requests from the App
- View aircraft images
If you wish to charge users to download your app you will need to stipulate a price. * Keep in mind that you will need to upgrade your App Store account to an “iOS Paid Applications Account” in order to charge for your app.
You will need to provide a list of keywords for your app. When choosing your keywords please keep in mind that they will be used for searches within App Store, so they should be as accurate and succinct as possible. * Please separate the keywords with commas. Keywords cannot exceed 100 characters, including commas.
Copyright information should include the name of the person or entity that owns the exclusive rights to the app, along with the year the rights were obtained. e.g. Company Name 2014
Contact information should be comprised of those emails that app users can use to contact your company through App Store regarding the app. * This may differ from the contact information shown within the app
You will need to provide us with a URL address to a webpage where app users can go to receive support for their app. This will be visible to all App Store users. e.g. your company’s webpage, or the “about us” page of your company website.
The following section describes the technical adjustments that you must make to your App Store account and the technical documentation you must submit to Avinode in order for us to be able to submit the app to App Store. * Begin this section once your iOS Developer Account has been approved.
Once your iOS Developer account enrollment is complete you will need to invite Avinode to join your team.
Step 1
Sign in with your developer account at https://developer.apple.com/membercenter/index.action
Step 2
Navigation to “Invitation”-page https://developer.apple.com/membercenter/index.action#invitations
Step 3
The “Invite Person” or “Bulk Invite” links should take you to a page requesting you to fill in the details of the person or people you wish to invite. Fill in the form with the following:
First name: Avinode
Last name: Developer
Email address: itunes@avinode.com
Step 4
Tick the radio dial indication under iOS Developer Program that you would like them to be an Admin and then press Send.
After inviting Avinode to join your team you will also need to add us as a user in App Store Connect at https://itunesconnect.apple.com
* We should have already provided you with the contact information needed to complete this step. If you have not received these contact details please email your sales representative to request this information.
Step 1
Sign in to App Store Connect with your iOS Developer Account at https://itunesconnect.apple.com
Step 2
Navigate to Users and Roles
Step 3
Under the section App Store Connect Users , press the “+” button to add a new user.
Step 4
Enter user information as follows:
First name: Avinode
Last name: Developer
Email address: itunes@avinode.com
Click Next in the top right corner.
Step 5
You should now find yourself on a page asking you to Select Roles. Tick the boxes marked Admin, and then press the Next button. On the next page (Notification) just press Save in the top right corner.
We will now complete the setup of your Mobile Application and submit it to the App Store for review and approval. Please note the Apple review process can take between one and five weeks. You will be able to follow this from your App Store account. We will notify you as soon as your app has been approved.
With your iPhone app approved and listed in App Store it is now time to begin your marketing rollout.The following text will give you some ideas for how you can spread the word about your new app.
Your business is likely already using a number of different communication channels to get messages out to your clients, i.e. your company’s website, email signatures, Twitter, Facebook and blogs. These are also an effective way to spread the word about your new app.Think about putting a link to your app’s page on App Store in your email signatures, or on the main page of your company’s website. Use social media, like Twitter, Facebook and your company’s blog(s), to advertise or discuss your new app. Keep this information refreshed and current, and update as you feel it is necessary.
Distribute your app directly to clients. This is the easiest way to get downloads right away and begin the word-of-mouth advertising on your app.
Carry your app with you wherever you go. You never know when you’ll have the opportunity to show your app to clients, potential clients, or other interested parties, so one of the simplest things you can do is to always carry your app with you. This is a very direct and simple form of marketing that allows you to show potential users the app while at the same time giving them a verbal overview of all its best features. This plants the seeds for instant word-of-mouth advertising in which your app begins to market itself through your clients.
Think about using giveaways and gifts as a way of promoting your new app. Giving away an iPhone or iPod touch loaded with your app, for example, is a great way of promoting your app to clients, or potential clients. Giveaways can take the form of direct gifts to clients, drawings, or lotteries among other things.
All developers should have a good understanding of the concepts explained on this page, as this terminology is widely used in the documentation.
Aircraft
An aircraft refers to a specific physical aircraft identified by its tail number. An aircraft is of a specific aircraft type.
Air operator’s certificate (AOC)
A certificate issued by a country’s national aviation authority, allowing the operator to use the aircraft for the specified commercial purposes.
Aircraft Category
Each aircraft type belongs to a category. These are the fixed wing categories available to all companies in the Avinode Marketplace.
These are the two available categories for helicopters.
Aircraft search
This is a search feature offered to Avinode members. For a given itinerary, the search feature returns the available aircraft. The search result includes routes and prices calculated from information provided by the companies marketing the aircraft.
Aircraft Type
An aircraft type contains information about a group of aircraft with the same or very similar specifications. Each aircraft is connected to one aircraft type. Examples of aircraft types are:
API
A programmable interface that can be used to access data and services. This can be used to power different applications.
API Subscription
Some applications will require an active API Subscription to be allowed to call the APIs.
Application
In this documentation, application refers to the software implementing and calling the APIs.
Avinode Marketplace
An international online marketplace used by the majority of professional buyers and sellers of private air charter flights.
Avinode member
A company with an Avinode Marketplace membership. Avinode is a B2B marketplace so end-clients cannot be Avinode members.
Avinode or SchedAero partner
A company with a professional relationship with Avinode or SchedAero. This can be companies providing tools and services for the private air charter business. Some examples are providers of fleet management systems, fuel providers etc.
Avinode TripManager
An online tool used by brokers to handle quoting, manage trip workflow, and more.
Avinode Web Apps
The Avinode Web Apps are widget like apps that can be installed by Avinode members on their company web pages.
Broker
A company that arranges transactions between the end-client and the seller. The broker often also arranges other trip related services for the end-client. This can be, for example, ground transportation, hotel accommodation etc.
Company account
An account set up for a specific company. A company account has a number of user accounts. A company account can have a list of aircraft that the company operates or markets.
Empty leg
Empty legs are flights that the operator needs to do to position an aircraft. These flights can be marketed in the Avinode Marketplace in an attempt to find business for them.
Empty leg search
This is a search feature offered to Avinode members. For a given departure and arrival airport, the search feature returns matching empty legs. The empty legs does not necessarily have to be an exact match to the given airports. The search feature can also return matching empty legs given only a departure or arrival airport.
End-client
The consumer buying a trip. In many cases, the end-client will be one of the passengers in the trip. The end-client is usually a customer of the broker.
Itinerary
An itinerary holds information about one of more flight legs.
Lead
A lead represents some kind of need an end-client has communicated to a buyer or potentially directly to an operator. A lead holds information about the end-client. It also has information about what the end-client is looking for. This can specify an itinerary and one or more lift.
Leg (aka segment)
A leg represents a flight movement between locations. This is normally between two airports but the location can be, for example, a city or an address. The leg also has information about departure time and/or arrival time. It can also hold information about the number of passengers, flight times, distance etc.
Lift
A lift can be specified on different levels. It can be specified as an aircraft, or more generally as an aircraft type or even as an aircraft category.
Marketed aircraft
This is an aircraft that is marketed in the Avinode Marketplace. Each aircraft can only be marketed by one Avinode member company. This company must be the operator holding the AOC for the aircraft or an marketing company holding a valid marketing agreement with the operator.
Marketing agent
A company that holds a marketing agreement with an operator, allowing them to sell flights for the specified aircraft.
Operator
A company that holds one or more air operator’s certificates and operates the aircraft listed on these.
Quote
A quote is an offer that a seller sends to a buyer as a reply to an RFQ. A quote contains information about what lift the quote is for, the itinerary and the price offered to the buyer. The quote itinerary may differ from the itinerary the buyer requested in the RFQ. This can happen if, for example, the quote is only for parts of the requested itinerary or if the seller wants to offer an alternative departure airport.
The seller can reply to an RFQ with any number of quotes.
A quote may be “Avinode Generated”. This means that Avinode has used the aircraft performance and pricing information, provided by the seller, to generate a quote on behalf of the seller.
Request for quote (RFQ)
For any given trip, the buyer can send RFQs to sellers to request quotes for the whole trip or parts of it. An RFQ has information about the itinerary the buyer is requesting quotes for. It may also include information about what lift the buyer is looking for.
SchedAero
An online tool used by operators to handle scheduling, quoting, flight & duty logging, invoicing, and more.
SchedAero member
A company using SchedAero.
Seller
A company marketing aircraft in the Avinode Marketplace. It can be the operator or a marketing agent.
Trip
A trip is something a buyer arranges for an end-client. It has an itinerary describing where and when the end-client wants to fly. It can also be connected to information about the end-client, RFQs sent to sellers, quotes received from sellers etc.
User account
A separate user account exist for each person at the company that has access to the company account. Each user account has a set of permissions defining which features and what data the person can access.
This change log contains information about additions and updates made to the APIs as well as information about updates done to the documentation on the Developer Portal.
GET/airports/search
POST/webhooks/settings
POST /tripmsgs/{requestId}/chat
criteria.minimumYearOfMake
in POST /searches
criteria.maxInitialPositioningTimeMinutes
in POST /searches
GET /rfqs/{id}
operation now returns the property canceled
, if the buyer has canceled the trip.GET /rfqs/{id}
operation now also returns the buyer’s preferred currency in the buyerAccount.preferredCurrency
property.GET /rfqs/{id}
operation.If you, as a developer, have technical questions related to the APIs, Sandbox access, etc., please contact our API support at techsupport@avinode.com.
If you, as an Avinode member, have questions about your API subscriptions or application’s business cases, then please contact your Avinode sales representative.
If you, as a SchedAero member, have questions about your API subscriptions or application’s business cases, then please contact your SchedAero sales representative.