Duffel Payments API
Pay for orders held with Duffel, list and retrieve payments, and use Payment Intents (where enabled) to collect card payments with Duffel as merchant of record.
Pay for orders held with Duffel, list and retrieve payments, and use Payment Intents (where enabled) to collect card payments with Duffel as merchant of record.
openapi: 3.0.1
info:
title: Duffel API
description: >-
The Duffel API is a REST API to sell travel - flights, accommodation (Stays),
and ancillaries. It covers offer requests and offers, orders, payments, seat
maps, ancillary services, accommodation search and booking, and webhooks.
Requests are authenticated with a Bearer access token and must include a
Duffel-Version header identifying the API version.
termsOfService: https://duffel.com/legal/terms-of-use
contact:
name: Duffel Support
url: https://help.duffel.com
version: v2
servers:
- url: https://api.duffel.com
security:
- bearerAuth: []
tags:
- name: Offer Requests
description: Search for flights by creating offer requests.
- name: Offers
description: Flight offers returned for an offer request.
- name: Orders
description: Create and manage flight orders (bookings).
- name: Payments
description: Pay for held orders.
- name: Seat Maps
description: Seat maps for an offer.
- name: Order Changes
description: Modify an existing order.
- name: Order Cancellations
description: Cancel an existing order and preview refunds.
- name: Stays
description: Accommodation search and booking.
- name: Webhooks
description: Register endpoints to receive event notifications.
paths:
/air/offer_requests:
post:
operationId: createOfferRequest
tags:
- Offer Requests
summary: Create an offer request
description: >-
Searches for flights. Provide the slices, passengers, and an optional
cabin class; Duffel queries airlines and returns matching offers.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- name: return_offers
in: query
schema:
type: boolean
default: true
- name: supplier_timeout
in: query
schema:
type: integer
default: 20000
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOfferRequest'
responses:
'201':
description: The offer request was created with offers.
content:
application/json:
schema:
$ref: '#/components/schemas/OfferRequestResponse'
get:
operationId: listOfferRequests
tags:
- Offer Requests
summary: List offer requests
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/After'
- $ref: '#/components/parameters/Before'
responses:
'200':
description: A paginated list of offer requests.
/air/offer_requests/{id}:
get:
operationId: getOfferRequest
tags:
- Offer Requests
summary: Get a single offer request
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The offer request.
content:
application/json:
schema:
$ref: '#/components/schemas/OfferRequestResponse'
/air/offers:
get:
operationId: listOffers
tags:
- Offers
summary: List offers
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- name: offer_request_id
in: query
required: true
schema:
type: string
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of offers.
/air/offers/{id}:
get:
operationId: getOffer
tags:
- Offers
summary: Get a single offer
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
- name: return_available_services
in: query
schema:
type: boolean
responses:
'200':
description: The offer.
content:
application/json:
schema:
$ref: '#/components/schemas/OfferResponse'
/air/offers/{id}/actions/price:
post:
operationId: priceOffer
tags:
- Offers
summary: Update an offer to fetch the latest price
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The re-priced offer.
/air/offers/{offer_id}/passengers/{offer_passenger_id}:
patch:
operationId: updateOfferPassenger
tags:
- Offers
summary: Update a single offer passenger
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- name: offer_id
in: path
required: true
schema:
type: string
- name: offer_passenger_id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
description: The updated offer passenger.
/air/orders:
post:
operationId: createOrder
tags:
- Orders
summary: Create an order
description: >-
Books one of the offers returned for an offer request. Provide the
selected offer id, passenger details, and either an instant payment or a
hold to pay later.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOrder'
responses:
'201':
description: The order was created.
content:
application/json:
schema:
$ref: '#/components/schemas/OrderResponse'
get:
operationId: listOrders
tags:
- Orders
summary: List orders
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/After'
responses:
'200':
description: A paginated list of orders.
/air/orders/{id}:
get:
operationId: getOrder
tags:
- Orders
summary: Get a single order
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The order.
content:
application/json:
schema:
$ref: '#/components/schemas/OrderResponse'
patch:
operationId: updateOrder
tags:
- Orders
summary: Update a single order
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
description: The updated order.
/air/orders/{id}/available_services:
get:
operationId: listAvailableServices
tags:
- Ancillaries
summary: List available services for an order
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: Available ancillary services for the order.
/air/orders/{id}/services:
post:
operationId: addServiceToOrder
tags:
- Ancillaries
summary: Add services to an order
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'201':
description: The order with the added services.
/air/order_change_requests:
post:
operationId: createOrderChangeRequest
tags:
- Order Changes
summary: Create an order change request
description: Searches for the available change options for an existing order.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'201':
description: The order change request with available offers.
/air/order_change_requests/{id}:
get:
operationId: getOrderChangeRequest
tags:
- Order Changes
summary: Get a single order change request
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The order change request.
/air/order_changes:
post:
operationId: createOrderChange
tags:
- Order Changes
summary: Create a pending order change
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'201':
description: The pending order change was created.
/air/order_changes/{id}:
get:
operationId: getOrderChange
tags:
- Order Changes
summary: Get a single order change
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The order change.
/air/order_changes/{id}/actions/confirm:
post:
operationId: confirmOrderChange
tags:
- Order Changes
summary: Confirm an order change
description: Confirms a pending order change, applying the new flights and pricing.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
description: The confirmed order change.
/air/order_cancellations:
post:
operationId: createOrderCancellation
tags:
- Order Cancellations
summary: Create a pending order cancellation
description: Previews the refund amount for cancelling an order.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'201':
description: The pending order cancellation with refund details.
get:
operationId: listOrderCancellations
tags:
- Order Cancellations
summary: List order cancellations
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of order cancellations.
/air/order_cancellations/{id}:
get:
operationId: getOrderCancellation
tags:
- Order Cancellations
summary: Get a single order cancellation
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The order cancellation.
/air/order_cancellations/{id}/actions/confirm:
post:
operationId: confirmOrderCancellation
tags:
- Order Cancellations
summary: Confirm an order cancellation
description: Confirms a pending cancellation, refunding and voiding the order.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The confirmed order cancellation.
/air/payments:
post:
operationId: createPayment
tags:
- Payments
summary: Create a payment
description: Pays for a held order using a supported payment method.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreatePayment'
responses:
'201':
description: The payment was created.
get:
operationId: listPayments
tags:
- Payments
summary: List payments
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- name: order_id
in: query
required: true
schema:
type: string
responses:
'200':
description: A paginated list of payments.
/air/payments/{id}:
get:
operationId: getPayment
tags:
- Payments
summary: Get a single payment
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The payment.
/air/seat_maps:
get:
operationId: getSeatMaps
tags:
- Seat Maps
summary: Get seat maps
description: Returns a list of seat maps, one per segment, for the given offer.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- name: offer_id
in: query
required: true
schema:
type: string
responses:
'200':
description: The seat maps for the offer.
/air/webhooks:
post:
operationId: createWebhook
tags:
- Webhooks
summary: Create a webhook
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateWebhook'
responses:
'201':
description: The webhook was created.
get:
operationId: listWebhooks
tags:
- Webhooks
summary: List webhooks
parameters:
- $ref: '#/components/parameters/DuffelVersion'
responses:
'200':
description: A paginated list of webhooks.
/air/webhooks/{id}:
patch:
operationId: updateWebhook
tags:
- Webhooks
summary: Update a webhook
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'200':
description: The updated webhook.
delete:
operationId: deleteWebhook
tags:
- Webhooks
summary: Delete a webhook
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'204':
description: The webhook was deleted.
/air/webhooks/{id}/actions/ping:
post:
operationId: pingWebhook
tags:
- Webhooks
summary: Ping a webhook
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'204':
description: A ping event was sent to the webhook.
/stays/search:
post:
operationId: searchStays
tags:
- Stays
summary: Search accommodation
description: >-
Searches for accommodation by location (latitude/longitude plus radius)
or a specific accommodation, with check-in/check-out dates, guests, and
rooms. Returns a list of search results.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/StaysSearch'
responses:
'200':
description: A list of accommodation search results.
/stays/search_results/{id}/actions/fetch_all_rates:
post:
operationId: fetchAllRates
tags:
- Stays
summary: Fetch all rates for a search result
description: Retrieves all available rooms and rates for a search result.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The search result with all rooms and rates.
/stays/quotes:
post:
operationId: createStaysQuote
tags:
- Stays
summary: Create a quote
description: Creates a quote for a chosen rate, confirming its current price before booking.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'201':
description: The quote was created.
/stays/quotes/{id}:
get:
operationId: getStaysQuote
tags:
- Stays
summary: Get a quote
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The quote.
/stays/bookings:
post:
operationId: createStaysBooking
tags:
- Stays
summary: Create a booking
description: Books a quoted rate, supplying guest details and payment.
parameters:
- $ref: '#/components/parameters/DuffelVersion'
requestBody:
required: true
content:
application/json:
schema:
type: object
responses:
'201':
description: The booking was created.
get:
operationId: listStaysBookings
tags:
- Stays
summary: List bookings
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of bookings.
/stays/bookings/{id}:
get:
operationId: getStaysBooking
tags:
- Stays
summary: Get a single booking
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The booking.
/stays/bookings/{id}/actions/cancel:
post:
operationId: cancelStaysBooking
tags:
- Stays
summary: Cancel a booking
parameters:
- $ref: '#/components/parameters/DuffelVersion'
- $ref: '#/components/parameters/PathId'
responses:
'200':
description: The cancelled booking.
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: >-
Authenticate with your Duffel access token as a Bearer token in the
Authorization header (Authorization: Bearer YOUR_ACCESS_TOKEN).
parameters:
DuffelVersion:
name: Duffel-Version
in: header
required: true
description: The version of the Duffel API to use for this request.
schema:
type: string
default: v2
PathId:
name: id
in: path
required: true
schema:
type: string
Limit:
name: limit
in: query
schema:
type: integer
default: 50
maximum: 200
After:
name: after
in: query
schema:
type: string
Before:
name: before
in: query
schema:
type: string
schemas:
CreateOfferRequest:
type: object
required:
- data
properties:
data:
type: object
required:
- slices
- passengers
properties:
slices:
type: array
items:
$ref: '#/components/schemas/Slice'
passengers:
type: array
items:
$ref: '#/components/schemas/Passenger'
cabin_class:
type: string
enum:
- first
- business
- premium_economy
- economy
Slice:
type: object
required:
- origin
- destination
- departure_date
properties:
origin:
type: string
description: IATA city or airport code for the origin.
example: LHR
destination:
type: string
description: IATA city or airport code for the destination.
example: JFK
departure_date:
type: string
format: date
example: '2026-07-21'
Passenger:
type: object
properties:
type:
type: string
enum:
- adult
- child
- infant_without_seat
age:
type: integer
OfferRequestResponse:
type: object
properties:
data:
$ref: '#/components/schemas/OfferRequest'
OfferRequest:
type: object
properties:
id:
type: string
example: orq_0000A3tQSmKyqOrcySrGbo
live_mode:
type: boolean
cabin_class:
type: string
slices:
type: array
items:
$ref: '#/components/schemas/Slice'
offers:
type: array
items:
$ref: '#/components/schemas/Offer'
created_at:
type: string
format: date-time
OfferResponse:
type: object
properties:
data:
$ref: '#/components/schemas/Offer'
Offer:
type: object
properties:
id:
type: string
example: off_0000A3vUda8dKRtUTwfM01
total_amount:
type: string
example: '521.79'
total_currency:
type: string
example: GBP
tax_amount:
type: string
owner:
type: object
properties:
iata_code:
type: string
name:
type: string
expires_at:
type: string
format: date-time
CreateOrder:
type: object
required:
- data
properties:
data:
type: object
required:
- selected_offers
- passengers
properties:
type:
type: string
enum:
- instant
- hold
selected_offers:
type: array
items:
type: string
passengers:
type: array
items:
type: object
payments:
type: array
items:
$ref: '#/components/schemas/Payment'
OrderResponse:
type: object
properties:
data:
$ref: '#/components/schemas/Order'
Order:
type: object
properties:
id:
type: string
example: ord_0000A3bQP9RLVfNUcdpLpw
booking_reference:
type: string
example: RZ3KML
total_amount:
type: string
total_currency:
type: string
live_mode:
type: boolean
created_at:
type: string
format: date-time
CreatePayment:
type: object
required:
- data
properties:
data:
type: object
required:
- order_id
- payment
properties:
order_id:
type: string
payment:
$ref: '#/components/schemas/Payment'
Payment:
type: object
required:
- type
- amount
- currency
properties:
type:
type: string
enum:
- balance
- arc_bsp_cash
- card
amount:
type: string
example: '521.79'
currency:
type: string
example: GBP
CreateWebhook:
type: object
required:
- data
properties:
data:
type: object
required:
- url
- events
properties:
url:
type: string
format: uri
events:
type: array
items:
type: string
example: order.created
StaysSearch:
type: object
required:
- data
properties:
data:
type: object
required:
- check_in_date
- check_out_date
- rooms
- guests
properties:
check_in_date:
type: string
format: date
check_out_date:
type: string
format: date
rooms:
type: integer
example: 1
guests:
type: array
items:
type: object
location:
type: object
properties:
radius:
type: integer
geographic_coordinates:
type: object
properties:
latitude:
type: number
longitude:
type: number