Simulate Travel Transactions
Overview
Do not enter production data in the Highnote Test environment, which is for exploring features and training. Use only dummy or test data.
Travel merchants send enhanced data describing the purchase itself—the ticket, the itinerary, the folio, the rental agreement. Highnote surfaces that data on the transaction whenever a merchant provides it. You can use the Highnote API to simulate travel enhanced data in the Test environment. Simulating travel transactions helps test the following use cases and card product settings:
- Airline, lodging, car rental, rail, and travel agency enhanced data
- Itemized taxes, fees, and extra charges
- Refunds and reversals that carry enhanced data
- Per-network differences between Visa and Mastercard
- Spend rules and velocity controls on travel merchant category codes (MCCs)
This guide provides steps for simulating travel transactions using the Highnote API.
Prerequisites
- Review Transaction Lifecycle guide
- Review Simulate Transactions guide
- A Highnote account
- An API key or the API Explorer
- A commercial credit card product, financial account, and payment card
Merchant category codes
Travel enhanced data is reported by merchants operating under travel MCCs. For an overview of MCC-based spend controls, see Configure Spend Rules.
The following table maps the travel MCCs to the MerchantCategory value you pass in merchantDetails.category:
| CODE | DESCRIPTION | MERCHANTCATEGORY |
|---|---|---|
| 3003 – 3291 (selected codes) | Airlines, air carriers | AIRLINES_AIR_CARRIERS |
| 3356 – 3440 (selected codes) | Car rentals | CAR_RENTAL |
| 4112 | Passenger railways | PASSENGER_RAILWAYS |
| 4411 | Cruise lines | CRUISE_LINES |
| 4511 | Airlines, air carriers | AIRLINES_AIR_CARRIERS |
| 4722 | Travel agencies, tour operators | TRAVEL_AGENCIES_TOUR_OPERATORS |
| 5812 | Eating places, restaurants | EATING_PLACES_RESTAURANTS |
| 5814 | Fast food restaurants | FAST_FOOD_RESTAURANTS |
| 7011 | Hotels, motels, and resorts | HOTELS_MOTELS_AND_RESORTS |
| 7512 | Car rental agencies | CAR_RENTAL_AGENCIES |
| 7513 | Truck and utility trailer rentals | TRUCK_UTILITY_TRAILER_RENTALS |
The 3000-series codes are not contiguous. Many of them map to brand-specific MerchantCategory members instead—3357 is HERTZ and 3501 is HOLIDAY_INNS. When you pass one of the generic members above, Highnote sends the first MCC in that member's set, so AIRLINES_AIR_CARRIERS produces categoryCode 3003 rather than 4511.
Highnote does not validate the enhanced data type against the merchant category you supply. A simulation that attaches lodging data to an airline MCC succeeds, and the data is stored and returned as sent. Set merchantDetails.category to a category the data belongs to, so your simulated transactions match what you receive in Live.
Travel data by network
Travel enhanced data reaches Highnote through the additionalTransactionData field on a transaction event. That field is a list of the AdditionalTransactionData interface, so it can carry travel data, fleet data, or both. Discriminate on __typename and select the fields you need through an inline fragment.
Visa and Mastercard model travel data differently, and they deliver it at different points in the transaction lifecycle.
When travel data arrives
| Network | Data | When it arrives |
|---|---|---|
| Visa | One industry record per transaction | Authorization, reversal, clearing, or—for late Level 3 detail—an EnhancedDataEvent |
| Mastercard | All industry records together, in one wrapper | Clearing stream only, on a ClearingEvent or an EnhancedDataEvent |
You can set up a Notification Event to alert you when enhanced data has been added to a transaction.
For fuel, non-fuel, and other fleet-related enhanced data, see Simulate Fleet Transactions.
Visa travel data
Visa reports one industry record per transaction, and the three verticals are mutually exclusive. An event carries at most one of the following types:
VisaAirlineData— ticket number, fare, taxes and fees, travel agency, and per-leg itinerary detail inlegsVisaLodgingData— check-in and check-out dates, room nights, room rate, room tax, and extra-charge indicatorsVisaCarRentalData— days rented, daily and weekly rates, insurance, fuel, and extra-charge indicators
Visa data can arrive on an AuthorizationEvent, a ReversalEvent, or a ClearingEvent, depending on when the acquirer provides it.
It can also arrive later, out of band, on an EnhancedDataEvent—this is how Level 3 detail is typically delivered. Check all four so you capture it regardless of when it arrives.
Visa spells the same value differently on input and output. Most pairs follow the same rule—drop the Amount suffix, as with totalFare and totalFareAmount. These six do not:
| Read field | Input field |
|---|---|
foodAndBeverageChargeAmount | foodAndBeverageCharges |
folioCashAdvanceAmount | folioCashAdvances |
insuranceChargeAmount | insuranceCharges |
fuelChargeAmount | fuelCharges |
oneWayDropOffChargeAmount | oneWayDropOffCharges |
exchangeTicketAmount | exchangeTicketAmount |
The first five drop the suffix and pluralize; exchangeTicketAmount keeps the suffix on both sides. Check the type reference rather than transforming a name by rule, and do not reuse input field names in a response selection set. Mastercard has no such asymmetry: its input and read field names match.
Mastercard travel data
Mastercard reports every industry record together, under a single MastercardEnhancedTravelData wrapper. Its five industry fields populate independently:
passengerTransportData— a singleMastercardPassengerTransportDataobject holding the ticket-level details, with per-leg detail nested undertripLegsrailData— a list ofMastercardRailData, one element per trip legcarRentalData— a list ofMastercardCarRentalDatalodgingData— a list ofMastercardLodgingDatatravelAgencyData— a list ofMastercardTravelAgencyData
Only the fields the merchant reported are populated. An event that carries no travel records produces no MastercardEnhancedTravelData entry at all, so additionalTransactionData can be empty on a Mastercard clearing.
Mastercard transmits travel data only on the clearing message, never on an authorization or a reversal. Simulate it through simulateClearing or simulateRefund only. On the read side it arrives on a ClearingEvent or an EnhancedDataEvent, including the ClearingEvent a refund returns. Check both, because the event that carries the data depends on when the acquirer supplies it.
Two Mastercard details are worth noting when you read the data back. The wrapper's id is the id of the enhanced data record, so a single event reporting an airline ticket, a rail leg, and a hotel stay returns one wrapper with one id. And taxType returns null when the network reports a tax whose type it does not identify, so treat null as an expected value rather than an error.
Simulate an airline transaction
via Visa
Airline data covers the ticket and its itinerary. Highnote assigns legSequenceNumber from the order of the legs list, so you do not send it.
Use the following mutation to simulate an airline authorization with Visa:
SimulateVisaAirlineAuthorization
Query
mutation SimulateVisaAirlineAuthorization($input: SimulateAuthorizationInput!) {
simulateAuthorization(input: $input) {
... on AuthorizationEvent {
id
responseCode
merchantDetails {
category
categoryCode
name
}
transaction {
... on Node {
id
}
}
additionalTransactionData {
__typename
... on VisaAirlineData {
id
ticketNumber
ticketIssueDate
electronicTicketIndicator
travelAgencyCode
travelAgencyName
totalFareAmount {
value
currencyCode
}
totalTaxAmount {
value
currencyCode
}
totalFeeAmount {
value
currencyCode
}
legs {
legSequenceNumber
carrierCode
flightNumber
serviceClassCode
originationCityAirportCode
destinationCityAirportCode
departureDate
departureTime
arrivalTime
stopOverIndicator
fareBasisCode
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "cardId": "<PAYMENT_CARD_ID>", "amount": { "value": 45000, "currencyCode": "USD" }, "merchantDetails": { "merchantId": "000000000011111", "name": "HIGHNOTE AIRWAYS", "description": "HIGHNOTE AIRWAYS - SFO", "category": "AIRLINES_AIR_CARRIERS", "address": { "postalCode": "94128", "region": "CA", "locality": "San Francisco", "countryCodeAlpha3": "USA" } }, "pointOfServiceDetails": { "category": "ECOMMERCE", "cardDataInputCapability": "KEY_ENTERED", "panEntryMode": "MANUAL", "pinEntryMode": "NO_PIN_ENTRY_CAPABILITY", "terminalAttendance": "UNATTENDED", "isCardHolderPresent": false, "isCardPresent": false, "terminalSupportsPartialApproval": false, "isRecurring": false }, "transactionProcessingType": "PAYMENT_DEBIT", "additionalTransactionData": { "visaAirlineData": { "ticketNumber": "0161234567890", "ticketIssueDate": "2026-08-01", "electronicTicketIndicator": true, "internetIndicator": true, "restrictedTicketIndicator": false, "travelAgencyCode": "TA123", "travelAgencyName": "HIGHNOTE TRAVEL", "computerizedReservationSystemCode": "SABR", "totalFare": { "value": 39500, "currencyCode": "USD" }, "totalTax": { "value": 4200, "currencyCode": "USD" }, "totalFee": { "value": 1300, "currencyCode": "USD" }, "legs": [ { "carrierCode": "HN", "flightNumber": "0100", "serviceClassCode": "Y", "originationCityAirportCode": "SFO", "destinationCityAirportCode": "JFK", "departureDate": "2026-09-14", "departureTime": "0930", "arrivalTime": "1745", "stopOverIndicator": false, "fareBasisCode": "YCA14" }, { "carrierCode": "HN", "flightNumber": "0101", "serviceClassCode": "Y", "originationCityAirportCode": "JFK", "destinationCityAirportCode": "SFO", "departureDate": "2026-09-21", "departureTime": "1810", "arrivalTime": "2135", "stopOverIndicator": false, "fareBasisCode": "YCA14" } ] } } } }
Result
{
"data": {
"simulateAuthorization": {
"id": "<TRANSACTION_EVENT_ID>",
"responseCode": "APPROVED",
"merchantDetails": {
"category": "AIRLINES_AIR_CARRIERS",
"categoryCode": "3003",
"name": "HIGHNOTE AIRWAYS"
},
"transaction": {
"id": "<TRANSACTION_ID>"
},
"additionalTransactionData": [
{
"__typename": "VisaAirlineData",
"id": "<ENHANCED_DATA_ID>",
"ticketNumber": "0161234567890",
"ticketIssueDate": "2026-08-01",
"electronicTicketIndicator": true,
"travelAgencyCode": "TA123",
"travelAgencyName": "HIGHNOTE TRAVEL",
"totalFareAmount": {
"value": 39500,
"currencyCode": "USD"
},
"totalTaxAmount": {
"value": 4200,
"currencyCode": "USD"
},
"totalFeeAmount": {
"value": 1300,
"currencyCode": "USD"
},
"legs": [
{
"legSequenceNumber": 1,
"carrierCode": "HN",
"flightNumber": "0100",
"serviceClassCode": "Y",
"originationCityAirportCode": "SFO",
"destinationCityAirportCode": "JFK",
"departureDate": "2026-09-14",
"departureTime": "0930",
"arrivalTime": "1745",
"stopOverIndicator": false,
"fareBasisCode": "YCA14"
},
{
"legSequenceNumber": 2,
"carrierCode": "HN",
"flightNumber": "0101",
"serviceClassCode": "Y",
"originationCityAirportCode": "JFK",
"destinationCityAirportCode": "SFO",
"departureDate": "2026-09-21",
"departureTime": "1810",
"arrivalTime": "2135",
"stopOverIndicator": false,
"fareBasisCode": "YCA14"
}
]
}
]
}
},
"extensions": {
"requestId": "<REQUEST_ID>"
}
}
via Mastercard
Mastercard reports airline purchases as passenger transport data. See Simulate a clearing with Mastercard, which carries passenger transport data alongside the other four industries.
Simulate a lodging transaction
via Visa
Lodging data describes the stay and the folio. The extraCharge* indicators are individual booleans rather than a single code, so set each one you want to report.
Use the following mutation to simulate a lodging clearing with Visa:
SimulateVisaLodgingClearing
Query
mutation SimulateVisaLodgingClearing($input: SimulateClearingInput!) {
simulateClearing(input: $input) {
... on ClearingEvent {
id
responseCode
merchantDetails {
category
categoryCode
name
}
transaction {
... on Node {
id
}
}
additionalTransactionData {
__typename
... on VisaLodgingData {
id
checkInDate
checkOutDate
roomNights
serviceDate
noShowIndicator
purchaseIdentifier
averageDailyRoomRateAmount {
value
currencyCode
}
totalRoomTaxAmount {
value
currencyCode
}
totalTaxAmount {
value
currencyCode
}
foodAndBeverageChargeAmount {
value
currencyCode
}
prepaidExpensesAmount {
value
currencyCode
}
folioCashAdvanceAmount {
value
currencyCode
}
extraChargeRestaurantIndicator
extraChargeGiftShopIndicator
extraChargeMinibarIndicator
extraChargeTelephoneIndicator
extraChargeLaundryIndicator
extraChargeOtherIndicator
localTaxIndicator
localTaxAmount {
value
currencyCode
}
nationalTaxIndicator
nationalTaxAmount {
value
currencyCode
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "transactionId": "<TRANSACTION_ID>", "merchantDetails": { "merchantId": "000000000011111", "name": "HIGHNOTE HOTEL SF", "description": "HIGHNOTE HOTEL - SF", "category": "HOTELS_MOTELS_AND_RESORTS", "address": { "postalCode": "94105", "region": "CA", "locality": "San Francisco", "countryCodeAlpha3": "USA" } }, "pointOfServiceDetails": { "category": "ECOMMERCE", "cardDataInputCapability": "KEY_ENTERED", "panEntryMode": "MANUAL", "pinEntryMode": "NO_PIN_ENTRY_CAPABILITY", "terminalAttendance": "UNATTENDED", "isCardHolderPresent": false, "isCardPresent": false, "terminalSupportsPartialApproval": false, "isRecurring": false }, "transactionProcessingType": "PAYMENT_DEBIT", "additionalTransactionData": { "visaLodgingData": { "checkInDate": "2026-09-14", "checkOutDate": "2026-09-17", "roomNights": 3, "serviceDate": "2026-09-14", "noShowIndicator": false, "purchaseIdentifier": "FOLIO-88213", "averageDailyRoomRate": { "value": 25000, "currencyCode": "USD" }, "totalRoomTax": { "value": 9000, "currencyCode": "USD" }, "totalTax": { "value": 11250, "currencyCode": "USD" }, "foodAndBeverageCharges": { "value": 6400, "currencyCode": "USD" }, "prepaidExpenses": { "value": 0, "currencyCode": "USD" }, "folioCashAdvances": { "value": 0, "currencyCode": "USD" }, "extraChargeRestaurantIndicator": true, "extraChargeGiftShopIndicator": false, "extraChargeMinibarIndicator": true, "extraChargeTelephoneIndicator": false, "extraChargeLaundryIndicator": false, "extraChargeOtherIndicator": false, "localTaxIndicator": true, "localTax": { "value": 2250, "currencyCode": "USD" }, "nationalTaxIndicator": false, "merchantPostalCode": "94105", "timeOfPurchase": "1102", "customerReferenceNumber": "CRN-4471" } } } }
Result
{
"data": {
"simulateClearing": {
"id": "<TRANSACTION_EVENT_ID>",
"responseCode": "APPROVED",
"merchantDetails": {
"category": "HOTELS_MOTELS_AND_RESORTS",
"categoryCode": "7011",
"name": "HIGHNOTE HOTEL SF"
},
"transaction": {
"id": "<TRANSACTION_ID>"
},
"additionalTransactionData": [
{
"__typename": "VisaLodgingData",
"id": "<ENHANCED_DATA_ID>",
"checkInDate": "2026-09-14",
"checkOutDate": "2026-09-17",
"roomNights": 3,
"serviceDate": "2026-09-14",
"noShowIndicator": false,
"purchaseIdentifier": "FOLIO-88213",
"averageDailyRoomRateAmount": {
"value": 25000,
"currencyCode": "USD"
},
"totalRoomTaxAmount": {
"value": 9000,
"currencyCode": "USD"
},
"totalTaxAmount": {
"value": 11250,
"currencyCode": "USD"
},
"foodAndBeverageChargeAmount": {
"value": 6400,
"currencyCode": "USD"
},
"prepaidExpensesAmount": {
"value": 0,
"currencyCode": "USD"
},
"folioCashAdvanceAmount": {
"value": 0,
"currencyCode": "USD"
},
"extraChargeRestaurantIndicator": true,
"extraChargeGiftShopIndicator": false,
"extraChargeMinibarIndicator": true,
"extraChargeTelephoneIndicator": false,
"extraChargeLaundryIndicator": false,
"extraChargeOtherIndicator": false,
"localTaxIndicator": true,
"localTaxAmount": {
"value": 2250,
"currencyCode": "USD"
},
"nationalTaxIndicator": false,
"nationalTaxAmount": null
}
]
}
},
"extensions": {
"requestId": "<REQUEST_ID>"
}
}
via Mastercard
Mastercard reports lodging as a list under lodgingData. See Simulate a refund with Mastercard for a lodging-only example.
Simulate a car rental transaction
via Visa
Car rental data describes the rental agreement. Daily and weekly rates are separate fields rather than a rate plus a frequency code.
Use the following mutation to simulate a car rental reversal with Visa:
SimulateVisaCarRentalReversal
Query
mutation SimulateVisaCarRentalReversal($input: SimulateReversalInput!) {
simulateReversal(input: $input) {
... on ReversalEvent {
id
responseCode
merchantDetails {
category
categoryCode
name
}
transaction {
... on Node {
id
}
}
additionalTransactionData {
__typename
... on VisaCarRentalData {
id
daysRented
carClassCode
serviceDate
noShowIndicator
purchaseIdentifier
dailyRentalRateAmount {
value
currencyCode
}
weeklyRentalRateAmount {
value
currencyCode
}
insuranceChargeAmount {
value
currencyCode
}
fuelChargeAmount {
value
currencyCode
}
oneWayDropOffChargeAmount {
value
currencyCode
}
extraChargeGasIndicator
extraChargeMileageIndicator
extraChargeLateReturnIndicator
extraChargeOneWayIndicator
extraChargeParkingViolationIndicator
localTaxIndicator
localTaxAmount {
value
currencyCode
}
nationalTaxIndicator
nationalTaxAmount {
value
currencyCode
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "transactionId": "<TRANSACTION_ID>", "merchantDetails": { "merchantId": "000000000011111", "name": "HIGHNOTE CAR RENTAL", "description": "HIGHNOTE CAR RENTAL - OAK", "category": "CAR_RENTAL_AGENCIES", "address": { "postalCode": "94621", "region": "CA", "locality": "Oakland", "countryCodeAlpha3": "USA" } }, "pointOfServiceDetails": { "category": "ECOMMERCE", "cardDataInputCapability": "KEY_ENTERED", "panEntryMode": "MANUAL", "pinEntryMode": "NO_PIN_ENTRY_CAPABILITY", "terminalAttendance": "UNATTENDED", "isCardHolderPresent": false, "isCardPresent": false, "terminalSupportsPartialApproval": false, "isRecurring": false }, "transactionProcessingType": "PAYMENT_DEBIT", "additionalTransactionData": { "visaCarRentalData": { "daysRented": 5, "carClassCode": "ICAR", "serviceDate": "2026-09-14", "noShowIndicator": false, "purchaseIdentifier": "RA-770145", "dailyRentalRate": { "value": 4500, "currencyCode": "USD" }, "insuranceCharges": { "value": 3500, "currencyCode": "USD" }, "fuelCharges": { "value": 2800, "currencyCode": "USD" }, "oneWayDropOffCharges": { "value": 7500, "currencyCode": "USD" }, "extraChargeGasIndicator": true, "extraChargeMileageIndicator": false, "extraChargeLateReturnIndicator": false, "extraChargeOneWayIndicator": true, "extraChargeParkingViolationIndicator": false, "localTaxIndicator": true, "localTax": { "value": 1980, "currencyCode": "USD" }, "nationalTaxIndicator": false, "merchantPostalCode": "94621", "timeOfPurchase": "1615" } } } }
Result
{
"data": {
"simulateReversal": {
"id": "<TRANSACTION_EVENT_ID>",
"responseCode": "APPROVED",
"merchantDetails": {
"category": "CAR_RENTAL_AGENCIES",
"categoryCode": "7512",
"name": "HIGHNOTE CAR RENTAL"
},
"transaction": {
"id": "<TRANSACTION_ID>"
},
"additionalTransactionData": [
{
"__typename": "VisaCarRentalData",
"id": "<ENHANCED_DATA_ID>",
"daysRented": 5,
"carClassCode": "ICAR",
"serviceDate": "2026-09-14",
"noShowIndicator": false,
"purchaseIdentifier": "RA-770145",
"dailyRentalRateAmount": {
"value": 4500,
"currencyCode": "USD"
},
"weeklyRentalRateAmount": null,
"insuranceChargeAmount": {
"value": 3500,
"currencyCode": "USD"
},
"fuelChargeAmount": {
"value": 2800,
"currencyCode": "USD"
},
"oneWayDropOffChargeAmount": {
"value": 7500,
"currencyCode": "USD"
},
"extraChargeGasIndicator": true,
"extraChargeMileageIndicator": false,
"extraChargeLateReturnIndicator": false,
"extraChargeOneWayIndicator": true,
"extraChargeParkingViolationIndicator": false,
"localTaxIndicator": true,
"localTaxAmount": {
"value": 1980,
"currencyCode": "USD"
},
"nationalTaxIndicator": false,
"nationalTaxAmount": null
}
]
}
},
"extensions": {
"requestId": "<REQUEST_ID>"
}
}
via Mastercard
Mastercard describes the two ends of the rental separately: rentalCheckout is a MastercardRentalCheckout and rentalReturn is a MastercardRentalReturn.
Both carry the same five fields—city, stateOrProvince, country, locationIdentifier, and date.
country is an ISO3166Alpha3Country and date is a Date, not strings.
Mastercard also reports the rate frequency in a separate rentalRateFrequency field of type MastercardRentalRateFrequency, rather than inferring it from which rate field is populated as Visa does. See Simulate a clearing with Mastercard.
Simulate a clearing
via Visa
Visa clearing carries at most one industry record. See Simulate a lodging transaction via Visa for a clearing example, and swap visaLodgingData for visaAirlineData or visaCarRentalData to simulate a different vertical.
via Mastercard
Mastercard transmits travel data only on the clearing message, never on an authorization or a reversal, as noted above. All five industry records travel together in one mastercardEnhancedTravelData value, so a single mutation can report an airline ticket, a rail leg, a car rental, a hotel stay, and a travel agency fee at once.
Use the following mutation to simulate a travel clearing with Mastercard:
SimulateMastercardTravelClearing
Query
mutation SimulateMastercardTravelClearing($input: SimulateClearingInput!) {
simulateClearing(input: $input) {
... on ClearingEvent {
id
responseCode
merchantDetails {
category
categoryCode
name
}
transaction {
... on Node {
id
}
}
additionalTransactionData {
__typename
... on MastercardEnhancedTravelData {
id
passengerTransportData {
ticketNumber
issuingCarrier
totalFareAmount {
value
currencyCode
}
totalTaxesAmount {
value
currencyCode
}
totalFeeAmount {
value
currencyCode
}
tripLegs {
travelDate
carrierCode
flightNumber
serviceClassCode
originationCityAirportCode
destinationCityAirportCode
departureTime
arrivalTime
fareAmount {
value
currencyCode
}
}
}
railData {
ticketNumber
startStation
destinationStation
ticketClass
}
carRentalData {
rentalAgreementNumber
rentalRateFrequency
rentalRateAmount {
value
currencyCode
}
rentalCheckout {
city
stateOrProvince
country
locationIdentifier
date
}
rentalReturn {
city
stateOrProvince
country
locationIdentifier
date
}
detailTaxAmounts {
taxType
taxAmount {
value
currencyCode
}
}
}
lodgingData {
folioNumber
arrivalDate
departureDate
totalAmountChargedOnCreditCard {
value
currencyCode
}
}
travelAgencyData {
travelAgencySequenceNumber
travelAgencyFeeDescription
travelAgencyFeeAmount {
value
currencyCode
}
customIdentifier {
customIdentifierType
customIdentifierValue
}
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "transactionId": "<TRANSACTION_ID>", "merchantDetails": { "merchantId": "000000000011111", "name": "HIGHNOTE AIRWAYS", "description": "HIGHNOTE AIRWAYS - SFO", "category": "AIRLINES_AIR_CARRIERS", "address": { "postalCode": "94128", "region": "CA", "locality": "San Francisco", "countryCodeAlpha3": "USA" } }, "pointOfServiceDetails": { "category": "ECOMMERCE", "cardDataInputCapability": "KEY_ENTERED", "panEntryMode": "MANUAL", "pinEntryMode": "NO_PIN_ENTRY_CAPABILITY", "terminalAttendance": "UNATTENDED", "isCardHolderPresent": false, "isCardPresent": false, "terminalSupportsPartialApproval": false, "isRecurring": false }, "transactionProcessingType": "PAYMENT_DEBIT", "additionalTransactionData": { "mastercardEnhancedTravelData": { "passengerTransportData": { "ticketNumber": "0017890123456", "issuingCarrier": "HN", "totalFareAmount": { "value": 39500, "currencyCode": "USD" }, "totalTaxesAmount": { "value": 4200, "currencyCode": "USD" }, "totalFeeAmount": { "value": 1300, "currencyCode": "USD" }, "tripLegs": [ { "travelDate": "2026-09-14", "carrierCode": "HN", "flightNumber": "0100", "serviceClassCode": "Y", "originationCityAirportCode": "SFO", "destinationCityAirportCode": "JFK", "departureTime": "0930", "arrivalTime": "1745", "fareAmount": { "value": 39500, "currencyCode": "USD" } } ] }, "railData": [ { "ticketNumber": "9912345678", "startStation": "Union Station", "destinationStation": "Penn Station", "ticketClass": "1" } ], "carRentalData": [ { "rentalAgreementNumber": "RA-770145", "rentalRateFrequency": "DAILY", "rentalRateAmount": { "value": 5000, "currencyCode": "USD" }, "rentalCheckout": { "city": "Oakland", "stateOrProvince": "CA", "country": "USA", "locationIdentifier": "OAK01", "date": "2026-09-14" }, "rentalReturn": { "city": "San Francisco", "stateOrProvince": "CA", "country": "USA", "locationIdentifier": "SFO01", "date": "2026-09-19" }, "detailTaxAmounts": [ { "taxType": "STATE_SALES_TAX", "taxAmount": { "value": 1980, "currencyCode": "USD" } } ] } ], "lodgingData": [ { "folioNumber": "FOLIO-88213", "arrivalDate": "2026-09-14", "departureDate": "2026-09-17", "totalAmountChargedOnCreditCard": { "value": 80000, "currencyCode": "USD" } } ], "travelAgencyData": [ { "travelAgencySequenceNumber": "1", "travelAgencyFeeDescription": "Booking fee", "travelAgencyFeeAmount": { "value": 500, "currencyCode": "USD" }, "customIdentifier": { "customIdentifierType": "RECORD_LOCATOR", "customIdentifierValue": "LOC-1" } } ] } } } }
Result
{
"data": {
"simulateClearing": {
"id": "<TRANSACTION_EVENT_ID>",
"responseCode": "APPROVED",
"merchantDetails": {
"category": "AIRLINES_AIR_CARRIERS",
"categoryCode": "3003",
"name": "HIGHNOTE AIRWAYS"
},
"transaction": {
"id": "<TRANSACTION_ID>"
},
"additionalTransactionData": [
{
"__typename": "MastercardEnhancedTravelData",
"id": "<ENHANCED_DATA_ID>",
"passengerTransportData": {
"ticketNumber": "0017890123456",
"issuingCarrier": "HN",
"totalFareAmount": {
"value": 39500,
"currencyCode": "USD"
},
"totalTaxesAmount": {
"value": 4200,
"currencyCode": "USD"
},
"totalFeeAmount": {
"value": 1300,
"currencyCode": "USD"
},
"tripLegs": [
{
"travelDate": "2026-09-14",
"carrierCode": "HN",
"flightNumber": "0100",
"serviceClassCode": "Y",
"originationCityAirportCode": "SFO",
"destinationCityAirportCode": "JFK",
"departureTime": "0930",
"arrivalTime": "1745",
"fareAmount": {
"value": 39500,
"currencyCode": "USD"
}
}
]
},
"railData": [
{
"ticketNumber": "9912345678",
"startStation": "Union Station",
"destinationStation": "Penn Station",
"ticketClass": "1"
}
],
"carRentalData": [
{
"rentalAgreementNumber": "RA-770145",
"rentalRateFrequency": "DAILY",
"rentalRateAmount": {
"value": 5000,
"currencyCode": "USD"
},
"rentalCheckout": {
"city": "Oakland",
"stateOrProvince": "CA",
"country": "USA",
"locationIdentifier": "OAK01",
"date": "2026-09-14"
},
"rentalReturn": {
"city": "San Francisco",
"stateOrProvince": "CA",
"country": "USA",
"locationIdentifier": "SFO01",
"date": "2026-09-19"
},
"detailTaxAmounts": [
{
"taxType": "STATE_SALES_TAX",
"taxAmount": {
"value": 1980,
"currencyCode": "USD"
}
}
]
}
],
"lodgingData": [
{
"folioNumber": "FOLIO-88213",
"arrivalDate": "2026-09-14",
"departureDate": "2026-09-17",
"totalAmountChargedOnCreditCard": {
"value": 80000,
"currencyCode": "USD"
}
}
],
"travelAgencyData": [
{
"travelAgencySequenceNumber": "1",
"travelAgencyFeeDescription": "Booking fee",
"travelAgencyFeeAmount": {
"value": 500,
"currencyCode": "USD"
},
"customIdentifier": {
"customIdentifierType": "RECORD_LOCATOR",
"customIdentifierValue": "LOC-1"
}
}
]
}
]
}
},
"extensions": {
"requestId": "<REQUEST_ID>"
}
}
Simulate a refund
via Visa
SimulateRefundInput accepts additionalTransactionData, so a refund can carry Visa airline, lodging, or car rental data using the same input shape shown in Simulate a lodging transaction via Visa. Send the vertical that matches the original purchase.
via Mastercard
A refund is transmitted on the same clearing message as a purchase and returns the same ClearingEvent type, so it accepts Mastercard travel data. Amounts that represent a credit are signed, so a refunded charge is a negative value.
Use the following mutation to simulate a travel refund with Mastercard:
SimulateMastercardTravelRefund
Query
mutation SimulateMastercardTravelRefund($input: SimulateRefundInput!) {
simulateRefund(input: $input) {
... on ClearingEvent {
id
responseCode
merchantDetails {
category
categoryCode
name
}
transaction {
... on Node {
id
}
}
additionalTransactionData {
__typename
... on MastercardEnhancedTravelData {
id
lodgingData {
folioNumber
arrivalDate
departureDate
roomRateAmount {
value
currencyCode
}
totalAmountChargedOnCreditCard {
value
currencyCode
}
customIdentifier {
customIdentifierType
customIdentifierValue
}
}
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "transactionId": "<TRANSACTION_ID>", "merchantDetails": { "merchantId": "000000000011111", "name": "HIGHNOTE HOTEL SF", "description": "HIGHNOTE HOTEL - SF", "category": "HOTELS_MOTELS_AND_RESORTS", "address": { "postalCode": "94105", "region": "CA", "locality": "San Francisco", "countryCodeAlpha3": "USA" } }, "pointOfServiceDetails": { "category": "ECOMMERCE", "cardDataInputCapability": "KEY_ENTERED", "panEntryMode": "MANUAL", "pinEntryMode": "NO_PIN_ENTRY_CAPABILITY", "terminalAttendance": "UNATTENDED", "isCardHolderPresent": false, "isCardPresent": false, "terminalSupportsPartialApproval": false, "isRecurring": false }, "transactionProcessingType": "RETURNS", "additionalTransactionData": { "mastercardEnhancedTravelData": { "lodgingData": [ { "folioNumber": "FOLIO-88213", "arrivalDate": "2026-09-14", "departureDate": "2026-09-17", "roomRateAmount": { "value": 25000, "currencyCode": "USD" }, "totalAmountChargedOnCreditCard": { "value": -25000, "currencyCode": "USD" }, "customIdentifier": { "customIdentifierType": "FOLIO_NUMBER", "customIdentifierValue": "FOLIO-88213" } } ] } } } }
Result
{
"data": {
"simulateRefund": {
"id": "<TRANSACTION_EVENT_ID>",
"responseCode": "APPROVED",
"merchantDetails": {
"category": "HOTELS_MOTELS_AND_RESORTS",
"categoryCode": "7011",
"name": "HIGHNOTE HOTEL SF"
},
"transaction": {
"id": "<TRANSACTION_ID>"
},
"additionalTransactionData": [
{
"__typename": "MastercardEnhancedTravelData",
"id": "<ENHANCED_DATA_ID>",
"lodgingData": [
{
"folioNumber": "FOLIO-88213",
"arrivalDate": "2026-09-14",
"departureDate": "2026-09-17",
"roomRateAmount": {
"value": 25000,
"currencyCode": "USD"
},
"totalAmountChargedOnCreditCard": {
"value": -25000,
"currencyCode": "USD"
},
"customIdentifier": {
"customIdentifierType": "FOLIO_NUMBER",
"customIdentifierValue": "FOLIO-88213"
}
}
]
}
]
}
},
"extensions": {
"requestId": "<REQUEST_ID>"
}
}
Read travel data back
additionalTransactionData is a heterogeneous list, so a consumer must discriminate on __typename before selecting fields.
In Live, Visa Level 3 data, which is the line-item detail an acquirer sends after the transaction, and Mastercard enhanced data arrive after the original authorization, so query the transaction event again rather than relying on the response to the authorization.
Enhanced data that arrives out of band lands on an EnhancedDataEvent rather than on the original authorization or clearing.
The following query discriminates the four event types this page simulates travel data on.
The fragment is shared across all four branches, so each selects every travel type; combinations the tables above rule out simply return nothing.
EnhancedDataEvent exposes a merchantDetails field, but it is always null on that type, so the query omits it there.
Use the following query to read travel enhanced data from a transaction event:
FindTravelEnhancedData
Query
query FindTravelEnhancedData($id: ID!) {
node(id: $id) {
__typename
... on ClearingEvent {
id
merchantDetails {
category
categoryCode
}
additionalTransactionData {
...TravelEnhancedData
}
}
... on EnhancedDataEvent {
id
additionalTransactionData {
...TravelEnhancedData
}
}
... on AuthorizationEvent {
id
merchantDetails {
category
categoryCode
}
additionalTransactionData {
...TravelEnhancedData
}
}
... on ReversalEvent {
id
merchantDetails {
category
categoryCode
}
additionalTransactionData {
...TravelEnhancedData
}
}
}
}
fragment TravelEnhancedData on AdditionalTransactionData {
__typename
... on VisaAirlineData {
id
ticketNumber
totalFareAmount {
value
currencyCode
}
legs {
legSequenceNumber
carrierCode
flightNumber
originationCityAirportCode
destinationCityAirportCode
}
}
... on VisaLodgingData {
id
checkInDate
checkOutDate
roomNights
averageDailyRoomRateAmount {
value
currencyCode
}
}
... on VisaCarRentalData {
id
daysRented
carClassCode
dailyRentalRateAmount {
value
currencyCode
}
}
... on MastercardEnhancedTravelData {
id
passengerTransportData {
ticketNumber
issuingCarrier
totalFareAmount {
value
currencyCode
}
totalTaxesAmount {
value
currencyCode
}
totalFeeAmount {
value
currencyCode
}
}
railData {
ticketNumber
startStation
destinationStation
}
carRentalData {
rentalAgreementNumber
rentalRateFrequency
rentalCheckout {
city
stateOrProvince
country
locationIdentifier
date
}
rentalReturn {
city
stateOrProvince
country
locationIdentifier
date
}
}
lodgingData {
folioNumber
arrivalDate
departureDate
}
travelAgencyData {
travelAgencySequenceNumber
travelAgencyFeeDescription
}
}
}
Variables
{ "id": "<TRANSACTION_EVENT_ID>" }
Result
{
"data": {
"node": {
"__typename": "EnhancedDataEvent",
"id": "<TRANSACTION_EVENT_ID>",
"additionalTransactionData": [
{
"__typename": "MastercardEnhancedTravelData",
"id": "<ENHANCED_DATA_ID>",
"passengerTransportData": {
"ticketNumber": "0017890123456",
"issuingCarrier": "HN",
"totalFareAmount": {
"value": 39500,
"currencyCode": "USD"
},
"totalTaxesAmount": {
"value": 4200,
"currencyCode": "USD"
},
"totalFeeAmount": {
"value": 1300,
"currencyCode": "USD"
}
},
"railData": [
{
"ticketNumber": "9912345678",
"startStation": "Union Station",
"destinationStation": "Penn Station"
}
],
"carRentalData": null,
"lodgingData": null,
"travelAgencyData": null
}
]
}
},
"extensions": {
"requestId": "<REQUEST_ID>"
}
}
Errors and limitations
The following behaviors apply when you simulate travel enhanced data:
| Behavior | Result |
|---|---|
More than one industry type in a single additionalTransactionData value | Rejected. The input accepts exactly one of its fields. |
mastercardEnhancedTravelData on simulateAuthorization, simulateReversal, or simulateSingleStepAuthAndClear | UserError with code INVALID_INPUT |
visaAirlineData, visaLodgingData, or visaCarRentalData on simulateSingleStepAuthAndClear | Accepted and forwarded, but AuthorizationAndClearEvent does not expose additionalTransactionData at all |
Enhanced data type that does not match merchantDetails.category | Accepted. Highnote does not validate the pairing. |
| A field the merchant did not report | Returns null. Lists return null rather than an empty list. |
Simulation confirms that your integration accepts and reads travel enhanced data correctly. It does not model whether a given acquirer sends the data in Live, or whether a transaction qualifies for commercial interchange. In Live, enhanced data exists only when the acquirer provides it.
Automate your integration
To automate your integration, subscribe to the following notification events:
- Payment card authorization
- Payment authorization and clear
- Payment card cleared
- Payment card transaction enhanced data
The details provided in the payloads from these events can be used for the following use cases:
- Automate your application or website's transaction processing workflows
- Create account holder notifications and alerts