More products

Transfers

Transfers move travellers between an airport, a hotel or any address. Search by pickup and drop-off, book with the arriving flight when it's needed, and pass on pickup instructions exactly.

POST /search body
{
  "productType": "transfer",
  "pickupLocation":  { "type": "airport", "code": "DXB" },
  "dropoffLocation": { "type": "hotel",   "code": "c9b1e2f4a7d34b0e" },
  "pickupAt": "2026-11-10T14:30:00",
  "returnAt": "2026-11-13T09:00:00",
  "occupancy": [{ "adults": 2, "childrenAges": [7] }],
  "currency": "USD",
  "market": "GB"
}
Location typecode
airportIATA airport code, e.g. DXB.
hotelThe hotel's canonicalId from GET /catalog/suggest.
addressCoordinates as "lat,lng", e.g. "25.2048,55.2708".
  • pickupAt is the pickup date and time; for airport pickups, use the flight's scheduled landing time. Add returnAt for a return journey. Depending on the inventory, a row then covers either one direction — details.direction on GET /quotes/:id/details is ARRIVAL or DEPARTURE, and you book each leg as its own booking — or the whole round trip, with summary.tripType: "round", priced for both legs and booked as one booking.
  • The party comes from occupancy. The optional passengers overrides only the adult count — children from childrenAges are still added — so for 2 adults and a child, send passengers: 2 or leave it out. luggage is accepted but not currently used; check each row's luggageAllowance instead.
  • No destination is needed. Transfer searches finish before POST /search returns.

Results

Each row is one vehicle option for the journey:

A result row (abridged)
{
  "rateQuoteId": "66f2c4e5e4b0c1d2e3f4e300",
  "sellAmountMinor": 6400,
  "sellCurrency": "USD",
  "refundable": true,
  "summary": {
    "route": "DXB→c9b1e2f4a7d34b0e",
    "vehicleName": "Standard car",
    "transferType": "PRIVATE",
    "categoryName": "Standard",
    "minPax": 1,
    "maxPax": 3,
    "journeyTime": 35,
    "luggageAllowance": 3,
    "requiresFlightDetails": true,
    "cancellationPolicy": {
      "refundable": true,
      "deadlines": [{ "before": "2026-11-09T14:30:00Z", "penaltyMinor": 6400, "currency": "USD" }]
    }
  }
}

Show the vehicle, whether it's private or shared, the passenger and luggage limits and the journey time. Check maxPax and luggageAllowance against the party — an overfull car is refused at pickup. Capacity, category and journey-time fields are null when the inventory doesn't provide them; then go by the vehicle description and the quote details.

Price-check and details

Transfer prices are fixed at search, but the price-check is still required before booking. Fetch GET /quotes/:id/details for the pickup details (pickupInformation) and remarks (transferRemarks, when present), and show them before the traveller books.

Flight details

When a row has requiresFlightDetails: true, the transfer needs the flight — the arriving flight for an airport pickup, or the departing flight for an airport drop-off. Add it to the lead traveller:

Lead traveller
{
  "title": "Ms",
  "firstName": "Anna",
  "lastName": "Smith",
  "email": "anna.smith@example.com",
  "phone": "+447700900123",
  "carrierName": "Example Air",
  "flightNumber": "XA001",
  "flightTime": "14:05"
}
  • flightNumber is at most 7 characters: airline code plus number, no spaces (XA001). Anything longer is refused with 400 validation_error.
  • Missing carrierName or flightNumber returns 400 transfer_flight_details_required.
  • The lead traveller also needs email and phone — drivers call when they can't find the party.
  • Always send a title on the lead traveller (Mr, Mrs, Ms, Miss, Master or Dr), whether or not the flight is needed. Some transfers need it, the quote doesn't say which, and without it they return 400 traveler_title_required.

Pickup-time reconfirmation

For some transfers the exact pickup time is only fixed close to the day. These have mustCheckPickupTime: true in the quote details:

quote details (abridged)
"details": {
  "mustCheckPickupTime": true,
  "checkPickup": {
    "mustCheckPickupTime": true,
    "url": "https://www.checkpickup.com",
    "hoursBeforeConsulting": 48
  },
  "pickupInformation": {
    "from": { "code": "DXB", "description": "Dubai International Airport" },
    "to": { "code": "…", "description": "Example Marina Hotel" }
  },
  "transferRemarks": "Meet your driver at the arrivals hall exit, holding a sign with your name."
}

Book and deliver the voucher

Book with paymentMethod: "credit"; transfers are sold net. Most confirm straight away; if one returns supplier_pending, poll it as described in Booking statuses. When the operator issues one, a confirmed transfer carries the operator's voucher in the line item's details.supplierVouchers — give it to the traveller unchanged, together with the pickup instructions. Not every transfer has one (round trips booked as one booking often don't); then your own voucher with the pickup details is what the traveller carries.

A round trip booked as one booking has details.transferLegs on its line item, with a departure and a return entry, each carrying its own bookingReference and status.

Cancel

Cancel with POST /bookings/:id/cancel after checking cancellationPolicy. For a round trip booked as one booking, the whole trip is cancelled unless you send a scope in the body:

POST /bookings/:id/cancel body
{ "transferCancelScope": "return" }
  • transferCancelScope is "whole" (the default), "departure" or "return". It is ignored for other bookings.
  • Cancelling one leg leaves the booking in its current state; that leg's details.transferLegs entry changes to cancelled, and refund.status is manual_review — our operations team settles any refund for the leg.
  • Once both legs are cancelled, the booking itself is cancelled.