---
title: "Finalize the given pnr."
method: POST
path: "/v3/trips/{tripId}/pnrs/{pnrId}/finalize"
tags: ["Trip PNRs"]
---

# Finalize the given pnr.

`POST /v3/trips/{tripId}/pnrs/{pnrId}/finalize`

## Request

- Base URL: `https://api-ext-sboxmeta.partners.spotnana.com`
- URL: `https://api-ext-sboxmeta.partners.spotnana.com/v3/trips/{tripId}/pnrs/{pnrId}/finalize`
- Auth: HTTP bearer

This endpoint changes the metadata of PNR to finalized and triggers supplier actions if required.

## Request body

- FinalizeRequest: Request Object to finalize an existing Manual form or Shell Pnr.
  - `preBookAnswers` PreBookAnswers
    - `answers` EntityAnswer[]
      - `entityId` string: The unique ID for the question.
      - `userInput` string: The text input given by user (if any).
      - `itemIds` integer[]: The id/enum value corresponding to the option chosen by the user as answer.
      - `answers` AnswerPair[]
        - `item` string: The option selected from the list of available choices.
        - `value` string: The additional input provided (by the user) while selecting one of the options.
        - `description` string: Description of the selected option.
      - `customFieldType` 'QUESTION' | 'MEETING' | 'BUDGET' | 'BREX_TOKEN': The type of custom field.
      - `questionDisplayText` string: The question text to be displayed to the user.
      - `question` Question: The message defines the format of a question which can be asked to a user in any kind of workflows.
        - `id` string, uuid, required
        - `name` string, required: Question display name that the user will see. For eg, 'Choose the purpose of your trip'.
        - `questionFormat` 'INPUT_BOX' | 'RADIO_BUTTON' | 'CHECKBOX' | 'CHECKBOX_WITH_PERCENTAGE': Question types. INPUT_BOX will make user enter a free flowing text. RADIO_BUTTON will have multiple options, user can select only one. CHECKBOX questions contain the possible set of options, from which the user can choose multiple options. CHECKBOX_WITH_PERCENTAGE is similar to checkbox, with the difference being that each option having an additional input field whose values must add up to 100.
        - `optionInfo` OptionInfo: Options related information for the question.
          - `source` 'MANUAL' | 'COMPANY_CONFIG', required: Option source
          - `sourceMetadata` OptionSourceMetadata: Wrapper for option source company config.
            - `companyConfig` CompanyConfigSource: For this option source, options would be auto generated based on specified parameter.
              - …
          - `totalNumOptions` integer: Total number of options
          - `options` Option[]: Available options for the question. This will contain only max 10 options if only summary is requested.
            - `displayCode` string, required: The code which is sent in answer response.
            - `displayValue` string: The text to be displayed to the user beside this option.
        - `isRequired` boolean, required: Whether its compulsory to answer the question or not.
        - `isDisabled` boolean, required: Whether the question is disabled or not. If true, this should not be asked.
        - `includeInItinerary` boolean: Whether to include this question in the itinerary related emails.
        - `customFieldLocations` CustomFieldLocation[]
        - `matchConditions` CustomFieldMatchConditions: Conditions to select the custom field for given context.
          - `travelerConditions` TravelerMatchConditions: Matching conditions for traveler.
            - `workerTypes` WorkerType[]: Worker types. Users belonging to any of these would match.
            - `countries` string[]: Countries.
            - `legalEntities` Reference[]: Legal entities
              - …
            - `departments` Reference[]: Departments
              - …
            - `costCenters` Reference[]: Cost centers
              - …
            - `offices` Reference[]: Offices
              - …
          - `travelTypes` TravelType[]: Travel types to match.
          - `travelRegionTypes` TravelRegionType[]: Travel region types to match.
          - `tripUsageTypes` TripUsageType[]: Trip usage types to match. If empty, all trip usage types will be matched.
        - `questionType` QuestionType: Question type.
          - `preSearchQuestionType` 'UNKNOWN_SEARCH_QUESTION_TYPE' | 'PURPOSE_OF_TRIP': Types of pre-search questions. PURPOSE_OF_TRIP required to ask purpose of the trip user is going to. For example: meeting, training, interview.
          - `preCheckoutQuestionType` 'UNKNOWN_CHECKOUT_QUESTION_TYPE' | 'USER_DEFINED_QUESTION' | 'OOP_REASON_CODE': Types of pre-checkout questions. USER_DEFINED_QUESTION the default question type for all pre checkout questions which have been created from UI. OOP_REASON_CODE is kept separate so that existing OOP flow doesn't break.
    - `preBookQuestionResponseId` string: The unique id sent back in the pre book questions API response
  - `finalizeIntent` union: Intent of finalizing a PNR. Exactly one variant must be set, matching the SuspendReason used when the PNR was suspended. - PRICE_OPTIMIZATION suspend: use priceOptimization (PriceOptimizationMetadata). - EXCHANGE / GDS_EXCHANGE suspend: use manualVerificationIntent (ManualVerificationIntent). - AIR_PRICE_OPTIMIZATION suspend (deprecated): use airPriceOptimizationMetadata (AirPriceOptimizationMetadata).
    - object: **Deprecated.** Use PriceOptimizationMetadataWrapper with suspend reason `PRICE_OPTIMIZATION` instead. Legacy wrapper for air-only reshop, used only with suspend reason `AIR_PRICE_OPTIMIZATION`.
      - `airPriceOptimizationMetadata` AirPriceOptimizationMetadata: Information related to air price optimization if PNR has been rebooked.
        - `oldTickets` string[]: List of old tickets present in PNR before rebook. For non-ticketed PNRs, tickets will not be present.
        - `newTickets` string[]: List of new tickets in PNR after rebook. For non-ticketed PNRs, tickets will not be present.
        - `oldPnrId` string, required: Old Spotnana PnrId of the PNR before rebook.
        - `newPnrId` string, required: New Spotnana PnrId of the PNR after rebook. If the same PNR has been modified during rebook, oldPnrId and newPnrId will be same. If a new PNR has been booked during rebook, oldPnrId and newPnrId will be different.
        - `oldPrice` Money, required: Money object containing details such as the amount, the currency code, and the converted amount.
          - `amount` number, double, required: The numeric value for the amount of money.
          - `currencyCode` string, required: The 3-letter currency code for the money amount (defined using ISO 4217 standard).
          - `convertedAmount` number, double: The converted currency and amount that has been converted (if a currency conversion has been requested). For example, if the call requests that money be sent in a specified currency (because the frontend requested the backend to send money in the user's preferred currency).
          - `convertedCurrency` string: The 3-letter currency code for the converted currency (defined using ISO 4217 standard).
          - `otherCoinage` object[]: List of the dollar amount in other coinage systems like reward points, cryptocurrency etc.
            - `coinageCode` 'PAYMENT_METHOD_UNKNOWN' | 'CREDIT_CARD' | 'BREX_POINTS' | 'CASH' | 'QANTAS_POINTS' | 'VENDOR_PROGRAM_PAYMENT' | 'DELAYED_INVOICING' | 'FLIGHT_CREDITS' | 'QANTAS_TRAVEL_FUND' | 'CUSTOM_VIRTUAL_PAYMENT' | 'FLIGHT_PASS' | 'MISCELLANEOUS_CREDIT_ORDER' | 'NO_PREPAYMENT' | 'DELAYED_PAYMENT': Payment method
            - `amount` number, double
            - `conversionRate` number, double: 1 coin in this system equals to how many currency value
            - `preferredCurrencyConversionRate` number, double: 1 coin in this system equals to how many currency value
            - `otherCoinageMetadata` FlightPassPaymentMetadataWrapper: Wrapper for Flight Pass payment metadata.
              - …
        - `newPrice` Money, required: Money object containing details such as the amount, the currency code, and the converted amount.
          - `amount` number, double, required: The numeric value for the amount of money.
          - `currencyCode` string, required: The 3-letter currency code for the money amount (defined using ISO 4217 standard).
          - `convertedAmount` number, double: The converted currency and amount that has been converted (if a currency conversion has been requested). For example, if the call requests that money be sent in a specified currency (because the frontend requested the backend to send money in the user's preferred currency).
          - `convertedCurrency` string: The 3-letter currency code for the converted currency (defined using ISO 4217 standard).
          - `otherCoinage` object[]: List of the dollar amount in other coinage systems like reward points, cryptocurrency etc.
            - `coinageCode` 'PAYMENT_METHOD_UNKNOWN' | 'CREDIT_CARD' | 'BREX_POINTS' | 'CASH' | 'QANTAS_POINTS' | 'VENDOR_PROGRAM_PAYMENT' | 'DELAYED_INVOICING' | 'FLIGHT_CREDITS' | 'QANTAS_TRAVEL_FUND' | 'CUSTOM_VIRTUAL_PAYMENT' | 'FLIGHT_PASS' | 'MISCELLANEOUS_CREDIT_ORDER' | 'NO_PREPAYMENT' | 'DELAYED_PAYMENT': Payment method
            - `amount` number, double
            - `conversionRate` number, double: 1 coin in this system equals to how many currency value
            - `preferredCurrencyConversionRate` number, double: 1 coin in this system equals to how many currency value
            - `otherCoinageMetadata` FlightPassPaymentMetadataWrapper: Wrapper for Flight Pass payment metadata.
              - …
        - `priceDrop` Money, required: Money object containing details such as the amount, the currency code, and the converted amount.
          - `amount` number, double, required: The numeric value for the amount of money.
          - `currencyCode` string, required: The 3-letter currency code for the money amount (defined using ISO 4217 standard).
          - `convertedAmount` number, double: The converted currency and amount that has been converted (if a currency conversion has been requested). For example, if the call requests that money be sent in a specified currency (because the frontend requested the backend to send money in the user's preferred currency).
          - `convertedCurrency` string: The 3-letter currency code for the converted currency (defined using ISO 4217 standard).
          - `otherCoinage` object[]: List of the dollar amount in other coinage systems like reward points, cryptocurrency etc.
            - `coinageCode` 'PAYMENT_METHOD_UNKNOWN' | 'CREDIT_CARD' | 'BREX_POINTS' | 'CASH' | 'QANTAS_POINTS' | 'VENDOR_PROGRAM_PAYMENT' | 'DELAYED_INVOICING' | 'FLIGHT_CREDITS' | 'QANTAS_TRAVEL_FUND' | 'CUSTOM_VIRTUAL_PAYMENT' | 'FLIGHT_PASS' | 'MISCELLANEOUS_CREDIT_ORDER' | 'NO_PREPAYMENT' | 'DELAYED_PAYMENT': Payment method
            - `amount` number, double
            - `conversionRate` number, double: 1 coin in this system equals to how many currency value
            - `preferredCurrencyConversionRate` number, double: 1 coin in this system equals to how many currency value
            - `otherCoinageMetadata` FlightPassPaymentMetadataWrapper: Wrapper for Flight Pass payment metadata.
              - …
        - `penaltyPrice` Money: Money object containing details such as the amount, the currency code, and the converted amount.
          - `amount` number, double, required: The numeric value for the amount of money.
          - `currencyCode` string, required: The 3-letter currency code for the money amount (defined using ISO 4217 standard).
          - `convertedAmount` number, double: The converted currency and amount that has been converted (if a currency conversion has been requested). For example, if the call requests that money be sent in a specified currency (because the frontend requested the backend to send money in the user's preferred currency).
          - `convertedCurrency` string: The 3-letter currency code for the converted currency (defined using ISO 4217 standard).
          - `otherCoinage` object[]: List of the dollar amount in other coinage systems like reward points, cryptocurrency etc.
            - `coinageCode` 'PAYMENT_METHOD_UNKNOWN' | 'CREDIT_CARD' | 'BREX_POINTS' | 'CASH' | 'QANTAS_POINTS' | 'VENDOR_PROGRAM_PAYMENT' | 'DELAYED_INVOICING' | 'FLIGHT_CREDITS' | 'QANTAS_TRAVEL_FUND' | 'CUSTOM_VIRTUAL_PAYMENT' | 'FLIGHT_PASS' | 'MISCELLANEOUS_CREDIT_ORDER' | 'NO_PREPAYMENT' | 'DELAYED_PAYMENT': Payment method
            - `amount` number, double
            - `conversionRate` number, double: 1 coin in this system equals to how many currency value
            - `preferredCurrencyConversionRate` number, double: 1 coin in this system equals to how many currency value
            - `otherCoinageMetadata` FlightPassPaymentMetadataWrapper: Wrapper for Flight Pass payment metadata.
              - …
    - object: Wrapper object for ManualVerificationIntent.
      - `manualVerificationIntent` ManualVerificationIntent: Represents the intent for manual verification with a remark and a list of reasons.
        - `remark` string: Additional remarks or notes about the verification.
        - `reasons` ManualVerificationReason[]: List of reasons for manual verification.
    - object: Wrapper for QcFinalization.
      - `qcFinalizeData` QcFinalizeData: Request Object to indicate that all qc tasks have been resolved and current pnr is qc compliant
        - `pnrId` string, required
    - object: Wrapper for PriceOptimizationMetadata.
      - `priceOptimization` PriceOptimizationMetadata: Unified price optimization metadata for all travel types. Carried on FinalizeIntent and stored on PnrMetadata after finalize.
        - `oldPnrId` string, required: Spotnana PNR ID before reshop.
        - `newPnrId` string: Spotnana PNR ID after reshop. Same as oldPnrId for in-place modify; different for cross-PNR rebook. May not exist on failure.
        - `netSavedAmount` Money: Money object containing details such as the amount, the currency code, and the converted amount.
          - `amount` number, double, required: The numeric value for the amount of money.
          - `currencyCode` string, required: The 3-letter currency code for the money amount (defined using ISO 4217 standard).
          - `convertedAmount` number, double: The converted currency and amount that has been converted (if a currency conversion has been requested). For example, if the call requests that money be sent in a specified currency (because the frontend requested the backend to send money in the user's preferred currency).
          - `convertedCurrency` string: The 3-letter currency code for the converted currency (defined using ISO 4217 standard).
          - `otherCoinage` object[]: List of the dollar amount in other coinage systems like reward points, cryptocurrency etc.
            - `coinageCode` 'PAYMENT_METHOD_UNKNOWN' | 'CREDIT_CARD' | 'BREX_POINTS' | 'CASH' | 'QANTAS_POINTS' | 'VENDOR_PROGRAM_PAYMENT' | 'DELAYED_INVOICING' | 'FLIGHT_CREDITS' | 'QANTAS_TRAVEL_FUND' | 'CUSTOM_VIRTUAL_PAYMENT' | 'FLIGHT_PASS' | 'MISCELLANEOUS_CREDIT_ORDER' | 'NO_PREPAYMENT' | 'DELAYED_PAYMENT': Payment method
            - `amount` number, double
            - `conversionRate` number, double: 1 coin in this system equals to how many currency value
            - `preferredCurrencyConversionRate` number, double: 1 coin in this system equals to how many currency value
            - `otherCoinageMetadata` FlightPassPaymentMetadataWrapper: Wrapper for Flight Pass payment metadata.
              - …
        - `result` PriceOptimizationResult, required: Result of a price optimization reshop attempt.
          - `status` 'SUCCESS' | 'FAILURE' | 'NO_CHANGE', required: Outcome status of a price optimization reshop attempt.
          - `failureMetadata` PriceOptimizationFailureMetadata: Details about a failed price optimization attempt.
            - `reason` 'OLD_FARE_CANCEL_FAILED' | 'NEW_FARE_BOOK_FAILED' | 'OLD_PNR_CANCEL_FAILED' | 'NEW_PNR_BOOKING_FAILED' | 'NEW_TICKET_ISSUE_FAILED' | 'OLD_TICKET_VOID_FAILED' | 'SUPPLIER_ERROR', required: Failure reason for a price optimization reshop attempt.
            - `message` string: Human-readable detail about the failure.
        - `travelType` union: Travel-type-specific price optimization metadata.
          - object: Wrapper for air-specific price optimization metadata.
            - `air` AirPriceOptMetadata: Air-specific price optimization metadata.
              - …
          - object: Wrapper for hotel-specific price optimization metadata.
            - `hotel` HotelPriceOptMetadata: Hotel-specific price optimization metadata.
              - …
  - `finalizeMetadata` FinalizeMetadata: Metadata information related to finalize request
    - `isMandatoryTicketing` boolean: True for forceful ticketing of PNR.
    - `mandatorySkipTicketing` boolean: Override other params and skip ticketing.
    - `suspendReason` 'AIR_PRICE_OPTIMIZATION' | 'EXCHANGE' | 'GDS_EXCHANGE' | 'PRICE_OPTIMIZATION': Reason for suspending the PNR. Determines which finalizeIntent variant is required when finalizing. - PRICE_OPTIMIZATION: Unified price optimization reshop (air or hotel). Finalize with priceOptimization (PriceOptimizationMetadata). - EXCHANGE: Ticket exchange initiated by agent. Finalize with manualVerificationIntent. - GDS_EXCHANGE: GDS-driven ticket exchange. Finalize with manualVerificationIntent. - AIR_PRICE_OPTIMIZATION: Deprecated. Legacy air-only reshop. Use PRICE_OPTIMIZATION instead. Finalize with airPriceOptimizationMetadata.
    - `taskId` string: Task Id which needs to be mark completed before finalizing the PNR.
  - `customFieldV3UserResponses` CustomFieldV3Response[]: Custom field user responses for the booking.
    - `fieldId` string, uuid, required: Custom field id
    - `fieldName` string: Name of the custom field
    - `armId` string, uuid, required: Arm id which is applicable
    - `includeLocations` IncludeLocation[]
    - `selectedOptions` CustomFieldSelectedOption[], required: The list of options that are selected by user or auto populated.
      - `name` string, required: Value of the selection
      - `translatedName` string: Translated value of the selection
      - `description` string: Description of the selection
      - `translatedDescription` string: Translated description of the selection
      - `additionalUserInput` string: Additional user input
      - `additionalInfos` string[]: Actual values of the additional infos
      - `additionalInfoConfigs` AdditionalInfo[]: Additional info configs for the selected option
        - union: Additional data need to be sent along with the custom field response.
          - object: Variable defining the additional value to be sent along with custom field response.
            - `type` string, required
            - `name` 'PUBLISHED_FARE' | 'LLF' | 'ADD_COLLECT_AMOUNT' | 'SELECTED_FARE' | 'SPLIT_PAYMENT_FARE', required: Name of the variable.
          - object: Expression consisting of variables and constants which needs to be sent along with custom field response.
            - `type` string, required
            - `formatExpression` string, required: The expression must be of format : `<any_text> ${expression} <any_text>`.The expression can consist of a combination of variables and mathematical operations. Variable names must be same as VariableName Enum. To define mathematical operations, the operation name should follow the format `math.<math_op>(arg1, arg2)`. Both `arg1` and `arg2` can be variables or constants. The supported math operations (math_op) include: `add, mul, div, sub, min, and max`. All keywords, such as `<math_op>, math, and var` must be written in lowercase.
            - `variables` VariableName[]: Reference names of the variables present in the expression.
      - `optionId` string, uuid: Id of the selected option; sent by clients, never returned

## Response `204`

No Content

## Other responses

- `400`: PNR is already finalized.
- `401`: Unauthorized
- `403`: Forbidden
- `404`: The specified resource was not found.
- `408`: Finalization is taking longer than expected. Please refresh the Trips page in a few minutes. Contact support if the issue persists.

## Changes

- **2026-10-29** `86dbf1e03dae`: 5 info
  - added the new `DELAYED_PAYMENT` enum value to the request property `finalizeIntent/oneOf[subschema #1: AirPriceOptimizationMetadataWrapper]/airPriceOptimizationMetadata/newPrice/otherCoinage/items/coinageCode`
  - added the new `DELAYED_PAYMENT` enum value to the request property `finalizeIntent/oneOf[subschema #1: AirPriceOptimizationMetadataWrapper]/airPriceOptimizationMetadata/oldPrice/otherCoinage/items/coinageCode`
  - added the new `DELAYED_PAYMENT` enum value to the request property `finalizeIntent/oneOf[subschema #1: AirPriceOptimizationMetadataWrapper]/airPriceOptimizationMetadata/penaltyPrice/otherCoinage/items/coinageCode`
  - added the new `DELAYED_PAYMENT` enum value to the request property `finalizeIntent/oneOf[subschema #1: AirPriceOptimizationMetadataWrapper]/airPriceOptimizationMetadata/priceDrop/otherCoinage/items/coinageCode`
  - …1 more
- **2026-10-24** `b006f367b7e7`: 1 info
  - added the new optional request property `customFieldV3UserResponses/items/selectedOptions/items/optionId`
- …earlier changes not shown

[Operation history](https://skmtc.dev/spotnana/apis/trip-api/changes/v3/trips/:tripId/pnrs/:pnrId/finalize/post.md)

---

[API](https://skmtc.dev/spotnana/apis/trip-api.md) - [All operations](https://skmtc.dev/spotnana/apis/trip-api/llms.txt) - [OpenAPI document](https://skmtc.dev/spotnana/apis/trip-api/revisions/506fca66cea6?raw)
