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.

OpenAPI Specification

duffel-openapi.yml Raw ↑
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