Duffel Webhooks API

Register webhook endpoints to receive asynchronous events such as order creation, airline-initiated changes, and ping events; list, update, delete, and ping webhooks.

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