Skip Navigation

eCommerce Support of External Non-air Ancillary Catalogs

Digital Connect allows airlines to sell 3rd party products such as insurance, hotels, cars, etc. in path and to offer one shopping cart solution.

This feature is designed to let airlines partner with any content aggregator and orchestrate necessary service calls so that an airline can not only book 3rd party products outside of the Digital Connect flow, but also remain the Merchant of Record by adding the 3rd party product to the Digital Connect flow as an ancillary with custom price and fulfilling it as an EMD.

This feature applies to the following paths:

  • The Revenue Flow (B2C);
  • Manage Your Booking – Modify Trip Options Flow (MYB: MTO);
  • Manage Your Booking – Book Now Pay Later Flow (MYB: BNPL).

Prerequisites:

Airline needs to enable Modify Ancillary Price and provide specific list of ancillary codes that will be used to price and fulfill non-air ancillary content.

Limitations:

  • Airline must be a Merchant of Record (MOR) for these ancillaries.
  • This feature is not available for Seat Shopping.
  • The currency used in the ancillary shopping call must be the same as the one use during ancillary selection call.

Booking flows where modification of ancillaries will not be permitted are:

  • Agency Portal;
  • The Redemption Flow (RBE);
  • Points in Flat Free Upgrade Flow (FFU) and Frequent Flyer Upgrade Flow (FQTU);
  • Manage Your Booking – Modify Trip Options Flow (MTO) in points;
  • Manage Your Booking – Change Itinerary Flow (MYB:CI) for redemption bookings and revenue bookings;
  • Stateless Ancillary Service.

Highlights

The Revenue Flow (B2C)

  1. The airline obtains search criteria from the passenger and submits a /products/air/search request, POST operation to get a list of flights matching the search criteria.
  2. Airline UI displays the returned flights to the passenger on the Flights page.
  3. The passenger selects a flight.
  4. After the passenger selects one or more flights, the airline submits the /products/air POST operation to add the flight(s) to the itinerary and store the itinerary in the session.
  5. The airline prompts passenger for passenger details: first name/name/gender, date of birth, phone number, email address etc.
  6. The airline uses /passengers POST to add passenger to the itinerary.
  7. The airline calls /products/ancillaries GET to obtain list of ancillaries available for the currently selected itinerary.
  8. After a user selects an ancillary the airline calls /products/ancillaries POST to add selected ancillaries to the itinerary.
    • in products/ancillaries service POST operation airline includes price of ancillary in the request based on actual price of the non-air ancillary (hotel, car, insurance, etc.);
    • optionally, the GET /products/ancillaries call is sent with new selected quantity.
    • when the consecutive POST /products/ancillaries call with new quantity is sent and:
      • if new price is not sent then the original price obtained from initial shopping request (GET /products/ancillaries) is used for the whole quantity;
      •  if new price is sent, the original price for the entire quantity is overridden with the new price sent in POST/products/ancillaries call
  9. The airline calls /products GET operation to obtain current list, with prices of products that the passenger has added to the itinerary and use this information to build and display a shopping cart.
    • New feature: the service ensures that the non-air ancillaries are added correctly with their new price.
  10. The shopping cart is updated.
  11. When the passenger indicates that shopping is complete the airline obtains available payment options for the current itinerary by calling GET /paymentOptions. The airline can format the information for display to the passenger.
  12. When the passenger indicates that shopping is complete the airline obtains available payment options for the current itinerary by calling GET /paymentOptions. The airline can format the information for display to the passenger.
  13. The confirmation page is displayed.
  14. The airlines submit a /pnr GET request. The airline can format the information for display to the passenger.

The Manage Your Booking - Modify Trip Options Flow (MYB: MTO)

  1. The passenger retrieves a booking either by supplying basic PNR information or by logging into the passenger’s account. If the passenger is logged in all their reservations are visible.
  2. The /pnr service GET operation returns information for the PNR specified in the parameters. Airlines can prompt passengers for information that identifies a PNR, to retrieve the information and format it for display to the passenger (optional step).
  3. The airline retrieves PNR information and initializes Manage Your Booking – Modify Trip Options (MYB: MTO) Flow (with verification of MYB Rules) by calling:
    • /pnr/mto/ancillaries – for Ancillaries flow – where the passenger can manage ancillaries and seats.
  4. The airline calls /pnr/mto/products/ancillaries GET to obtain list of ancillaries available for the currently selected itinerary.
  5. After ancillary selection the airline calls /products/ancillaries POST to add selected ancillaries to the itinerary.
    • in products/ancillaries service POST operation airline includes price of ancillary in the request based on actual price of the non-air ancillary (hotel, car, insurance, etc.);
    • optionally, the GET /products/ancillaries call is sent with new selected quantity;
    • when the consecutive POST /products/ancillaries call with new quantity is sent and:
      • if new price is not sent then the original price obtained from initial shopping request (GET /products/ancillaries) is used for the whole quantity;
      •  if new price is sent, the original price for the entire quantity is overridden with the new price sent in POST/products/ancillaries call
  6. If ancillaries operation is successful, the airline calls /pnr/mto/products GET to update the selection associated to passenger and the shopping cart with new price of the selected non-air ancillaries.
    • New feature: the service ensures that the non-air ancillaries are added correctly with their new price.
  7. The shopping cart is updated.
  8. When the passenger indicates that shopping is complete the airline obtains available payment options for the current itinerary by calling /pnr/mto/paymentOptions GET. The airline can format the information for display to the passenger.
  9. When the passenger selects form of payment, completes the payment and decides to purchase, the airline initiates the purchase and ticketing process by calling /pnr/mto/purchase POST. If payment is successful, the PNR and other supporting documents are issued, and the airline’s application receives results indicating success..
    • The /pnr/mto/purchase POST service also adds specific remarks to the PNR on the price(s) of given ancillary(ies).
  10. The response indicates whether the purchase is successful. The airline formats this information for display to the passenger.

The Manage Your Booking - Book Now Pay Later Flow (MYB: BNPL)

  1. The passenger retrieves a booking either by supplying basic PNR information or by logging into the passenger’s account. If the passenger is logged in all their reservations are visible.
  2. The /pnr/bnpl service GET operation returns information for the PNR specified in the parameters. Airlines can prompt passengers for information that identifies a PNR, to retrieve the information and format it for display to the passenger (optional step).
  3. The airline retrieves PNR information and initializes Manage Your Booking – Book Now Pay Later (MYB: BNPL) Flow (with verification of MYB Rules) by calling:
    • /pnr/bnpl/ancillaries – for Ancillaries flow – where the passenger can manage ancillaries and seats.
  4. The airline calls /pnr/bnpl/products/ancillaries GET to obtain list of ancillaries available for the currently selected itinerary.
  5. After ancillary selection the airline calls /products/ancillaries POST to add selected ancillaries to the itinerary.
    • in products/ancillaries service POST operation airline includes price of ancillary in the request based on actual price of the non-air ancillary (hotel, car, insurance, etc.);
    • optionally, the GET /products/ancillaries call is sent with new selected quantity;
    • when the consecutive POST /products/ancillaries call with new quantity is sent and:
      • if new price is not sent then the original price obtained from initial shopping request (GET /products/ancillaries) is used for the whole quantity;
      • if new price is sent, the original price for the entire quantity is overridden with the new price sent in POST/products/ancillaries call.
  6. If ancillaries operation is successful, the airline calls /pnr/bnpl/products GET to update the selection associated to passenger and the shopping cart with new price of the selected non-air ancillaries.
    • New feature: the service ensures that the non-air ancillaries are added correctly with their new price.
  7. The shopping cart is updated.
  8. When the passenger indicates that shopping is complete the airline obtains available payment options for the current itinerary by calling /pnr/mto/paymentOptions GET. The airline can format the information for display to the passenger.
  9. When the passenger selects form of payment, completes the payment and decides to purchase, the airline initiates the purchase and ticketing process by calling /pnr/bnpl/purchase POST. If payment is successful, the PNR and other supporting documents are issued, and the airline’s application receives results indicating success.
    • If authorization is successful, the /pnr/bnpl/purchase POST service also adds specific remarks to the PNR about the price(s) of given ancillary(ies).
  10. The response indicates whether the purchase is successful. The airline formats this information for display to the passenger.

Fingerprint

Fingerprint validation is a general mechanism that can be used by various Digital Connect services. It prevents unauthorized modifications of JSON data. A user can define which data are sensitive and should be protected.

Fingerprint secures Ancillary price overriding. Each “ancillaryOverridePrice” element of an ancillary selection in /products/ancillaries POST contains “securityData” section ensuring that sensitive data (e.g. price) is not modified by an untrusted party after a client sends the request, i.e. prevents “man-in-the-middle” attacks.

Example of secure ancillaryOverridePrice:

"ancillaryOverridePrice": {
        "taxPrice": [ {
                "code": "MXA",
                "price": {
                        "amount": 304,
                        "currency": "MXN"
                }
        }],
        "basePrice": { 
                "amount": 1996
                "currency": "MXN"
        },
        "securityData": { 
                "fingerprint": "e7541705e7c44f400afbda03e612f2e0876e4fffe0e54e379168b0c02e5ec308",
                "timestamp": 1516275376
        }
}

AncillaryOverridePrice, being a client of fingerprint validator, provides input string for hash generation from the following data:

  • ancillary subcode – i.e. "0CE";
  • base price (amount and currency);
  • tax ancillary prices (amounts and currencies);
  • timestamp.

Note:  The ancillary code is not contained within ancillaryOverridePrice but it is retrieved from its ancestor.

Fingerprint Creation Procedure:

  1. Base string creation.
    • fingerprint base string has the following format:
      <ancillary code><base price><base currency><tax price 1><tax price currency 1><tax price 2><tax price currency 2>...<timestamp>
    • considering the example above, the input string will look like the following one:
      OCE1996MXN304MXN...<1516275376
  2. Application of message authentication function on the input string (MAC with SHA-256 by default).
  3. Representation of the final fingerprint and the output of the above operation in hex-encoded, 64-character string, such as:
    e7541705e7c44f400afbda03e612f2e0876e4fffe0e54e379168b0c02e5ec308

PNR Remarks

In host remarks, the following elements will be added: the original price and the new price, an ancillary subcode, segment and for which passengers, as well as an indicator that the airline requested a price override.

The remarks follow configuration or additional text qualifier passed by the API customer:

AOP /customer qualifier /groupcode /subcode /quantity /passenger(s) /id /{date}{O&D}{airline code}{flight number} /original total price (base+tax) /modified total price (base+tax)
  • Remarks with old and new price
    Remarks with old and new price
  • Issued AEs
    Issued AEs

Request Examples

Modify Ancillary with Higher Price (B2C Path)

[
  {
    "service": "POST: /products/ancillaries",
    "status": "200: OK",
    "request": {
      "ancillaryOperations": [
        {
          "selectedPassengers": [
            {
              "quantity": 2,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 224,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "alamawiekszegokota",
                "basePrice": {
                  "amount": 1396,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "0c63df5cac19e72f093c83f72c83b7967d6411bda4565439d1cd15ab86304451",
                  "timestamp": 1518514650
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "1",
            "departure": "2018-05-01T01:05:00.000",
            "type": "ITINERARY_PART"
          }
        }
      ]
    }
  }
]


Modify Ancillary with Zero Price (MTO Path)

[
  {
    "service": "POST: /pnr/mto/products/ancillaries",
    "status": "200: OK",
    "request": {
      "ancillaryOperations": [
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 0,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 0,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "4ca7378c59a65b3ebde400a9292a07496b005a383c65e8f0959d4be113f2f2e1",
                  "timestamp": 1518511801
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "1",
            "departure": "2018-04-06T14:30:00.000",
            "type": "ITINERARY_PART"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 0,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 0,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "4ca7378c59a65b3ebde400a9292a07496b005a383c65e8f0959d4be113f2f2e1",
                  "timestamp": 1518511801
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "@ref": "1"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 224,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 1396,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "b2d9b6ecfffb9ede296b51fd8cb17cff1fa6688021f6e3cbbce754075cc111be",
                  "timestamp": 1518511801
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "origin": "CUN",
            "destination": "MEX",
            "@id": "2",
            "departure": "2018-04-13T01:32:00.000",
            "type": "ITINERARY_PART"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 224,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 1396,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "b2d9b6ecfffb9ede296b51fd8cb17cff1fa6688021f6e3cbbce754075cc111be",
                  "timestamp": 1518511801
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "@ref": "2"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 11,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 65,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "bbae5527b8bad8a9f800aba88c0fb8773799c44ac670f9634c82cbb155db5968",
                  "timestamp": 1518511801
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "AMS",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "3",
            "departure": "2018-04-06T14:30:00.000",
            "type": "ITINERARY"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 11,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 65,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "bbae5527b8bad8a9f800aba88c0fb8773799c44ac670f9634c82cbb155db5968",
                  "timestamp": 1518511801
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "AMS",
          "selectedTravelPart": {
            "@ref": "3"
          }
        }
      ]
    }
  }
]

Modify Ancillary with Zero Price and EMDs Lower Price (MTO Path)

[
  {
    "service": "POST: /pnr/mto/products/ancillaries",
    "status": "200: OK",
    "request": {
      "ancillaryOperations": [
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 0,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 0,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "4ca7378c59a65b3ebde400a9292a07496b005a383c65e8f0959d4be113f2f2e1",
                  "timestamp": 1518511801
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "1",
            "departure": "2018-04-06T14:30:00.000",
            "type": "ITINERARY_PART"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 0,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 0,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "4ca7378c59a65b3ebde400a9292a07496b005a383c65e8f0959d4be113f2f2e1",
                  "timestamp": 1518511801
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "@ref": "1"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 224,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 1396,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "b2d9b6ecfffb9ede296b51fd8cb17cff1fa6688021f6e3cbbce754075cc111be",
                  "timestamp": 1518511801
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "origin": "CUN",
            "destination": "MEX",
            "@id": "2",
            "departure": "2018-04-13T01:32:00.000",
            "type": "ITINERARY_PART"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 224,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 1396,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "b2d9b6ecfffb9ede296b51fd8cb17cff1fa6688021f6e3cbbce754075cc111be",
                  "timestamp": 1518511801
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "@ref": "2"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 11,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 65,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "bbae5527b8bad8a9f800aba88c0fb8773799c44ac670f9634c82cbb155db5968",
                  "timestamp": 1518511801
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "AMS",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "3",
            "departure": "2018-04-06T14:30:00.000",
            "type": "ITINERARY"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 11,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "-",
                "basePrice": {
                  "amount": 65,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "bbae5527b8bad8a9f800aba88c0fb8773799c44ac670f9634c82cbb155db5968",
                  "timestamp": 1518511801
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "AMS",
          "selectedTravelPart": {
            "@ref": "3"
          }
        }
      ]
    }
  }
]


Modify Ancillary with Higher and DR Lower and EMDs Zero Price (BNPL Path)

[
  {
    "service": "POST: /pnr/bnpl/products/ancillaries",
    "status": "200: OK",
    "request": {
      "ancillaryOperations": [
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "index": 1
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "1",
            "departure": "2018-03-24T13:20:00.000",
            "type": "ITINERARY_PART"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 410,
                      "currency": "MXN"
                    }
                  }
                ],
                "basePrice": {
                  "amount": 2560,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "4228106d572f804c34ebb3613100ad7e9875a60b71e07700d044fa3ee236e196",
                  "timestamp": 1516952436
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "origin": "CUN",
            "destination": "MEX",
            "@id": "2",
            "departure": "2018-03-31T01:32:00.000",
            "type": "ITINERARY_PART"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 0,
                      "currency": "MXN"
                    }
                  }
                ],
                "basePrice": {
                  "amount": 0,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "afb46a0e66db5234efad5df8c66b244b9ab068d142330c62a75526596a10ea83",
                  "timestamp": 1516952436
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "AMS",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "3",
            "departure": "2018-03-24T13:20:00.000",
            "type": "ITINERARY"
          }
        },
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 0,
                      "currency": "MXN"
                    }
                  }
                ],
                "basePrice": {
                  "amount": 0,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "afb46a0e66db5234efad5df8c66b244b9ab068d142330c62a75526596a10ea83",
                  "timestamp": 1516952436
                }
              },
              "index": 2
            }
          ],
          "ancillaryCode": "AMS",
          "selectedTravelPart": {
            "@ref": "3"
          }
        }
      ]
    }
  }
]



Error Handling

Digital Connect validates and sends error responses in cases such as:

Feature is Disabled

[
  {
    "service": "POST: /products/ancillaries",
    "status": "400: Bad Request",
    "request": {
      "ancillaryOperations": [
        {
          "ancillaryCode": "0CD",
          "selectedTravelPart": {
            "@id": "1",
            "origin": "MEX",
            "destination": "CUN",
            "departure": "2018-04-14T01:05:00.000",
            "type": "ITINERARY_PART"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 1078,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 173,
                      "currency": "MXN"
                    }
                  }
                ],
                "securityData": {
                  "fingerprint": "618d5505a484b4c24aec21f6c87695518464992bdb04955db21947e34e0569b3",
                  "timestamp": 1518602156
                }
              }
            }
          ]
        }
      ]
    },
    "response": {
      "status": "NotProcessed",
      "type": "Validation",
      "errorCode": "ERR.SSW.CLIENT.INVALID_REQUEST",
      "timeStamp": "2018-02-14T03:55:56",
      "message": "Validation error.",
      "details": {
        "ancillaryOperations[0]": [
          "price.modification.disabled"
        ]
      }
    }
  }
]

Requested Ancillary is not Allowed for Price Modification

[
  {
    "service": "POST: /products/ancillaries",
    "status": "400: Bad Request",
    "request": {
      "ancillaryOperations": [
        {
          "ancillaryCode": "0CD",
          "selectedTravelPart": {
            "@id": "1",
            "origin": "MEX",
            "destination": "CUN",
            "departure": "2018-05-29T01:05:00.000",
            "type": "ITINERARY_PART"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 1078,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 173,
                      "currency": "MXN"
                    }
                  }
                ],
                "securityData": {
                  "fingerprint": "b1a9ee9ab9264b1c385b5891839d5961415fafbef0730bb53d4372fda22bf4e6",
                  "timestamp": 1518602105
                }
              }
            }
          ]
        }
      ]
    },
    "response": {
      "status": "NotProcessed",
      "type": "Validation",
      "errorCode": "ERR.SSW.CLIENT.INVALID_REQUEST",
      "timeStamp": "2018-02-14T03:55:05",
      "message": "Validation error.",
      "details": {
        "ancillaryOperations[0]": [
          "price.modification.not.allowed.for.ancillary.code[0CD]"
        ]
      }
    }
  }
]

Invalid Text Qualifier

[
  {
    "service": "POST: /pnr/mto/products/ancillaries",
    "status": "400: Bad Request",
    "request": {
      "ancillaryOperations": [
        {
          "ancillaryCode": "0CD",
          "selectedTravelPart": {
            "@id": "1",
            "origin": "MEX",
            "destination": "CUN",
            "departure": "2018-05-30T01:05:00.000",
            "type": "ITINERARY_PART"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 10,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 10,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "1234",
                "securityData": {
                  "fingerprint": "051da4c20708f03b9870fcc80e4cba698ee89d8271aab6de47de3577a4187c95",
                  "timestamp": 1518683038
                }
              }
            }
          ]
        },
        {
          "ancillaryCode": "0DD",
          "selectedTravelPart": {
            "@ref": "1"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 10,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 10,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "a",
                "securityData": {
                  "fingerprint": "4fbb7a9da508f0e54857ee3debb502b71fa1db664c4939bf0210a0c428bdf0e0",
                  "timestamp": 1518683038
                }
              }
            }
          ]
        },
        {
          "ancillaryCode": "0EC",
          "selectedTravelPart": {
            "@ref": "1"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 10,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 10,
                      "currency": "MXN"
                    }
                  }
                ],
                "additionalTextQualifier": "overTenCharacters",
                "securityData": {
                  "fingerprint": "927bd60c4047b8e6f0b75688dfb8ccab268047678f6270b2f59a73102f5bac85",
                  "timestamp": 1518683038
                }
              }
            }
          ]
        }
      ]
    },
    "response": {
      "status": "NotProcessed",
      "type": "Validation",
      "errorCode": "ERR.SSW.CLIENT.INVALID_REQUEST",
      "timeStamp": "2018-02-15T02:23:58",
      "message": "Validation error.",
      "details": {
        "ancillaryOperations[2].selectedPassengers[0].ancillaryOverridePrice.additionalTextQualifier": [
          "validation.text.tooLong"
        ],
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.additionalTextQualifier": [
          "validation.text.pattern"
        ],
        "ancillaryOperations[1].selectedPassengers[0].ancillaryOverridePrice.additionalTextQualifier": [
          "validation.text.tooShort"
        ]
      }
    }
  }
]

Price is Out of Range

[
  {
    "service": "POST: /pnr/mto/products/ancillaries",
    "status": "400: Bad Request",
    "request": {
      "ancillaryOperations": [
        {
          "ancillaryCode": "0DD",
          "selectedTravelPart": {
            "@id": "1",
            "origin": "MEX",
            "destination": "CUN",
            "departure": "2018-04-05T01:05:00.000",
            "type": "ITINERARY_PART"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 14.99,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 0.99,
                      "currency": "MXN"
                    }
                  }
                ],
                "securityData": {
                  "fingerprint": "100ae28ec9d47aab1c32516d3db87aab2ab3ccaaab2ff716ec4cee13f62875d5",
                  "timestamp": 1518688435
                }
              }
            }
          ]
        },
        {
          "ancillaryCode": "0CD",
          "selectedTravelPart": {
            "@ref": "1"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 150.01,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 15.01,
                      "currency": "MXN"
                    }
                  }
                ],
                "securityData": {
                  "fingerprint": "6d586ae5894d507cf309868e88ea42ff2029ac07e8ec0d7761e0ef045213465e",
                  "timestamp": 1518688435
                }
              }
            }
          ]
        }
      ]
    },
    "response": {
      "status": "NotProcessed",
      "type": "Validation",
      "errorCode": "ERR.SSW.CLIENT.INVALID_REQUEST",
      "timeStamp": "2018-02-15T03:53:55",
      "message": "Validation error.",
      "details": {
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.basePrice.amount": [
          "validation.number.tooSmall"
        ],
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.taxPrice[0].price.amount": [
          "validation.number.tooSmall"
        ],
        "ancillaryOperations[1].selectedPassengers[0].ancillaryOverridePrice.taxPrice[0].price.amount": [
          "validation.number.tooBig"
        ],
        "ancillaryOperations[1].selectedPassengers[0].ancillaryOverridePrice.basePrice.amount": [
          "validation.number.tooBig"
        ]
      }
    }
  }
]

Price Modification with Invalid Currency Scale

[
  {
    "service": "POST: /products/ancillaries",
    "status": "400: Bad Request",
    "request": {
      "ancillaryOperations": [
        {
          "ancillaryCode": "0CD",
          "selectedTravelPart": {
            "@id": "1",
            "origin": "MEX",
            "destination": "CUN",
            "departure": "2018-05-30T01:05:00.000",
            "type": "ITINERARY_PART"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 120.001,
                  "currency": "MXN"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 15.001,
                      "currency": "MXN"
                    }
                  }
                ],
                "securityData": {
                  "fingerprint": "24b9e88ddbd3c94670e5fa01e8b6ffa6e3a08c0112530d12a8a4649aaaf02902",
                  "timestamp": 1518602227
                }
              }
            }
          ]
        }
      ]
    },
    "response": {
      "status": "NotProcessed",
      "type": "Validation",
      "errorCode": "ERR.SSW.CLIENT.INVALID_REQUEST",
      "timeStamp": "2018-02-14T03:57:07",
      "message": "Validation error.",
      "details": {
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.basePrice": [
          "invalid.scale|expected.is[2]"
        ],
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.taxPrice[0].price": [
          "invalid.scale|expected.is[2]"
        ]
      }
    }
  }
]

 

Invalid Currency

[
  {
    "service": "POST: /pnr/mto/products/ancillaries",
    "status": "400: Bad Request",
    "request": {
      "ancillaryOperations": [
        {
          "ancillaryCode": "0CD",
          "selectedTravelPart": {
            "@id": "1",
            "origin": "MEX",
            "destination": "CUN",
            "departure": "2018-05-16T01:05:00.000",
            "type": "ITINERARY_PART"
          },
          "selectedPassengers": [
            {
              "index": 1,
              "quantity": 1,
              "ancillaryOverridePrice": {
                "basePrice": {
                  "amount": 1078,
                  "currency": "USD"
                },
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 173,
                      "currency": "USD"
                    }
                  }
                ],
                "securityData": {
                  "fingerprint": "fc77e40c329fed1e2bf1a83a9aa66ac05e0cb261d63c482aad34f89b9ea2141a",
                  "timestamp": 1518682581
                }
              }
            }
          ]
        }
      ]
    },
    "response": {
      "status": "NotProcessed",
      "type": "Validation",
      "errorCode": "ERR.SSW.CLIENT.INVALID_REQUEST",
      "timeStamp": "2018-02-15T02:16:21",
      "message": "Validation error.",
      "details": {
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.taxPrice[0].price.currency": [
          "invalid.currency.code[USD]|expected[MXN]"
        ],
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.basePrice.currency": [
          "invalid.currency.code[USD]|expected[MXN]"
        ]
      }
    }
  }
]

 

Fingerprint Errors – e.g. Timestamp is Out of Range

[
  {
    "service": "POST: /products/ancillaries",
    "status": "400: Bad Request",
    "request": {
      "ancillaryOperations": [
        {
          "selectedPassengers": [
            {
              "quantity": 1,
              "ancillaryOverridePrice": {
                "taxPrice": [
                  {
                    "code": "MXA",
                    "price": {
                      "amount": 304,
                      "currency": "MXN"
                    }
                  }
                ],
                "basePrice": {
                  "amount": 1996,
                  "currency": "MXN"
                },
                "securityData": {
                  "fingerprint": "512862f15c79304ef44863e7a239aefcc64c19bd9054bb829ae6ab9ec777f034",
                  "timestamp": 1517384030
                }
              },
              "index": 1
            }
          ],
          "ancillaryCode": "0CE",
          "selectedTravelPart": {
            "origin": "MEX",
            "destination": "CUN",
            "@id": "1",
            "departure": "2018-04-29T01:05:00.000",
            "type": "ITINERARY_PART"
          }
        }
      ]
    },
    "response": {
      "timeStamp": "2018-01-31T02:03:50",
      "errorCode": "ERR.SSW.CLIENT.INVALID_REQUEST",
      "details": {
        "ancillaryOperations[0].selectedPassengers[0].ancillaryOverridePrice.securityData.timestamp": [
          "timestamp.outside.range"
        ]
      },
      "type": "Validation",
      "message": "Validation error.",
      "status": "NotProcessed"
    }
  }
]