Skip to main content
WhatsApp usMy bookings

Developer API

Last updated September 18, 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.

Getting access

The affiliate programme is open — anyone can join. Get in touch and tell us who you are and roughly what traffic you expect, and we will set you up.

  • 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.

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.

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"
        }
      ]
    }
  ]
}
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

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

We are rebuilding partner reporting alongside the new platform. Until it ships, ask us for your statement and we will send it — including everything needed 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