Note: As of the date of publication, iOS26 is still a developer beta release. Content below may change between now and the public release.
Introduction
iOS 26 brings the first major update to flight boarding passes since their initial release in iOS 6. Apple are seeking to enhance the passenger experience with a range of new features, including:
a new standardized layout, providing passengers with a consistent experience across all airlines,
integration with Apple's flight service to automatically stay up to date,
live activities that provide easy access to key flight information that can be shared with friends and family,
leveraging SSR code, passenger privilege, and security program data to display badges on the pass surface to efficiently communicate information about passenger requirements and service entitlements,
a new Airline Services tab providing passengers a way to easily manage their booking, purchase add-on services, and get relevant information about services available throughout their journey,
integration with maps and find me for airport directions and tracking luggage with Apple's Find My service.
These new enhancements utilize Semantic Tags in the Apple Pass Bundle to be able to provide the upgraded pass to iOS 26 users, whilst allowing backward compatibility with passengers using devices running iOS 18 or below.
PassKit takes care of populating the majority of these tags to enable compatibility automatically. However, there have been a few enhancements to the PassKit API to provide the additional information required to fully benefit from the new pass format.
This article will introduce the mandatory and optional changes that you can make to your API calls and PassKit objects to enable these features for your passengers and operations.
Mandatory Items:
We've tried to simplify upgrading to the new format as much as possible, and there are just 2 changes that you need to make to your templates.\
Firstly, in the appleWalletSettings
object, we have added a new boolean parameter semanticBoardingPass
. Set this to true
and Wallet will automatically render the pass in the new format.
For Wallet to render the pass in the new format, the following minimum information must be supplied:
carrier.iataCarrierCode
flight.flightNumber
flight.scheduledDepartureTime
flight.scheduledArrivalTime
flight.boardingTime
port.iataAirportCode
(for departure and arrival ports)port.cityName
(for departure and arrival ports)port.timezone
(for departure and arrival ports)
If any of the above data is not available, then Wallet will fallback to the original layout.
Whilst not mandatory, semantic boarding passes use a new logo image type primaryLogo
. This logo is slightly smaller than the appleLogo
, and needs to have a height of 90 pixels and a width of up to 378 pixels. If no primaryLogo
is supplied, we will do our best to downscale your appleLogo
which should still be provided for backward compatibility with passengers not using iOS 26.
Optional Items:
Certain passenger capabilities allow for badges to be displayed on the face of the pass. You can pass an array of PassengerCapabilities
to the capabilities
field on the boarding pass object.
Enum: PassengerCapabilities
Name | Number | Description |
| 0 | Passenger has no capabilities, or capabilities are unknown. |
| 1 | Passenger is entitled to pre-board the airplane |
| 2 | Passenger is entitled to priority boarding |
| 3 | Passenger may bring carry-on baggage on board |
| 4 | Passenger may bring a personal item (e.g. purse, laptop bag, etc.) on board |
The new format allows for badges or icons to be displayed for eligible security pathways supported at each airport. As well as the US-Centric programs of TSA PreCheck®, Global Entry, and CLEAR., badges can be presented for passengers qualifying for One Stop Security, Transit Without Visa, International to Domestic, and International to International.
To display a badge on the pass, both the Airport and the Passenger need to be members of the program.
We have created added a field securityPrograms
to both the Airport and BoardingPass objects which accepts an array of AirportSecurityPrograms
:
Enum: AirportSecurityPrograms
Name | Number | Description |
| 0 | Default, no programs available, or programs are unknown |
| 1 | TSA PreCheck® |
| 2 | TSA PreCheck® Touchless ID |
| 3 | Transit Without Visa |
| 4 | One Stop Security |
| 5 | International to International |
| 6 | International to Domestic |
| 7 | Global Entry |
| 8 | CLEAR+ |
For international travel, there is an option to display a badge confirming that passenger documentation (passport / visa / etc.) has been checked. The text and localized text for this badge can be set by the carrier and sits against the Airport object.
We have also added a loungeId
paramater, that if present will display a map with a link to the Apple Place ID of the airport lounge in the Airline Services section of the tag. You can use the most appropriate lounge id for the majority of passengers, or omit it and provide individually at the boarding pass level with an additional data items with a key of airport.loungeId
.
Field | Type | Description |
documentsVerifiedText |
| A localizable value to show whe a passenger's international documents have been verified. Examples include "Docs OK", or "TravelReady". If the boarding pass conditionalItems -> InternationalDocVerification is COMPLETED, this value will show on the face of the pass. |
localizedDocumentsVerifiedText |
| The localized documents verified text. |
loungeId |
| Apple Place ID for Airline lounge. Can be overridden at the boarding pass level by providing additional data items |
FlightURLs:
Flight URLs enhance the passenger experience by allowing them to engage with their booking information and to access upgrades and services for their journey. Urls can be provided in the urls
field of the flight designator, flight, or boarding pass level, with each level overriding the parent level.
As an example, there may be URLs to purchase lounge access or additional baggage that would apply to the majority of passengers. If a passenger has already purchased these services, it may be better to present URLs that do not contain the lounge access or additional baggage URLs to avoid confusion.
URls can be web links or deep links to your app. Wherever possible they should be as deep as possible.
Message: FlightURLS
Field | Type | Description |
upgradeURL |
| A link to upgrade the flight. |
orderFoodURL |
| A link to order food, either before or during the flight. |
purchaseWifiURL |
| A link to purchase in-flight wifi. |
changeSeatURL |
| A link to change the seat for this ticket. |
entertainmentURL |
| A link to in-flight entertainment. |
purchaseAdditionalBaggageURL |
| A link to add checked bags for this ticket. |
purchaseLoungeAccessURL |
| A link to purchase lounge access. |
baggagePolicyURL | string | A link to the baggage policy. |
reportLostBagURL |
| A link to report lost luggage. |
managementURL |
| A link for managing the booking. |
accessibilityURL | string | A link for passengers requiring assistance. |
requestWheelchairURL |
| A link to request a wheel chair. |
registerServiceAnimalURL |
| A link for registering a service animal. |
transitProviderEmail |
| The email for the transit provider. |
transitProviderWebsiteURL |
| A link for the transit provider. |
transitProviderPhoneNumber |
| A phone number for the transit provider. |
Infants:
With semantic boarding passes, SSR codes, Passenger Capabilities, and Airport Security Programs play a significant role in exposing badges on the front of the pass. With this in mind, we have extended the Infant
object to accept independent arrays of these items using the parameters ssrCodes
, capabilities
, and securityPrograms
. The SSR code INFT
will be added automatically if no ssrCodes
are provided.
You can find the full documentation for the PassKit Flights API here.