Evalgent
Back to Blog
Voice AI Testing

When AI Calls Airlines for Travelers: What to Test

Deepesh Jayal
15 min read
When AI Calls Airlines for Travelers: What to Test
On this page

This post is for the product team at a corporate or leisure travel management platform. You built an outbound agent that calls airline and hotel contact centers for your clients' travelers. It rebooks after cancellations, asks for refunds, adds seats and special service requests, and fixes names. It waits through IVR menus and hold queues. Then it writes the result to the trip record and notifies the traveler.

Every call ends in a write-back. When AI calls airlines, the airline hears a code and your system stores a status. If either is wrong, nobody notices until the traveler is at the gate.

If you are still choosing a vendor, start with how to evaluate a travel booking voice agent vendor. For the inbound side of hospitality, see our hotel voice agent QA guide.

7 business days
Refund deadline for credit card purchases (14 CFR 260.2)
3 h / 6 h
Domestic / international time change that counts as significant (14 CFR 260)
~35%
gpt-4o pass^1 on the tau-bench airline domain (Yao et al.)
68.7%
Best rate of recordings with every critical value recovered (VoiceCodeBench)

What happens when AI calls airlines: the workflow

An outbound airline call has four stages. The agent captures intent from the trip record. It takes an action through a human or an IVR. It gets a confirmation. Then it writes back to your system.

Record locator (PNR): the booking reference for a passenger name record. AltexSoft describes it as "a 6-digit alphanumeric code assigned to the PNR file upon its creation" (AltexSoft).

One trip can hold several record locators. The same AltexSoft explainer notes that "the same trip can get several PNR numbers in different reservation systems." Your GDS locator and the airline's own locator may differ. An agent that reads the agency locator to the airline will hear "I can't find that booking." Worse, it may find a different one.

Here is the shape of a typical cancellation call:

1. Dial the airline's published number from an allowlist.

2. Navigate the IVR by speech or DTMF.

3. Wait on hold, sometimes for an hour.

4. Authenticate with the record locator, ticket number and passenger name.

5. Ask for the rebooking, refund or service the trip record calls for.

6. Judge each offer against the client's travel policy.

7. Get the outcome read back, then end the call.

8. Re-read the booking and write the result to the trip record.

It is tempting to skip step 8 and write what the transcript says happened. The transcript is the agent's own story.

Seven failures that strand travelers

These seven failures matter most on airline calls. Each one can pass a transcript review. Each one breaks a downstream record.

FailureWhat happens on the callWhat breaks downstream
Wrong locatorAgent says "D", airline hears "B"Wrong booking found or none
Worse rebookingAgent says "that works" to a late arrivalTraveler misses the meeting
Credit vs refundAgent accepts a travel creditRefund right lost, card not credited
False confirmAirline waitlists, agent stores "Confirmed"Traveler shows up with no seat
Hold hang-upSilence timeout fires at minute 10Call lost, queue restarts
IVR loopWrong menu branch, stuck in self-serviceNo human reached, no change made
PII to wrong partyDOB and passport read to a wrong linePrivacy incident

Failure 1: the wrong record locator

Spelled letters are among the hardest things to get across a phone line. The classic problem is the E-set: B, C, D, E, G, P, T, V and Z. They differ only in a short consonant burst. Narrowband telephone audio cuts much of it. Fanty and Cole called the E-set a "difficult" subset in their ICSLP 1990 study of spoken letter recognition.

Your TTS says the letter. A human ear or an IVR recognizer hears it. You control only one side.

Modern ASR still struggles with exact codes. VoiceCodeBench tested 19 systems on 1,482 audited entities, including spelled sequences. The best system recovered every critical value in only 68.7% of recordings. Word error rate showed little rank agreement with exact-value recovery (Spearman ρ = -0.28). A low WER does not mean your codes survive.

Now do the math on a six-character code. Assume, as an illustration, 99% accuracy per character on a noisy line. The whole code survives 0.99^6 ≈ 94.1% of the time. That is roughly one wrong booking lookup in 17 calls.

The fix is old aviation practice. The ICAO spelling alphabet exists to make letters clear over radio and phone. ICAO describes it as a universal alphabet "used to clarify parts of messages that contain letters and numbers." Most people call it the NATO phonetic alphabet.

Make three rules:

  • Spell every locator and ticket number with the NATO alphabet. "Quebec, Bravo, X-ray, Seven, Delta, Papa."
  • Ask the airline agent to read it back. Compare the readback letter by letter.
  • On a mismatch, spell again only the characters that failed. Then confirm the passenger name and flight against the found booking.

The last check matters most. A one-letter error can land on a real but different booking.

Record locator QBX7DP spelled with NATO words, E-set letters B, D and P flagged, and a readback loop where the airline repeats the code before any change

Failure 2: accepting a worse rebooking than policy allows

Airline agents offer what is easy to book. Your agent wants to finish the call. The result is a polite "that works."

The research says to expect this. On the tau-bench airline domain, Yao et al. report gpt-4o at about 35% pass^1. Tasks include changing and cancelling flights under policy rules. In agent-to-agent negotiation experiments, Zhu et al. found that "behavioral anomalies in LLMs can result in financial losses for both consumers and merchants." They warn users to be careful when delegating business decisions to agents.

Do not leave "acceptable" to the model. Give it a policy envelope as data, and check every offer in code:

  • Latest arrival time, per traveler and per trip purpose
  • Maximum connections and minimum connection time
  • Allowed cabins and fare families (for example, no basic economy)
  • Allowed airports, including co-terminals
  • Maximum fare difference the agent may approve

Anything outside the envelope gets one answer: "Please hold that, I need to check with the traveler." The agent must never agree on the traveler's behalf.

Failure 3: refund vs travel credit

This one has a regulation behind it. Under the US DOT rule in 14 CFR 260.6, a carrier must refund the fare when it cancels or significantly changes a flight. That applies when the passenger declines the alternative and doesn't accept a credit.

A significant change includes a departure three hours or more earlier, or an arrival three hours or more later, on a domestic itinerary. International itineraries use six hours. A new airport, more connections or a cabin downgrade also count (Federal Register, April 26, 2024).

Refunds must be "prompt": 7 business days for card purchases and 20 calendar days for other payments. DOT's compliance guide says an automatic refund is required for cancellations on or after May 16, 2024, under the FAA Reauthorization Act. Other refund parts applied from October 28, 2024.

A carrier may offer a voucher instead. It must state the traveler's right to a full refund, and the voucher must stay valid for at least five years. Section 260.7 says a carrier must not treat a consumer as accepting a credit unless they "affirmatively agree." Your agent's casual "okay, sure" is exactly that kind of agreement risk. Treat it as an irreversible action. This is general information as of October 2026, not legal advice.

The write-back has a trap. "Refund requested", "refund issued" and "travel credit issued" are three different records. Each needs a different traveler message. If your agent stores "refunded" when the airline issued a credit, the client's expense system and card reconciliation go wrong.

There is a liability point too. In Moffatt v. Air Canada (2024 BCCRT 149), a tribunal held the airline to refund advice its chatbot gave. It found the airline "did not take reasonable care to ensure its chatbot was accurate." What your agent tells a traveler about their refund is your platform's statement.

Failure 4: "confirmed" when the airline only waitlisted

Airline agents say "you're on the 6:40" in many ways. Some mean a confirmed seat. Some mean a waitlist or standby. The transcript reads the same.

GDS segment status codes don't. In Travelport's air segment definitions, HK means "Holds Confirmed." HL means "Have Waitlisted." KL means confirming from the waitlist. UC means unable, segment closed. SC flags a schedule change.

So never write a trip status from the call. Re-read the booking after the call. Map the segment status to your trip status in code. If the call says "confirmed" and the record says HL, store "Waitlisted" and alert a human.

Outcome-versus-record check: what the airline agent said on the call compared with the segment status in the booking, mapping HK, HL, KL and UC to trip statuses and alerts

The same rule applies to tickets. A rebooked segment without a reissued ticket is not travel-ready. Check the ticket number and coupon status too, not only the segment.

Failure 5: hanging up during long holds

Airline holds during weather events can run long. Your stack was tuned for short inbound calls. Three timers can end the call early.

  • Silence or idle timeouts. Many agent frameworks end a call after a stretch with no user speech. Hold music may not count as speech after noise suppression.
  • Max call duration. Twilio's changelog says it raised the maximum call length "from 4 hours to 24 hours" via a console setting. Check what your carrier, trunk and framework each enforce.
  • LLM turn triggers. VAD fires on hold music or the "your call is important" loop. The agent starts talking to a recording, or decides it reached voicemail.

Holds change capacity math. Use Little's law, L = λW. Say a storm cancels flights for 400 travelers in two hours. That is λ = 200 calls per hour. If each call averages 45 minutes of hold plus 10 of talk, W = 55 minutes. You need L = 200 × 55/60 ≈ 183 concurrent lines. These numbers are illustrative. Trunk and LLM rate limits must cover that peak.

A held call should not run a full LLM turn loop. Switch to a cheap "hold watcher" state that ignores music and wakes on a live greeting.

Illustrative 58-minute airline call timeline showing IVR, a long hold with announcements, where silence timeouts, voicemail detection and VAD misfires end calls, and live pickup

Failure 6: IVR navigation failures

Airline IVRs push callers to self-service. They ask for a code by speech or keypad, and may say "goodbye" after two misses.

Common failures include:

  • Speaking a locator to a speech IVR that expects keypad entry. Letters on a keypad need a scheme the IVR defines.
  • Choosing a menu option from a stale script after the airline changed its tree.

Script IVRs per airline and version them. Re-record the live tree on a schedule and diff it. Our guide to testing DTMF navigation covers digit timing and barge-in.

Failure 7: disclosing traveler PII to the wrong party

Your agent carries a lot of data: name, date of birth, passport number, frequent flyer number, phone and sometimes card details. It will share it with whoever answers.

Wrong parties are common. A misdial, a transfer to a partner airline, or a hotel switchboard can all pick up. Set three guards:

  • Dial only numbers from a maintained allowlist per supplier.
  • Confirm the supplier from the greeting before giving any data.
  • Release fields one at a time, only when asked, and never card numbers by voice.

Our post on voice agent PII leakage detection shows how to test for leaks.

Three legal questions come up when AI calls airlines. None has a single national answer. This is general information as of October 2026, not legal advice.

Saying it's an AI. California's bot law, Business and Professions Code 17941, bars using a bot online to mislead someone about its artificial identity in a commercial setting. Utah's 2025 SB 226 requires disclosure when a consumer clearly asks. Neither law was written for an agent calling an airline. Disclose anyway, at the start: "This is an automated assistant calling for a traveler." It costs one sentence and removes any question of misleading the person on the line.

Authority to act. Store a signed authorization for each traveler and each action type. Rebooking, refund requests and name corrections each need their own scope. Log which authorization covered each call.

Calling the traveler. Calls to the traveler are a different matter. The FCC ruled in February 2024 that AI-generated voices are "artificial" under the TCPA. Prior express consent applies to those calls. The FCC adopted FCC 26-67 on September 30, 2026. It lets callers scope an opt-out to the informational category. It takes effect 30 days after Federal Register publication, which had not happened as of early October 2026. See our outbound voice agent testing guide for the consent checks.

Guards in code: readback, offer check and write-back

Here is a simplified, framework-neutral sketch. Wire it to your own tool calls.

# Simplified sketch. Not tied to any framework or GDS API.
NATO = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", [
    "Alfa", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel",
    "India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa",
    "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey",
    "X-ray", "Yankee", "Zulu", "Zero", "One", "Two", "Three", "Four",
    "Five", "Six", "Seven", "Eight", "Nine"]))
E_SET = set("BCDEGPTVZ")

def spell(code: str) -> str:
    return ", ".join(NATO[c] for c in code.upper())

def readback_diff(expected: str, heard: str) -> list[int]:
    """Positions where the airline's readback differs (heard = normalized letters)."""
    if len(heard) != len(expected):
        return list(range(len(expected)))
    return [i for i, (a, b) in enumerate(zip(expected, heard)) if a != b]

def offer_ok(offer: dict, policy: dict) -> tuple[bool, str]:
    if offer["arrive"] > policy["latest_arrival"]:
        return False, "arrives after policy limit"
    if offer["connections"] > policy["max_connections"]:
        return False, "too many connections"
    if offer["fare_family"] in policy["blocked_fares"]:
        return False, "fare family not allowed"
    if offer["fare_diff"] > policy["max_fare_diff"]:
        return False, "fare difference needs approval"
    return True, "within policy"

STATUS = {"HK": "Confirmed", "HL": "Waitlisted",
          "KL": "Confirming from waitlist", "UC": "Not confirmed"}

def trip_status(segment_status: str, ticketed: bool) -> str:
    s = STATUS.get(segment_status, "Needs review")
    if s == "Confirmed" and not ticketed:
        return "Confirmed, ticket pending"
    return s

Example: `spell("QBX7DP")` returns "Quebec, Bravo, X-ray, Seven, Delta, Papa". `readback_diff("QBX7DP", "QBX7BP")` returns `[4]`, so the agent re-spells only "Delta". The status comes from the re-read record, never from the transcript.

The hard part is making the agent call these every time. Our post on tool-argument accuracy from speech goes deeper on that gap.

How to test an AI agent that calls airlines

When AI calls airlines in production, each call hits a real contact center. You can't test that way at scale. Build the airline side instead.

1. Write simulated airline agents. Script counterpart personas: a fast agent who mishears B and D, a slow one, one who offers basic economy first, one who pushes a travel credit, and one who says "you're on it" for a waitlist. Give each one a hidden truth record.

2. Build IVR fixtures. Record or script each supplier's menu tree, including the keypad-only code prompt and the "text you a link" branch. Version them, and diff against the live tree monthly.

3. Run hold-time tests. Play 5, 30, 60 and 90 minutes of hold music with periodic announcements. Pass means no hang-up, no talking to the recording, and a correct pickup on a live greeting.

4. Stress the readback. Use locators packed with E-set letters over 8 kHz audio, with noise and accents on the airline side. Pass means the airline's booking matches, or the agent re-spells until it does.

5. Check offers against policy. Feed offers just inside and just outside each policy limit. Pass means every outside offer gets "I need to check with the traveler."

6. Check outcome vs record. After each test call, compare the trip record with the counterpart's hidden truth. Status, ticket number, refund type and amount must all match.

7. Check disclosure and data release. Route some calls to a wrong-supplier greeting. Pass means zero personal fields spoken.

8. Set the bar and repeat. For zero-tolerance cases, use the rule of three. With zero failures in 300 runs, you can say the failure rate is below about 1% with 95% confidence.

Run each scenario on clean lines, noisy 8 kHz audio, accented airline agents and long holds. Every cell should pass before a prompt or flow change ships. See how to ship voice agent prompt changes safely for the release gate.

This is where synthetic callers fit. Evalgent generates test scenarios from your agent's prompt and flows, including its policies and hard constraints. Its caller profiles vary accent, pace, interruptions, response delay and background noise. It judges calls from the audio, not only the transcript. That matters when the question is whether "Delta" was actually said.

Monitoring airline calls in production

Testing catches what you thought of. Production shows you the rest of what happens when AI calls airlines.

Track these per supplier and per week:

  • Readback mismatch rate, and how often a re-spell fixed it
  • Hold abandonment: calls ended by your side before a human answered
  • Out-of-policy acceptances: offers accepted that the policy check would have rejected
  • Status disagreements: transcript says confirmed, record says otherwise
  • Credit vs refund mix, against what travelers asked for
  • PII spoken before supplier confirmation

Sample recordings, not only transcripts. Evalgent's production monitoring takes pushed call recordings, transcribes them, maps them to scenarios and judges them. It flags PII leakage, tool-call failures, latency spikes and policy failures with fix recommendations. For the general setup, see how to monitor voice agents in production.

Hotel calls fail the same silent way; see hotel AI reservation errors.

Frequently asked questions

Can an AI agent call an airline on your behalf?

An AI agent can call an airline on a traveler's behalf if the traveler has authorized it. It can wait on hold, navigate the IVR, authenticate with the record locator and request changes. Airlines may still require the traveler for some actions. Store the authorization, disclose that the caller is automated, and verify every outcome in the booking afterward.

How should an AI agent read a confirmation code to an airline?

An AI agent should spell a confirmation code with the NATO phonetic alphabet, one character at a time. It should then ask the airline agent to read it back and compare letter by letter. Letters like B, D, E and P sound alike on phone audio. Re-spell only the mismatched characters, then confirm the passenger name and flight.

What is the difference between a refund and a travel credit?

A refund returns money to the original form of payment. A travel credit is a voucher for future travel with the same airline. Under 14 CFR 260.6, a US carrier offering a credit instead of a refund must state the right to a full refund. The credit must stay valid for at least five years.

When is a refund automatic under the DOT rule?

Under 14 CFR 260.6, a refund is automatic when the airline cancels and offers no alternative, or the passenger rejects the alternative. It is also due if the passenger doesn't respond and the changed flight leaves without them. Card refunds are due within 7 business days. Other payments get 20 calendar days.

Does an AI caller have to say it is an AI?

No single US law covers an AI calling an airline. California's bot law targets online bots misleading people in commercial settings. Utah's SB 226 requires disclosure when a consumer clearly asks. Disclosing at the start of every call is the safest design. This is general information as of October 2026, not legal advice.

How long should an AI agent wait on hold?

An AI agent calling airlines should be able to wait as long as a human would, often an hour or more during disruptions. Raise silence and idle timeouts for the hold state. Check carrier and trunk call-duration limits. Use a low-cost hold watcher that ignores music and wakes only on a live human greeting.

How do you test an AI agent that calls airlines?

Test an airline-calling agent against simulated airline agents with hidden truth records. Add IVR fixtures, hold-time tests and readback stress tests using E-set letters on 8 kHz audio. Feed offers just outside policy. After each call, compare the trip record with the truth. Status, ticket and refund type must match.

How do you know if a rebooking is confirmed or waitlisted?

A rebooking's real status is in the booking record, not the call. Re-read the booking after the call and check the segment status code. HK means confirmed, HL means waitlisted, and UC means the airline could not confirm. Also check that a new ticket was issued before telling the traveler they are set.

The bottom line

When AI calls airlines, the call is only as good as the record it leaves behind. Spell codes with readback, check every offer and credit against policy in code, and write status only from the re-read booking.

Related Articles