Download OpenAPI specification:
Org-scoped chauffeur booking SaaS API for operators, public bookers, passengers, and drivers.
Money: all amounts are integer pence (GBP minor units). Never send pounds as floats.
Auth: JWT bearer. Obtain accessToken via POST /api/v1/auth/login, then send
Authorization: Bearer <token>. Most org routes require membership + permission on :orgId.
Browsing: Redocly sidebar groups (npm run docs:preview) - best for navigation.
Try it: Scalar (npm run docs:preview:scalar) against http://localhost:4100.
Live Swagger UI on the API (/docs) is secondary.
Changelog: human notes in docs/API_CHANGES.md (not this machine spec).
Sync contract after route/schema changes: npm run docs:sync.
Liveness and dependency checks for deploys and load balancers.
GET /api/v1/health reports process status, app version, and a database ping.
No authentication. Use this before hitting org-scoped routes in smoke tests.
Staff authentication, registration bootstrap, password reset, and token refresh.
Public endpoints issue JWTs (accessToken / refresh). Protected routes under this tag
operate on the authenticated user (e.g. me, logout). Seed users are documented in
docs/API_DOCS.md. Platform admin login is separate under Admin.
| email required | string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... |
| password required | string >= 8 characters |
| name required | string non-empty |
| orgName | string |
| orgSlug | string |
{- "email": "user@example.com",
- "password": "stringst",
- "name": "string",
- "orgName": "string",
- "orgSlug": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| email required | string non-empty |
| password required | string non-empty |
{- "email": "string",
- "password": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| email required | string non-empty |
| password required | string non-empty |
{- "email": "string",
- "password": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| email required | string non-empty |
| surface | string Default: "chauffeur" Enum: "chauffeur" "staff" |
{- "email": "string",
- "surface": "chauffeur"
}{- "ok": true,
- "devResetUrl": "string",
- "devToken": "string",
- "property1": null,
- "property2": null
}| token required | string non-empty |
| newPassword required | string >= 8 characters |
{- "token": "string",
- "newPassword": "stringst"
}{- "ok": true
}| refreshToken | string |
{ }{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| code required | string non-empty |
| state | string |
{- "code": "string",
- "state": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| idToken required | string non-empty |
| surface | string Default: "chauffeur" Enum: "staff" "passenger" "chauffeur" "platform" |
{- "idToken": "string",
- "surface": "staff"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| email required | string non-empty |
| orgSlug | string |
{- "email": "string",
- "orgSlug": "string"
}{- "ok": true,
- "expiresAt": "string",
- "devMagicLink": "string",
- "devToken": "string",
- "property1": null,
- "property2": null
}| email required | string non-empty |
{- "email": "string"
}{- "ok": true,
- "expiresAt": "string",
- "devMagicLink": "string",
- "devToken": "string",
- "property1": null,
- "property2": null
}| token required | string non-empty |
{- "token": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| token required | string non-empty |
| password required | string >= 8 characters |
{- "token": "string",
- "password": "stringst"
}{- "orgId": "string",
- "userId": "string",
- "email": "string",
- "chauffeurId": "string",
- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "typ": "chauffeur",
- "needsOrgJoin": true
}| token required | string non-empty |
{- "token": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| code required | string = 6 characters |
{- "code": "string"
}{- "enabled": true,
- "backupCodes": [
- "string"
]
}| challengeToken required | string non-empty |
| code required | string non-empty |
{- "challengeToken": "string",
- "code": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "refreshToken": "string",
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "memberships": [
- null
]
}, - "typ": "staff",
- "orgId": "string",
- "chauffeurId": "string",
- "customerId": "string",
- "needsOrgJoin": true,
- "challengeRequired": true,
- "challengeToken": "string",
- "devTotpCode": "string"
}| code required | string non-empty |
{- "code": "string"
}{- "backupCodes": [
- "string"
]
}{ }{- "ok": true,
- "devVerifyUrl": "string",
- "devToken": "string",
- "property1": null,
- "property2": null
}Organization profile and settings for the tenant that owns bookings and fleet.
All paths are scoped by :orgId. Requires JWT + org membership. Settings drive branding,
rounding mode, booking behaviour, and Connect readiness - money rounding is always in pence.
| orgId required | string non-empty |
| name | string non-empty |
| tagline | string or null |
| supportPhone | string or null |
{- "name": "string",
- "tagline": "string",
- "supportPhone": "string"
}{- "id": "string",
- "name": "string",
- "slug": "string",
- "plan": "string",
- "status": "string",
- "tagline": "string",
- "supportPhone": "string"
}| orgId required | string non-empty |
| property name* additional property | any |
{- "property1": null,
- "property2": null
}{- "property1": null,
- "property2": null
}Invite, list, update, and deactivate staff members within an organization.
Role/permission checks gate mutations. Invite acceptance may appear under Auth when the caller is not yet a member. Org-scoped; amounts are not typically involved.
| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "role": "string",
- "status": "string",
- "notes": "string",
- "lastLoginAt": "string",
- "invitedAt": "string",
- "createdAt": "string",
- "inviteId": "string",
- "inviteToken": "string",
- "inviteExpiresAt": "string"
}
]
}| orgId required | string non-empty |
| name required | string non-empty |
| email required | string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... |
| role required | string Enum: "owner" "operations_manager" "dispatcher" "finance" "read_only" |
| phone | string |
| notes | string |
{- "name": "string",
- "email": "user@example.com",
- "role": "owner",
- "phone": "string",
- "notes": "string"
}{- "id": "string",
- "orgId": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "role": "string",
- "status": "string",
- "notes": "string",
- "lastLoginAt": "string",
- "invitedAt": "string",
- "createdAt": "string",
- "inviteId": "string",
- "inviteToken": "string",
- "inviteExpiresAt": "string"
}| orgId required | string non-empty |
| staffId required | string non-empty |
| role | string Enum: "owner" "operations_manager" "dispatcher" "finance" "read_only" |
| notes | string |
| status | string Enum: "active" "invited" "deactivated" |
{- "role": "owner",
- "notes": "string",
- "status": "active"
}{- "id": "string",
- "orgId": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "role": "string",
- "status": "string",
- "notes": "string",
- "lastLoginAt": "string",
- "invitedAt": "string",
- "createdAt": "string",
- "inviteId": "string",
- "inviteToken": "string",
- "inviteExpiresAt": "string"
}| orgId required | string non-empty |
| staffId required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "role": "string",
- "status": "string",
- "notes": "string",
- "lastLoginAt": "string",
- "invitedAt": "string",
- "createdAt": "string",
- "inviteId": "string",
- "inviteToken": "string",
- "inviteExpiresAt": "string"
}| orgId required | string non-empty |
| staffId required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "role": "string",
- "status": "string",
- "notes": "string",
- "lastLoginAt": "string",
- "invitedAt": "string",
- "createdAt": "string",
- "inviteId": "string",
- "inviteToken": "string",
- "inviteExpiresAt": "string"
}| orgId required | string non-empty |
| staffId required | string non-empty |
{- "staffId": "string",
- "userId": "string",
- "data": [
- {
- "id": "string",
- "type": "string",
- "at": "string",
- "summary": "string",
- "meta": {
- "property1": null,
- "property2": null
}
}
]
}Upload and manage org media assets (logos, fleet photos, builder images).
Authenticated org staff create upload intents / finalize assets. Public booking and builder
surfaces consume media URLs. Paths are org-scoped via :orgId.
| orgId required | string non-empty |
| q | string |
| tag | string |
| kind | string Enum: "image" "document" |
| cursor | string |
| limit | integer [ 1 .. 100 ] Default: 40 |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "kind": "image",
- "filename": "string",
- "mimeType": "string",
- "sizeBytes": -9007199254740991,
- "storageKey": "string",
- "width": -9007199254740991,
- "height": -9007199254740991,
- "alt": "string",
- "tags": [
- "string"
], - "url": "string",
- "createdByUserId": "string",
- "createdAt": "string",
- "updatedAt": "string"
}
], - "nextCursor": "string"
}| orgId required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "kind": "image",
- "filename": "string",
- "mimeType": "string",
- "sizeBytes": -9007199254740991,
- "storageKey": "string",
- "width": -9007199254740991,
- "height": -9007199254740991,
- "alt": "string",
- "tags": [
- "string"
], - "url": "string",
- "createdByUserId": "string",
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "kind": "image",
- "filename": "string",
- "mimeType": "string",
- "sizeBytes": -9007199254740991,
- "storageKey": "string",
- "width": -9007199254740991,
- "height": -9007199254740991,
- "alt": "string",
- "tags": [
- "string"
], - "url": "string",
- "createdByUserId": "string",
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| alt | string or null |
| tags | Array of strings |
| filename | string non-empty |
{- "alt": "string",
- "tags": [
- "string"
], - "filename": "string"
}{- "id": "string",
- "orgId": "string",
- "kind": "image",
- "filename": "string",
- "mimeType": "string",
- "sizeBytes": -9007199254740991,
- "storageKey": "string",
- "width": -9007199254740991,
- "height": -9007199254740991,
- "alt": "string",
- "tags": [
- "string"
], - "url": "string",
- "createdByUserId": "string",
- "createdAt": "string",
- "updatedAt": "string"
}In-app notification inbox for org staff (booking events, Connect, billing).
List, mark read, and manage notification state for the current user in an org context. Delivery of email is handled by the outbox (Email); this tag is the product inbox API.
| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "userId": "string",
- "type": "string",
- "title": "string",
- "body": "string",
- "meta": null,
- "readAt": "string",
- "createdAt": "string"
}
]
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "userId": "string",
- "type": "string",
- "title": "string",
- "body": "string",
- "meta": null,
- "readAt": "string",
- "createdAt": "string"
}| orgId required | string non-empty |
| endpoint required | string <uri> <= 2048 characters |
required | object |
| userAgent | string <= 512 characters |
{- "keys": {
- "p256dh": "string",
- "auth": "string"
}, - "userAgent": "string"
}{- "id": "string",
- "endpoint": "string",
- "createdAt": "string"
}Core trip lifecycle for dispatchers: create, list, update, assign, cancel.
Org-scoped (:orgId). Fares and line items use integer pence. Status transitions and
assignment touch fleet/chauffeur records. Calendar-style listing is served from these
endpoints (there is no separate Calendar tag).
| orgId required | string non-empty |
| from required | string non-empty |
| to required | string non-empty |
string or Array of strings | |
string or Array of strings | |
string or Array of strings | |
string or Array of strings | |
string or Array of strings | |
string or Array of strings | |
| q | string |
| assignment | string Enum: "assigned" "unassigned" |
{- "bookings": [
- {
- "id": "string",
- "orgId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "vehicleId": "string",
- "vehicleClassId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "endTime": "string",
- "durationMinutes": -9007199254740991,
- "status": "string",
- "farePence": -9007199254740991,
- "lateRisk": true,
- "zoneId": "string",
- "airportCode": "string",
- "notes": "string"
}
], - "conflicts": [
- {
- "chauffeurId": "string",
- "vehicleId": "string",
- "bookingIds": [
- "string"
]
}
], - "resources": {
- "chauffeurs": [
- {
- "id": "string",
- "name": "string",
- "vehiclePlate": "string",
- "status": "string"
}
], - "vehicles": [
- {
- "id": "string",
- "plate": "string",
- "status": "string"
}
]
}
}| orgId required | string non-empty |
{- "chauffeurs": [
- {
- "id": "string",
- "name": "string"
}
], - "vehicles": [
- {
- "id": "string",
- "plate": "string",
- "model": "string",
- "vehicleClassId": "string"
}
], - "vehicleClasses": [
- {
- "id": "string",
- "name": "string"
}
], - "zones": [
- {
- "id": "string",
- "name": "string"
}
], - "airports": [
- {
- "code": "string",
- "name": "string"
}
]
}| orgId required | string non-empty |
| status | string Enum: "confirmed" "assigned" "en_route" "arrived" "in_progress" "completed" "cancelled" |
string or Array of strings | |
| from | string |
| to | string |
| chauffeurId | string |
string or Array of strings | |
| q | string |
| archived | boolean |
| includeArchived | boolean |
| paymentStatus | string Enum: "pending" "paid" "refunded" "failed" |
string or Array of strings | |
| assignment | string Enum: "assigned" "unassigned" |
| vehicleClassId | string |
string or Array of strings | |
| vehicleId | string |
string or Array of strings | |
| zoneId | string |
string or Array of strings | |
| airportCode | string |
string or Array of strings |
[- {
- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}
]| orgId required | string non-empty |
| passengerId | string or null |
| vehicleClassId required | string non-empty |
| vehicleId | string or null |
| pickup required | string non-empty |
| dropoff required | string non-empty |
| pickupTime required | string non-empty |
| farePence | integer [ 0 .. 9007199254740991 ] |
| distanceMiles | number >= 0 |
| notes | string |
| zoneId | string or null |
| airportCode | string or null |
| chauffeurId | string or null |
| status | string Enum: "confirmed" "assigned" |
| paymentStatus | string Enum: "pending" "paid" "refunded" "failed" |
| quoteId | string or null |
| fareOverrideReason | string or null |
| flightNumber | string or null |
| flightSnapshot | null |
{- "passengerId": "string",
- "vehicleClassId": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "farePence": 9007199254740991,
- "distanceMiles": 0,
- "notes": "string",
- "zoneId": "string",
- "airportCode": "string",
- "chauffeurId": "string",
- "status": "confirmed",
- "paymentStatus": "pending",
- "quoteId": "string",
- "fareOverrideReason": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}{- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "contentType": "string",
- "csv": "string",
- "rowCount": -9007199254740991
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null,
- "quoteSnapshot": null,
- "dropoffTime": "string",
- "durationMinutes": 0,
- "cancelFeePence": -9007199254740991,
- "extras": null,
- "channel": "string",
- "property1": null,
- "property2": null
}| orgId required | string non-empty |
| id required | string non-empty |
| property name* additional property | any |
{- "property1": null,
- "property2": null
}{- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}| orgId required | string non-empty |
| id required | string non-empty |
| status required | string Enum: "confirmed" "assigned" "en_route" "arrived" "in_progress" "completed" "cancelled" |
{- "status": "confirmed"
}{- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}| orgId required | string non-empty |
| id required | string non-empty |
| chauffeurId required | string or null |
{- "chauffeurId": "string"
}{- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}| orgId required | string non-empty |
| ids required | Array of strings[ items non-empty ] |
required | object |
{- "ids": [
- "string"
], - "patch": {
- "property1": null,
- "property2": null
}
}[- {
- "id": "string",
- "orgId": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "vehicleClassId": "string",
- "vehicleClassName": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "quoteId": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}
]| orgId required | string non-empty |
| status | string Enum: "pending" "approved" "rejected" |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "bookingId": "string",
- "chauffeurId": "string",
- "chauffeurName": "string",
- "chauffeurEmail": "string",
- "reason": "string",
- "status": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "bookingStatus": "string",
- "stillAssigned": true,
- "createdAt": "string",
- "reviewedAt": "string",
- "reviewNote": "string"
}
]
}| orgId required | string non-empty |
| id required | string non-empty |
| reviewNote | string or null <= 2000 characters |
{- "reviewNote": "string"
}{- "id": "string",
- "status": "approved",
- "bookingId": "string",
- "unassigned": true,
- "cancelled": true,
- "requiresReassign": true,
- "reassignBookingId": "string",
- "reassignUrl": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| reviewNote | string or null <= 2000 characters |
{- "reviewNote": "string"
}{- "id": "string",
- "status": "approved",
- "bookingId": "string",
- "unassigned": true,
- "cancelled": true,
- "requiresReassign": true,
- "reassignBookingId": "string",
- "reassignUrl": "string"
}Live flight status for airport transfers via AviationStack (server-side key only).
Paid plans only (Organization.plan paid/pro). The platform flight_tracking flag is a
kill switch (off = nobody). Flag on + free plan is still blocked. Basic paid/pro: 500
upstream HTTP calls per org per UTC month; cache hits do not count. Over cap returns
error.code: QUOTA. Public lookup is rate-limited and never blocks booking. Responses use
a stable snapshot DTO, not the AviationStack payload shape. Refresh persists
Booking.flightSnapshot for dispatch timing.
| orgId required | string non-empty |
| flightIata | string [ 2 .. 12 ] characters ^[A-Za-z0-9]{2,12}$ |
| flightNumber | string [ 1 .. 12 ] characters |
| depIata | string = 3 characters ^[A-Za-z]{3}$ |
| arrIata | string = 3 characters ^[A-Za-z]{3}$ |
| flightDate | string^\d{4}-\d{2}-\d{2}$ |
| limit | integer [ 1 .. 10 ] |
{- "enabled": true,
- "configured": true,
- "flights": [
- {
- "flightDate": "string",
- "status": "scheduled",
- "airlineName": "string",
- "airlineIata": "string",
- "flightNumber": "string",
- "flightIata": "string",
- "flightIcao": "string",
- "departure": {
- "airportName": "string",
- "iata": "string",
- "icao": "string",
- "terminal": "string",
- "gate": "string",
- "delayMinutes": 0,
- "scheduledAt": "string",
- "estimatedAt": "string",
- "actualAt": "string"
}, - "arrival": {
- "airportName": "string",
- "iata": "string",
- "icao": "string",
- "terminal": "string",
- "gate": "string",
- "delayMinutes": 0,
- "scheduledAt": "string",
- "estimatedAt": "string",
- "actualAt": "string"
}, - "lastCheckedAt": "string"
}
], - "error": {
- "code": "DISABLED",
- "message": "string"
}
}| orgId required | string non-empty |
| id required | string non-empty |
{- "enabled": true,
- "configured": true,
- "flights": [
- {
- "flightDate": "string",
- "status": "scheduled",
- "airlineName": "string",
- "airlineIata": "string",
- "flightNumber": "string",
- "flightIata": "string",
- "flightIcao": "string",
- "departure": {
- "airportName": "string",
- "iata": "string",
- "icao": "string",
- "terminal": "string",
- "gate": "string",
- "delayMinutes": 0,
- "scheduledAt": "string",
- "estimatedAt": "string",
- "actualAt": "string"
}, - "arrival": {
- "airportName": "string",
- "iata": "string",
- "icao": "string",
- "terminal": "string",
- "gate": "string",
- "delayMinutes": 0,
- "scheduledAt": "string",
- "estimatedAt": "string",
- "actualAt": "string"
}, - "lastCheckedAt": "string"
}
], - "error": {
- "code": "DISABLED",
- "message": "string"
}, - "bookingId": "string",
- "persisted": true
}Operator home metrics for the selected organization.
Aggregates recent bookings, fleet utilisation signals, and attention items. Requires JWT + org access. Read-only snapshot for the console landing screen.
| orgId required | string non-empty |
| period | string Default: "7d" Enum: "today" "7d" "30d" |
{- "period": "today",
- "kpis": {
- "bookings": -9007199254740991,
- "activeBookings": -9007199254740991,
- "revenuePence": -9007199254740991,
- "unassigned": -9007199254740991,
- "lateRisk": -9007199254740991,
- "utilizationPct": 0,
- "completionRatePct": -9007199254740991
}, - "attention": [
- {
- "type": "string",
- "bookingId": "string",
- "pickupTime": "string"
}
], - "funnel": {
- "quoted": -9007199254740991,
- "started": -9007199254740991,
- "booked": -9007199254740991,
- "assigned": -9007199254740991,
- "paid": -9007199254740991,
- "completed": -9007199254740991,
- "revenuePence": {
- "quoted": -9007199254740991,
- "booked": -9007199254740991,
- "assigned": -9007199254740991,
- "completed": -9007199254740991
}
}, - "timeline": [
- {
- "id": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "vehicleClassId": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "funnelStage": "quote",
- "pickupLat": 0,
- "pickupLng": 0,
- "durationMinutes": -9007199254740991
}
], - "zones": [
- {
- "zoneId": "string",
- "zoneName": "string",
- "color": "string",
- "pickups": -9007199254740991,
- "revenuePence": -9007199254740991
}
], - "fleet": [
- {
- "id": "string",
- "name": "string",
- "status": "on_job",
- "utilizationPct": -9007199254740991,
- "jobsToday": -9007199254740991
}
], - "heatmap": [
- {
- "date": "string",
- "count": -9007199254740991,
- "revenuePence": -9007199254740991
}
], - "bookings": [
- {
- "id": "string",
- "passengerId": "string",
- "passengerName": "string",
- "chauffeurId": "string",
- "vehicleClassId": "string",
- "vehicleId": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "distanceMiles": 0,
- "paymentStatus": "string",
- "notes": "string",
- "createdAt": "string",
- "archived": true,
- "zoneId": "string",
- "airportCode": "string",
- "lateRisk": true,
- "funnelStage": "quote",
- "pickupLat": 0,
- "pickupLng": 0,
- "durationMinutes": -9007199254740991
}
], - "source": "live"
}Vehicles, vehicle classes, and chauffeur (driver) fleet records.
CRUD and availability for assets used in assignment and public quotes. Org-scoped. Class codes feed Pricing rates; chauffeurs also surface in the Chauffeur mobile API.
| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": -9007199254740991,
- "baseRatePence": -9007199254740991,
- "minFarePence": -9007199254740991,
- "hourlyRatePence": -9007199254740991,
- "includedMiles": 0,
- "includedHours": 0,
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "active": true,
- "bookable": true
}
], - "nextCursor": "string"
}| orgId required | string non-empty |
| name required | string non-empty |
| description | string |
| capacity | integer [ -9007199254740991 .. 9007199254740991 ] |
| luggage | integer [ 0 .. 9007199254740991 ] |
| baseRatePence required | integer [ 0 .. 9007199254740991 ] |
| minFarePence required | integer [ 0 .. 9007199254740991 ] |
| hourlyRatePence | integer or null [ -9007199254740991 .. 9007199254740991 ] |
| includedMiles | number >= 0 |
| includedHours | number >= 0 |
| bookable | boolean |
| active | boolean |
| imageMediaIds | Array of strings <= 5 items |
| images | Array of strings |
{- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": 9007199254740991,
- "baseRatePence": 9007199254740991,
- "minFarePence": 9007199254740991,
- "hourlyRatePence": -9007199254740991,
- "includedMiles": 0,
- "includedHours": 0,
- "bookable": true,
- "active": true,
- "imageMediaIds": [
- "string"
], - "images": [
- "string"
]
}{- "id": "string",
- "orgId": "string",
- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": -9007199254740991,
- "baseRatePence": -9007199254740991,
- "minFarePence": -9007199254740991,
- "hourlyRatePence": -9007199254740991,
- "includedMiles": 0,
- "includedHours": 0,
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "active": true,
- "bookable": true
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": -9007199254740991,
- "baseRatePence": -9007199254740991,
- "minFarePence": -9007199254740991,
- "hourlyRatePence": -9007199254740991,
- "includedMiles": 0,
- "includedHours": 0,
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "active": true,
- "bookable": true
}| orgId required | string non-empty |
| id required | string non-empty |
| name | string non-empty |
| description | string |
| capacity | integer [ -9007199254740991 .. 9007199254740991 ] |
| luggage | integer [ 0 .. 9007199254740991 ] |
| baseRatePence | integer [ 0 .. 9007199254740991 ] |
| minFarePence | integer [ 0 .. 9007199254740991 ] |
| hourlyRatePence | integer or null [ -9007199254740991 .. 9007199254740991 ] |
| includedMiles | number >= 0 |
| includedHours | number >= 0 |
| bookable | boolean |
| active | boolean |
| imageMediaIds | Array of strings <= 5 items |
| images | Array of strings |
| sortOrder | integer [ -9007199254740991 .. 9007199254740991 ] |
{- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": 9007199254740991,
- "baseRatePence": 9007199254740991,
- "minFarePence": 9007199254740991,
- "hourlyRatePence": -9007199254740991,
- "includedMiles": 0,
- "includedHours": 0,
- "bookable": true,
- "active": true,
- "imageMediaIds": [
- "string"
], - "images": [
- "string"
], - "sortOrder": -9007199254740991
}{- "id": "string",
- "orgId": "string",
- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": -9007199254740991,
- "baseRatePence": -9007199254740991,
- "minFarePence": -9007199254740991,
- "hourlyRatePence": -9007199254740991,
- "includedMiles": 0,
- "includedHours": 0,
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "active": true,
- "bookable": true
}| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "vehicleClassId": "string",
- "plate": "string",
- "make": "string",
- "model": "string",
- "colour": "string",
- "year": -9007199254740991,
- "status": "string",
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "luggage": -9007199254740991,
- "notes": "string",
- "phvLicense": "string",
- "odometer": -9007199254740991,
- "motExpiresAt": "string",
- "insuranceExpiresAt": "string",
- "phvExpiresAt": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}
], - "nextCursor": "string"
}| orgId required | string non-empty |
| vehicleClassId required | string non-empty |
| plate required | string non-empty |
| make | string |
| model | string |
| colour | string |
| year | integer [ -9007199254740991 .. 9007199254740991 ] |
| imageMediaIds | Array of strings <= 5 items |
| images | Array of strings |
| luggage | integer or null [ -9007199254740991 .. 9007199254740991 ] |
| notes | string |
| phvLicense | string or null |
| odometer | integer or null [ -9007199254740991 .. 9007199254740991 ] |
| motExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| insuranceExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| phvExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
{- "vehicleClassId": "string",
- "plate": "string",
- "make": "string",
- "model": "string",
- "colour": "string",
- "year": -9007199254740991,
- "imageMediaIds": [
- "string"
], - "images": [
- "string"
], - "luggage": -9007199254740991,
- "notes": "string",
- "phvLicense": "string",
- "odometer": -9007199254740991,
- "motExpiresAt": "2019-08-24T14:15:22Z",
- "insuranceExpiresAt": "2019-08-24T14:15:22Z",
- "phvExpiresAt": "2019-08-24T14:15:22Z"
}{- "id": "string",
- "orgId": "string",
- "vehicleClassId": "string",
- "plate": "string",
- "make": "string",
- "model": "string",
- "colour": "string",
- "year": -9007199254740991,
- "status": "string",
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "luggage": -9007199254740991,
- "notes": "string",
- "phvLicense": "string",
- "odometer": -9007199254740991,
- "motExpiresAt": "string",
- "insuranceExpiresAt": "string",
- "phvExpiresAt": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "vehicleClassId": "string",
- "plate": "string",
- "make": "string",
- "model": "string",
- "colour": "string",
- "year": -9007199254740991,
- "status": "string",
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "luggage": -9007199254740991,
- "notes": "string",
- "phvLicense": "string",
- "odometer": -9007199254740991,
- "motExpiresAt": "string",
- "insuranceExpiresAt": "string",
- "phvExpiresAt": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| vehicleClassId | string non-empty |
| plate | string non-empty |
| make | string |
| model | string |
| colour | string |
| year | integer [ -9007199254740991 .. 9007199254740991 ] |
| imageMediaIds | Array of strings <= 5 items |
| images | Array of strings |
| luggage | integer or null [ -9007199254740991 .. 9007199254740991 ] |
| notes | string |
| phvLicense | string or null |
| odometer | integer or null [ -9007199254740991 .. 9007199254740991 ] |
| motExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| insuranceExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| phvExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| archived | boolean |
{- "vehicleClassId": "string",
- "plate": "string",
- "make": "string",
- "model": "string",
- "colour": "string",
- "year": -9007199254740991,
- "imageMediaIds": [
- "string"
], - "images": [
- "string"
], - "luggage": -9007199254740991,
- "notes": "string",
- "phvLicense": "string",
- "odometer": -9007199254740991,
- "motExpiresAt": "2019-08-24T14:15:22Z",
- "insuranceExpiresAt": "2019-08-24T14:15:22Z",
- "phvExpiresAt": "2019-08-24T14:15:22Z",
- "archived": true
}{- "id": "string",
- "orgId": "string",
- "vehicleClassId": "string",
- "plate": "string",
- "make": "string",
- "model": "string",
- "colour": "string",
- "year": -9007199254740991,
- "status": "string",
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "luggage": -9007199254740991,
- "notes": "string",
- "phvLicense": "string",
- "odometer": -9007199254740991,
- "motExpiresAt": "string",
- "insuranceExpiresAt": "string",
- "phvExpiresAt": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| status required | string Enum: "available" "on_job" "maintenance" "retired" |
{- "status": "available"
}{- "id": "string",
- "orgId": "string",
- "vehicleClassId": "string",
- "plate": "string",
- "make": "string",
- "model": "string",
- "colour": "string",
- "year": -9007199254740991,
- "status": "string",
- "imageMediaIds": [
- "string"
], - "images": [
- {
- "id": "string",
- "url": "string",
- "alt": "string"
}
], - "luggage": -9007199254740991,
- "notes": "string",
- "phvLicense": "string",
- "odometer": -9007199254740991,
- "motExpiresAt": "string",
- "insuranceExpiresAt": "string",
- "phvExpiresAt": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "vehicleId": "string",
- "vehiclePlate": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string"
}
], - "nextCursor": "string"
}| orgId required | string non-empty |
| name required | string non-empty |
string | |
| phone | string |
| vehicleId | string or null |
| avatarMediaId | string or null |
| avatarUrl | string or null |
| languages | Array of strings |
| rating | number or null [ 0 .. 5 ] |
| badge | string or null |
| licenceExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| pcoExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| dbsExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
boolean or string or string |
{- "name": "string",
- "email": "string",
- "phone": "string",
- "vehicleId": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "languages": [
- "string"
], - "rating": 5,
- "badge": "string",
- "licenceExpiresAt": "2019-08-24T14:15:22Z",
- "pcoExpiresAt": "2019-08-24T14:15:22Z",
- "dbsExpiresAt": "2019-08-24T14:15:22Z",
- "docsRequiredBeforeUse": false
}{- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "vehicleId": "string",
- "vehiclePlate": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string",
- "licenceExpiresAt": "string",
- "pcoExpiresAt": "string",
- "dbsExpiresAt": "string",
- "docsRequiredBeforeUse": false,
- "userId": "string",
- "pendingInviteId": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "vehicleId": "string",
- "vehiclePlate": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string",
- "licenceExpiresAt": "string",
- "pcoExpiresAt": "string",
- "dbsExpiresAt": "string",
- "docsRequiredBeforeUse": false,
- "userId": "string",
- "pendingInviteId": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| name | string non-empty |
string | |
| phone | string |
| vehicleId | string or null |
| avatarMediaId | string or null |
| avatarUrl | string or null |
| languages | Array of strings |
| rating | number or null [ 0 .. 5 ] |
| badge | string or null |
| licenceExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| pcoExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| dbsExpiresAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
boolean or string or string | |
| status | string Enum: "available" "off_duty" "on_job" |
| archived | boolean |
{- "name": "string",
- "email": "string",
- "phone": "string",
- "vehicleId": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "languages": [
- "string"
], - "rating": 5,
- "badge": "string",
- "licenceExpiresAt": "2019-08-24T14:15:22Z",
- "pcoExpiresAt": "2019-08-24T14:15:22Z",
- "dbsExpiresAt": "2019-08-24T14:15:22Z",
- "docsRequiredBeforeUse": false,
- "status": "available",
- "archived": true
}{- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "vehicleId": "string",
- "vehiclePlate": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string",
- "licenceExpiresAt": "string",
- "pcoExpiresAt": "string",
- "dbsExpiresAt": "string",
- "docsRequiredBeforeUse": false,
- "userId": "string",
- "pendingInviteId": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| name required | string [ 1 .. 120 ] characters |
| email required | string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... |
| phone | string <= 40 characters |
| notes | string <= 2000 characters |
| vehicleId | string or null |
boolean or string or string Default: false |
{- "name": "string",
- "email": "user@example.com",
- "phone": "string",
- "notes": "string",
- "vehicleId": "string",
- "docsRequiredBeforeUse": false
}{- "id": "string",
- "inviteId": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "docsRequiredBeforeUse": false,
- "status": "invited",
- "invitedAt": "string",
- "inviteToken": "string",
- "inviteExpiresAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| vehicleId required | string or null |
{- "vehicleId": "string"
}{- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "vehicleId": "string",
- "vehiclePlate": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string",
- "licenceExpiresAt": "string",
- "pcoExpiresAt": "string",
- "dbsExpiresAt": "string",
- "docsRequiredBeforeUse": false,
- "userId": "string",
- "pendingInviteId": "string",
- "archived": true,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "resourceType": "vehicle",
- "resourceId": "string",
- "resourceLabel": "string",
- "kind": "string",
- "severity": "warning",
- "expiresAt": "string",
- "message": "string"
}
]
}Passenger/customer CRM for the organization (profiles, notes, history).
Org-scoped JWT routes. Linked to bookings by customer id. No payment capture here - use Payments / Portal for charging and passenger self-service.
| orgId required | string non-empty |
| q | string |
| status | string Enum: "active" "inactive" "vip" "blocked" |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "company": "string",
- "status": "active",
- "tags": [
- "string"
], - "notes": "string",
- "noteRows": [
- {
- "id": "string",
- "body": "string",
- "author": "string",
- "createdAt": "string",
- "updatedAt": "string"
}
], - "feedback": [
- {
- "id": "string",
- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new",
- "createdAt": "string"
}
], - "archived": true,
- "createdAt": "string"
}
], - "nextCursor": "string"
}| orgId required | string non-empty |
| name required | string non-empty |
string | |
| phone | string |
| company | string |
| status | string Enum: "active" "inactive" "vip" "blocked" |
| tags | Array of strings |
| notes | string |
{- "name": "string",
- "email": "string",
- "phone": "string",
- "company": "string",
- "status": "active",
- "tags": [
- "string"
], - "notes": "string"
}{- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "company": "string",
- "status": "active",
- "tags": [
- "string"
], - "notes": "string",
- "noteRows": [
- {
- "id": "string",
- "body": "string",
- "author": "string",
- "createdAt": "string",
- "updatedAt": "string"
}
], - "feedback": [
- {
- "id": "string",
- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new",
- "createdAt": "string"
}
], - "archived": true,
- "createdAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "company": "string",
- "status": "active",
- "tags": [
- "string"
], - "notes": "string",
- "noteRows": [
- {
- "id": "string",
- "body": "string",
- "author": "string",
- "createdAt": "string",
- "updatedAt": "string"
}
], - "feedback": [
- {
- "id": "string",
- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new",
- "createdAt": "string"
}
], - "archived": true,
- "createdAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| name | string non-empty |
string | |
| phone | string |
| company | string |
| status | string Enum: "active" "inactive" "vip" "blocked" |
| tags | Array of strings |
| notes | string |
| archived | boolean |
{- "name": "string",
- "email": "string",
- "phone": "string",
- "company": "string",
- "status": "active",
- "tags": [
- "string"
], - "notes": "string",
- "archived": true
}{- "id": "string",
- "orgId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "company": "string",
- "status": "active",
- "tags": [
- "string"
], - "notes": "string",
- "noteRows": [
- {
- "id": "string",
- "body": "string",
- "author": "string",
- "createdAt": "string",
- "updatedAt": "string"
}
], - "feedback": [
- {
- "id": "string",
- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new",
- "createdAt": "string"
}
], - "archived": true,
- "createdAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
{- "data": [
- {
- "id": "string",
- "body": "string",
- "author": "string",
- "createdAt": "string",
- "updatedAt": "string"
}
]
}| orgId required | string non-empty |
| id required | string non-empty |
| body required | string non-empty |
| author | string |
{- "body": "string",
- "author": "string"
}{- "id": "string",
- "body": "string",
- "author": "string",
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| noteId required | string non-empty |
| body | string non-empty |
| author | string |
{- "body": "string",
- "author": "string"
}{- "id": "string",
- "body": "string",
- "author": "string",
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
{- "data": [
- {
- "id": "string",
- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new",
- "createdAt": "string"
}
]
}| orgId required | string non-empty |
| id required | string non-empty |
| rating required | integer [ 1 .. 5 ] |
| comment | string |
| bookingId | string |
| status | string Enum: "new" "reviewed" "archived" |
{- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new"
}{- "id": "string",
- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new",
- "createdAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| feedbackId required | string non-empty |
| rating | integer [ 1 .. 5 ] |
| comment | string |
| bookingId | string or null |
| status | string Enum: "new" "reviewed" "archived" |
{- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new"
}{- "id": "string",
- "rating": 1,
- "comment": "string",
- "bookingId": "string",
- "status": "new",
- "createdAt": "string"
}Live fleet monitoring for org staff: roster snapshot, duty status, GPS trail for in-progress trips, and ops alerts.
Requires JWT + monitoring permission. Fleet-wide live locations are not
exposed to passengers.
| orgId required | string non-empty |
| dutyStatus | string Default: "all" Enum: "working" "on_leave" "off_duty" "all" |
| q | string |
| onMapOnly | string Enum: "0" "1" "true" "false" |
| since | string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
{- "data": [
- {
- "id": "string",
- "chauffeurId": "string",
- "name": "string",
- "phone": "string",
- "avatarUrl": "string",
- "initials": "string",
- "vehicleLabel": "string",
- "plate": "string",
- "dutyStatus": "working",
- "motionState": "moving",
- "passengerOnBoard": true,
- "activeBookingId": "string",
- "location": {
- "lat": 0,
- "lng": 0
}, - "heading": 0,
- "speedMps": 0,
- "lastSeenAt": "string",
- "shift": {
- "startedAt": "string",
- "endsAt": "string",
- "scheduledMinutes": -9007199254740991
}, - "statusNote": "string",
- "threadId": "string"
}
], - "serverTime": "string"
}| orgId required | string non-empty |
| chauffeurId required | string non-empty |
{- "id": "string",
- "chauffeurId": "string",
- "name": "string",
- "phone": "string",
- "avatarUrl": "string",
- "initials": "string",
- "vehicleLabel": "string",
- "plate": "string",
- "dutyStatus": "working",
- "motionState": "moving",
- "passengerOnBoard": true,
- "activeBookingId": "string",
- "location": {
- "lat": 0,
- "lng": 0
}, - "heading": 0,
- "speedMps": 0,
- "lastSeenAt": "string",
- "shift": {
- "startedAt": "string",
- "endsAt": "string",
- "scheduledMinutes": -9007199254740991
}, - "statusNote": "string",
- "threadId": "string"
}| orgId required | string non-empty |
| chauffeurId required | string non-empty |
| from | string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| to | string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| bookingId | string |
| cursor | string |
| limit | integer ( 0 .. 2000 ] Default: 500 |
{- "data": [
- {
- "id": "string",
- "lat": 0,
- "lng": 0,
- "recordedAt": "string",
- "receivedAt": "string",
- "speedMps": 0,
- "heading": 0,
- "accuracyM": 0,
- "bookingId": "string",
- "source": "string"
}
], - "meta": {
- "nextCursor": "string"
}
}| orgId required | string non-empty |
| chauffeurId required | string non-empty |
| dutyStatus required | string Enum: "working" "on_leave" "off_duty" |
| statusNote | string or null <= 500 characters |
| startedAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| endsAt | string or null <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| scheduledMinutes | integer ( 0 .. 1440 ] |
{- "dutyStatus": "working",
- "statusNote": "string",
- "startedAt": "2019-08-24T14:15:22Z",
- "endsAt": "2019-08-24T14:15:22Z",
- "scheduledMinutes": 1440
}{- "id": "string",
- "chauffeurId": "string",
- "name": "string",
- "phone": "string",
- "avatarUrl": "string",
- "initials": "string",
- "vehicleLabel": "string",
- "plate": "string",
- "dutyStatus": "working",
- "motionState": "moving",
- "passengerOnBoard": true,
- "activeBookingId": "string",
- "location": {
- "lat": 0,
- "lng": 0
}, - "heading": 0,
- "speedMps": 0,
- "lastSeenAt": "string",
- "shift": {
- "startedAt": "string",
- "endsAt": "string",
- "scheduledMinutes": -9007199254740991
}, - "statusNote": "string",
- "threadId": "string"
}| orgId required | string non-empty |
| cursor | string |
| limit | integer ( 0 .. 100 ] Default: 40 |
| unackedOnly | string Enum: "0" "1" "true" "false" |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "type": "traffic_delay",
- "title": "string",
- "body": "string",
- "chauffeurId": "string",
- "bookingId": "string",
- "threadId": "string",
- "createdAt": "string",
- "acknowledgedAt": "string"
}
], - "meta": {
- "nextCursor": "string"
}
}| orgId required | string non-empty |
| type required | string Enum: "traffic_delay" "status_change" "chat_message" "passenger_boarded" "passenger_alighted" "shift_ending" "custom" |
| title required | string [ 1 .. 200 ] characters |
| body | string <= 2000 characters |
| chauffeurId | string |
| bookingId | string |
| threadId | string |
{- "type": "traffic_delay",
- "title": "string",
- "body": "string",
- "chauffeurId": "string",
- "bookingId": "string",
- "threadId": "string"
}{- "id": "string",
- "orgId": "string",
- "type": "traffic_delay",
- "title": "string",
- "body": "string",
- "chauffeurId": "string",
- "bookingId": "string",
- "threadId": "string",
- "createdAt": "string",
- "acknowledgedAt": "string"
}| orgId required | string non-empty |
| alertId required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "type": "traffic_delay",
- "title": "string",
- "body": "string",
- "chauffeurId": "string",
- "bookingId": "string",
- "threadId": "string",
- "createdAt": "string",
- "acknowledgedAt": "string"
}Unified ops messaging (staff↔chauffeur and staff↔passenger). Same store as Live Monitoring SlideOver chat.
Threads, messages, image attachments, reactions, read receipts, pin/archive. Realtime fan-out via Socket.IO; REST is source of truth.
| orgId required | string non-empty |
| type | string Default: "all" Enum: "all" "chauffeur" "passenger" |
| lens | string Default: "open" Enum: "open" "needs_reply" "pinned" "archived" |
| q | string |
| updatedSince | string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
| cursor | string |
| limit | integer ( 0 .. 100 ] Default: 40 |
{- "data": [
- {
- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}
], - "meta": {
- "nextCursor": "string"
}
}| orgId required | string non-empty |
| type required | string Value: "passenger" |
| customerId required | string non-empty |
| bookingId | string |
{- "type": "chauffeur",
- "chauffeurId": "string"
}{- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}| orgId required | string non-empty |
| chauffeurId required | string non-empty |
{- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}| orgId required | string non-empty |
| threadId required | string non-empty |
{- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}| orgId required | string non-empty |
| threadId required | string non-empty |
| cursor | string |
| limit | integer ( 0 .. 100 ] Default: 50 |
| after | string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
{- "data": [
- {
- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}
], - "meta": {
- "nextCursor": "string"
}
}| orgId required | string non-empty |
| threadId required | string non-empty |
| body required | string [ 1 .. 4000 ] characters |
| clientTempId | string <= 64 characters |
{- "body": "string",
- "clientTempId": "string"
}{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}| orgId required | string non-empty |
| threadId required | string non-empty |
{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}| orgId required | string non-empty |
| threadId required | string non-empty |
| readAt | string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
{- "readAt": "2019-08-24T14:15:22Z"
}{- "threadId": "string",
- "userId": "string",
- "readAt": "string",
- "unreadCount": -9007199254740991
}| orgId required | string non-empty |
| threadId required | string non-empty |
| pinned required | boolean |
{- "pinned": true
}{- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}| orgId required | string non-empty |
| threadId required | string non-empty |
| archived required | boolean |
{- "archived": true
}{- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}| orgId required | string non-empty |
| threadId required | string non-empty |
| messageId required | string non-empty |
| emoji required | string [ 1 .. 32 ] characters |
{- "emoji": "string"
}{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}| orgId required | string non-empty |
| threadId required | string non-empty |
| messageId required | string non-empty |
| emoji required | string non-empty |
{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}Rate cards, zones, time tiers, surcharges, and quote simulation.
All rates and quote totals are integer pence. Org-scoped configuration drives public and
console quotes. Rounding modes on the org apply after composition (see docs/PRICING_MONEY.md).
| orgId required | string non-empty |
| mode required | string Enum: "distance" "airport" "hourly" |
| vehicleClassId required | string non-empty |
| miles | number >= 0 Default: 0 |
| hours | number >= 0 Default: 0 |
| tierId | string or null |
| zoneId | string or null |
| airportCode | string or null |
| pickupPostcode | string |
| dropoffPostcode | string |
| pickupLat | number |
| pickupLng | number |
| dropoffLat | number |
| dropoffLng | number |
| waitMinutes | integer [ 0 .. 9007199254740991 ] Default: 0 |
| extraStops | integer [ 0 .. 9007199254740991 ] Default: 0 |
| surchargeIds | Array of strings Default: [] |
| applyGratuity | boolean Default: false |
| applyTax | boolean Default: true |
{- "mode": "distance",
- "vehicleClassId": "string",
- "miles": 0,
- "hours": 0,
- "tierId": "string",
- "zoneId": "string",
- "airportCode": "string",
- "pickupPostcode": "string",
- "dropoffPostcode": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "waitMinutes": 0,
- "extraStops": 0,
- "surchargeIds": [ ],
- "applyGratuity": false,
- "applyTax": true
}{- "quoteId": "string",
- "expiresAt": "string",
- "lines": [
- {
- "key": "string",
- "label": "string",
- "amountPence": -9007199254740991,
- "detail": "string",
- "kind": "string"
}
], - "subtotalPence": -9007199254740991,
- "totalPence": -9007199254740991,
- "currency": "string",
- "warnings": [
- "string"
], - "applied": {
- "bandId": "string",
- "airportFareId": "string",
- "tierId": "string",
- "zoneId": "string",
- "surchargeIds": [
- "string"
]
}, - "pricingVersionId": "string",
- "mode": "distance",
- "airportCode": "string",
- "miles": 0
}| orgId required | string non-empty |
{- "publishedPricingVersionId": "string",
- "data": [
- {
- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string"
}
]
}| orgId required | string non-empty |
| versionId required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string",
- "tiers": [
- {
- "property1": null,
- "property2": null
}
], - "mileageBands": [
- {
- "property1": null,
- "property2": null
}
], - "airportFares": [
- {
- "property1": null,
- "property2": null
}
], - "zones": [
- {
- "property1": null,
- "property2": null
}
], - "surcharges": [
- {
- "property1": null,
- "property2": null
}
], - "londonCoverage": null,
- "airportPostcodes": null
}| orgId required | string non-empty |
| label | string |
| fromVersionId | string |
{- "label": "string",
- "fromVersionId": "string"
}{- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string",
- "tiers": [
- {
- "property1": null,
- "property2": null
}
], - "mileageBands": [
- {
- "property1": null,
- "property2": null
}
], - "airportFares": [
- {
- "property1": null,
- "property2": null
}
], - "zones": [
- {
- "property1": null,
- "property2": null
}
], - "surcharges": [
- {
- "property1": null,
- "property2": null
}
], - "londonCoverage": null,
- "airportPostcodes": null
}| orgId required | string non-empty |
| versionId required | string non-empty |
| label | string |
| changeSummary | string |
| currency | string |
| taxRatePercent | number |
| gratuityDefaultPercent | number |
| freeWaitMinutes | integer [ -9007199254740991 .. 9007199254740991 ] |
| roundingMode | string Enum: "nearest_penny" "nearest_50p" "nearest_pound" |
Array of objects | |
Array of objects | |
Array of objects | |
Array of objects | |
Array of objects | |
object | |
Array of objects |
{- "label": "string",
- "changeSummary": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "nearest_penny",
- "tiers": [
- {
- "name": "string",
- "timeRange": "string",
- "multiplier": 0,
- "active": true
}
], - "mileageBands": [
- {
- "vehicleClassId": "string",
- "fromMiles": 0,
- "toMiles": 0,
- "ratePerMilePence": -9007199254740991
}
], - "airportFares": [
- {
- "vehicleClassId": "string",
- "airportCode": "string",
- "airportName": "string",
- "farePence": -9007199254740991,
- "pricingMode": "fixed_only",
- "includedMiles": 0,
- "excessRatePence": -9007199254740991,
- "active": true
}
], - "zones": [
- {
- "name": "string",
- "type": "multiplier",
- "multiplier": 0,
- "active": true,
- "areaId": "string"
}
], - "surcharges": [
- {
- "name": "string",
- "type": "fixed",
- "amountPence": -9007199254740991,
- "percentValue": 0,
- "active": true
}
], - "londonCoverage": {
- "selectedAreaIds": [
- "string"
], - "property1": null,
- "property2": null
}, - "airportPostcodes": [
- {
- "postcode": "string",
- "airportCode": "string",
- "label": "string",
- "radiusMiles": 0,
- "lat": 0,
- "lng": 0
}
]
}{- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string",
- "tiers": [
- {
- "property1": null,
- "property2": null
}
], - "mileageBands": [
- {
- "property1": null,
- "property2": null
}
], - "airportFares": [
- {
- "property1": null,
- "property2": null
}
], - "zones": [
- {
- "property1": null,
- "property2": null
}
], - "surcharges": [
- {
- "property1": null,
- "property2": null
}
], - "londonCoverage": null,
- "airportPostcodes": null
}| orgId required | string non-empty |
| versionId required | string non-empty |
| changeSummary | string |
{- "versionId": "string",
- "changeSummary": "string"
}{- "publishedPricingVersionId": "string",
- "version": {
- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string"
}, - "idempotent": true
}| orgId required | string non-empty |
| versionId required | string non-empty |
{- "publishedPricingVersionId": "string",
- "version": {
- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string"
}
}| orgId required | string non-empty |
| versionId required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string",
- "tiers": [
- {
- "property1": null,
- "property2": null
}
], - "mileageBands": [
- {
- "property1": null,
- "property2": null
}
], - "airportFares": [
- {
- "property1": null,
- "property2": null
}
], - "zones": [
- {
- "property1": null,
- "property2": null
}
], - "surcharges": [
- {
- "property1": null,
- "property2": null
}
], - "londonCoverage": null,
- "airportPostcodes": null
}| orgId required | string non-empty |
| versionId required | string non-empty |
| selectedAreaIds required | Array of strings |
{- "selectedAreaIds": [
- "string"
]
}{- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string",
- "tiers": [
- {
- "property1": null,
- "property2": null
}
], - "mileageBands": [
- {
- "property1": null,
- "property2": null
}
], - "airportFares": [
- {
- "property1": null,
- "property2": null
}
], - "zones": [
- {
- "property1": null,
- "property2": null
}
], - "surcharges": [
- {
- "property1": null,
- "property2": null
}
], - "londonCoverage": null,
- "airportPostcodes": null
}| orgId required | string non-empty |
| versionId required | string non-empty |
required | Array of objects |
{- "airportPostcodes": [
- {
- "postcode": "string",
- "airportCode": "string",
- "label": "string",
- "radiusMiles": 0,
- "lat": 0,
- "lng": 0
}
]
}{- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string",
- "tiers": [
- {
- "property1": null,
- "property2": null
}
], - "mileageBands": [
- {
- "property1": null,
- "property2": null
}
], - "airportFares": [
- {
- "property1": null,
- "property2": null
}
], - "zones": [
- {
- "property1": null,
- "property2": null
}
], - "surcharges": [
- {
- "property1": null,
- "property2": null
}
], - "londonCoverage": null,
- "airportPostcodes": null
}| orgId required | string non-empty |
| versionId required | string non-empty |
| vehicleClassIds | Array of strings |
| replaceExisting | boolean |
Array of objects |
{- "vehicleClassIds": [
- "string"
], - "replaceExisting": true,
- "bands": [
- {
- "fromMiles": 0,
- "toMiles": 0,
- "rateFactor": 0
}
]
}{- "id": "string",
- "orgId": "string",
- "label": "string",
- "changeSummary": "string",
- "isDraft": true,
- "publishedAt": "string",
- "currency": "string",
- "taxRatePercent": 0,
- "gratuityDefaultPercent": 0,
- "freeWaitMinutes": -9007199254740991,
- "roundingMode": "string",
- "sourceVersionId": "string",
- "createdAt": "string",
- "tiers": [
- {
- "property1": null,
- "property2": null
}
], - "mileageBands": [
- {
- "property1": null,
- "property2": null
}
], - "airportFares": [
- {
- "property1": null,
- "property2": null
}
], - "zones": [
- {
- "property1": null,
- "property2": null
}
], - "surcharges": [
- {
- "property1": null,
- "property2": null
}
], - "londonCoverage": null,
- "airportPostcodes": null
}Public booking-page builder: pages, blocks, publish, and template catalogue.
Org staff configure the white-label booking experience. Published pages are consumed by
Public routes via org slug. Template tags in seed data are UI labels, not OpenAPI tags.
| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "name": "string",
- "description": "string",
- "tags": [
- "string"
], - "formStyle": "string",
- "formDesignId": "string",
- "theme": {
- "property1": null,
- "property2": null
}, - "preview": {
- "property1": null,
- "property2": null
}
}
]
}| orgId required | string non-empty |
| templateId required | string non-empty |
{- "templateId": "string"
}{- "orgId": "string",
- "config": {
- "property1": null,
- "property2": null
}, - "updatedAt": "string",
- "revision": -9007199254740991,
- "publishedBuilderVersionId": "string",
- "baseVersionId": "string",
- "baseVersionNumber": -9007199254740991,
- "latestVersionNumber": -9007199254740991,
- "hasSecretsInDraft": true
}| orgId required | string non-empty |
{- "orgId": "string",
- "config": {
- "property1": null,
- "property2": null
}, - "updatedAt": "string",
- "revision": -9007199254740991,
- "publishedBuilderVersionId": "string",
- "baseVersionId": "string",
- "baseVersionNumber": -9007199254740991,
- "latestVersionNumber": -9007199254740991,
- "hasSecretsInDraft": true
}| orgId required | string non-empty |
required | object |
| baseVersionId | string or null |
| expectedRevision | integer or null [ 0 .. 9007199254740991 ] |
{- "config": {
- "property1": null,
- "property2": null
}, - "baseVersionId": "string",
- "expectedRevision": 9007199254740991
}{- "orgId": "string",
- "config": {
- "property1": null,
- "property2": null
}, - "updatedAt": "string",
- "revision": -9007199254740991,
- "publishedBuilderVersionId": "string",
- "baseVersionId": "string",
- "baseVersionNumber": -9007199254740991,
- "latestVersionNumber": -9007199254740991,
- "hasSecretsInDraft": true
}| orgId required | string non-empty |
| label | string |
| notes | string |
{- "label": "string",
- "notes": "string"
}{- "id": "string",
- "orgId": "string",
- "version": -9007199254740991,
- "label": "string",
- "notes": "string",
- "publishedAt": "string",
- "publishedByUserId": "string",
- "sourceVersionId": "string",
- "config": {
- "property1": null,
- "property2": null
}
}| orgId required | string non-empty |
{- "publishedBuilderVersionId": "string",
- "latestVersionNumber": -9007199254740991,
- "data": [
- {
- "id": "string",
- "version": -9007199254740991,
- "label": "string",
- "notes": "string",
- "publishedAt": "string",
- "publishedByUserId": "string",
- "sourceVersionId": "string",
- "isCurrent": true
}
]
}| orgId required | string non-empty |
| versionId required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "version": -9007199254740991,
- "label": "string",
- "notes": "string",
- "publishedAt": "string",
- "publishedByUserId": "string",
- "sourceVersionId": "string",
- "config": {
- "property1": null,
- "property2": null
}
}| orgId required | string non-empty |
| versionId required | string non-empty |
{- "publishedBuilderVersionId": "string",
- "version": {
- "id": "string",
- "version": -9007199254740991,
- "label": "string",
- "notes": "string",
- "publishedAt": "string",
- "publishedByUserId": "string",
- "sourceVersionId": "string",
- "isCurrent": true
}
}| orgId required | string non-empty |
| versionId required | string non-empty |
{- "orgId": "string",
- "config": {
- "property1": null,
- "property2": null
}, - "updatedAt": "string",
- "revision": -9007199254740991,
- "publishedBuilderVersionId": "string",
- "baseVersionId": "string",
- "baseVersionNumber": -9007199254740991,
- "latestVersionNumber": -9007199254740991,
- "hasSecretsInDraft": true
}Optional add-ons (child seats, meet & greet, etc.) selectable on quotes and bookings.
Org-scoped catalogue with prices in pence. Public and console flows attach extras to quotes; totals remain integer minor units end-to-end.
| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "code": "string",
- "name": "string",
- "description": "string",
- "amountPence": -9007199254740991,
- "bookable": true,
- "active": true,
- "sortOrder": -9007199254740991,
- "createdAt": "string",
- "updatedAt": "string"
}
]
}| orgId required | string non-empty |
| code required | string [ 1 .. 64 ] characters |
| name required | string non-empty |
| description | string |
| amountPence required | integer [ 0 .. 9007199254740991 ] |
| bookable | boolean |
| active | boolean |
| sortOrder | integer [ -9007199254740991 .. 9007199254740991 ] |
{- "code": "string",
- "name": "string",
- "description": "string",
- "amountPence": 9007199254740991,
- "bookable": true,
- "active": true,
- "sortOrder": -9007199254740991
}{- "id": "string",
- "orgId": "string",
- "code": "string",
- "name": "string",
- "description": "string",
- "amountPence": -9007199254740991,
- "bookable": true,
- "active": true,
- "sortOrder": -9007199254740991,
- "createdAt": "string",
- "updatedAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| code | string [ 1 .. 64 ] characters |
| name | string non-empty |
| description | string |
| amountPence | integer [ 0 .. 9007199254740991 ] |
| bookable | boolean |
| active | boolean |
| sortOrder | integer [ -9007199254740991 .. 9007199254740991 ] |
{- "code": "string",
- "name": "string",
- "description": "string",
- "amountPence": 9007199254740991,
- "bookable": true,
- "active": true,
- "sortOrder": -9007199254740991
}{- "id": "string",
- "orgId": "string",
- "code": "string",
- "name": "string",
- "description": "string",
- "amountPence": -9007199254740991,
- "bookable": true,
- "active": true,
- "sortOrder": -9007199254740991,
- "createdAt": "string",
- "updatedAt": "string"
}Unauthenticated booking funnel by org slug (quote, availability, create booking).
No JWT. Rate-limited. Returns published builder config, vehicle classes, and creates bookings/payments handoff. Money in responses is pence. AI chat is under AI.
{- "orgId": "string",
- "slug": "string",
- "name": "string",
- "tagline": "string",
- "supportPhone": "string",
- "paymentMode": "string",
- "depositPercent": 0,
- "booking": {
- "mode": "string",
- "minLeadTimeHours": 0,
- "maxAdvanceDays": 0
}, - "vehicleClasses": [
- {
- "id": "string",
- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": -9007199254740991,
- "imageMediaIds": [
- "string"
], - "images": [
- "string"
], - "baseRatePence": -9007199254740991,
- "minFarePence": -9007199254740991
}
], - "extras": [
- {
- "id": "string",
- "code": "string",
- "name": "string",
- "description": "string",
- "amountPence": -9007199254740991
}
], - "builder": {
- "version": -9007199254740991,
- "publishedAt": "string",
- "config": {
- "property1": null,
- "property2": null
}
}, - "secretsStripped": true,
- "isFreePlan": true,
- "flightTrackingEnabled": true
}{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "name": "string",
- "description": "string",
- "capacity": -9007199254740991,
- "luggage": -9007199254740991,
- "imageMediaIds": [
- "string"
], - "images": [
- "string"
], - "baseRatePence": -9007199254740991,
- "minFarePence": -9007199254740991,
- "hourlyRatePence": -9007199254740991,
- "bookable": true,
- "active": true
}
]
}| slug required | string non-empty |
| input required | string [ 1 .. 200 ] characters |
| sessionToken | string [ 1 .. 36 ] characters |
| regionCode | string = 2 characters |
| languageCode | string [ 2 .. 10 ] characters |
{- "suggestions": [
- {
- "description": "string",
- "placeId": "string",
- "mainText": "string",
- "secondaryText": "string",
- "type": "airport"
}
]
}| slug required | string non-empty |
| placeId required | string [ 1 .. 256 ] characters |
| sessionToken | string [ 1 .. 36 ] characters |
| regionCode | string = 2 characters |
| languageCode | string [ 2 .. 10 ] characters |
{- "placeId": "string",
- "formattedAddress": "string",
- "displayName": "string",
- "location": {
- "lat": -90,
- "lng": -180
}
}| slug required | string non-empty |
| vehicleClassId required | string non-empty |
| miles | number >= 0 Default: 0 |
| hours | number >= 0 Default: 0 |
| tierId | string or null |
| airportCode | string or null |
| pickupPostcode | string |
| dropoffPostcode | string |
| pickupLat | number |
| pickupLng | number |
| dropoffLat | number |
| dropoffLng | number |
| waitMinutes | integer [ 0 .. 9007199254740991 ] Default: 0 |
| extraStops | integer [ 0 .. 9007199254740991 ] Default: 0 |
| surchargeIds | Array of strings Default: [] |
| applyGratuity | boolean Default: false |
| applyTax | boolean Default: true |
| mode | string Default: "distance" Enum: "distance" "airport" "hourly" |
object or null | |
object or null | |
| pickupAddress | string or null non-empty |
| dropoffAddress | string or null non-empty |
Array of objects |
{- "vehicleClassId": "string",
- "miles": 0,
- "hours": 0,
- "tierId": "string",
- "airportCode": "string",
- "pickupPostcode": "string",
- "dropoffPostcode": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "waitMinutes": 0,
- "extraStops": 0,
- "surchargeIds": [ ],
- "applyGratuity": false,
- "applyTax": true,
- "mode": "distance",
- "pickupCoords": {
- "lat": -90,
- "lng": -180
}, - "dropoffCoords": {
- "lat": -90,
- "lng": -180
}, - "pickupAddress": "string",
- "dropoffAddress": "string",
- "extras": [
- {
- "extraId": "string",
- "quantity": 1
}
]
}{- "quoteId": "string",
- "expiresAt": "string",
- "lines": [
- {
- "key": "string",
- "label": "string",
- "amountPence": -9007199254740991,
- "detail": "string",
- "kind": "string"
}
], - "subtotalPence": -9007199254740991,
- "totalPence": -9007199254740991,
- "currency": "string",
- "warnings": [
- "string"
], - "applied": {
- "bandId": "string",
- "airportFareId": "string",
- "tierId": "string",
- "zoneId": "string",
- "surchargeIds": [
- "string"
]
}, - "pricingVersionId": "string",
- "mode": "distance",
- "airportCode": "string",
- "miles": 0,
- "durationMinutes": -9007199254740991,
- "extras": [
- {
- "extraId": "string",
- "code": "string",
- "label": "string",
- "quantity": -9007199254740991,
- "amountPence": -9007199254740991
}
]
}| slug required | string non-empty |
| quoteId required | string non-empty |
required | object |
required | object |
| vehicleClassId required | string non-empty |
Array of objects | |
| paymentMode | string Enum: "full_prepay" "deposit" "pay_later" |
| partnerCode | string or null |
| sessionId | string |
{- "quoteId": "string",
- "passenger": {
- "name": "string",
- "email": "user@example.com",
- "phone": "string"
}, - "trip": {
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "airportCode": "string",
- "flightNumber": "string",
- "flightSnapshot": null
}, - "vehicleClassId": "string",
- "extras": [
- {
- "extraId": "string",
- "quantity": 1
}
], - "paymentMode": "full_prepay",
- "partnerCode": "string",
- "sessionId": "string"
}{- "booking": {
- "id": "string",
- "status": "string",
- "farePence": -9007199254740991,
- "paymentStatus": "string",
- "pickupTime": "string"
}, - "payment": {
- "clientSecret": "string",
- "paymentIntentId": "string",
- "amountPence": -9007199254740991,
- "chargePattern": "destination",
- "captureMethod": "automatic",
- "paymentMode": "string"
}
}| slug required | string non-empty |
| sessionId required | string non-empty |
| stage required | string non-empty |
object |
{- "sessionId": "string",
- "stage": "string",
- "meta": {
- "property1": null,
- "property2": null
}
}{- "id": "string",
- "orgId": "string",
- "sessionId": "string",
- "stage": "string",
- "createdAt": "string"
}| slug required | string [ 1 .. 80 ] characters |
| flightIata | string [ 2 .. 12 ] characters ^[A-Za-z0-9]{2,12}$ |
| flightNumber | string [ 1 .. 12 ] characters |
| depIata | string = 3 characters ^[A-Za-z]{3}$ |
| arrIata | string = 3 characters ^[A-Za-z]{3}$ |
| flightDate | string^\d{4}-\d{2}-\d{2}$ |
| limit | integer [ 1 .. 10 ] |
{- "enabled": true,
- "configured": true,
- "flights": [
- {
- "flightDate": "string",
- "status": "scheduled",
- "airlineName": "string",
- "airlineIata": "string",
- "flightNumber": "string",
- "flightIata": "string",
- "flightIcao": "string",
- "departure": {
- "airportName": "string",
- "iata": "string",
- "icao": "string",
- "terminal": "string",
- "gate": "string",
- "delayMinutes": 0,
- "scheduledAt": "string",
- "estimatedAt": "string",
- "actualAt": "string"
}, - "arrival": {
- "airportName": "string",
- "iata": "string",
- "icao": "string",
- "terminal": "string",
- "gate": "string",
- "delayMinutes": 0,
- "scheduledAt": "string",
- "estimatedAt": "string",
- "actualAt": "string"
}, - "lastCheckedAt": "string"
}
], - "error": {
- "code": "DISABLED",
- "message": "string"
}
}Public AI chat relay for the booking page (vaulted provider keys on the server).
Unauthenticated, rate-limited, scoped by org slug. Never returns API keys. Falls back to rule-based mock replies when no provider key is configured.
| slug required | string non-empty |
| type required | string Value: "field" |
| field required | string Value: "pickup" |
required | object |
| sessionId required | string [ 1 .. 128 ] characters |
{- "messages": [
- {
- "role": "user",
- "content": "string"
}
], - "sessionId": "string"
}{- "orgId": "string",
- "slug": "string",
- "mode": "rule_mock",
- "message": {
- "role": "assistant",
- "content": "string"
}, - "requiredField": "pickup",
- "collected": {
- "pickup": "string",
- "dropoff": "string",
- "pickupPlaceId": "string",
- "dropoffPlaceId": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "date": "string",
- "time": "string",
- "passengers": -9007199254740991,
- "vehicle": "string",
- "extras": [
- "string"
], - "name": "string",
- "email": "string",
- "phone": "string",
- "flight": "string",
- "requirements": "string"
}, - "quoteReady": true,
- "sessionId": "string",
- "publishedBuilderVersion": -9007199254740991,
- "publicConfigHasSecrets": true,
- "strippedConfigKeysSample": [
- "string"
]
}Payment intents and payment status for org bookings (Stripe).
Authenticated org or booking-linked flows. Amounts are pence. Destination charges and application fees interact with Connect account state - see Connect docs for readiness.
| orgId required | string non-empty |
| id required | string non-empty |
| amountPence | integer ( 0 .. 9007199254740991 ] |
| reason | string <= 500 characters |
| idempotencyKey | string [ 1 .. 255 ] characters |
{- "amountPence": 9007199254740991,
- "reason": "string",
- "idempotencyKey": "string"
}{- "bookingId": "string",
- "refundId": "string",
- "amountPence": -9007199254740991,
- "status": "string",
- "paymentStatus": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
| amountPence | integer ( 0 .. 9007199254740991 ] |
{- "amountPence": 9007199254740991
}{- "bookingId": "string",
- "paymentIntentId": "string",
- "status": "string",
- "amountPence": -9007199254740991,
- "alreadyCaptured": true
}Stripe Connect onboarding, account status, and payout-related org setup.
Org owners/admins link a Connect account so destination charges can settle to the operator. Platform fee bps depend on plan. Webhook-driven status updates arrive via Webhooks.
| orgId required | string non-empty |
{- "orgId": "string",
- "stripeAccountId": "string",
- "status": "not_started",
- "chargesEnabled": true,
- "payoutsEnabled": true,
- "detailsSubmitted": true,
- "requirementsDue": [
- "string"
], - "email": "string",
- "country": "string",
- "applicationFeeBps": -9007199254740991,
- "updatedAt": "string"
}| orgId required | string non-empty |
| returnUrl | string <uri> |
| refreshUrl | string <uri> |
string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... | |
| country | string = 2 characters |
{- "email": "user@example.com",
- "country": "st"
}{- "stripeAccountId": "string",
- "expiresAt": -9007199254740991
}| orgId required | string non-empty |
{- "data": [
- {
- "id": "string",
- "amountPence": -9007199254740991,
- "currency": "string",
- "status": "string",
- "arrivalDate": "string",
- "createdAt": "string"
}
], - "nextCursor": "string"
}| orgId required | string non-empty |
| bookingId required | string non-empty |
| amountPence | integer ( 0 .. 9007199254740991 ] |
| currency | string = 3 characters Default: "gbp" |
{- "bookingId": "string",
- "amountPence": 9007199254740991,
- "currency": "gbp"
}{- "bookingId": "string",
- "paymentIntentId": "string",
- "clientSecret": "string",
- "amountPence": -9007199254740991,
- "applicationFeePence": -9007199254740991,
- "connectedAccountId": "string",
- "chargePattern": "destination"
}| orgId required | string non-empty |
| name required | string non-empty |
{- "name": "string"
}{- "id": "string",
- "name": "string",
- "keyPrefix": "string",
- "secret": "string",
- "createdAt": "string"
}| orgId required | string non-empty |
| id required | string non-empty |
{- "id": "string",
- "name": "string",
- "keyPrefix": "string",
- "secret": "string",
- "createdAt": "string"
}| orgId required | string non-empty |
| url required | string <uri> |
| events | Array of strings |
{- "events": [
- "string"
]
}{- "property1": null,
- "property2": null
}| orgId required | string non-empty |
| code required | string non-empty |
| name required | string non-empty |
| contactEmail | string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... |
| commissionBps | integer [ -9007199254740991 .. 9007199254740991 ] |
{- "code": "string",
- "name": "string",
- "contactEmail": "user@example.com",
- "commissionBps": -9007199254740991
}{- "property1": null,
- "property2": null
}| orgId required | string non-empty |
| hostname required | string non-empty |
{- "hostname": "string"
}{- "property1": null,
- "property2": null
}SaaS subscription billing for the organization (platform plan / Stripe Billing).
Distinct from trip Payments. Manage checkout, portal, and subscription status for the tenant’s Chauffeur SaaS plan. Requires org admin JWT.
| orgId required | string non-empty |
{- "orgId": "string",
- "plan": "string",
- "platformPlanCode": "string",
- "platformPlanName": "string",
- "subscriptionStatus": "string",
- "seatCount": -9007199254740991,
- "seatLimit": -9007199254740991,
- "currentPeriodEnd": "string",
- "mrrPence": -9007199254740991,
- "stripeCustomerId": "string",
- "stripeSubscriptionId": "string",
- "stripePriceId": "string",
- "readOnly": true
}| orgId required | string non-empty |
| priceId | string non-empty |
| planKey | string Enum: "free" "paid" "pro" |
| seatCount | integer [ 1 .. 500 ] Default: 1 |
| successUrl | string <uri> |
| cancelUrl | string <uri> |
{- "priceId": "string",
- "planKey": "free",
- "seatCount": 1,
}{- "sessionId": "string",
- "customerId": "string"
}Passenger self-service portal (view trip, pay, manage booking, support inbox).
Auth is typically a portal/magic token rather than staff JWT. Amounts in pence. Complements console Bookings, Payments, and Inbox without granting staff permissions. Fleet-wide live GPS is not available here (staff Monitoring only).
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "status": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "farePence": -9007199254740991,
- "paymentStatus": "string",
- "cancelFeePence": -9007199254740991,
- "cancelledAt": "string",
- "vehicleClassName": "string",
- "chauffeurName": "string",
- "chauffeurPhone": "string"
}
], - "nextCursor": "string"
}| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "status": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "farePence": -9007199254740991,
- "paymentStatus": "string",
- "cancelFeePence": -9007199254740991,
- "cancelledAt": "string",
- "vehicleClassName": "string",
- "chauffeurName": "string",
- "chauffeurPhone": "string"
}| id required | string non-empty |
{- "id": "string",
- "orgId": "string",
- "status": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "farePence": -9007199254740991,
- "paymentStatus": "string",
- "cancelFeePence": -9007199254740991,
- "cancelledAt": "string",
- "vehicleClassName": "string",
- "chauffeurName": "string",
- "chauffeurPhone": "string",
- "cancelPolicy": {
- "withinFreeWindow": true,
- "cancelFeePence": -9007199254740991,
- "freeCancelHours": 0
}
}| name | string non-empty |
| phone | string or null |
{- "name": "string",
- "phone": "string"
}{- "id": "string",
- "email": "string",
- "name": "string",
- "phone": "string",
- "customerId": "string",
- "orgId": "string"
}{- "data": [
- {
- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}
]
}| threadId required | string non-empty |
| cursor | string |
| limit | integer ( 0 .. 100 ] Default: 50 |
| after | string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
{- "data": [
- {
- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}
], - "meta": {
- "nextCursor": "string"
}
}| threadId required | string non-empty |
| body required | string [ 1 .. 4000 ] characters |
| clientTempId | string <= 64 characters |
{- "body": "string",
- "clientTempId": "string"
}{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}Driver mobile API: assigned jobs, status updates, trip actions, GPS location batches, presence heartbeats, and chauffeur↔ops inbox messaging.
Authenticated as a chauffeur user linked to the org fleet. Location trail is
stored only while a booking is en_route / in_progress. Live map fan-out is
staff-only via Socket.IO (see docs/REALTIME_EVENTS.md).
{- "id": "string",
- "orgId": "string",
- "orgName": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "licenceExpiresAt": "string",
- "pcoExpiresAt": "string",
- "dbsExpiresAt": "string",
- "dateOfBirth": "string",
- "gender": "male",
- "docsRequiredBeforeUse": false,
- "docsGate": {
- "required": false,
- "satisfied": true,
- "reason": "string"
}, - "branding": {
- "logoMediaId": "string",
- "logoUrl": "string",
- "primaryColor": "string",
- "accentColor": "string"
}, - "driversCanSeeFares": true,
- "orgs": [
- {
- "chauffeurId": "string",
- "orgId": "string",
- "orgName": "string",
- "docsRequiredBeforeUse": false,
- "docsGate": {
- "required": false,
- "satisfied": true,
- "reason": "string"
}, - "branding": {
- "logoMediaId": "string",
- "logoUrl": "string",
- "primaryColor": "string",
- "accentColor": "string"
}, - "driversCanSeeFares": true
}
], - "vehicle": {
- "id": "string",
- "plate": "string",
- "make": "string",
- "model": "string"
}
}| name | string [ 1 .. 120 ] characters |
| phone | string or null <= 40 characters |
| languages | Array of strings <= 20 items [ items [ 1 .. 40 ] characters ] |
| avatarMediaId | string or null |
| dateOfBirth | string or null |
| gender | string or null Enum: "male" "female" "other" "prefer_not" |
{- "name": "string",
- "phone": "string",
- "languages": [
- "string"
], - "avatarMediaId": "string",
- "dateOfBirth": "string",
- "gender": "male"
}{- "id": "string",
- "orgId": "string",
- "orgName": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "licenceExpiresAt": "string",
- "pcoExpiresAt": "string",
- "dbsExpiresAt": "string",
- "dateOfBirth": "string",
- "gender": "male",
- "docsRequiredBeforeUse": false,
- "docsGate": {
- "required": false,
- "satisfied": true,
- "reason": "string"
}, - "branding": {
- "logoMediaId": "string",
- "logoUrl": "string",
- "primaryColor": "string",
- "accentColor": "string"
}, - "driversCanSeeFares": true,
- "orgs": [
- {
- "chauffeurId": "string",
- "orgId": "string",
- "orgName": "string",
- "docsRequiredBeforeUse": false,
- "docsGate": {
- "required": false,
- "satisfied": true,
- "reason": "string"
}, - "branding": {
- "logoMediaId": "string",
- "logoUrl": "string",
- "primaryColor": "string",
- "accentColor": "string"
}, - "driversCanSeeFares": true
}
], - "vehicle": {
- "id": "string",
- "plate": "string",
- "make": "string",
- "model": "string"
}
}{- "id": "string",
- "orgId": "string",
- "orgName": "string",
- "userId": "string",
- "name": "string",
- "email": "string",
- "phone": "string",
- "status": "string",
- "languages": [
- "string"
], - "rating": 0,
- "badge": "string",
- "avatarMediaId": "string",
- "avatarUrl": "string",
- "licenceExpiresAt": "string",
- "pcoExpiresAt": "string",
- "dbsExpiresAt": "string",
- "dateOfBirth": "string",
- "gender": "male",
- "docsRequiredBeforeUse": false,
- "docsGate": {
- "required": false,
- "satisfied": true,
- "reason": "string"
}, - "branding": {
- "logoMediaId": "string",
- "logoUrl": "string",
- "primaryColor": "string",
- "accentColor": "string"
}, - "driversCanSeeFares": true,
- "orgs": [
- {
- "chauffeurId": "string",
- "orgId": "string",
- "orgName": "string",
- "docsRequiredBeforeUse": false,
- "docsGate": {
- "required": false,
- "satisfied": true,
- "reason": "string"
}, - "branding": {
- "logoMediaId": "string",
- "logoUrl": "string",
- "primaryColor": "string",
- "accentColor": "string"
}, - "driversCanSeeFares": true
}
], - "vehicle": {
- "id": "string",
- "plate": "string",
- "make": "string",
- "model": "string"
}
}| kind required | string Enum: "licence" "pco" "dbs" "insurance" "other" |
| mediaId required | string non-empty |
| expiresAt | string or null |
{- "kind": "licence",
- "mediaId": "string",
- "expiresAt": "string"
}{- "id": "string",
- "kind": "licence",
- "mediaId": "string",
- "mediaUrl": "string",
- "status": "pending",
- "expiresAt": "string",
- "reviewerNote": "string",
- "uploadedAt": "string"
}{- "id": "string",
- "kind": "licence",
- "mediaId": "string",
- "mediaUrl": "string",
- "status": "pending",
- "expiresAt": "string",
- "reviewerNote": "string",
- "uploadedAt": "string"
}| token required | string [ 8 .. 4096 ] characters |
| platform required | string Enum: "ios" "android" |
| appVersion | string <= 40 characters |
{- "token": "stringst",
- "platform": "ios",
- "appVersion": "string"
}{- "id": "string",
- "platform": "ios",
- "token": "string",
- "appVersion": "string",
- "lastSeenAt": "string"
}| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "completedJobs": -9007199254740991,
- "totalJobs": -9007199254740991,
- "revenuePence": -9007199254740991,
- "hoursMinutes": -9007199254740991,
- "hoursWorked": 0,
- "avgRating": 0,
- "profileRating": 0
}| cursor | string |
| limit | integer [ 1 .. 100 ] Default: 50 |
| from | string |
| to | string |
{- "data": [
- {
- "id": "string",
- "bookingId": "string",
- "rating": -9007199254740991,
- "comment": "string",
- "status": "string",
- "createdAt": "string",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string"
}
], - "nextCursor": "string"
}{- "summary": "string",
- "keyNotes": [
- "string"
], - "sentiment": "positive",
- "insufficientData": true,
- "feedbackCount": -9007199254740991,
- "model": "string",
- "periodFrom": "string",
- "periodTo": "string"
}| date | string |
| phase | string Enum: "upcoming" "past" "active" "all" |
| from | string |
| to | string |
| cursor | string |
| limit | integer [ 1 .. 100 ] Default: 50 |
{- "data": [
- {
- "bookingId": "string",
- "orgId": "string",
- "orgName": "string",
- "status": "string",
- "phase": "upcoming",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "pickupAddress": "string",
- "dropoffAddress": "string",
- "pickupAt": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "farePence": -9007199254740991,
- "notes": "string",
- "flightNumber": "string",
- "flightSnapshot": null,
- "passengerName": "string",
- "passengerPhone": "string",
- "vehiclePlate": "string",
- "vehicleLabel": "string",
- "vehicleClassName": "string",
- "driverPassengerRating": 1,
- "pendingDeclineRequest": {
- "id": "string",
- "reason": "string",
- "status": "string",
- "createdAt": "string"
}
}
], - "nextCursor": "string"
}| bookingId required | string non-empty |
{- "bookingId": "string",
- "orgId": "string",
- "orgName": "string",
- "status": "string",
- "phase": "upcoming",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "pickupAddress": "string",
- "dropoffAddress": "string",
- "pickupAt": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "farePence": -9007199254740991,
- "notes": "string",
- "flightNumber": "string",
- "flightSnapshot": null,
- "passengerName": "string",
- "passengerPhone": "string",
- "vehiclePlate": "string",
- "vehicleLabel": "string",
- "vehicleClassName": "string",
- "driverPassengerRating": 1,
- "pendingDeclineRequest": {
- "id": "string",
- "reason": "string",
- "status": "string",
- "createdAt": "string"
}
}| bookingId required | string non-empty |
{- "bookingId": "string",
- "orgId": "string",
- "orgName": "string",
- "status": "string",
- "phase": "upcoming",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "pickupAddress": "string",
- "dropoffAddress": "string",
- "pickupAt": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "farePence": -9007199254740991,
- "notes": "string",
- "flightNumber": "string",
- "flightSnapshot": null,
- "passengerName": "string",
- "passengerPhone": "string",
- "vehiclePlate": "string",
- "vehicleLabel": "string",
- "vehicleClassName": "string",
- "driverPassengerRating": 1,
- "pendingDeclineRequest": {
- "id": "string",
- "reason": "string",
- "status": "string",
- "createdAt": "string"
}
}| bookingId required | string non-empty |
{- "bookingId": "string",
- "orgId": "string",
- "orgName": "string",
- "status": "string",
- "phase": "upcoming",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "pickupAddress": "string",
- "dropoffAddress": "string",
- "pickupAt": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "farePence": -9007199254740991,
- "notes": "string",
- "flightNumber": "string",
- "flightSnapshot": null,
- "passengerName": "string",
- "passengerPhone": "string",
- "vehiclePlate": "string",
- "vehicleLabel": "string",
- "vehicleClassName": "string",
- "driverPassengerRating": 1,
- "pendingDeclineRequest": {
- "id": "string",
- "reason": "string",
- "status": "string",
- "createdAt": "string"
}
}| bookingId required | string non-empty |
{- "bookingId": "string",
- "orgId": "string",
- "orgName": "string",
- "status": "string",
- "phase": "upcoming",
- "pickup": "string",
- "dropoff": "string",
- "pickupTime": "string",
- "pickupAddress": "string",
- "dropoffAddress": "string",
- "pickupAt": "string",
- "pickupLat": 0,
- "pickupLng": 0,
- "dropoffLat": 0,
- "dropoffLng": 0,
- "farePence": -9007199254740991,
- "notes": "string",
- "flightNumber": "string",
- "flightSnapshot": null,
- "passengerName": "string",
- "passengerPhone": "string",
- "vehiclePlate": "string",
- "vehicleLabel": "string",
- "vehicleClassName": "string",
- "driverPassengerRating": 1,
- "pendingDeclineRequest": {
- "id": "string",
- "reason": "string",
- "status": "string",
- "createdAt": "string"
}
}| bookingId required | string non-empty |
| rating required | integer [ 1 .. 5 ] |
| comment | string <= 500 characters |
{- "rating": 1,
- "comment": "string"
}{- "bookingId": "string",
- "rating": 1,
- "comment": "string",
- "ratedAt": "string"
}| bookingId required | string non-empty |
| reason required | string [ 3 .. 2000 ] characters |
{- "reason": "string"
}{- "id": "string",
- "bookingId": "string",
- "orgId": "string",
- "reason": "string",
- "status": "string",
- "createdAt": "string"
}required | Array of objects [ 1 .. 50 ] items |
{- "points": [
- {
- "lat": -90,
- "lng": -180,
- "recordedAt": "2019-08-24T14:15:22Z",
- "speedMps": 100,
- "heading": 360,
- "accuracyM": 10000,
- "bookingId": "string"
}
]
}{- "data": {
- "accepted": -9007199254740991,
- "trailWritten": -9007199254740991,
- "presence": {
- "lat": 0,
- "lng": 0,
- "heading": 0,
- "speedMps": 0,
- "motionState": "moving",
- "passengerOnBoard": true,
- "activeBookingId": "string",
- "dutyStatus": "working",
- "lastSeenAt": "string",
- "statusNote": "string"
}
}
}| passengerOnBoard | boolean |
| motionState | string Enum: "moving" "idle" "offline" |
| statusNote | string or null <= 500 characters |
| dutyStatus | string Enum: "working" "on_leave" "off_duty" |
| activeBookingId | string or null |
| lat | number [ -90 .. 90 ] |
| lng | number [ -180 .. 180 ] |
{- "passengerOnBoard": true,
- "motionState": "moving",
- "statusNote": "string",
- "dutyStatus": "working",
- "activeBookingId": "string",
- "lat": -90,
- "lng": -180
}{- "data": {
- "orgId": "string",
- "chauffeurId": "string",
- "presence": {
- "lat": 0,
- "lng": 0,
- "heading": 0,
- "speedMps": 0,
- "motionState": "moving",
- "passengerOnBoard": true,
- "activeBookingId": "string",
- "dutyStatus": "working",
- "lastSeenAt": "string",
- "statusNote": "string"
}
}
}{- "id": "string",
- "type": "chauffeur",
- "participant": {
- "id": "string",
- "name": "string",
- "initials": "string",
- "avatarUrl": "string",
- "contactHint": "string"
}, - "statusSnippet": "string",
- "lastMessagePreview": "string",
- "lastMessageAt": "string",
- "unreadCount": -9007199254740991,
- "needsReply": true,
- "pinned": true,
- "archived": true,
- "chauffeur": {
- "chauffeurId": "string",
- "dutyStatus": "working",
- "plate": "string",
- "vehicleLabel": "string",
- "activeBookingId": "string"
}, - "passenger": {
- "customerId": "string",
- "bookingRef": "string",
- "routeSummary": "string",
- "tripStatus": "string"
}
}| cursor | string |
| limit | integer ( 0 .. 100 ] Default: 50 |
{- "data": [
- {
- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}
], - "meta": {
- "nextCursor": "string"
}
}| body required | string [ 1 .. 4000 ] characters |
| clientTempId | string <= 64 characters |
{- "body": "string",
- "clientTempId": "string"
}{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}| messageId required | string non-empty |
| emoji required | string [ 1 .. 32 ] characters |
{- "emoji": "string"
}{- "id": "string",
- "conversationId": "string",
- "threadId": "string",
- "kind": "text",
- "senderRole": "staff",
- "senderName": "string",
- "senderUserId": "string",
- "body": "string",
- "attachmentMediaId": "string",
- "attachmentUrl": "string",
- "sentAt": "string",
- "clientTempId": "string",
- "reactions": [
- {
- "emoji": "string",
- "count": -9007199254740991,
- "reactedByMe": true
}
]
}Analytics series for ops: overview, demand, funnel, fleet, chauffeurs, and more.
Org-scoped, permission reporting. Read-only aggregates over bookings and related entities.
Money metrics remain in pence where monetary.
| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "kpis": {
- "totalBookings": -9007199254740991,
- "completed": -9007199254740991,
- "cancelled": -9007199254740991,
- "revenuePence": -9007199254740991,
- "cancelFeePence": -9007199254740991,
- "noShows": -9007199254740991,
- "lateCount": -9007199254740991,
- "avgFarePence": -9007199254740991
}
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "series": [
- {
- "day": "string",
- "revenuePence": -9007199254740991,
- "bookings": -9007199254740991
}
]
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "vehicles": [
- {
- "vehicleId": "string",
- "plate": "string",
- "jobs": -9007199254740991,
- "revenuePence": -9007199254740991
}
]
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "chauffeurs": [
- {
- "chauffeurId": "string",
- "name": "string",
- "jobs": -9007199254740991,
- "completed": -9007199254740991
}
]
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "uniquePassengers": -9007199254740991,
- "totalBookings": -9007199254740991
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "byHour": [
- {
- "hour": -9007199254740991,
- "bookings": -9007199254740991
}
]
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "cancelled": -9007199254740991,
- "cancelFeePence": -9007199254740991,
- "noShows": -9007199254740991,
- "rate": 0
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "classes": [
- {
- "vehicleClassId": "string",
- "name": "string",
- "bookings": -9007199254740991
}
]
}| orgId required | string non-empty |
| from | string |
| to | string |
{- "from": "string",
- "to": "string",
- "lateCount": -9007199254740991,
- "avgLateMinutes": 0,
- "noShows": -9007199254740991,
- "completionRate": 0
}Immutable audit trail of sensitive org and platform actions.
List/filter audit events for compliance and debugging. Requires appropriate JWT access. Complements Reporting (metrics) with who-did-what event history.
| orgId required | string non-empty |
| cursor | string |
| limit | integer [ 1 .. 100 ] |
{- "data": [
- {
- "id": "string",
- "action": "string",
- "resource": "string",
- "actorUserId": "string",
- "meta": {
- "property1": null,
- "property2": null
}, - "createdAt": "string"
}
], - "nextCursor": "string"
}Platform-operator APIs (cross-tenant). Not for normal org staff.
Requires platform admin auth. Manage orgs, plans, and platform-wide controls. Email outbox ops live under Email; prefer that tag for outbox drain/list.
| email required | string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... |
| password required | string >= 8 characters |
{- "email": "user@example.com",
- "password": "stringst"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "role": "string"
}
}| setupToken required | string non-empty |
| email required | string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... |
| name required | string non-empty |
| password required | string >= 12 characters |
{- "setupToken": "string",
- "email": "user@example.com",
- "name": "string",
- "password": "stringstring"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "role": "string"
}
}{- "orgCount": -9007199254740991,
- "bookingVolume": -9007199254740991,
- "activeSubscriptions": -9007199254740991,
- "mrrPence": -9007199254740991,
- "plans": [
- {
- "id": "string",
- "code": "string",
- "name": "string",
- "mrrPence": -9007199254740991,
- "seatLimit": -9007199254740991
}
]
}{- "data": [
- {
- "id": "string",
- "name": "string",
- "slug": "string",
- "plan": "string",
- "status": "string",
- "platformPlanCode": "string",
- "connectStatus": "string",
- "subscriptionStatus": "string",
- "createdAt": "string"
}
]
}| name required | string non-empty |
| slug required | string non-empty ^[a-z0-9-]+$ |
| plan | string Enum: "free" "paid" "pro" |
{- "name": "string",
- "slug": "string",
- "plan": "free"
}{- "id": "string",
- "name": "string",
- "slug": "string",
- "plan": "string",
- "status": "string"
}| id required | string non-empty |
| plan | string Enum: "free" "paid" "pro" |
| status | string Enum: "active" "suspended" |
| platformPlanId | string or null |
{- "plan": "free",
- "status": "active",
- "platformPlanId": "string"
}{- "property1": null,
- "property2": null
}| orgId required | string non-empty |
{- "orgId": "string"
}{- "accessToken": "string",
- "expiresIn": -9007199254740991,
- "impersonatedUser": {
- "id": "string",
- "email": "string",
- "name": "string"
}, - "orgId": "string"
}| id | string |
| code required | string [ 3 .. 4 ] characters |
| name required | string non-empty |
| country | string |
| lat | number or null |
| lng | number or null |
| active | boolean |
{- "id": "string",
- "code": "stri",
- "name": "string",
- "country": "string",
- "lat": 0,
- "lng": 0,
- "active": true
}{- "property1": null,
- "property2": null
}| id | string |
| name required | string non-empty |
| description | string |
object | |
| active | boolean |
{- "id": "string",
- "name": "string",
- "description": "string",
- "payload": {
- "property1": null,
- "property2": null
}, - "active": true
}{- "property1": null,
- "property2": null
}| id | string |
| code required | string non-empty |
| name required | string non-empty |
| seatLimit | integer [ -9007199254740991 .. 9007199254740991 ] |
| applicationFeeBps | integer [ -9007199254740991 .. 9007199254740991 ] |
| stripePriceId | string or null |
| mrrPence | integer [ -9007199254740991 .. 9007199254740991 ] |
| active | boolean |
{- "id": "string",
- "code": "string",
- "name": "string",
- "seatLimit": -9007199254740991,
- "applicationFeeBps": -9007199254740991,
- "stripePriceId": "string",
- "mrrPence": -9007199254740991,
- "active": true
}{- "property1": null,
- "property2": null
}| id required | string |
| description | string |
| defaultEnabled | boolean |
{- "description": "string",
- "defaultEnabled": true
}{- "property1": null,
- "property2": null
}| orgId required | string non-empty |
| key required | string non-empty |
| enabled required | boolean |
{- "orgId": "string",
- "key": "string",
- "enabled": true
}{- "orgId": "string",
- "flags": [
- {
- "key": "string",
- "enabled": true,
- "source": "org"
}
]
}Platform email outbox: list queued/sent rows and drain pending sends.
Platform admin only. Outbox decouples transactional email from request latency (Redis/worker). Org notification preferences remain under Notifications.
| limit | integer ( 0 .. 1000 ] |
| includePending | boolean |
{ }{- "found": -9007199254740991,
- "enqueued": -9007199254740991,
- "redisFailures": -9007199254740991,
- "emailConfigured": true
}| status | string Enum: "pending" "pending_config" "sent" "failed" |
| orgId | string |
| limit | integer ( 0 .. 200 ] |
| cursor | string |
{- "data": [
- {
- "id": "string",
- "orgId": "string",
- "to": "string",
- "templateId": "string",
- "status": "string",
- "idempotencyKey": "string",
- "providerMessageId": "string",
- "lastError": "string",
- "attemptCount": -9007199254740991,
- "sentAt": "string",
- "createdAt": "string",
- "updatedAt": "string"
}
], - "nextCursor": "string"
}Inbound provider webhooks (e.g. Stripe) with signature verification.
No JWT - authenticity is via provider signing secrets. Updates payment, Connect, and billing state. Do not call these from clients; configure endpoints in the provider dashboard.