Developing a Mobile App for Flight Tickets
Aviation ticketing is technically the most complex niche among transport apps. Flight data comes via GDS (Global Distribution System)—Amadeus, Sabre, Travelport—and updates in real time. Direct GDS access requires certification; most independent developers use aggregator APIs.
Data Sources: GDS and Aggregators
Amadeus for Developers is the most accessible GDS API. Free tier up to 2000 calls/month, production via partnership. OAuth2 authorization, REST/JSON. Main endpoints:
-
GET /shopping/flight-offers—search offers -
POST /shopping/flight-offers/pricing—verify price before booking -
POST /booking/flight-orders—create booking
Critical: aviation prices change by the second. Between flight-offers and flight-orders must call pricing—price may change. Without this—book at stale price, GDS returns error.
// iOS: flight search via Amadeus API
struct FlightSearchParams {
let origin: String // "SVO"
let destination: String // "AYT"
let departureDate: String // "2025-07-10"
let adults: Int
let travelClass: String // "ECONOMY", "BUSINESS"
let nonStop: Bool
}
class FlightSearchViewModel: ObservableObject {
@Published var offers: [FlightOffer] = []
@Published var isLoading = false
@Published var error: SearchError?
func search(params: FlightSearchParams) async {
isLoading = true
do {
// Request to our backend proxying Amadeus
offers = try await flightAPI.searchOffers(params)
} catch {
self.error = .networkError(error.localizedDescription)
}
isLoading = false
}
}
For multi-system needs (multiple GDS + low-cost airlines)—aggregators Travelpayouts API, Kiwi.com API, Skyscanner Partner API. Last requires partner status with 100K+ searches/month traffic.
For Russian market: Aviasales API—access via partners.aviasales.ru, good CIS coverage, partnership model.
Complex Search: Multi-Segment Routes
Direct flights are simple. Complex—multi-segment routes with connections. GDS returns itineraries with multiple segments. Must display correctly:
- Total travel time vs flight time (excluding connections)
- Connection time (layover) with warning if < 60 minutes
- Connection airport—different airport in same city (e.g., CDG vs ORY in Paris)—red flag
Filtering: direct only, max 1 connection, departure time (night/day/morning), airline, departure airport (for cities with multiple airports).
Sorting: by price, by travel time, by convenience (composite index). Amadeus returns amenities per offer—aisle seat, baggage, meals—include in flight card.
Seat Selection and Ancillaries
Seat selection in aircraft—interactive cabin map. Amadeus Seat Map API returns schema: rows, columns, class type, status (available/occupied/blocked). Render via Canvas/custom View.
Schema differs significantly by aircraft type. A320 and Boeing 737 have different layouts. Schema data live—occupied seats update per API call.
Ancillaries: extra baggage, meal selection, insurance. Each service—separate POST /booking/flight-orders/{id}/ancillaries or airline endpoint. Prices from Additional Bag Offers via Amadeus.
Boarding Passes and Trip Management
After successful booking—PNR (Passenger Name Record) and e-ticket. Boarding pass available 24 hours before departure via airline Check-in API (if supported). Standard—BCBP (Bar Coded Boarding Pass): data string encoded in Aztec or QR.
On iOS: PKBoardingPass via PassKit—add boarding pass to Wallet with automatic reminder on lock screen at right moment:
// Add boarding pass to Apple Wallet
func addBoardingPassToWallet(pass: PKPass) {
let passLibrary = PKPassLibrary()
if passLibrary.containsPass(pass) { return }
let addPassVC = PKAddPassesViewController(pass: pass)
present(addPassVC, animated: true)
}
On Android: equivalent via Google Wallet API with BoardingCardObject.
Push notifications via FCM/APNs: flight delay (via FlightAware API or AviationStack), check-in opens, gate change, boarding reminder.
Offline and Poor Airport Connectivity
Boarding pass must work without internet. Cache data in Core Data / Room when received: flight number, PNR, barcode, passenger data. Generate QR from local data—don't query server when showing.
Refund and Exchange
Refund/exchange via airline API or GDS. Each fare has its own fare conditions—display on purchase screen: non-refundable, partially refundable, free exchange. Amadeus Branded Fares API helps structure fare conditions for user.
Stages and Timeline
| Stage | Timeline |
|---|---|
| GDS / aggregator integration | 1–2 weeks |
| Search: single and multi-segment flights | 2 weeks |
| Booking, payment, PNR | 2 weeks |
| Seat selection, ancillaries | 1 week |
| Boarding passes, Apple/Google Wallet | 1 week |
| Flight status notifications | 1 week |
| Testing, iOS + Android | 1 week |
Total: 9–12 weeks. Pricing is calculated individually after requirements analysis.







