Skip to content

Driver Sessions

Taxi & Private HireProductsTransporter › Driver Sessions

Generally available

A Transporter is a Driver-on-shift — the active pairing of a Driver, a Vehicle, and a Fleet during a shift, including authentication credentials, lifecycle state, current location, current trip assignment, and queue memberships. The driver app logs in as a Transporter; dispatch sees Transporters (not Drivers) as the unit of supply. Soft-delete preserves history when shifts end.

Example request

POST /client/{clientId}/transporter

{
  "ref": "<string>",
  "driver": {
    "id": "<id>"
  },
  "driverEntryLocked": false,
  "vehicle": {
    "id": "<id>"
  },
  "vehicleEntryLocked": false,
  "primaryGroup": "<string>",
  "groups": [
    {
      "id": "<id>"
    }
  ]
}

Example shape, derived from the Transporter fields — indicative, not the authoritative schema (that arrives with the API reference).

Endpoints

MethodPath
GET /client/{clientId}/transporter/sessions
POST /client/{clientId}/transporter · primary
GET /client/{clientId}/transporter/{transporterId}
GET /client/{clientId}/transporter/queues
POST /client/{clientId}/transporter/{transporterId}
GET /client/{clientId}/driver/me/eligible-vehicles
POST /client/{clientId}/driver/me/end-shift
POST /client/{clientId}/driver/me/messages/{id}/read
GET /client/{clientId}/driver/me/messages
POST /client/{clientId}/driver/me/start-shift
POST /client/{clientId}/transporter/{transporterId}/force-end-shift
GET /client/{clientId}/transporter/live-shifts
GET /client/{clientId}/driver/me/surge
POST /client/{clientId}/driver/me/surge/subscribe
POST /client/{clientId}/driver/me/surge/unsubscribe

Full request/response schemas and an interactive explorer will live in the API reference (coming soon).

Use cases

Operator flows that exercise this feature.

Pair a transporter

config risk: low

Create a transporter and link a driver + vehicle to it — the dispatchable unit.

  1. POST /client/{clientId}/transporter
  2. POST /client/{clientId}/transporter/{transporterId}/driver/{driverId}
  3. POST /client/{clientId}/transporter/{transporterId}/vehicle/{vehicleId}

Fields

FieldTypeDescription
ref string Shift reference / call-sign visible to operators + drivers ("DUB-042", "Night-7"). Queryable via `queryFields()`; not unique by itself — pair with `clientId`.
driver Driver The current logged in Driver. If driver entry is locked, this is the only driver who may login to this Transporter
driverEntryLocked boolean Single Driver Mode. This setting determines if the Transporter is in single driver mode only (locked to one specific driver). If this is enabled, you must specify a Driver record. If this is not enabled, you can choose which drivers are eligible below.
vehicle Vehicle Vehicle paired into this shift. Combined with `driver` to form the dispatch-eligible Driver-on-shift unit.
vehicleEntryLocked boolean Mirror of `driverEntryLocked` for the Vehicle side — `setVehicle()` throws when true. Keeps the Vehicle stable for the duration of an active trip / shift.
capabilityMask string 32-bit bitmask of capabilities this Driver+Vehicle pairing satisfies. Aggregated from `Driver.capabilities` ∪ `Vehicle.capabilities`; dispatch matches it against `Trip.capabilityMask` with a single bitwise AND.
fleetIds json Denormalised dispatch-scope: JSON array of Fleet IDs derived from the live Driver+Vehicle pairing. Source of truth on Driver/Vehicle; refreshed by membership-write hooks.
primaryGroup string Primary group label within the fleet (controller groups, geographic teams, depot codes). Operator-curated; surfaces in the dispatch board grouping and reporting cuts.
groups Collection
deletedAt integer
deletedBy bigint
clientId bigint Tenant scope. Every tenant-aware entity carries this; `ClientFilter` enforces row-level isolation on read; the multi-tenancy routing layer (`/client/{clientId}`) sets it at create time. Surfaced only under `admin` / `tripLog` groups — never to end users.
internalKey string Optional client-supplied external reference / idempotency key. When present, lets external systems correlate platform-side records back to their own source-of-truth ids. Not persisted to a column — populated by the request handler when the caller sets it.
__objectType string Discriminator string (entity class short-name) emitted alongside the id in serialized output. Resolved at read time by `getObjectType()`; lets the FE dispatch entity-specific rendering without inspecting the URL.
id bigint Snowflake-style primary key (unsigned BIGINT). Generated by `IdFactory` at create time; surfaced to the FE / API as a `G`-prefixed string and stripped back to plain bigint server-side before Doctrine lookup.
createdDate integer Unix timestamp the row was first persisted. Set in the entity's PrePersist hook; never rewritten on subsequent updates.
updatedDate integer Unix timestamp the row was last touched. Bumped on every commit that hits the Doctrine UoW for this entity; drives FE invalidation + the listing change cursor.
passiveUpdatedDate int Read-through alias for `updatedDate` exposed under different serializer groups. Lets the FE distinguish "real edit" from "background touch" projections without changing the underlying column.
listingUpdatedDate int Listing-projection timestamp surfaced only under the `listMode` group. Driven by `TripCache` and other listing-shape refreshers separately from `updatedDate` so a listing rebuild doesn't trigger detail-page invalidation.