American Express Global Business Travel · AsyncAPI Specification

Amex Gbt Webhooks

Version

View Spec View on GitHub TravelUnited StatesCorporate TravelTravel ManagementBusiness TravelDistributionBookingAviationHotelsRailCar RentalExpenseDuty of CareReportingAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-07-28'
method: searched
source: >-
  https://apis.egencia.com/openconnect/v1/api-info?name={Booking,Receipt},
  https://www.egencia.com/openconnect-expensestream-service/v1/api-info,
  https://www.egencia.com/openconnect-validation-service/v1/api-info,
  https://www.egencia.com/openconnect-approval-service/v1/api-info, plus
  openapi/amex-gbt-expense-spi-openapi.json, openapi/amex-gbt-validation-spi-openapi.json,
  openapi/amex-gbt-approval-customisation-spi-openapi.json
spec_type: none
asyncapi_published: false
notes: >-
  Amex GBT / Egencia has a real, documented event surface but publishes no AsyncAPI document for
  it. Egencia calls these interfaces SPIs - Service Provider Interfaces - and the distinction
  matters: the customer BUILDS AND HOSTS the endpoint, and Egencia calls it. Egencia publishes the
  contract as an OpenAPI document describing the listener the customer must implement, which is
  why the Expense SPI's servers[] entry is the placeholder /some.base.path. Two of the five are
  notification pushes (Expense, Get Booking, Receipt) and two are synchronous decision callbacks
  inside the checkout flow (Validation, Approval Customisation) - the latter can BLOCK a booking,
  which is unusual for a webhook surface and is recorded here deliberately.
  This artifact is the webhook catalogue; no AsyncAPI has been authored, because authoring one
  would be fabricating a contract the provider does not publish.
delivery:
  transport: HTTPS POST from Egencia to a customer-hosted endpoint
  security: >-
    Egencia declares no securityScheme on any SPI contract - the customer defines authentication
    on its own listener. All communication is over TLS ("For Data Security, all the Egencia
    communication will happen over the SSL/TLS channel").
  acknowledgement: >-
    "The web service returns a success message if the message has been taken into account. If the
    consumer web service doesn't reply on due time Expense SPI will retry few times."
  retries: >-
    429, 502, 503 and 504 from the customer's listener are documented as "will be retried 3 times
    automatically on our side". No exponential-backoff schedule, dead-letter behaviour or replay
    endpoint is published.
  ordering: not published
  signature_verification: not published
  headers:
  - {name: message_timestamp, description: 'Time Stamp in format ISO DATE TIME', spec: openapi/amex-gbt-expense-spi-openapi.json}
  - {name: SGP-Request, spec: openapi/amex-gbt-expense-spi-openapi.json}
subscriptions:
  operation: pushSubscriptionNotification
  path: POST {customer-base}/v1/subscriptions
  spec: openapi/amex-gbt-expense-spi-openapi.json
  schemas: [Subscription, SubscriptionEntity, SubscriptionEvent]
  note: >-
    "don't forget to subscribe to the receipts/invoices, which ensures that only eligible audience
    can see invoices and receipts." Subscription events are themselves pushed to the customer.
webhooks:
- name: Expense SPI push
  direction: egencia-to-customer
  kind: notification
  operation: pushExpense
  path: POST {customer-base}/some.path
  spec: openapi/amex-gbt-expense-spi-openapi.json
  api: amex-gbt:egencia-expense-spi
  trigger: >-
    "Egencia will call this web service for each new and updated booking as well as for
    associated service fees ... any modification of the Egencia Trip summary is conveyed to the
    client's listener web service by Expense SPI in real time."
  documented_triggers:
  - booking created (hotel, flight, car, rail, ground)
  - booking item added to an existing trip
  - approval status change (AWAITING APPROVAL -> BOOKED)
  - ticket issued
  - receipt or invoice generated (payload carries the document download link)
  - ticket exchanged and any resulting extra payment
  - booking cancelled (credit note generated)
  payload_schemas: [Expense, Flight, Hotel, Car, Train, GlobalGround, Fee, Payment, ReceiptInfo, Person, Company, CustomDataField, PolicyCompliance, CO2Emission, TicketInformation, Segment, Provider, Partner, PointOfSale]
  responses: ['200', '400', '429', '502', '503', '504']
- name: Get Booking SPI push notification
  direction: egencia-to-customer
  kind: notification
  api: amex-gbt:egencia-get-booking-api
  trigger: >-
    "Get Booking SPI will notify the partner when a booking is created or updated in Egencia" -
    booking, update and cancel events. The push carries the mission number and booking ID; the
    partner then calls GET /v1/bookings/{bookingId} for the detail.
  payload_fields: [mission_number, booking_id, company_id, organization_parent_id, 'items[].id', 'items[].traveler_id', 'items[].product_type', 'items[].status', 'items[].receipt_info', 'items[].booking_date_time', 'items[].is_agent_assisted', partner.name]
  follow_up_operations: [getBookingProduct, getBookingItem]
  note: 'Replaces the legacy T&E solution "receiveDossierExpedia".'
  spec_published: false
  spec_note: >-
    The push payload is documented as a worked JSON example in the Booking api-info document, not
    as a machine-readable schema. Only the pull side (Get Booking API) has an OpenAPI contract.
- name: Receipt SPI push notification
  direction: egencia-to-customer
  kind: notification
  api: amex-gbt:egencia-receipt-api
  trigger: A receipt or invoice is generated for a booking item.
  payload_fields: [booking_id, item_id, product_type, company_id, traveler_id, organization_parent_id, _links.receipt.href]
  follow_up_operations: [getReceipt, getReceiptsAsZip]
  spec_published: false
- name: Validation SPI callback
  direction: egencia-to-customer
  kind: synchronous-decision
  operation: validateFields
  path: POST {customer-base}/v1/validateFields
  spec: openapi/amex-gbt-validation-spi-openapi.json
  api: amex-gbt:egencia-validation-spi
  trigger: >-
    "At checkout time, when the user clicks on the book button. Egencia platform will call the
    Consumer's web service to send the data. Depending on the web service response the user will
    either be blocked on the checkout page or will be redirected to her/his trip while the booking
    has been confirmed."
  blocking: true
  payload_schemas: [CDFValidationRequest, ValidationField, Traveler, BookerForThirdParty]
  response_schemas: [CDFValidationResponse, Error, ErrorField]
  multi_passenger: >-
    "In the case of Multi passenger bookings (AKA multi-PAX), the web service can either be called
    multiple times with one traveler in each call or called once with all the travelers at once."
  responses: ['200', '400', '401', '403', '500']
- name: Approval Customisation SPI callback
  direction: egencia-to-customer
  kind: synchronous-decision
  operation: getApprovalDetails
  path: POST {customer-base}/v1/custom-approval
  spec: openapi/amex-gbt-approval-customisation-spi-openapi.json
  api: amex-gbt:egencia-approval-customisation-spi
  trigger: >-
    At checkout, Egencia calls the customer's web service with the booking data to decide whether
    level one and level two approval are required and who the approvers are, then plugs the
    response into its own approval process.
  blocking: true
  payload_schemas: [ApprovalRequest, Company, Traveler, CustomDataField, Price]
  response_schemas: [ExternalApprovalDetailsResponse, ExternalApprovalDetail, OpenconnectApprovalErrorResponseBean]
  responses: ['200', '400', '401', '403', '500']
gaps:
- No AsyncAPI document, no event catalogue page, no CloudEvents envelope.
- No published signature or shared-secret scheme for verifying that a push genuinely came from Egencia.
- No replay, backfill or dead-letter endpoint for missed notifications - a consumer that is down
  past the retry budget must reconcile through the pull APIs (Get Booking, Reporting) instead.
- The Get Booking SPI and Receipt SPI payloads are documented only as JSON examples in prose;
  there is no machine-readable schema for either.
related:
- openapi/amex-gbt-expense-spi-openapi.json
- openapi/amex-gbt-validation-spi-openapi.json
- openapi/amex-gbt-approval-customisation-spi-openapi.json
- conventions/amex-gbt-conventions.yml