View Categories

Launching soon on the Shopify App StoreJoin the waitlist

GraphQL API reference: Departures

7 min read

The departure operations of the Rentals & Bookings GraphQL API. A departure is one run of a product sold by departures (a tour, a class, a boat trip: see Rental types). They use the same address, keys and rules as the rest of the API: see GraphQL API reference: Rentals & Bookings for how to send a request, and the API overview for keys, limits and errors. The same operations are in REST, with the fields explained: REST API reference: Departures. The guides and equipment on a run are in GraphQL API reference: Staff & resources.

Needs the Rentals & Bookings app. Every operation needs a secret key; mutations need Allow changes (write). The Free plan’s API can read only: a mutation is refused with plan_required.

  • ref is a run’s id (gid://sirentals/Departure/31 or 31) or its key, p<rental product id>-<YYYYMMDDHHMM> (p12-202612050900). A run made by a product’s repeating departure times has id: null and only its key until something is stored for it; changing it stores it.
  • productId takes gid://shopify/Product/… or the number. bookingId and a guest’s id are numbers.
  • Times are Y-m-d H:i in the store’s time zone, days Y-m-d.
  • Mutations answer userErrors { field message code data } when a change is refused: duplicate, cancelled, checked_in, not_found, invalid_param (with field). The REST errors table explains each.
curl -s "https://YOUR-API-ADDRESS/graphql/2026-10" -H "Authorization: Bearer sirb_your_secret_key" -H "Content-Type: application/json" \
  -d '{"query": "{ rentalDepartures(from: \"2026-12-05\", to: \"2026-12-06\") { totalCount nodes { key title start status seatsLeft } } }"}'

Runs #

OperationArgumentsWhat it does
rentalDepartures
query · secret key
returns RentalDepartureConnection!
from: String
to: String
productId: ID
locationId: ID
status: RentalDepartureStatusFilter
first: Int
after: String
Every run of the store’s departure products between two days (from, to: Y-m-d; default 14 days from today, at most 92), soonest first. Cancelled runs only with status: CANCELLED or ALL.
rentalDeparture
query · secret key
returns RentalDeparture
ref: String!One run by ref (its id or its key, p12-202612050900), with the staff and resources assigned; null when there is none.
createRentalDeparture
mutation · secret key
returns RentalDeparturePayload!
input: RentalDepartureCreateInput!Add a one-off run (not one of the product’s repeating times). duplicate when the product already has a run at that time.
updateRentalDeparture
mutation · secret key
returns RentalDeparturePayload!
ref: String!
input: RentalDepartureUpdateInput!
Change a run: capacity, cut-off, close or reopen sales, notes, its own minimum. Only the fields you send change.
runRentalDepartureAnyway
mutation · secret key
returns RentalDeparturePayload!
ref: String!Run a departure that is below its minimum anyway: no more alerts, runState becomes run_anyway.
query NextTwoDays {
  rentalDepartures(from: "2026-12-05", to: "2026-12-06", status: OPEN, first: 50) {
    totalCount
    nodes {
      id key title start end status seatsTotal seatsTaken seatsLeft cutoffAt salesStopped
      minGuests guaranteed runState
      limitedBy { by seats }
    }
  }
}
mutation MoreSeats {
  updateRentalDeparture(ref: "p12-202612050900", input: {capacity: 10, notes: "Two guides needed"}) {
    departure { id key capacity seatsLeft }
    userErrors { field code message }
  }
}

RentalDepartureCreateInput

FieldTypeNotes
productIdID
rentalProductIdInt
variantIdID
startString!Y-m-d H:i in the store’s time zone.
endString
lengthStringLike 3h, 90m or 2d (default: the length of the product’s first departure time).
capacityInt
cutoffMinutesInt
notesString
notesPublicString

RentalDepartureUpdateInput

FieldTypeNotes
capacityIntSeats of its own; null = the product’s stock.
cutoffMinutesIntMinutes before the start when online sales stop; null = the product’s.
statusRentalDepartureStatusOPEN or CLOSED (Close sales).
notesString
notesPublicString
minGuestsIntThe run’s own minimum guests; null = the product’s.
decideByMinutesIntMinutes before the start when the shop decides; null = the product’s.
EnumValues
RentalDepartureStatusFilterOPEN
CLOSED
CANCELLED
DONE
ALL
RentalDepartureStatusOPEN
CLOSED
CANCELLED
DONE
TypeFields
RentalDeparture
One run of a product sold by departures (“Set departures”).
id: ID, legacyResourceId: Int, key: String!, rentalProductId: Int!, productId: ID!, variantId: ID!, title: String!, start: String!, end: String!, length: String, status: RentalDepartureStatus!, oneOff: Boolean!, capacity: Int, stock: Int, seatsTotal: Int, seatsTaken: Int!, seatsLeft: Int, booked: Int!, bookings: Int!, checkedIn: Int!, cutoffMinutes: Int, cutoffAt: String, salesStopped: Boolean!, locationId: ID, notes: String, notesPublic: String, cancelReason: String, cancelledAt: String, minGuests: Int, decideBy: String, guaranteed: Boolean!, runState: String, limitedBy: RentalDepartureLimit, staff: [RentalDepartureStaff!]
RentalDepartureLimit
What limits a run’s seats (Limit sales).
by: String!, seats: Int!, short: [RentalDepartureShort!]!
RentalDepartureShortrole: String!, count: Int!, have: Int!
RentalDepartureStaffkind: String!, id: Int!, name: String, role: String, status: String!
RentalDeparturePayloaddeparture: RentalDeparture, userErrors: [RentalUserError!]!

Guest list #

OperationArgumentsWhat it does
rentalDepartureManifest
query · secret key
returns RentalDepartureManifest
ref: String!The run’s guest list, one row per booking, with the pickup points, the itinerary and the totals.
query GuestList {
  rentalDepartureManifest(ref: "31") {
    departure { title start }
    rows { number bookingId name guests pickup { name } checkedInAt noShow ticket }
    totals { bookings guests checkedIn }
  }
}
TypeFields
RentalDepartureManifestdeparture: RentalDeparture!, staff: [RentalDepartureStaff!]!, rows: [RentalDepartureManifestRow!]!, pickups: [RentalManifestPickup!]!, itinerary: [RentalItineraryDay!]!, totals: RentalDepartureManifestTotals!
RentalDepartureManifestRownumber: Int!, bookingId: Int!, name: String, guests: Int!, adults: Int, children: Int, seniors: Int, students: Int, otherGuests: String, private: Boolean, participants: [RentalParticipant!], pickup: RentalPickup, order: String, orderId: ID, phone: String, email: String, notes: String, balanceDue: Float, checkedInAt: String, noShow: Boolean, ticket: String
RentalParticipant
One named guest of a booking.
id: Int!, position: Int!, name: String, email: String, phone: String, checkedInAt: String, noShow: Boolean, waiver: String, waiverUrl: String, details: JSON
RentalPickup
A pickup point and its time on the run.
id: String, name: String, address: String, at: String
RentalManifestPickup
One stop of the driver’s list.
id: String, name: String, address: String, at: String, map: String, guests: Int!, bookings: [Int!]!
RentalItineraryDay
One day of a multi-day trip.
day: Int!, title: String!, text: String, overnight: String
RentalDepartureManifestTotalsbookings: Int!, guests: Int!, checkedIn: Int!

Cancelling and moving #

input.reason is required here (WEATHER, NOT_ENOUGH or OTHER); outcome defaults to REFUND, notifyGuests and notifyStaff to true.

OperationArgumentsWhat it does
rentalDepartureCancelPreview
query · secret key
returns RentalDepartureCancelPreview
ref: String!
outcome: RentalDepartureOutcome
What cancelling the run would do: bookings, guests and the refund total (null for OFFER).
cancelRentalDeparture
mutation · secret key
returns RentalDepartureCancelPayload!
ref: String!
input: RentalDepartureCancelInput!
Cancel a run: each booking is refunded (REFUND) or offered the next runs with seats (OFFER), and guests and staff are told. cancelled when it already is.
cancelRentalDepartureDay
mutation · secret key
returns RentalDepartureDayCancelPayload!
date: String!
productIds: [ID!]
input: RentalDepartureCancelInput!
Cancel every run that starts on a day (a storm); productIds limits it. Runs already cancelled or done are left alone.
moveRentalDeparture
mutation · secret key
returns RentalDepartureMovePayload!
ref: String!
start: String!
notifyGuests: Boolean
Change a run’s time: its bookings move with it, the end keeps the run’s length, and guests are emailed unless notifyGuests: false.
mutation Storm {
  cancelRentalDeparture(ref: "31", input: {reason: WEATHER, outcome: REFUND, note: "High winds on the harbour."}) {
    departure { id status cancelReason }
    results { booking order refunded amount refundError emailed }
    userErrors { field code message }     # cancelled when it already is
  }
}

RentalDepartureCancelInput

FieldTypeNotes
reasonRentalDepartureReason!
outcomeRentalDepartureOutcome
notifyGuestsBoolean
notifyStaffBoolean
noteStringA message to the guests.
EnumValues
RentalDepartureOutcomeREFUND – A full refund to the way they paid.
OFFER – An email with the next runs that have seats; a booking not moved within 7 days is refunded.
RentalDepartureReasonWEATHER
NOT_ENOUGH
OTHER
TypeFields
RentalDepartureCancelPreviewdeparture: RentalDeparture!, bookings: Int!, guests: Int!, refundTotal: Float, currency: String, manual: Int!
RentalDepartureCancelPayloaddeparture: RentalDeparture, results: [RentalDepartureCancelResult!], userErrors: [RentalUserError!]!
RentalDepartureCancelResultbooking: Int!, order: String, refunded: Boolean, amount: Float, refundError: String, offered: Boolean, emailed: Boolean
RentalDepartureDayCancelPayloaddate: String, cancelled: Int, departures: [RentalDeparture!], results: [RentalDepartureCancelResult!], userErrors: [RentalUserError!]!
RentalDepartureMovePayloaddeparture: RentalDeparture, moved: Int, userErrors: [RentalUserError!]!

Check-in and guest names #

OperationArgumentsWhat it does
checkInRentalBooking
mutation · secret key
returns RentalCheckInPayload!
bookingId: Int
code: String
departureId: Int
action: RentalCheckInAction
Check a booking in (or undo, or mark a no-show) by booking id or by the code on the guest’s ticket. warnings flags already, wrong_departure and cancelled.
rentalBookingParticipants
query · secret key
returns RentalBookingParticipants
bookingId: Int!A booking’s named guests, with the product’s setting (ask: off, optional or required) and the seats.
setRentalBookingParticipants
mutation · secret key
returns RentalBookingParticipantsPayload!
bookingId: Int!
participants: [RentalParticipantInput!]!
Replace a booking’s names: at most one per seat; a position keeps its check-in.
checkInRentalParticipant
mutation · secret key
returns RentalParticipantPayload!
id: Int!
action: RentalCheckInAction
Check one named guest in (or undo, or mark a no-show). The first guest checked in checks the booking in too.
mutation ScanTicket {
  checkInRentalBooking(code: "42-3fa9c1d2e4b5", departureId: 31) {
    booking { id order guests checkedInAt noShow }
    warnings { code message }             # already, wrong_departure or cancelled
    userErrors { field code message }
  }
}
mutation Names {
  setRentalBookingParticipants(bookingId: 42, participants: [{name: "Jordan Lee", email: "[email protected]"}, {name: "Sam Lee"}]) {
    seats
    participants { id position name checkedInAt }
    userErrors { field code message }
  }
}

RentalParticipantInput

FieldTypeNotes
nameString
emailString
phoneString
EnumValues
RentalCheckInActionCHECK_IN
UNDO
NO_SHOW
TypeFields
RentalCheckInPayloadbooking: RentalCheckedInBooking, warnings: [RentalCheckInWarning!], userErrors: [RentalUserError!]!
RentalCheckedInBookingid: Int!, departureId: Int, order: String, status: String!, guests: Int!, checkedInAt: String, noShow: Boolean!
RentalCheckInWarningcode: String!, message: String!
RentalBookingParticipantsbookingId: Int!, ask: String!, seats: Int!, participants: [RentalParticipant!]!
RentalBookingParticipantsPayloadbookingId: Int, ask: String, seats: Int, participants: [RentalParticipant!], userErrors: [RentalUserError!]!
RentalParticipantPayloadparticipant: RentalParticipant, userErrors: [RentalUserError!]!