Skip to main content
WhatsApp usMy bookings

Developer API

Last updated September 23, 2026

Search our flights, link travellers straight into a booking, and earn commission on what you send. Everything below is served from https://aviodeals.com.

Already a partner? Your statistics, bookings and monthly statements are in the partner portal. Partner sign-in

Getting access

The affiliate programme is open: anyone can join. Fill in the form below and we email you a link to your trial credentials straight away. Tell us about your project at the same time; that is what we base a commercial agreement on.

  • A tracking code — the value you put in the ref parameter on every link you send us.
  • An API token for the search and feed endpoints.
  • Commission terms: a percentage of the order total, up to an agreed maximum per booking.

Your token is a bearer credential: anyone holding it can query as you. We store only a hash of it, so we cannot read it back to you — keep it somewhere safe, and tell us straight away if it leaks and we will replace it.

A trial account is limited, so that evaluating us never costs an airline contract:

  • It ends after 30 days unless we have agreed terms by then.
  • Up to 500 search requests a day.
  • Searches are answered from our price store, which our own customers and live partners keep filled. A route and date nobody has searched recently may answer empty; production accounts trigger live refreshes.
  • Bookings you send during the trial are tracked to your code. Commission is paid from the date of your agreement.

Get trial credentials

This becomes your tracking code, for example acme-travel.

We send your credentials link here and use it for everything after.

Optional. Where our flights will be shown.

A sentence or two: the product, the markets, and where our flights would appear.

We use these details only to set up your access and to contact you about an agreement.

Authentication

Send your token on every feed and search request, either as an Authorization header carrying the raw token — with no Bearer prefix — or as an accessToken query parameter. The redirect endpoints are public and take no token.

Example

curl -H "Authorization: YOUR_TOKEN" \
  "https://aviodeals.com/api/v2/data/routes.json"

Failures

Both answer HTTP 401 with the code ERROR_UNAUTHORIZED:

  • No token at all: Authentication required
  • A token we do not recognise, or one belonging to a deactivated account: Access Denied [1]

Endpoints

Responses are JSON. Dates are ISO 8601 (YYYY-MM-DD). Airports are referenced either by IATA code or by the numeric id from the airports feed; both are accepted everywhere an airport is named.

Baggage and fare options are only ever returned by the two addresses ending in -tcs: flights-tcs.json and flights-multi-tcs. The other addresses never change, so an integration built on them keeps working exactly as it does today.

GET/api/v2/data/airports.jsonToken required

Every airport we serve, with its numeric id, IATA code, city and country.

Static reference data. Cache it — it changes rarely, and the ids are stable.

Example response · 200 OK

[
  {
    "id": 51,
    "code": "DUS",
    "city": "Dusseldorf",
    "country": "Germany"
  },
  {
    "id": 242,
    "code": "DAR",
    "city": "Dar es salaam",
    "country": "Tanzania"
  }
]
GET/api/v2/data/routes.jsonToken required

The airport pairs we actually fly, as departure and destination pairs.

Two airports we serve do not make a bookable pair. Use this feed to confine your searches to routes that exist — a pair outside it can only ever answer empty.

Example response · 200 OK

[
  {
    "departure": {
      "id": 242,
      "code": "DAR",
      "city": "Dar es salaam",
      "country": "Tanzania"
    },
    "destination": {
      "id": 267,
      "code": "ZNZ",
      "city": "Zanzibar",
      "country": "Tanzania"
    }
  }
]
GET/api/v2/data/routes/with-availability.jsonToken required

The same pairs, with the days each route operates.

Use this to avoid searching a route on a day it does not fly.

Example response · 200 OK

[
  {
    "dep": "DAR",
    "des": "ZNZ",
    "dow": "Mon,Tue,Wed,Thu,Fri,Sat,Sun",
    "from": "2026-01-01",
    "to": "2027-12-31"
  }
]
GET/api/v2/flights.jsonToken required

Search one route on one date, one way or return.

Answers an object with departure and return arrays. Each flight carries its own id — pass that id to the redirect endpoint to land the traveller on it.

Parameters

from required
Origin airport, IATA code or id.
to required
Destination airport, IATA code or id.
departureDate required
Outbound date, YYYY-MM-DD.
returnDate optional
Return date for a round trip. Omit for one way.
adults optional
Adult passengers. Defaults to 1.
children optional
Child passengers. Defaults to 0.
infants optional
Infants on lap. Defaults to 0.
  • A pair we do not fly answers empty arrays, not an error — an empty answer is never a reason to retry.
  • A date in the past answers empty rather than failing.
  • return is present only when a returnDate was sent.

Example response · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705
    }
  ]
}
GET/api/v2/flights-tcs.jsonToken required

The same search, with baggage and up to four fare options per flight.

Answers exactly what flights.json answers, and every flight object gains a fareOptions array: the fares you can sell on that flight, cheapest first, at most four. Each option has its own id for the redirect endpoint, its own price blocks, a fareFamilyName, and the baggage it includes — cabinBag and checkedBag, each with pieces, status (FREE or NOT_INCLUDED) and, where the airline states one, a weight per piece in kilograms. Built for total-cost comparison such as Skyscanner Total Cost Search.

Parameters

from required
Origin airport, IATA code or id.
to required
Destination airport, IATA code or id.
departureDate required
Outbound date, YYYY-MM-DD.
returnDate optional
Return date for a round trip. Omit for one way.
adults optional
Adult passengers. Defaults to 1.
children optional
Child passengers. Defaults to 0.
infants optional
Infants on lap. Defaults to 0.
  • The first fare option is the flight's own offer: same id, same price as the flight object.
  • A field the airline did not state is left out, never sent as zero — treat a missing cabinBag or checkedBag as unknown.
  • cancellation and flightChange appear only as FREE, and only where the airline states it; their absence makes no claim.
  • Two fares with identical attributes are one product: only the cheaper is listed.
  • We sell no paid bags, so no bag price is ever sent.
  • flights.json is unchanged and stays available; use whichever fits your integration.

Example response · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705,
      "fareOptions": [
        {
          "id": 1000000383705,
          "fareFamilyName": "NR",
          "price": {
            "currency": "USD",
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "106.05",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "90.88",
            "child": "0.00",
            "infant": "0.00"
          },
          "cabinBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 5,
              "unit": "KG"
            }
          },
          "checkedBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 20,
              "unit": "KG"
            }
          }
        },
        {
          "id": 1000000383706,
          "fareFamilyName": "Y",
          "price": {
            "currency": "USD",
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "146.04",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "125.15",
            "child": "0.00",
            "infant": "0.00"
          },
          "checkedBag": {
            "pieces": 2,
            "status": "FREE",
            "weight": {
              "value": 23,
              "unit": "KG"
            }
          },
          "flightChange": "FREE"
        }
      ]
    }
  ]
}
POST/api/v2/flights-multiToken required

Search up to five routes and dates in one request, without baggage.

The request is a JSON body. Each destination is one route on one date; a return trip is two destinations, the way out and the way back. The answer is an object named result, keyed FROM-TO-DATE (for example MGA-RNI-2026-10-27), each key holding that destination's flights in the same format as flights.json. Its answer never changes: for baggage and fare options, send the same request to flights-multi-tcs.

Parameters

passengers.adults optional
Adult passengers. Defaults to 1.
passengers.children optional
Child passengers. Defaults to 0.
passengers.infants optional
Infants on lap. Defaults to 0.
destinations[N].from required
Origin airport, IATA code or id.
destinations[N].to required
Destination airport, IATA code or id.
destinations[N].date required
Date, YYYY-MM-DD.
  • At most five destinations are read; any after the fifth are ignored.
  • To link a return trip, pass the outbound and the return flight id to redirect-multi.
  • A pair outside the routes feed is refused with HTTP 400 and the code ERROR_DATA_VALIDATION (Route X-Y is not supported), where flights.json answers the same pair with empty arrays.
  • A destination on a day we do not fly, or on a date in the past, answers an empty list. A request with no destinations answers an empty array.

Example request

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

Example response · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088
      }
    ]
  }
}
POST/api/v2/flights-multi-tcsToken required

The same multi-destination search, with baggage and up to four fare options per flight.

Takes exactly the request flights-multi takes and answers exactly what it answers, and every flight object gains a fareOptions array, as described for flights-tcs.json: the fares you can sell on that flight, cheapest first, at most four, each with its own id for the redirect endpoints, its own price blocks, a fareFamilyName and the baggage it includes. Built for total-cost comparison such as Skyscanner Total Cost Search.

Parameters

passengers.adults optional
Adult passengers. Defaults to 1.
passengers.children optional
Child passengers. Defaults to 0.
passengers.infants optional
Infants on lap. Defaults to 0.
destinations[N].from required
Origin airport, IATA code or id.
destinations[N].to required
Destination airport, IATA code or id.
destinations[N].date required
Date, YYYY-MM-DD.
  • The first fare option is the flight's own offer: same id, same price as the flight object.
  • A field the airline did not state is left out, never sent as zero — treat a missing cabinBag or checkedBag as unknown.
  • cancellation and flightChange appear only as FREE, and only where the airline states it; their absence makes no claim.
  • We sell no paid bags, so no bag price is ever sent.
  • flights-multi is unchanged and stays available; switching is a change of address only.

Example request

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

Example response · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088,
        "fareOptions": [
          {
            "id": 1000000384088,
            "fareFamilyName": "Light",
            "price": {
              "currency": "USD",
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "140.60",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "120.48",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 0,
              "status": "NOT_INCLUDED"
            }
          },
          {
            "id": 1000000384091,
            "fareFamilyName": "Standard",
            "price": {
              "currency": "USD",
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "150.16",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "128.68",
              "child": "0.00",
              "infant": "0.00"
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          },
          {
            "id": 1000000384092,
            "fareFamilyName": "Essential",
            "price": {
              "currency": "USD",
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "169.29",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "145.07",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          }
        ]
      }
    ]
  }
}
GET/api/v2/redirectPublic

The deep link. Send travellers here to land on the flight they clicked.

Redirects to our results page with the trip already filled in, and records your attribution. This endpoint never errors: an id we cannot resolve still lands the traveller on a usable page rather than a dead end.

Parameters

flightId required
The outbound flight id from a search response.
returnFlightId optional
The inbound flight id, for a round trip.
ref required
Your tracking code. Without it the visit earns you nothing.
subAffiliate optional
Your own sub-channel label, returned to you in reporting.
campaign optional
Your own campaign label.
partnerClickId optional
Your click identifier, so you can reconcile a booking against your own logs.
currency optional
Currency to display prices in. Does not change the currency charged.

Example response · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/redirect-multiPublic

The deep link for a round trip, taking both legs as a list.

Reads flightIds as a collection: the first entry is the outbound, the second the inbound. Takes the same attribution parameters as the single redirect.

Parameters

flightIds[] required
Flight ids in order: outbound first, inbound second.
ref required
Your tracking code.

Example response · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/results-multiPublic

A deep link built from airports and dates rather than flight ids.

Use this when you have no flight id to hand — for example from a cached or expired search. Reads destinations as indexed parameters: destinations[0][from], destinations[0][to], destinations[0][date].

Parameters

destinations[N][from] required
Origin airport for leg N.
destinations[N][to] required
Destination airport for leg N.
destinations[N][date] required
Date for leg N.
ref required
Your tracking code.
  • A destination we cannot resolve is skipped rather than refused.

Example response · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/partner/statistics.jsonToken required

Your searches, clicks, bookings and commission, by day or by route.

The figures of the Statistics page in your partner portal, for your own systems. Searches are the search requests your token made; clicks are the redirects you sent us, and a dead end is a click we could not match to a flight. Bookings count on the day they were paid; commission is summed over confirmed bookings only.

Parameters

from optional
First day, YYYY-MM-DD (UTC). Defaults to the first of the month of to.
to optional
Last day, YYYY-MM-DD (UTC), inclusive. Defaults to today. At most 366 days after from.
groupBy optional
day (the default) or route. Routes count both directions together.
  • Only ever your own figures. Answered from our own records: it never reaches an airline.
  • Commission is a number in the currency named in the response.

Example response · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "from": "2026-09-01",
  "to": "2026-09-26",
  "groupBy": "day",
  "currency": "USD",
  "totals": {
    "searches": 41280,
    "clicks": 312,
    "deadEnds": 4,
    "bookings": 9,
    "commission": 51.32
  },
  "days": [
    {
      "date": "2026-09-01",
      "searches": 1466,
      "clicks": 11,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-02",
      "searches": 1655,
      "clicks": 13,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-03",
      "searches": 1702,
      "clicks": 12,
      "deadEnds": 0,
      "bookings": 1,
      "commission": 3.05
    }
  ]
}
GET/api/v2/partner/bookings.jsonToken required

Your bookings for one month, with commission and your own click ids.

The rows of the Bookings page in your partner portal. A booking belongs to the month it was paid; one refunded or cancelled later stays listed with its status, and its commission is deducted on your next statement.

Parameters

month optional
YYYY-MM. Defaults to the current month.
  • status is confirmed, cancelled or refunded; the month's commission counts confirmed bookings only.
  • clickId and subId are the values you sent us with the click.

Example response · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "month": "2026-09",
  "currency": "USD",
  "count": 9,
  "commission": 51.32,
  "bookings": [
    {
      "paidAt": "2026-09-25T10:14:03.000Z",
      "reference": "00GDSG",
      "route": "SAP-RTB-SAP",
      "travelFrom": "2026-12-20",
      "travelTo": "2027-01-03",
      "passengers": 1,
      "commission": 7.5,
      "currency": "USD",
      "status": "confirmed",
      "clickId": "c-B4C912",
      "subId": null
    }
  ]
}

Errors

Every error has the same envelope: success is false, code names the class of error, and errors lists what was wrong — with a path naming the parameter where one is at fault. A missing or unknown token answers 401; a search that cannot be read answers 400. An empty result is never an error.

401 Unauthorized

{
  "success": false,
  "code": "ERROR_UNAUTHORIZED",
  "errors": [
    {
      "message": "Authentication required"
    }
  ]
}

400 Bad Request

{
  "success": false,
  "code": "ERROR_GENERAL",
  "errors": [
    {
      "message": "To airport is required",
      "path": "to"
    },
    {
      "message": "Departure date is required",
      "path": "departureDate"
    }
  ]
}

Attribution

Put your tracking code in the ref parameter on every link. We set a first-party cookie when the traveller lands, and read it back if they book — so a booking counts for you even when it happens days after the click.

https://aviodeals.com/api/v2/redirect?flightId=1000000000123&ref=YOUR_CODE
  • The attribution window is 42 days from the click.
  • The most recent click wins: if a traveller arrives through another partner after you, the booking is theirs.
  • A booking is attributed once, at the moment it is created.

Commission

You earn an agreed percentage of the order total, up to an agreed maximum per booking. The exact numbers are in your own agreement — the rules below apply to everyone.

  • The maximum is per booking, not per passenger: one booking earns one capped commission however many travellers are on it.
  • Commission is calculated on the order total actually charged, not on a price quoted earlier.
  • Amounts are rounded down to the cent.
  • Commission is earned on bookings that are paid for. A held or abandoned checkout earns nothing.
  • A booking sold in a currency other than your payout currency is reported to you rather than paid automatically — we do not convert at settlement, we agree the rate with you.

Reporting

Sign in to the partner portal for your statistics, bookings and monthly statements, or pull the same figures with the two partner endpoints above. On the 2nd of each month we email your statement for the month before, with everything you need for an invoice.

Fair use

We buy our inventory from airlines under contracts that measure how many searches we send them per booking. That budget is shared with you, so a few habits keep the connection healthy for both of us.

  • Search only pairs in the routes feed, on days the availability feed says they operate. A pair we do not fly can only answer empty, and asking anyway spends the budget for nothing.
  • Cache the airport and route feeds. They change rarely.
  • Do not poll a search repeatedly for the same trip. Prices are held at booking, not at search.
  • Tell us before you materially increase your query volume, so we can raise our own limits first.

Questions

Something unclear, something broken, or an endpoint you need that is not here? Get in touch — we would rather change the API than have you work around it.

Developer API | aviodeals