Expedia Fraud Protection API
API for fraud prevention and protection services within the Expedia Group platform.
API for fraud prevention and protection services within the Expedia Group platform.
openapi: 3.0.0
info:
title: Expedia Group Fraud Prevention Service
version: 'v2'
description: "Fraud & Risk APIs to detect fraud"
contact:
name: "Risk Tech Verge"
email: "[email protected]"
x-eg-lifecycle: "PLANNED"
servers:
- url: 'https://api.sandbox.expediagroup.com/fraud-prevention/v2'
tags:
- name: OrderPurchaseScreen
- name: OrderPurchaseUpdate
paths:
'/order/purchase/screen':
post:
tags:
- OrderPurchaseScreen
description: 'The Order Purchase API gives a Fraud recommendation for a transaction. A recommendation can be Accept, Reject, or Review. A transaction is marked as Review whenever there are insufficient signals to recommend Accept or Reject. These incidents are manually reviewed, and a corrected recommendation is made asynchronously. '
summary: 'Expedia Group Run fraud screening for one transaction'
operationId: 'screen'
security:
- orderPurchaseScreenAuth:
- fraudandrisk.fraud.order-purchase-screen
requestBody:
required: true
content:
'application/json':
schema:
$ref: '#/components/schemas/OrderPurchaseScreenRequest'
responses:
'200':
description: 'The OrderPurchaseScreenRequest was successfully received and the order screening is complete.'
content:
'application/json':
schema:
$ref: '#/components/schemas/OrderPurchaseScreenResponse'
'401':
description: Unauthorized
content:
'application/json':
schema:
$ref: '#/components/schemas/UnauthorizedError'
'403':
description: Forbidden
content:
'application/json':
schema:
$ref: '#/components/schemas/ForbiddenError'
'404':
description: Not Found
content:
'application/json':
schema:
$ref: '#/components/schemas/NotFoundError'
'429':
description: Too many requests
content:
'application/json':
schema:
$ref: '#/components/schemas/TooManyRequestsError'
'500':
description: Internal server error
content:
'application/json':
schema:
$ref: '#/components/schemas/InternalServerError'
'502':
description: Bad gateway
content:
'application/json':
schema:
$ref: '#/components/schemas/BadGatewayError'
'503':
description: Retryable Order Purchase Screen Failure
content:
'application/json':
schema:
$ref: '#/components/schemas/RetryableOrderPurchaseScreenFailure'
'504':
description: Gateway timeout
content:
'application/json':
schema:
$ref: '#/components/schemas/GatewayTimeoutError'
'400':
description: Bad request
content:
'application/json':
schema:
$ref: '#/components/schemas/BadRequestError'
'/order/purchase/update':
post:
tags:
- OrderPurchaseUpdate
description: |
The Order Purchase Update API is called when the status of the order has changed.
For example, if the customer cancels the reservation, changes reservation in any way, or adds additional products or travelers to the reservation, the Order Purchase Update API is called to notify Expedia Group about the change.
The Order Purchase Update API is also called when the merchant cancels or changes an order based on a Fraud recommendation.
summary: 'Expedia Group Send an update for a transaction'
operationId: 'update'
security:
- orderPurchaseUpdateAuth:
- fraudandrisk.fraud.order-purchase-update
requestBody:
required: true
description: |
An OrderPurchaseUpdate request may be of one of the following types `ORDER_UPDATE`, `CHARGEBACK_FEEDBACK`, `INSULT_FEEDBACK`, `REFUND_UPDATE`, `PAYMENT_UPDATE`.
content:
'application/json':
schema:
$ref: "#/components/schemas/OrderPurchaseUpdateRequest"
examples:
OrderUpdate:
summary: Sample OrderUpdate Request
value:
type: ORDER_UPDATE
risk_id: '1234324324'
acquirer_reference_number: '12345'
order_status: COMPLETED
cancellation_reason:
primary_reason_description: string
ChargebackFeedback:
summary: Sample ChargebackFeedback Request
value:
type: CHARGEBACK_FEEDBACK
risk_id: '1234324324'
chargeback_detail:
chargeback_status: RECEIVED
chargeback_reason: FRAUD
chargeback_amount:
value: 123.45
currency_code: "USD"
InsultFeedback:
summary: Sample InsultFeedback Request
value:
type: INSULT_FEEDBACK
risk_id: '1234324324'
RefundUpdate:
summary: Sample RefundUpdate Request
value:
type: REFUND_UPDATE
risk_id: "1234324324"
refund_status: "SETTLED"
refund_details:
acquirer_reference_number: "12345"
refund_deposit_date_time: "2022-07-24T01:01:01.111Z"
refund_settlement_date_time: "2022-07-24T01:01:01.111Z"
settlement_id: "12345"
refund_settled_amount:
value: 123.32
currency_code: "USD"
PaymentUpdate:
summary: Sample PaymentUpdate Request
value:
type: PAYMENT_UPDATE
risk_id: "1234324324"
merchant_order_code: "12345"
responses:
'200':
description: 'The OrderUpdateRequest was successful.'
content:
'application/json':
schema:
$ref: '#/components/schemas/OrderPurchaseUpdateResponse'
'401':
description: Unauthorized
content:
'application/json':
schema:
$ref: '#/components/schemas/UnauthorizedError'
'403':
description: Forbidden
content:
'application/json':
schema:
$ref: '#/components/schemas/ForbiddenError'
'404':
description: Order Purchase Update Not Found
content:
'application/json':
schema:
$ref: '#/components/schemas/OrderPurchaseUpdateNotFoundError'
'429':
description: Too many requests
content:
'application/json':
schema:
$ref: '#/components/schemas/TooManyRequestsError'
'500':
description: Internal server error
content:
'application/json':
schema:
$ref: '#/components/schemas/InternalServerError'
'502':
description: Bad gateway
content:
'application/json':
schema:
$ref: '#/components/schemas/BadGatewayError'
'503':
description: Retryable Order Purchase Update Failure
content:
'application/json':
schema:
$ref: '#/components/schemas/RetryableOrderPurchaseUpdateFailure'
'504':
description: Gateway timeout
content:
'application/json':
schema:
$ref: '#/components/schemas/GatewayTimeoutError'
'400':
description: Bad request
content:
'application/json':
schema:
$ref: '#/components/schemas/BadRequestError'
components:
schemas:
Error:
description: The object used to describe an error, containing both human-readable and machine-readable information.
type: object
properties:
code:
description: Snake cased all caps error code interpreted from the HTTP status code that can programmatically be acted upon.
type: string
example: "BAD_REQUEST"
enum:
- UNAUTHORIZED
- FORBIDDEN
- NOT_FOUND
- ORDER_PURCHASE_UPDATE_NOT_FOUND
- TOO_MANY_REQUESTS
- INTERNAL_SERVER_ERROR
- BAD_GATEWAY
- RETRYABLE_ORDER_PURCHASE_SCREEN_FAILURE
- RETRYABLE_ORDER_PURCHASE_UPDATE_FAILURE
- GATEWAY_TIMEOUT
- BAD_REQUEST
message:
description: A human-readable explanation of the error, specific to this error occurrence.
type: string
example: "An input validation error was encountered. Please see causes for more details."
required:
- code
- message
UnauthorizedError:
description: "Indicates that the token sent in the 'Authorization' header is either invalid or missing. Please check the value in the token field along with the token expiration time before retrying."
example:
code: "UNAUTHORIZED"
message: "Invalid EG token provided. Please provide a valid token in the Authorization header."
allOf:
- $ref: "#/components/schemas/Error"
ForbiddenError:
description: "Indicates that the API cannot fulfill the request because while the client is correctly authenticated, the client doesn't have the permission to execute the specified operation. This error type does not imply that the request is valid, or that the resource against which the operation being performed exists or satisfies other pre-conditions."
example:
code: "FORBIDDEN"
message: "Insufficient permissions to perform the request."
allOf:
- $ref: "#/components/schemas/Error"
NotFoundError:
description: "Indicates that the API cannot find the resource that is either being requested or against which the operation is being performed. Please check the request again to make sure that the request is valid."
example:
code: "NOT_FOUND"
message: "The requested resource does not exist."
allOf:
- $ref: "#/components/schemas/Error"
OrderPurchaseUpdateNotFoundError:
description: "Indicates that the API cannot find the resource that is either being requested or against which the operation is being performed."
example:
code: "ORDER_PURCHASE_UPDATE_NOT_FOUND"
message: "The request failed because the Order Screen event for this booking is missing. Please send a new Order Screen event again."
allOf:
- $ref: "#/components/schemas/Error"
TooManyRequestsError:
description: "Indicates that the API cannot fulfill the request because server resources have been exhausted. Perhaps the client has sent too many requests in a given amount of time or has reached some specific quota. Please check the rate limits for the product and adjust as necessary before retries. If you believe the rate limit was incorrect or if you need a different rate limit, please reach out to the <support team> regarding the next steps."
example:
code: "TOO_MANY_REQUESTS"
message: "The request failed because the server resources for this client have been exhausted."
allOf:
- $ref: "#/components/schemas/Error"
InternalServerError:
description: "Indicates that the API encountered an unexpected condition that prevented it from fulfilling the request. Sometimes used as a generic catch-allerror type when no other error types can be used. Retrying the same request will usually result in the same error. Please reach out to support team as next step for this error resolution."
example:
code: "INTERNAL_SERVER_ERROR"
message: "The server encountered an internal error."
allOf:
- $ref: "#/components/schemas/Error"
BadGatewayError:
description: "Indicates that the server received an invalid response from the upstream server. Causes could be incorrectly configured target server at gateway, EOF exception, incorrectly configured keep-alive timeouts. Please reach out to support team as next step for this error resolution."
example:
code: "BAD_GATEWAY"
message: "The server received an invalid response from an upstream server."
allOf:
- $ref: "#/components/schemas/Error"
RetryableOrderPurchaseScreenFailure:
description: |
Indicates that the API is either down for maintenance or overloaded and cannot fulfill the request at the current time. This is a temporary error and retrying the same request after a certain delay could eventually result in success.
There will be a Retry-After HTTP header in API response specifying how long to wait to retry the request. If there is no Retry-After HTTP header then retry can happen immediately. If the error persists after retrying with delay, please reach out to <support team>."
example:
code: "RETRYABLE_ORDER_PURCHASE_SCREEN_FAILURE"
message: "A temporary internal error occurred. You can safely retry your call using the same order details."
allOf:
- $ref: "#/components/schemas/Error"
RetryableOrderPurchaseUpdateFailure:
description: |
Indicates that the API is either down for maintenance or overloaded and cannot fulfill the request at the current time. This is a temporary error and retrying the same request after a certain delay could eventually result in success.
There will be a Retry-After HTTP header in API response specifying how long to wait to retry the request. If there is no Retry-After HTTP header then retry can happen immediately. If the error persists after retrying with delay, please reach out to <support team>."
example:
code: "RETRYABLE_ORDER_PURCHASE_UPDATE_FAILURE"
message: "A temporary internal error occurred. You can safely retry your call using the same order details."
allOf:
- $ref: "#/components/schemas/Error"
GatewayTimeoutError:
description: "Indicates that the API gateway has issues completing the request on time. Request can be retried if it is idempotent, If the issue persists, please reach out to support. For non-idempotent requests, please reach out to <support team> to know the status of your request before attempting retries."
example:
code: "GATEWAY_TIMEOUT"
message: "The server timed out while trying to complete the request."
allOf:
- $ref: "#/components/schemas/Error"
BadRequestError:
description: "Indicates that a bad request occurred. Typically it is an invalid parameter."
example:
code: "BAD_REQUEST"
message: "An input validation error was encountered. Please see causes for more details."
causes:
code: "MISSING_MANDATORY_PARAM"
field: "$.transaction.customer_account.account_type"
message: "The value of a field should not be null."
allOf:
- $ref: "#/components/schemas/Error"
- type: object
properties:
causes:
type: array
items:
type: object
properties:
code:
type: string
example: MISSING_MANDATORY_PARAM
enum:
- MISSING_MANDATORY_PARAM
- INVALID_PARAM
- INVALID_FORMAT
field:
type: string
description: "A JSON Path expression indicating which field, in the request body, caused the error."
example: "$.transaction.customer_account.account_type"
message:
type: string
example: "The value of a field should not be null."
OrderPurchaseUpdateRequest:
title: OrderPurchaseUpdateRequest
description: |
The `type` field value is used as a discriminator, with the following mapping:
* `ORDER_UPDATE`: `OrderUpdate`
* `CHARGEBACK_FEEDBACK`: `ChargebackFeedback`
* `INSULT_FEEDBACK`: `InsultFeedback`
* `REFUND_UPDATE`: `RefundUpdate`
* `PAYMENT_UPDATE`: `PaymentUpdate`
type: object
required:
- risk_id
- type
properties:
type:
$ref: '#/components/schemas/UpdateType'
risk_id:
description: 'The `risk_id` provided by Expedia''s Fraud Prevention Service in the `OrderPurchaseScreenResponse`.'
type: string
maxLength: 200
example: '123456789'
discriminator:
propertyName: type
mapping:
ORDER_UPDATE: OrderUpdate
CHARGEBACK_FEEDBACK: ChargebackFeedback
INSULT_FEEDBACK: InsultFeedback
REFUND_UPDATE: RefundUpdate
PAYMENT_UPDATE: PaymentUpdate
UpdateType:
title: UpdateType
description: 'Transaction type associated with the update event.'
type: string
enum:
- ORDER_UPDATE
- CHARGEBACK_FEEDBACK
- INSULT_FEEDBACK
- REFUND_UPDATE
- PAYMENT_UPDATE
OrderUpdate:
title: OrderUpdate
description: 'Order related data that should be updated.'
allOf:
- $ref: '#/components/schemas/OrderPurchaseUpdateRequest'
- type: object
required:
- order_status
properties:
order_status:
$ref: '#/components/schemas/Status'
acquirer_reference_number:
description: |
A unique number that tags a credit or debit card transaction when it goes from the merchant's bank through to the cardholder's bank.
`acquirer_reference_number` is a required field only if `order_status` = `COMPLETED`
Typically, merchants can get this number from their payment processors.
This number is used when dealing with disputes/chargebacks on original transactions.
type: string
maxLength: 200
cancellation_reason:
$ref: '#/components/schemas/CancellationReason'
CancellationReason:
title: CancellationReason
description: 'Reason of order update cancellation.'
type: object
properties:
primary_reason_code:
description: 'Primary cancellation reason code.'
type: string
maxLength: 200
sub_reason_code:
description: 'Substitute cancellation reason code.'
type: string
maxLength: 200
primary_reason_description:
description: 'Primary cancellation reason code. Required if `order_status = CANCELLED`.'
type: string
maxLength: 200
sub_reason_description:
description: 'Substitute cancellation reason description.'
type: string
maxLength: 200
ChargebackFeedback:
title: ChargebackFeedback
description: 'Feedback from EG external partners if they receive a chargeback for a false negative recommendation from Fraud Prevention system.'
allOf:
- $ref: '#/components/schemas/OrderPurchaseUpdateRequest'
- type: object
properties:
chargeback_detail:
$ref: '#/components/schemas/ChargebackDetail'
InsultFeedback:
title: InsultFeedback
description: 'Feedback from EG external partners regarding a false positive recommendation that from Fraud Prevention system gave for their customer.'
allOf:
- $ref: '#/components/schemas/OrderPurchaseUpdateRequest'
- type: object
properties:
insult_detail:
$ref: '#/components/schemas/InsultDetail'
RefundUpdate:
title: RefundUpdate
description: 'Refund related data. Update should be sent when refund is issued or settled. Amounts should include all fees and taxes.'
discriminator:
propertyName: refund_status
mapping:
ISSUED: IssuedRefundUpdate
SETTLED: SettledRefundUpdate
allOf:
- $ref: "#/components/schemas/OrderPurchaseUpdateRequest"
- type: object
required:
- refund_status
properties:
refund_status:
description: |
Identifies the refund status. Possible values are:
-`ISSUED` - The refund was issued.
-`SETTLED` - The refund was settled.
type: string
enum:
- ISSUED
- SETTLED
IssuedRefundUpdate:
title: IssuedRefundUpdate
description: 'Data related to the issued refund that should be updated.'
allOf:
- $ref: "#/components/schemas/RefundUpdate"
- type: object
required:
- refund_status
properties:
refund_details:
$ref: "#/components/schemas/IssuedRefundUpdateDetails"
SettledRefundUpdate:
title: SettledRefundUpdate
description: 'Data related to the settled refund that should be updated.'
allOf:
- $ref: "#/components/schemas/RefundUpdate"
- type: object
required:
- refund_status
properties:
refund_details:
$ref: "#/components/schemas/SettledRefundUpdateDetails"
IssuedRefundUpdateDetails:
title: IssuedRefundUpdateDetails
description: 'Data that describes issued refund that should be updated.'
type: object
required:
- refund_issued_date_time
- refund_issued_amount
properties:
refund_issued_date_time:
description: "Date and time when the 3rd party payment processor confirmed that a previously submitted payment refund has issued at the participating financial institutions."
type: string
format: date-time
refund_issued_amount:
$ref: "#/components/schemas/Amount"
SettledRefundUpdateDetails:
title: SettledRefundUpdateDetails
description: 'Data that describes settled refund that should be updated.'
type: object
required:
- refund_settlement_date_time
- refund_deposit_date_time
- acquirer_reference_number
- settlement_id
- refund_settled_amount
properties:
refund_settlement_date_time:
description: "Date and time when the 3rd party payment processor confirmed that a previously submitted payment refund has settled at the participating financial institutions."
type: string
format: date-time
refund_deposit_date_time:
description: "Date and time when the refund was deposited to the original form of payment."
type: string
format: date-time
acquirer_reference_number:
description: |
A unique number that tags a credit or debit card transaction when it goes from the merchant's bank through to the cardholder's bank.
Typically, merchants can get this number from their payment processors.
This number is used when dealing with disputes/chargebacks on original transactions.
type: string
maxLength: 200
settlement_id:
description: "Unique settlement identifier specific to the payment processor for the settlement transaction generated for a previously submitted payment refund."
type: string
maxLength: 200
refund_settled_amount:
$ref: "#/components/schemas/Amount"
PaymentUpdate:
title: PaymentUpdate
description: 'Payment related data that should be updated.'
allOf:
- $ref: "#/components/schemas/OrderPurchaseUpdateRequest"
- type: object
required:
- merchant_order_code
properties:
merchant_order_code:
description: "Reference code passed to acquiring bank at the time of payment. This code is the key ID that ties back to payments data at the payment level."
type: string
maxLength: 200
ChargebackDetail:
title: ChargebackDetail
type: object
description: 'Details related to the chargeback.'
required:
- chargeback_status
- chargeback_reason
- chargeback_amount
properties:
chargeback_status:
type: string
enum:
- RECEIVED
- REVERSAL
description: |
Identifies the chargeback status. Possible values are:
-`RECEIVED` - The chargeback was received.
-`REVERSAL` - The chargeback reversal was received.
chargeback_reason:
type: string
enum:
- FRAUD
- NON_FRAUD
description: 'Reason for chargeback which can be `Fraud` or `Non Fraud`.'
chargeback_amount:
$ref: '#/components/schemas/Amount'
bank_reason_code:
type: string
description: 'Unique code provided by the acquiring bank for the category of fraud.'
maxLength: 200
chargeback_reported_date_time:
type: string
format: date-time
description: 'Date and time when the chargeback was reported to the partner, in ISO-8601 date and time format `yyyy-MM-ddTHH:mm:ss.SSSZ`.'
InsultDetail:
title: InsultDetail
type: object
description: 'Details related to the insult.'
properties:
insult_reported_date_time:
type: string
format: date-time
description: 'Date and time when the insult was reported to the partner, in ISO-8601 date and time format `yyyy-MM-ddTHH:mm:ss.SSSZ`.'
Status:
title: Status
description: |
Defines the current state of the Order.
Generally, OrderPurchaseScreenRequest is followed by an OrderUpdate reflecting the change in current order status. From `IN_PROGRESS` to any of below possible values:
* `COMPLETED` is used when the order has been processed fully. For example, inventory has been reserved, and the payment has been settled.
* `CHANGE_COMPLETED` is like `COMPLETED` but on a changed order.
* `CANCELLED` is used when the order is cancelled. This could be acustomer initiated cancel or based on Fraud recommendation.
* `FAILED` is used when order failed due to any errors on Partner system. This could be followed by another OrderUpdate call with any `order_status` once the order is recovered, abandoned, or cancelled.
* `CHANGE_FAILED` is like `FAILED` but on a changed order.
*
* `CHANGE_COMPLETED` or `CHANGE_FAILED` are applicable if OrderPurchaseScreen Fraud API was called via a change in order which is through `transaction.transaction_details.order_type` = `CHANGE`
* `COMPLETED` or `CANCELLED` order status indicates the completion of lifecycle on an order.
type: string
enum:
- COMPLETED
- CHANGE_COMPLETED
- CANCELLED
- FAILED
- CHANGE_FAILED
maxLength: 200
OrderPurchaseUpdateResponse:
title: OrderPurchaseUpdateResponse
type: object
properties:
risk_id:
type: string
description: 'Unique identifier of transaction that was updated.'
maxLength: 200
example: '1234567'
OrderPurchaseScreenRequest:
title: OrderPurchaseScreenRequest
type: object
properties:
transaction:
$ref: '#/components/schemas/OrderPurchaseTransaction'
required:
- transaction
OrderPurchaseTransaction:
title: OrderPurchaseTransaction
type: object
required:
- site_info
- device_details
- customer_account
- transaction_details
properties:
site_info:
$ref: '#/components/schemas/SiteInfo'
device_details:
$ref: '#/components/schemas/DeviceDetails'
customer_account:
$ref: '#/components/schemas/CustomerAccount'
transaction_details:
$ref: '#/components/schemas/TransactionDetails'
OrderPurchaseScreenResponse:
title: OrderPurchaseScreenResponse
type: object
properties:
risk_id:
type: string
description: 'Unique identifier assigned to the transaction by Expedia''s Fraud Prevention Service.'
maxLength: 200
example: '1234567'
decision:
$ref: '#/components/schemas/FraudDecision'
FraudDecision:
title: FraudDecision
type: string
enum:
- ACCEPT
- REVIEW
- REJECT
SiteInfo:
title: SiteInfo
type: object
required:
- country_code
- agent_assisted
properties:
country_code:
description: 'The alpha-3 ISO code that represents a country name.'
pattern: ^[A-Z]{3}$
type: string
example: 'USA'
agent_assisted:
description: 'Identifies if an agent assisted in booking travel for the customer. `False` if the order was directly booked by customer.'
type: boolean
DeviceDetails:
title: DeviceDetails
required:
- ip_address
type: object
properties:
source:
type: string
maxLength: 50
description: 'Source of the device_box. Default value is `TrustWidget`.'
device_box:
type: string
description: 'Device related information retrieved from TrustWidget.'
ip_address:
type: string
description: "IP address of the device used for booking."
pattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$
example: "192.168.32.48"
TransactionDetails:
title: TransactionDetails
required:
- order_id
- current_order_status
- order_type
- travel_products
- travelers
type: object
properties:
order_id:
description: 'Unique identifier assigned to the order by the partner. `order_id` is specific to the partner namespace.'
type: string
maxLength: 50
example: '1000000234'
current_order_status:
description: |
Status of the order:
* `IN_PROGRESS` is used when order has not processed fully. For example, inventory has not yet been reserved, or payment has not yet been settled.
* `COMPLETED` is used when an order has been processed fully. For example, inventory has been reserved, and the payment has been settled.
type: string
enum:
- IN_PROGRESS
- COMPLETED
order_type:
description: |
Type of order. Possible `order_types`.
`CREATE` - Initial type of a brand new order.
`CHANGE` - If a `OrderPurchaseScreenRequest` has already been submitted for the initial booking with `order_type = CREATE`, but has now been modified and partner wishes to resubmit for Fraud screening then the `order_type = CHANGE`. Examples of changes that are supported are changes made to `check-in/checkout dates` or `price of a TravelProduct`.
type: string
enum:
- CREATE
- CHANGE
example: 'CREATE'
travel_products:
type: array
minItems: 1
maxItems: 20
items:
$ref: '#/components/schemas/TravelProduct'
travelers:
description: 'Individuals who are part of the travel party for the order. At minimum there must be at least `1` traveler.'
type: array
items:
$ref: '#/components/schemas/Traveler'
minItems: 1
maxItems: 30
payments:
description: 'List of the form(s) of payment being used to purchase the order. One or more forms of payment can be used within an order. Information gathered will be specific to the form of payment.'
type: array
items:
$ref: '#/components/schem
# --- truncated at 32 KB (87 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/expedia-group/refs/heads/main/openapi/expedia-fraud-protection-openapi-original.yml