Chauffeur Booking API (1.0.0)

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.

Health

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.

Liveness + database ping

Responses

Response samples

Content type
application/json
{
  • "status": "string",
  • "version": "string",
  • "db": "string"
}

Auth

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.

Register staff user + org (bootstrap)

Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "email": "user@example.com",
  • "password": "stringst",
  • "name": "string",
  • "orgName": "string",
  • "orgSlug": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

Staff email/password login → accessToken (use in Authorize)

Request Body schema: application/json
required
email
required
string non-empty
password
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

Chauffeur email/password login (typ=chauffeur JWT)

Request Body schema: application/json
required
email
required
string non-empty
password
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

Request password reset email (always ok; no enumeration)

Request Body schema: application/json
required
email
required
string non-empty
surface
string
Default: "chauffeur"
Enum: "chauffeur" "staff"

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "surface": "chauffeur"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "devResetUrl": "string",
  • "devToken": "string",
  • "property1": null,
  • "property2": null
}

Reset password with email token; revokes refresh tokens

Request Body schema: application/json
required
token
required
string non-empty
newPassword
required
string >= 8 characters

Responses

Request samples

Content type
application/json
{
  • "token": "string",
  • "newPassword": "stringst"
}

Response samples

Content type
application/json
{
  • "ok": true
}

Rotate refresh → new access token

Request Body schema: application/json
required
refreshToken
string

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

/api/v1/auth/logout

Request Body schema: application/json
required
refreshToken
string

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true
}

Current principal + memberships

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "typ": "staff",
  • "id": "string",
  • "email": "string",
  • "name": "string",
  • "totpEnabled": true,
  • "emailVerifiedAt": "string",
  • "property1": null,
  • "property2": null
}

Google OAuth authorization URL

query Parameters
surface
string
Enum: "staff" "passenger" "chauffeur" "platform"

Responses

Response samples

Content type
application/json
{
  • "url": "string"
}

Google OAuth browser redirect → SPA hash callback

query Parameters
code
string
state
string
error
string
error_description
string

Responses

Exchange Google auth code for session

Request Body schema: application/json
required
code
required
string non-empty
state
string

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "state": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

Exchange Google native idToken for session

Request Body schema: application/json
required
idToken
required
string non-empty
surface
string
Default: "chauffeur"
Enum: "staff" "passenger" "chauffeur" "platform"

Responses

Request samples

Content type
application/json
{
  • "idToken": "string",
  • "surface": "staff"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

/api/v1/auth/passenger/magic-link

Request Body schema: application/json
required
email
required
string non-empty
orgSlug
string

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "orgSlug": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "expiresAt": "string",
  • "devMagicLink": "string",
  • "devToken": "string",
  • "property1": null,
  • "property2": null
}

/api/v1/auth/chauffeur/magic-link

Request Body schema: application/json
required
email
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "expiresAt": "string",
  • "devMagicLink": "string",
  • "devToken": "string",
  • "property1": null,
  • "property2": null
}

/api/v1/auth/magic-link/verify

Request Body schema: application/json
required
token
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "token": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

Accept chauffeur invite, set password, mint chauffeur session

Request Body schema: application/json
required
token
required
string non-empty
password
required
string >= 8 characters

Responses

Request samples

Content type
application/json
{
  • "token": "string",
  • "password": "stringst"
}

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "userId": "string",
  • "email": "string",
  • "chauffeurId": "string",
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "typ": "chauffeur",
  • "needsOrgJoin": true
}

Redeem chauffeur invite for signed-in Google user (links membership; no password)

Authorizations:
bearerAuth
Request Body schema: application/json
required
token
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "token": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

Start TOTP enrollment (returns otpauth URI + raw secret)

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "otpauthUri": "string",
  • "secret": "string",
  • "devTotpCode": "string"
}

Confirm TOTP enrollment with first valid code → returns backup codes

Authorizations:
bearerAuth
Request Body schema: application/json
required
code
required
string = 6 characters

Responses

Request samples

Content type
application/json
{
  • "code": "string"
}

Response samples

Content type
application/json
{
  • "enabled": true,
  • "backupCodes": [
    ]
}

Disable 2FA (requires current TOTP or backup code)

Authorizations:
bearerAuth
Request Body schema: application/json
required
code
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "code": "string"
}

Response samples

Content type
application/json
{
  • "ok": true
}

Verify 2FA code with challenge token → full session

Request Body schema: application/json
required
challengeToken
required
string non-empty
code
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "challengeToken": "string",
  • "code": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "refreshToken": "string",
  • "user": {
    },
  • "typ": "staff",
  • "orgId": "string",
  • "chauffeurId": "string",
  • "customerId": "string",
  • "needsOrgJoin": true,
  • "challengeRequired": true,
  • "challengeToken": "string",
  • "devTotpCode": "string"
}

Regenerate backup codes (requires current TOTP code)

Authorizations:
bearerAuth
Request Body schema: application/json
required
code
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "code": "string"
}

Response samples

Content type
application/json
{
  • "backupCodes": [
    ]
}

Send verification email to current user

Authorizations:
bearerAuth
Request Body schema: application/json
required
object
Default: {}

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "devVerifyUrl": "string",
  • "devToken": "string",
  • "property1": null,
  • "property2": null
}

Verify email address with token

Request Body schema: application/json
required
token
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "token": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "emailVerifiedAt": "string"
}

Accept staff invite and set password

Request Body schema: application/json
required
token
required
string non-empty
password
required
string >= 8 characters

Responses

Request samples

Content type
application/json
{
  • "token": "string",
  • "password": "stringst"
}

Orgs

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.

/api/v1/orgs/{orgId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "slug": "string",
  • "plan": "string",
  • "status": "string",
  • "tagline": "string",
  • "supportPhone": "string"
}

/api/v1/orgs/{orgId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
name
string non-empty
tagline
string or null
supportPhone
string or null

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "tagline": "string",
  • "supportPhone": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "slug": "string",
  • "plan": "string",
  • "status": "string",
  • "tagline": "string",
  • "supportPhone": "string"
}

/api/v1/orgs/{orgId}/settings

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/settings

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Staff

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.

/api/v1/orgs/{orgId}/staff

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/staff/invites

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "user@example.com",
  • "role": "owner",
  • "phone": "string",
  • "notes": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

/api/v1/orgs/{orgId}/staff/invites/{inviteId}/resend

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
inviteId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "invitedAt": "string",
  • "inviteToken": "string",
  • "inviteExpiresAt": "string"
}

/api/v1/orgs/{orgId}/staff/invites/{inviteId}/revoke

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
inviteId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "status": "revoked"
}

/api/v1/orgs/{orgId}/staff/{staffId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
staffId
required
string non-empty
Request Body schema: application/json
required
role
string
Enum: "owner" "operations_manager" "dispatcher" "finance" "read_only"
notes
string
status
string
Enum: "active" "invited" "deactivated"

Responses

Request samples

Content type
application/json
{
  • "role": "owner",
  • "notes": "string",
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "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"
}

/api/v1/orgs/{orgId}/staff/{staffId}/deactivate

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
staffId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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"
}

/api/v1/orgs/{orgId}/staff/{staffId}/reactivate

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
staffId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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"
}

/api/v1/orgs/{orgId}/staff/{staffId}/promote-owner

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
staffId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "previousOwnerId": "string",
  • "newOwnerId": "string"
}

Staff activity timeline (audit + membership events)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
staffId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "staffId": "string",
  • "userId": "string",
  • "data": [
    ]
}

Media

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.

List org media library assets

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
q
string
tag
string
kind
string
Enum: "image" "document"
cursor
string
limit
integer [ 1 .. 100 ]
Default: 40

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

Upload media (multipart: file, optional alt/tags JSON)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "kind": "image",
  • "filename": "string",
  • "mimeType": "string",
  • "sizeBytes": -9007199254740991,
  • "storageKey": "string",
  • "width": -9007199254740991,
  • "height": -9007199254740991,
  • "alt": "string",
  • "tags": [
    ],
  • "url": "string",
  • "createdByUserId": "string",
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/media/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "kind": "image",
  • "filename": "string",
  • "mimeType": "string",
  • "sizeBytes": -9007199254740991,
  • "storageKey": "string",
  • "width": -9007199254740991,
  • "height": -9007199254740991,
  • "alt": "string",
  • "tags": [
    ],
  • "url": "string",
  • "createdByUserId": "string",
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/media/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
alt
string or null
tags
Array of strings
filename
string non-empty

Responses

Request samples

Content type
application/json
{
  • "alt": "string",
  • "tags": [
    ],
  • "filename": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "kind": "image",
  • "filename": "string",
  • "mimeType": "string",
  • "sizeBytes": -9007199254740991,
  • "storageKey": "string",
  • "width": -9007199254740991,
  • "height": -9007199254740991,
  • "alt": "string",
  • "tags": [
    ],
  • "url": "string",
  • "createdByUserId": "string",
  • "createdAt": "string",
  • "updatedAt": "string"
}

Soft-delete media asset (attachments keep id until replaced)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true,
  • "id": "string"
}

Stream media file bytes

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Notifications

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.

/api/v1/orgs/{orgId}/notifications

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/notifications/{id}/read

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "userId": "string",
  • "type": "string",
  • "title": "string",
  • "body": "string",
  • "meta": null,
  • "readAt": "string",
  • "createdAt": "string"
}

/api/v1/orgs/{orgId}/notifications/read-all

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "updated": -9007199254740991
}

Public VAPID key for Web Push (staff dashboard)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "publicKey": "string",
  • "configured": true
}

Register or refresh a browser Web Push subscription

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
endpoint
required
string <uri> <= 2048 characters
required
object
userAgent
string <= 512 characters

Responses

Request samples

Content type
application/json
{
  • "endpoint": "http://example.com",
  • "keys": {
    },
  • "userAgent": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "endpoint": "string",
  • "createdAt": "string"
}

Revoke a browser Web Push subscription

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
endpoint
required
string <uri> <= 2048 characters

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Bookings

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).

Calendar range with conflict projection

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
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"

Responses

Response samples

Content type
application/json
{
  • "bookings": [
    ],
  • "conflicts": [
    ],
  • "resources": {
    }
}

Dynamic filter dropdown catalogs (fleet, zones, airports)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "chauffeurs": [
    ],
  • "vehicles": [
    ],
  • "vehicleClasses": [
    ],
  • "zones": [
    ],
  • "airports": [
    ]
}

List bookings (Phase 1 bare array)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
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

Responses

Response samples

Content type
application/json
[
  • {
    }
]

/api/v1/orgs/{orgId}/bookings

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json
{
  • "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
}

CSV export of bookings in range (integer pence)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "contentType": "string",
  • "csv": "string",
  • "rowCount": -9007199254740991
}

/api/v1/orgs/{orgId}/bookings/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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
}

/api/v1/orgs/{orgId}/bookings/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Response samples

Content type
application/json
{
  • "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
}

/api/v1/orgs/{orgId}/bookings/{id}/status

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
status
required
string
Enum: "confirmed" "assigned" "en_route" "arrived" "in_progress" "completed" "cancelled"

Responses

Request samples

Content type
application/json
{
  • "status": "confirmed"
}

Response samples

Content type
application/json
{
  • "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
}

/api/v1/orgs/{orgId}/bookings/{id}/cancel

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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
}

/api/v1/orgs/{orgId}/bookings/{id}/chauffeur

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
chauffeurId
required
string or null

Responses

Request samples

Content type
application/json
{
  • "chauffeurId": "string"
}

Response samples

Content type
application/json
{
  • "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
}

/api/v1/orgs/{orgId}/bookings/bulk

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
ids
required
Array of strings[ items non-empty ]
required
object

Responses

Request samples

Content type
application/json
{
  • "ids": [
    ],
  • "patch": {
    }
}

Response samples

Content type
application/json
[
  • {
    }
]

List chauffeur decline/drop requests for ops review

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
status
string
Enum: "pending" "approved" "rejected"

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Approve decline → unassign only + force reassign prompt

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
reviewNote
string or null <= 2000 characters

Responses

Request samples

Content type
application/json
{
  • "reviewNote": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "status": "approved",
  • "bookingId": "string",
  • "unassigned": true,
  • "cancelled": true,
  • "requiresReassign": true,
  • "reassignBookingId": "string",
  • "reassignUrl": "string"
}

Reject decline → driver remains assigned

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
reviewNote
string or null <= 2000 characters

Responses

Request samples

Content type
application/json
{
  • "reviewNote": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "status": "approved",
  • "bookingId": "string",
  • "unassigned": true,
  • "cancelled": true,
  • "requiresReassign": true,
  • "reassignBookingId": "string",
  • "reassignUrl": "string"
}

Flights

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.

Lookup live flight status for airport transfers (paid plans, flag + monthly quota)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
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 ]

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "configured": true,
  • "flights": [
    ],
  • "error": {
    }
}

Refresh and persist the flight snapshot on a booking

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "configured": true,
  • "flights": [
    ],
  • "error": {
    },
  • "bookingId": "string",
  • "persisted": true
}

Dashboard

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.

Ops dashboard KPIs from live booking aggregates

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
period
string
Default: "7d"
Enum: "today" "7d" "30d"

Responses

Response samples

Content type
application/json
{
  • "period": "today",
  • "kpis": {
    },
  • "attention": [
    ],
  • "funnel": {
    },
  • "timeline": [
    ],
  • "zones": [
    ],
  • "fleet": [
    ],
  • "heatmap": [
    ],
  • "bookings": [
    ],
  • "source": "live"
}

Fleet

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.

/api/v1/orgs/{orgId}/vehicle-classes

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

/api/v1/orgs/{orgId}/vehicle-classes

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "capacity": -9007199254740991,
  • "luggage": 9007199254740991,
  • "baseRatePence": 9007199254740991,
  • "minFarePence": 9007199254740991,
  • "hourlyRatePence": -9007199254740991,
  • "includedMiles": 0,
  • "includedHours": 0,
  • "bookable": true,
  • "active": true,
  • "imageMediaIds": [
    ],
  • "images": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "description": "string",
  • "capacity": -9007199254740991,
  • "luggage": -9007199254740991,
  • "baseRatePence": -9007199254740991,
  • "minFarePence": -9007199254740991,
  • "hourlyRatePence": -9007199254740991,
  • "includedMiles": 0,
  • "includedHours": 0,
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "active": true,
  • "bookable": true
}

/api/v1/orgs/{orgId}/vehicle-classes/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "description": "string",
  • "capacity": -9007199254740991,
  • "luggage": -9007199254740991,
  • "baseRatePence": -9007199254740991,
  • "minFarePence": -9007199254740991,
  • "hourlyRatePence": -9007199254740991,
  • "includedMiles": 0,
  • "includedHours": 0,
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "active": true,
  • "bookable": true
}

/api/v1/orgs/{orgId}/vehicle-classes/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
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 ]

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "capacity": -9007199254740991,
  • "luggage": 9007199254740991,
  • "baseRatePence": 9007199254740991,
  • "minFarePence": 9007199254740991,
  • "hourlyRatePence": -9007199254740991,
  • "includedMiles": 0,
  • "includedHours": 0,
  • "bookable": true,
  • "active": true,
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "sortOrder": -9007199254740991
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "description": "string",
  • "capacity": -9007199254740991,
  • "luggage": -9007199254740991,
  • "baseRatePence": -9007199254740991,
  • "minFarePence": -9007199254740991,
  • "hourlyRatePence": -9007199254740991,
  • "includedMiles": 0,
  • "includedHours": 0,
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "active": true,
  • "bookable": true
}

/api/v1/orgs/{orgId}/vehicle-classes/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true
}

/api/v1/orgs/{orgId}/vehicles

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

/api/v1/orgs/{orgId}/vehicles

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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[...

Responses

Request samples

Content type
application/json
{
  • "vehicleClassId": "string",
  • "plate": "string",
  • "make": "string",
  • "model": "string",
  • "colour": "string",
  • "year": -9007199254740991,
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "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"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "vehicleClassId": "string",
  • "plate": "string",
  • "make": "string",
  • "model": "string",
  • "colour": "string",
  • "year": -9007199254740991,
  • "status": "string",
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "luggage": -9007199254740991,
  • "notes": "string",
  • "phvLicense": "string",
  • "odometer": -9007199254740991,
  • "motExpiresAt": "string",
  • "insuranceExpiresAt": "string",
  • "phvExpiresAt": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/vehicles/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "vehicleClassId": "string",
  • "plate": "string",
  • "make": "string",
  • "model": "string",
  • "colour": "string",
  • "year": -9007199254740991,
  • "status": "string",
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "luggage": -9007199254740991,
  • "notes": "string",
  • "phvLicense": "string",
  • "odometer": -9007199254740991,
  • "motExpiresAt": "string",
  • "insuranceExpiresAt": "string",
  • "phvExpiresAt": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/vehicles/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "vehicleClassId": "string",
  • "plate": "string",
  • "make": "string",
  • "model": "string",
  • "colour": "string",
  • "year": -9007199254740991,
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "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
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "vehicleClassId": "string",
  • "plate": "string",
  • "make": "string",
  • "model": "string",
  • "colour": "string",
  • "year": -9007199254740991,
  • "status": "string",
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "luggage": -9007199254740991,
  • "notes": "string",
  • "phvLicense": "string",
  • "odometer": -9007199254740991,
  • "motExpiresAt": "string",
  • "insuranceExpiresAt": "string",
  • "phvExpiresAt": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/vehicles/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true
}

/api/v1/orgs/{orgId}/vehicles/{id}/status

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
status
required
string
Enum: "available" "on_job" "maintenance" "retired"

Responses

Request samples

Content type
application/json
{
  • "status": "available"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "vehicleClassId": "string",
  • "plate": "string",
  • "make": "string",
  • "model": "string",
  • "colour": "string",
  • "year": -9007199254740991,
  • "status": "string",
  • "imageMediaIds": [
    ],
  • "images": [
    ],
  • "luggage": -9007199254740991,
  • "notes": "string",
  • "phvLicense": "string",
  • "odometer": -9007199254740991,
  • "motExpiresAt": "string",
  • "insuranceExpiresAt": "string",
  • "phvExpiresAt": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/chauffeurs

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

/api/v1/orgs/{orgId}/chauffeurs

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
name
required
string non-empty
email
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "vehicleId": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "languages": [
    ],
  • "rating": 5,
  • "badge": "string",
  • "licenceExpiresAt": "2019-08-24T14:15:22Z",
  • "pcoExpiresAt": "2019-08-24T14:15:22Z",
  • "dbsExpiresAt": "2019-08-24T14:15:22Z",
  • "docsRequiredBeforeUse": false
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "status": "string",
  • "vehicleId": "string",
  • "vehiclePlate": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "languages": [
    ],
  • "rating": 0,
  • "badge": "string",
  • "licenceExpiresAt": "string",
  • "pcoExpiresAt": "string",
  • "dbsExpiresAt": "string",
  • "docsRequiredBeforeUse": false,
  • "userId": "string",
  • "pendingInviteId": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/chauffeurs/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "status": "string",
  • "vehicleId": "string",
  • "vehiclePlate": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "languages": [
    ],
  • "rating": 0,
  • "badge": "string",
  • "licenceExpiresAt": "string",
  • "pcoExpiresAt": "string",
  • "dbsExpiresAt": "string",
  • "docsRequiredBeforeUse": false,
  • "userId": "string",
  • "pendingInviteId": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/chauffeurs/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
name
string non-empty
email
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "vehicleId": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "languages": [
    ],
  • "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
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "status": "string",
  • "vehicleId": "string",
  • "vehiclePlate": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "languages": [
    ],
  • "rating": 0,
  • "badge": "string",
  • "licenceExpiresAt": "string",
  • "pcoExpiresAt": "string",
  • "dbsExpiresAt": "string",
  • "docsRequiredBeforeUse": false,
  • "userId": "string",
  • "pendingInviteId": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/chauffeurs/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true
}

Invite chauffeur (email + docs policy); driver sets password on accept

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "notes": "string",
  • "vehicleId": "string",
  • "docsRequiredBeforeUse": false
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "inviteId": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "docsRequiredBeforeUse": false,
  • "status": "invited",
  • "invitedAt": "string",
  • "inviteToken": "string",
  • "inviteExpiresAt": "string"
}

Resend chauffeur invite email

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
inviteId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "invitedAt": "string",
  • "inviteToken": "string",
  • "inviteExpiresAt": "string"
}

Revoke pending chauffeur invite

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
inviteId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "status": "revoked"
}

/api/v1/orgs/{orgId}/chauffeurs/{id}/vehicle

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
vehicleId
required
string or null

Responses

Request samples

Content type
application/json
{
  • "vehicleId": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "status": "string",
  • "vehicleId": "string",
  • "vehiclePlate": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "languages": [
    ],
  • "rating": 0,
  • "badge": "string",
  • "licenceExpiresAt": "string",
  • "pcoExpiresAt": "string",
  • "dbsExpiresAt": "string",
  • "docsRequiredBeforeUse": false,
  • "userId": "string",
  • "pendingInviteId": "string",
  • "archived": true,
  • "createdAt": "string",
  • "updatedAt": "string"
}

MOT/insurance/PHV/licence/PCO/DBS expiry alerts

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Customers

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.

/api/v1/orgs/{orgId}/customers

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
q
string
status
string
Enum: "active" "inactive" "vip" "blocked"

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

/api/v1/orgs/{orgId}/customers

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
name
required
string non-empty
email
string
phone
string
company
string
status
string
Enum: "active" "inactive" "vip" "blocked"
tags
Array of strings
notes
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "company": "string",
  • "status": "active",
  • "tags": [
    ],
  • "notes": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "company": "string",
  • "status": "active",
  • "tags": [
    ],
  • "notes": "string",
  • "noteRows": [
    ],
  • "feedback": [
    ],
  • "archived": true,
  • "createdAt": "string"
}

/api/v1/orgs/{orgId}/customers/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "company": "string",
  • "status": "active",
  • "tags": [
    ],
  • "notes": "string",
  • "noteRows": [
    ],
  • "feedback": [
    ],
  • "archived": true,
  • "createdAt": "string"
}

/api/v1/orgs/{orgId}/customers/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
name
string non-empty
email
string
phone
string
company
string
status
string
Enum: "active" "inactive" "vip" "blocked"
tags
Array of strings
notes
string
archived
boolean

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "company": "string",
  • "status": "active",
  • "tags": [
    ],
  • "notes": "string",
  • "archived": true
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "company": "string",
  • "status": "active",
  • "tags": [
    ],
  • "notes": "string",
  • "noteRows": [
    ],
  • "feedback": [
    ],
  • "archived": true,
  • "createdAt": "string"
}

Hard-delete if no bookings; otherwise soft-archive

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true,
  • "archived": true,
  • "id": "string"
}

/api/v1/orgs/{orgId}/customers/{id}/notes

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/customers/{id}/notes

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
body
required
string non-empty
author
string

Responses

Request samples

Content type
application/json
{
  • "body": "string",
  • "author": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "body": "string",
  • "author": "string",
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/customers/{id}/notes/{noteId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
noteId
required
string non-empty
Request Body schema: application/json
required
body
string non-empty
author
string

Responses

Request samples

Content type
application/json
{
  • "body": "string",
  • "author": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "body": "string",
  • "author": "string",
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/customers/{id}/notes/{noteId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
noteId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true,
  • "id": "string"
}

/api/v1/orgs/{orgId}/customers/{id}/feedback

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/customers/{id}/feedback

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
rating
required
integer [ 1 .. 5 ]
comment
string
bookingId
string
status
string
Enum: "new" "reviewed" "archived"

Responses

Request samples

Content type
application/json
{
  • "rating": 1,
  • "comment": "string",
  • "bookingId": "string",
  • "status": "new"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "rating": 1,
  • "comment": "string",
  • "bookingId": "string",
  • "status": "new",
  • "createdAt": "string"
}

/api/v1/orgs/{orgId}/customers/{id}/feedback/{feedbackId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
feedbackId
required
string non-empty
Request Body schema: application/json
required
rating
integer [ 1 .. 5 ]
comment
string
bookingId
string or null
status
string
Enum: "new" "reviewed" "archived"

Responses

Request samples

Content type
application/json
{
  • "rating": 1,
  • "comment": "string",
  • "bookingId": "string",
  • "status": "new"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "rating": 1,
  • "comment": "string",
  • "bookingId": "string",
  • "status": "new",
  • "createdAt": "string"
}

/api/v1/orgs/{orgId}/customers/{id}/feedback/{feedbackId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
feedbackId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true,
  • "id": "string"
}

Monitoring

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.

Live monitoring roster snapshot

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
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[...

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "serverTime": "string"
}

/api/v1/orgs/{orgId}/monitoring/drivers/{chauffeurId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
chauffeurId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": {
    },
  • "heading": 0,
  • "speedMps": 0,
  • "lastSeenAt": "string",
  • "shift": {
    },
  • "statusNote": "string",
  • "threadId": "string"
}

GPS trail for active/in-progress trips

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
chauffeurId
required
string non-empty
query Parameters
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

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

/api/v1/orgs/{orgId}/monitoring/drivers/{chauffeurId}/duty

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
chauffeurId
required
string non-empty
Request Body schema: application/json
required
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 ]

Responses

Request samples

Content type
application/json
{
  • "dutyStatus": "working",
  • "statusNote": "string",
  • "startedAt": "2019-08-24T14:15:22Z",
  • "endsAt": "2019-08-24T14:15:22Z",
  • "scheduledMinutes": 1440
}

Response samples

Content type
application/json
{
  • "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": {
    },
  • "heading": 0,
  • "speedMps": 0,
  • "lastSeenAt": "string",
  • "shift": {
    },
  • "statusNote": "string",
  • "threadId": "string"
}

/api/v1/orgs/{orgId}/monitoring/alerts

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
cursor
string
limit
integer ( 0 .. 100 ]
Default: 40
unackedOnly
string
Enum: "0" "1" "true" "false"

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

/api/v1/orgs/{orgId}/monitoring/alerts

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "type": "traffic_delay",
  • "title": "string",
  • "body": "string",
  • "chauffeurId": "string",
  • "bookingId": "string",
  • "threadId": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "type": "traffic_delay",
  • "title": "string",
  • "body": "string",
  • "chauffeurId": "string",
  • "bookingId": "string",
  • "threadId": "string",
  • "createdAt": "string",
  • "acknowledgedAt": "string"
}

/api/v1/orgs/{orgId}/monitoring/alerts/{alertId}/ack

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
alertId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "type": "traffic_delay",
  • "title": "string",
  • "body": "string",
  • "chauffeurId": "string",
  • "bookingId": "string",
  • "threadId": "string",
  • "createdAt": "string",
  • "acknowledgedAt": "string"
}

Inbox

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.

List inbox threads

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
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

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Create or open inbox thread (chauffeur or passenger)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
One of
type
required
string
Value: "passenger"
customerId
required
string non-empty
bookingId
string

Responses

Request samples

Content type
application/json
{
  • "type": "chauffeur",
  • "chauffeurId": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "chauffeur",
  • "participant": {
    },
  • "statusSnippet": "string",
  • "lastMessagePreview": "string",
  • "lastMessageAt": "string",
  • "unreadCount": -9007199254740991,
  • "needsReply": true,
  • "pinned": true,
  • "archived": true,
  • "chauffeur": {
    },
  • "passenger": {
    }
}

Get or create chauffeur ops thread (deep link)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
chauffeurId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "chauffeur",
  • "participant": {
    },
  • "statusSnippet": "string",
  • "lastMessagePreview": "string",
  • "lastMessageAt": "string",
  • "unreadCount": -9007199254740991,
  • "needsReply": true,
  • "pinned": true,
  • "archived": true,
  • "chauffeur": {
    },
  • "passenger": {
    }
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "chauffeur",
  • "participant": {
    },
  • "statusSnippet": "string",
  • "lastMessagePreview": "string",
  • "lastMessageAt": "string",
  • "unreadCount": -9007199254740991,
  • "needsReply": true,
  • "pinned": true,
  • "archived": true,
  • "chauffeur": {
    },
  • "passenger": {
    }
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}/messages

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty
query Parameters
cursor
string
limit
integer ( 0 .. 100 ]
Default: 50
after
string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[...

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}/messages

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty
Request Body schema: application/json
required
body
required
string [ 1 .. 4000 ] characters
clientTempId
string <= 64 characters

Responses

Request samples

Content type
application/json
{
  • "body": "string",
  • "clientTempId": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ]
}

Upload image and send as message (multipart: file, optional caption)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": [
    ]
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}/read

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty
Request Body schema: application/json
required
readAt
string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[...

Responses

Request samples

Content type
application/json
{
  • "readAt": "2019-08-24T14:15:22Z"
}

Response samples

Content type
application/json
{
  • "threadId": "string",
  • "userId": "string",
  • "readAt": "string",
  • "unreadCount": -9007199254740991
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}/pin

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty
Request Body schema: application/json
required
pinned
required
boolean

Responses

Request samples

Content type
application/json
{
  • "pinned": true
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "chauffeur",
  • "participant": {
    },
  • "statusSnippet": "string",
  • "lastMessagePreview": "string",
  • "lastMessageAt": "string",
  • "unreadCount": -9007199254740991,
  • "needsReply": true,
  • "pinned": true,
  • "archived": true,
  • "chauffeur": {
    },
  • "passenger": {
    }
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}/archive

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty
Request Body schema: application/json
required
archived
required
boolean

Responses

Request samples

Content type
application/json
{
  • "archived": true
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "chauffeur",
  • "participant": {
    },
  • "statusSnippet": "string",
  • "lastMessagePreview": "string",
  • "lastMessageAt": "string",
  • "unreadCount": -9007199254740991,
  • "needsReply": true,
  • "pinned": true,
  • "archived": true,
  • "chauffeur": {
    },
  • "passenger": {
    }
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}/messages/{messageId}/reactions

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty
messageId
required
string non-empty
Request Body schema: application/json
required
emoji
required
string [ 1 .. 32 ] characters

Responses

Request samples

Content type
application/json
{
  • "emoji": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ]
}

/api/v1/orgs/{orgId}/inbox/threads/{threadId}/messages/{messageId}/reactions/{emoji}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
threadId
required
string non-empty
messageId
required
string non-empty
emoji
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": [
    ]
}

Pricing

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).

Staff pricing quote (persists quoteId + TTL)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "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
}

Response samples

Content type
application/json
{
  • "quoteId": "string",
  • "expiresAt": "string",
  • "lines": [
    ],
  • "subtotalPence": -9007199254740991,
  • "totalPence": -9007199254740991,
  • "currency": "string",
  • "warnings": [
    ],
  • "applied": {
    },
  • "pricingVersionId": "string",
  • "mode": "distance",
  • "airportCode": "string",
  • "miles": 0
}

/api/v1/orgs/{orgId}/pricing/versions

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "publishedPricingVersionId": "string",
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/pricing/versions/{versionId}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": null,
  • "airportPostcodes": null
}

Create draft by cloning published (or empty)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
label
string
fromVersionId
string

Responses

Request samples

Content type
application/json
{
  • "label": "string",
  • "fromVersionId": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": null,
  • "airportPostcodes": null
}

Replace draft nested graph

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "label": "string",
  • "changeSummary": "string",
  • "currency": "string",
  • "taxRatePercent": 0,
  • "gratuityDefaultPercent": 0,
  • "freeWaitMinutes": -9007199254740991,
  • "roundingMode": "nearest_penny",
  • "tiers": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": {
    },
  • "airportPostcodes": [
    ]
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": null,
  • "airportPostcodes": null
}

Publish draft → immutable PricingVersion

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
versionId
required
string non-empty
changeSummary
string

Responses

Request samples

Content type
application/json
{
  • "versionId": "string",
  • "changeSummary": "string"
}

Response samples

Content type
application/json
{
  • "publishedPricingVersionId": "string",
  • "version": {
    },
  • "idempotent": true
}

Restore prior published pointer

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "publishedPricingVersionId": "string",
  • "version": {
    }
}

Load a published version into the draft for editing (next publish = new version)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": null,
  • "airportPostcodes": null
}

Set London coverage area ids on a draft

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty
Request Body schema: application/json
required
selectedAreaIds
required
Array of strings

Responses

Request samples

Content type
application/json
{
  • "selectedAreaIds": [
    ]
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": null,
  • "airportPostcodes": null
}

Replace airport postcode mappings on a draft

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty
Request Body schema: application/json
required
required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "airportPostcodes": [
    ]
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": null,
  • "airportPostcodes": null
}

Generate mileage bands for vehicle classes on a draft

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty
Request Body schema: application/json
required
vehicleClassIds
Array of strings
replaceExisting
boolean
Array of objects

Responses

Request samples

Content type
application/json
{
  • "vehicleClassIds": [
    ],
  • "replaceExisting": true,
  • "bands": [
    ]
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "mileageBands": [
    ],
  • "airportFares": [
    ],
  • "zones": [
    ],
  • "surcharges": [
    ],
  • "londonCoverage": null,
  • "airportPostcodes": null
}

Builder

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.

Static template catalog (matches FE constants)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Merge a catalog template into the draft config

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
templateId
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "templateId": "string"
}

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "config": {
    },
  • "updatedAt": "string",
  • "revision": -9007199254740991,
  • "publishedBuilderVersionId": "string",
  • "baseVersionId": "string",
  • "baseVersionNumber": -9007199254740991,
  • "latestVersionNumber": -9007199254740991,
  • "hasSecretsInDraft": true
}

/api/v1/orgs/{orgId}/builder

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "config": {
    },
  • "updatedAt": "string",
  • "revision": -9007199254740991,
  • "publishedBuilderVersionId": "string",
  • "baseVersionId": "string",
  • "baseVersionNumber": -9007199254740991,
  • "latestVersionNumber": -9007199254740991,
  • "hasSecretsInDraft": true
}

/api/v1/orgs/{orgId}/builder

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
required
object
baseVersionId
string or null
expectedRevision
integer or null [ 0 .. 9007199254740991 ]

Responses

Request samples

Content type
application/json
{
  • "config": {
    },
  • "baseVersionId": "string",
  • "expectedRevision": 9007199254740991
}

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "config": {
    },
  • "updatedAt": "string",
  • "revision": -9007199254740991,
  • "publishedBuilderVersionId": "string",
  • "baseVersionId": "string",
  • "baseVersionNumber": -9007199254740991,
  • "latestVersionNumber": -9007199254740991,
  • "hasSecretsInDraft": true
}

Publish immutable snapshot; secrets stripped; forks from draft baseVersion

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
label
string
notes
string

Responses

Request samples

Content type
application/json
{
  • "label": "string",
  • "notes": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "version": -9007199254740991,
  • "label": "string",
  • "notes": "string",
  • "publishedAt": "string",
  • "publishedByUserId": "string",
  • "sourceVersionId": "string",
  • "config": {
    }
}

/api/v1/orgs/{orgId}/builder/versions

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "publishedBuilderVersionId": "string",
  • "latestVersionNumber": -9007199254740991,
  • "data": [
    ]
}

Get a published builder version snapshot

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "version": -9007199254740991,
  • "label": "string",
  • "notes": "string",
  • "publishedAt": "string",
  • "publishedByUserId": "string",
  • "sourceVersionId": "string",
  • "config": {
    }
}

Point live embed at an existing version (history preserved)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "publishedBuilderVersionId": "string",
  • "version": {
    }
}

Load a published version into the draft for editing (next publish = new version)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
versionId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "config": {
    },
  • "updatedAt": "string",
  • "revision": -9007199254740991,
  • "publishedBuilderVersionId": "string",
  • "baseVersionId": "string",
  • "baseVersionNumber": -9007199254740991,
  • "latestVersionNumber": -9007199254740991,
  • "hasSecretsInDraft": true
}

Service extras

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.

/api/v1/orgs/{orgId}/service-extras

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/service-extras

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
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 ]

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string",
  • "description": "string",
  • "amountPence": 9007199254740991,
  • "bookable": true,
  • "active": true,
  • "sortOrder": -9007199254740991
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "code": "string",
  • "name": "string",
  • "description": "string",
  • "amountPence": -9007199254740991,
  • "bookable": true,
  • "active": true,
  • "sortOrder": -9007199254740991,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/service-extras/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
code
string [ 1 .. 64 ] characters
name
string non-empty
description
string
amountPence
integer [ 0 .. 9007199254740991 ]
bookable
boolean
active
boolean
sortOrder
integer [ -9007199254740991 .. 9007199254740991 ]

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string",
  • "description": "string",
  • "amountPence": 9007199254740991,
  • "bookable": true,
  • "active": true,
  • "sortOrder": -9007199254740991
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "code": "string",
  • "name": "string",
  • "description": "string",
  • "amountPence": -9007199254740991,
  • "bookable": true,
  • "active": true,
  • "sortOrder": -9007199254740991,
  • "createdAt": "string",
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/service-extras/{id}

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "deleted": true
}

Public

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.

Minimal published booking config (no secrets)

path Parameters
slug
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "slug": "string",
  • "name": "string",
  • "tagline": "string",
  • "supportPhone": "string",
  • "paymentMode": "string",
  • "depositPercent": 0,
  • "booking": {
    },
  • "vehicleClasses": [
    ],
  • "extras": [
    ],
  • "builder": {
    },
  • "secretsStripped": true,
  • "isFreePlan": true,
  • "flightTrackingEnabled": true
}

Bookable vehicle classes for public runtime

path Parameters
slug
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Address autocomplete via Places API (New) server proxy

path Parameters
slug
required
string non-empty
query Parameters
input
required
string [ 1 .. 200 ] characters
sessionToken
string [ 1 .. 36 ] characters
regionCode
string = 2 characters
languageCode
string [ 2 .. 10 ] characters

Responses

Response samples

Content type
application/json
{
  • "suggestions": [
    ]
}

Place Details (New) - formatted address + coordinates

path Parameters
slug
required
string non-empty
query Parameters
placeId
required
string [ 1 .. 256 ] characters
sessionToken
string [ 1 .. 36 ] characters
regionCode
string = 2 characters
languageCode
string [ 2 .. 10 ] characters

Responses

Response samples

Content type
application/json
{
  • "placeId": "string",
  • "formattedAddress": "string",
  • "displayName": "string",
  • "location": {
    }
}

Public quote using published pricing (binds quoteId + TTL)

path Parameters
slug
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "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": {
    },
  • "dropoffCoords": {
    },
  • "pickupAddress": "string",
  • "dropoffAddress": "string",
  • "extras": [
    ]
}

Response samples

Content type
application/json
{
  • "quoteId": "string",
  • "expiresAt": "string",
  • "lines": [
    ],
  • "subtotalPence": -9007199254740991,
  • "totalPence": -9007199254740991,
  • "currency": "string",
  • "warnings": [
    ],
  • "applied": {
    },
  • "pricingVersionId": "string",
  • "mode": "distance",
  • "airportCode": "string",
  • "miles": 0,
  • "durationMinutes": -9007199254740991,
  • "extras": [
    ]
}

Create booking from bound quoteId + PaymentIntent clientSecret

path Parameters
slug
required
string non-empty
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "quoteId": "string",
  • "passenger": {
    },
  • "trip": {
    },
  • "vehicleClassId": "string",
  • "extras": [
    ],
  • "paymentMode": "full_prepay",
  • "partnerCode": "string",
  • "sessionId": "string"
}

Response samples

Content type
application/json
{
  • "booking": {
    },
  • "payment": {
    }
}

Record anonymous funnel stage for reporting

path Parameters
slug
required
string non-empty
Request Body schema: application/json
required
sessionId
required
string non-empty
stage
required
string non-empty
object

Responses

Request samples

Content type
application/json
{
  • "sessionId": "string",
  • "stage": "string",
  • "meta": {
    }
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "sessionId": "string",
  • "stage": "string",
  • "createdAt": "string"
}

Lookup live flight status via server-side AviationStack (paid plans, flag + monthly quota)

path Parameters
slug
required
string [ 1 .. 80 ] characters
query Parameters
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 ]

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "configured": true,
  • "flights": [
    ],
  • "error": {
    }
}

AI

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.

AI chat booking turn — slot machine owns requiredField; vaulted LLM copy only; never returns API keys

path Parameters
slug
required
string non-empty
Request Body schema: application/json
required
Any of
One of
type
required
string
Value: "field"
field
required
string
Value: "pickup"
required
object
sessionId
required
string [ 1 .. 128 ] characters

Responses

Request samples

Content type
application/json
{
  • "messages": [
    ],
  • "sessionId": "string"
}

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "slug": "string",
  • "mode": "rule_mock",
  • "message": {
    },
  • "requiredField": "pickup",
  • "collected": {
    },
  • "quoteReady": true,
  • "sessionId": "string",
  • "publishedBuilderVersion": -9007199254740991,
  • "publicConfigHasSecrets": true,
  • "strippedConfigKeysSample": [
    ]
}

Payments

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.

Initiate Stripe refund for a paid booking

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
amountPence
integer ( 0 .. 9007199254740991 ]
reason
string <= 500 characters
idempotencyKey
string [ 1 .. 255 ] characters

Responses

Request samples

Content type
application/json
{
  • "amountPence": 9007199254740991,
  • "reason": "string",
  • "idempotencyKey": "string"
}

Response samples

Content type
application/json
{
  • "bookingId": "string",
  • "refundId": "string",
  • "amountPence": -9007199254740991,
  • "status": "string",
  • "paymentStatus": "string"
}

Capture a manual-capture PaymentIntent (pay-later / auth)

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty
Request Body schema: application/json
required
amountPence
integer ( 0 .. 9007199254740991 ]

Responses

Request samples

Content type
application/json
{
  • "amountPence": 9007199254740991
}

Response samples

Content type
application/json
{
  • "bookingId": "string",
  • "paymentIntentId": "string",
  • "status": "string",
  • "amountPence": -9007199254740991,
  • "alreadyCaptured": true
}

Cancel an open (unpaid) PaymentIntent

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "bookingId": "string",
  • "paymentIntentId": "string",
  • "status": "string",
  • "alreadyCanceled": true
}

Connect

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.

/api/v1/orgs/{orgId}/connect/account

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "stripeAccountId": "string",
  • "status": "not_started",
  • "chargesEnabled": true,
  • "payoutsEnabled": true,
  • "detailsSubmitted": true,
  • "requirementsDue": [
    ],
  • "email": "string",
  • "country": "string",
  • "applicationFeeBps": -9007199254740991,
  • "updatedAt": "string"
}

/api/v1/orgs/{orgId}/connect/onboard

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
returnUrl
string <uri>
refreshUrl
string <uri>
email
string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z...
country
string = 2 characters

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

/api/v1/orgs/{orgId}/connect/payouts

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

/api/v1/orgs/{orgId}/connect/destination-charges

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
bookingId
required
string non-empty
amountPence
integer ( 0 .. 9007199254740991 ]
currency
string = 3 characters
Default: "gbp"

Responses

Request samples

Content type
application/json
{
  • "bookingId": "string",
  • "amountPence": 9007199254740991,
  • "currency": "gbp"
}

Response samples

Content type
application/json
{
  • "bookingId": "string",
  • "paymentIntentId": "string",
  • "clientSecret": "string",
  • "amountPence": -9007199254740991,
  • "applicationFeePence": -9007199254740991,
  • "connectedAccountId": "string",
  • "chargePattern": "destination"
}

/api/v1/orgs/{orgId}/connect/channels

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/connect/api-keys

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/connect/api-keys

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
name
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "keyPrefix": "string",
  • "secret": "string",
  • "createdAt": "string"
}

/api/v1/orgs/{orgId}/connect/api-keys/{id}/rotate

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "keyPrefix": "string",
  • "secret": "string",
  • "createdAt": "string"
}

/api/v1/orgs/{orgId}/connect/api-keys/{id}/revoke

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "ok": true,
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/connect/webhooks

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/connect/webhooks

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
url
required
string <uri>
events
Array of strings

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/connect/webhooks/{id}/test

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/connect/webhooks/{id}/deliveries

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/partners

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/partners

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
code
required
string non-empty
name
required
string non-empty
contactEmail
string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z...
commissionBps
integer [ -9007199254740991 .. 9007199254740991 ]

Responses

Request samples

Content type
application/json
{
  • "code": "string",
  • "name": "string",
  • "contactEmail": "user@example.com",
  • "commissionBps": -9007199254740991
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/partners/{id}/approve

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "ok": true,
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/partners/{id}/reject

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "ok": true,
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/connect/domain

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/orgs/{orgId}/connect/domain

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
hostname
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "hostname": "string"
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/orgs/{orgId}/connect/domain/{id}/verify

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

Billing

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.

/api/v1/orgs/{orgId}/billing

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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
}

/api/v1/orgs/{orgId}/billing/checkout

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
priceId
string non-empty
planKey
string
Enum: "free" "paid" "pro"
seatCount
integer [ 1 .. 500 ]
Default: 1
successUrl
string <uri>
cancelUrl
string <uri>

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

/api/v1/orgs/{orgId}/billing/portal

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
Request Body schema: application/json
required
returnUrl
string <uri>

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json

Portal

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).

/api/v1/portal/bookings

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

/api/v1/portal/bookings/{id}

Authorizations:
bearerAuth
path Parameters
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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"
}

/api/v1/portal/bookings/{id}/cancel

Authorizations:
bearerAuth
path Parameters
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": {
    }
}

/api/v1/portal/profile

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "email": "string",
  • "name": "string",
  • "phone": "string",
  • "customerId": "string",
  • "orgId": "string"
}

/api/v1/portal/profile

Authorizations:
bearerAuth
Request Body schema: application/json
required
name
string non-empty
phone
string or null

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "phone": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "email": "string",
  • "name": "string",
  • "phone": "string",
  • "customerId": "string",
  • "orgId": "string"
}

Receipt as JSON (default) or PDF (?format=pdf)

Authorizations:
bearerAuth
path Parameters
id
required
string non-empty
query Parameters
format
string
Default: "json"
Enum: "json" "pdf"

Responses

Passenger inbox threads

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/portal/inbox/threads/{threadId}/messages

Authorizations:
bearerAuth
path Parameters
threadId
required
string non-empty
query Parameters
cursor
string
limit
integer ( 0 .. 100 ]
Default: 50
after
string <date-time> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[...

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

/api/v1/portal/inbox/threads/{threadId}/messages

Authorizations:
bearerAuth
path Parameters
threadId
required
string non-empty
Request Body schema: application/json
required
body
required
string [ 1 .. 4000 ] characters
clientTempId
string <= 64 characters

Responses

Request samples

Content type
application/json
{
  • "body": "string",
  • "clientTempId": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ]
}

/api/v1/portal/inbox/threads/{threadId}/read

Authorizations:
bearerAuth
path Parameters
threadId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "threadId": "string",
  • "userId": "string",
  • "readAt": "string",
  • "unreadCount": -9007199254740991
}

Chauffeur

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).

Chauffeur profile + compliance dates + vehicle

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "orgName": "string",
  • "userId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "status": "string",
  • "languages": [
    ],
  • "rating": 0,
  • "badge": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "licenceExpiresAt": "string",
  • "pcoExpiresAt": "string",
  • "dbsExpiresAt": "string",
  • "dateOfBirth": "string",
  • "gender": "male",
  • "docsRequiredBeforeUse": false,
  • "docsGate": {
    },
  • "branding": {
    },
  • "driversCanSeeFares": true,
  • "orgs": [
    ],
  • "vehicle": {
    }
}

Update own chauffeur profile (name/phone/languages/avatar/dob/gender)

Authorizations:
bearerAuth
Request Body schema: application/json
required
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"

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "phone": "string",
  • "languages": [
    ],
  • "avatarMediaId": "string",
  • "dateOfBirth": "string",
  • "gender": "male"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "orgName": "string",
  • "userId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "status": "string",
  • "languages": [
    ],
  • "rating": 0,
  • "badge": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "licenceExpiresAt": "string",
  • "pcoExpiresAt": "string",
  • "dbsExpiresAt": "string",
  • "dateOfBirth": "string",
  • "gender": "male",
  • "docsRequiredBeforeUse": false,
  • "docsGate": {
    },
  • "branding": {
    },
  • "driversCanSeeFares": true,
  • "orgs": [
    ],
  • "vehicle": {
    }
}

Upload avatar image (multipart file)

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "orgId": "string",
  • "orgName": "string",
  • "userId": "string",
  • "name": "string",
  • "email": "string",
  • "phone": "string",
  • "status": "string",
  • "languages": [
    ],
  • "rating": 0,
  • "badge": "string",
  • "avatarMediaId": "string",
  • "avatarUrl": "string",
  • "licenceExpiresAt": "string",
  • "pcoExpiresAt": "string",
  • "dbsExpiresAt": "string",
  • "dateOfBirth": "string",
  • "gender": "male",
  • "docsRequiredBeforeUse": false,
  • "docsGate": {
    },
  • "branding": {
    },
  • "driversCanSeeFares": true,
  • "orgs": [
    ],
  • "vehicle": {
    }
}

/api/v1/chauffeur/me/documents

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Register a compliance document from an uploaded mediaId

Authorizations:
bearerAuth
Request Body schema: application/json
required
kind
required
string
Enum: "licence" "pco" "dbs" "insurance" "other"
mediaId
required
string non-empty
expiresAt
string or null

Responses

Request samples

Content type
application/json
{
  • "kind": "licence",
  • "mediaId": "string",
  • "expiresAt": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "kind": "licence",
  • "mediaId": "string",
  • "mediaUrl": "string",
  • "status": "pending",
  • "expiresAt": "string",
  • "reviewerNote": "string",
  • "uploadedAt": "string"
}

Upload compliance document (multipart: file, kind, expiresAt?)

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "kind": "licence",
  • "mediaId": "string",
  • "mediaUrl": "string",
  • "status": "pending",
  • "expiresAt": "string",
  • "reviewerNote": "string",
  • "uploadedAt": "string"
}

Stream own avatar/document media bytes

Authorizations:
bearerAuth
path Parameters
mediaId
required
string non-empty

Responses

Register FCM/APNs device token

Authorizations:
bearerAuth
Request Body schema: application/json
required
token
required
string [ 8 .. 4096 ] characters
platform
required
string
Enum: "ios" "android"
appVersion
string <= 40 characters

Responses

Request samples

Content type
application/json
{
  • "token": "stringst",
  • "platform": "ios",
  • "appVersion": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "platform": "ios",
  • "token": "string",
  • "appVersion": "string",
  • "lastSeenAt": "string"
}

Revoke a device push token

Authorizations:
bearerAuth
path Parameters
tokenId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Jobs completed + revenue (pence) + hours + ratings for range

Authorizations:
bearerAuth
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "completedJobs": -9007199254740991,
  • "totalJobs": -9007199254740991,
  • "revenuePence": -9007199254740991,
  • "hoursMinutes": -9007199254740991,
  • "hoursWorked": 0,
  • "avgRating": 0,
  • "profileRating": 0
}

Daily completed-jobs + revenue buckets for range

Authorizations:
bearerAuth
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "data": [
    ]
}

Customer feedback for this chauffeur’s bookings

Authorizations:
bearerAuth
query Parameters
cursor
string
limit
integer [ 1 .. 100 ]
Default: 50
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

Feedback coaching summary (heuristic; cached weekly)

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "summary": "string",
  • "keyNotes": [
    ],
  • "sentiment": "positive",
  • "insufficientData": true,
  • "feedbackCount": -9007199254740991,
  • "model": "string",
  • "periodFrom": "string",
  • "periodTo": "string"
}

/api/v1/chauffeur/jobs

Authorizations:
bearerAuth
query Parameters
date
string
phase
string
Enum: "upcoming" "past" "active" "all"
from
string
to
string
cursor
string
limit
integer [ 1 .. 100 ]
Default: 50

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

/api/v1/chauffeur/jobs/{bookingId}

Authorizations:
bearerAuth
path Parameters
bookingId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": {
    }
}

Start: assigned→en_route, or arrived→in_progress

Authorizations:
bearerAuth
path Parameters
bookingId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": {
    }
}

Mark arrived at pickup (en_route → arrived)

Authorizations:
bearerAuth
path Parameters
bookingId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": {
    }
}

/api/v1/chauffeur/jobs/{bookingId}/complete

Authorizations:
bearerAuth
path Parameters
bookingId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "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": {
    }
}

Rate passenger after a completed job (one-time)

Authorizations:
bearerAuth
path Parameters
bookingId
required
string non-empty
Request Body schema: application/json
required
rating
required
integer [ 1 .. 5 ]
comment
string <= 500 characters

Responses

Request samples

Content type
application/json
{
  • "rating": 1,
  • "comment": "string"
}

Response samples

Content type
application/json
{
  • "bookingId": "string",
  • "rating": 1,
  • "comment": "string",
  • "ratedAt": "string"
}

Request to drop/decline an assigned job (admin must approve)

Authorizations:
bearerAuth
path Parameters
bookingId
required
string non-empty
Request Body schema: application/json
required
reason
required
string [ 3 .. 2000 ] characters

Responses

Request samples

Content type
application/json
{
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "bookingId": "string",
  • "orgId": "string",
  • "reason": "string",
  • "status": "string",
  • "createdAt": "string"
}

Batch GPS samples (offline queue friendly)

Authorizations:
bearerAuth
Request Body schema: application/json
required
required
Array of objects [ 1 .. 50 ] items

Responses

Request samples

Content type
application/json
{
  • "points": [
    ]
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Heartbeat / duty / passenger-on-board presence

Authorizations:
bearerAuth
Request Body schema: application/json
required
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 ]

Responses

Request samples

Content type
application/json
{
  • "passengerOnBoard": true,
  • "motionState": "moving",
  • "statusNote": "string",
  • "dutyStatus": "working",
  • "activeBookingId": "string",
  • "lat": -90,
  • "lng": -180
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

/api/v1/chauffeur/inbox/thread

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "chauffeur",
  • "participant": {
    },
  • "statusSnippet": "string",
  • "lastMessagePreview": "string",
  • "lastMessageAt": "string",
  • "unreadCount": -9007199254740991,
  • "needsReply": true,
  • "pinned": true,
  • "archived": true,
  • "chauffeur": {
    },
  • "passenger": {
    }
}

/api/v1/chauffeur/inbox/messages

Authorizations:
bearerAuth
query Parameters
cursor
string
limit
integer ( 0 .. 100 ]
Default: 50

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

/api/v1/chauffeur/inbox/messages

Authorizations:
bearerAuth
Request Body schema: application/json
required
body
required
string [ 1 .. 4000 ] characters
clientTempId
string <= 64 characters

Responses

Request samples

Content type
application/json
{
  • "body": "string",
  • "clientTempId": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ]
}

Send image message (multipart file)

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "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": [
    ]
}

/api/v1/chauffeur/inbox/read

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "threadId": "string",
  • "userId": "string",
  • "readAt": "string",
  • "unreadCount": -9007199254740991
}

/api/v1/chauffeur/inbox/messages/{messageId}/reactions

Authorizations:
bearerAuth
path Parameters
messageId
required
string non-empty
Request Body schema: application/json
required
emoji
required
string [ 1 .. 32 ] characters

Responses

Request samples

Content type
application/json
{
  • "emoji": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ]
}

Reporting

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.

/api/v1/orgs/{orgId}/reporting/overview

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "kpis": {
    }
}

/api/v1/orgs/{orgId}/reporting/revenue

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "series": [
    ]
}

/api/v1/orgs/{orgId}/reporting/funnel

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "stages": [
    ]
}

/api/v1/orgs/{orgId}/reporting/fleet

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "vehicles": [
    ]
}

/api/v1/orgs/{orgId}/reporting/chauffeurs

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "chauffeurs": [
    ]
}

/api/v1/orgs/{orgId}/reporting/customers

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "uniquePassengers": -9007199254740991,
  • "totalBookings": -9007199254740991
}

/api/v1/orgs/{orgId}/reporting/demand

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "byHour": [
    ]
}

/api/v1/orgs/{orgId}/reporting/cancellations

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "cancelled": -9007199254740991,
  • "cancelFeePence": -9007199254740991,
  • "noShows": -9007199254740991,
  • "rate": 0
}

/api/v1/orgs/{orgId}/reporting/trip-mix

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "classes": [
    ]
}

/api/v1/orgs/{orgId}/reporting/performance

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
from
string
to
string

Responses

Response samples

Content type
application/json
{
  • "from": "string",
  • "to": "string",
  • "lateCount": -9007199254740991,
  • "avgLateMinutes": 0,
  • "noShows": -9007199254740991,
  • "completionRate": 0
}

Audit

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.

/api/v1/orgs/{orgId}/audit

Authorizations:
bearerAuth
path Parameters
orgId
required
string non-empty
query Parameters
cursor
string
limit
integer [ 1 .. 100 ]

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

Admin

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.

Platform admin login (typ: platform JWT)

Request Body schema: application/json
required
email
required
string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z...
password
required
string >= 8 characters

Responses

Request samples

Content type
application/json
{
  • "email": "user@example.com",
  • "password": "stringst"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "user": {
    }
}

Whether first-run super admin bootstrap is still open

Responses

Response samples

Content type
application/json
{
  • "available": true,
  • "reason": "ok"
}

Create the first platform super admin (setup-token gated, one-time)

Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "setupToken": "string",
  • "email": "user@example.com",
  • "name": "string",
  • "password": "stringstring"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "user": {
    }
}

/api/v1/admin/metrics

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "orgCount": -9007199254740991,
  • "bookingVolume": -9007199254740991,
  • "activeSubscriptions": -9007199254740991,
  • "mrrPence": -9007199254740991,
  • "plans": [
    ]
}

/api/v1/admin/organizations

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/admin/organizations

Authorizations:
bearerAuth
Request Body schema: application/json
required
name
required
string non-empty
slug
required
string non-empty ^[a-z0-9-]+$
plan
string
Enum: "free" "paid" "pro"

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "slug": "string",
  • "plan": "free"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "slug": "string",
  • "plan": "string",
  • "status": "string"
}

/api/v1/admin/organizations/{id}

Authorizations:
bearerAuth
path Parameters
id
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/admin/organizations/{id}

Authorizations:
bearerAuth
path Parameters
id
required
string non-empty
Request Body schema: application/json
required
plan
string
Enum: "free" "paid" "pro"
status
string
Enum: "active" "suspended"
platformPlanId
string or null

Responses

Request samples

Content type
application/json
{
  • "plan": "free",
  • "status": "active",
  • "platformPlanId": "string"
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/admin/impersonate

Authorizations:
bearerAuth
Request Body schema: application/json
required
orgId
required
string non-empty

Responses

Request samples

Content type
application/json
{
  • "orgId": "string"
}

Response samples

Content type
application/json
{
  • "accessToken": "string",
  • "expiresIn": -9007199254740991,
  • "impersonatedUser": {
    },
  • "orgId": "string"
}

/api/v1/admin/airports

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/admin/airports

Authorizations:
bearerAuth
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "code": "stri",
  • "name": "string",
  • "country": "string",
  • "lat": 0,
  • "lng": 0,
  • "active": true
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/admin/geo-packs

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/admin/geo-packs

Authorizations:
bearerAuth
Request Body schema: application/json
required
id
string
name
required
string non-empty
description
string
object
active
boolean

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "payload": {
    },
  • "active": true
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/admin/plans

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/admin/plans

Authorizations:
bearerAuth
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "code": "string",
  • "name": "string",
  • "seatLimit": -9007199254740991,
  • "applicationFeeBps": -9007199254740991,
  • "stripePriceId": "string",
  • "mrrPence": -9007199254740991,
  • "active": true
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/admin/users

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/admin/feature-flags

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

/api/v1/admin/feature-flags/{id}

Authorizations:
bearerAuth
path Parameters
id
required
string
Request Body schema: application/json
required
description
string
defaultEnabled
boolean

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "defaultEnabled": true
}

Response samples

Content type
application/json
{
  • "property1": null,
  • "property2": null
}

/api/v1/admin/feature-flags/evaluate

Authorizations:
bearerAuth
query Parameters
orgId
required
string non-empty

Responses

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "flags": [
    ]
}

/api/v1/admin/feature-flags/org-override

Authorizations:
bearerAuth
Request Body schema: application/json
required
orgId
required
string non-empty
key
required
string non-empty
enabled
required
boolean

Responses

Request samples

Content type
application/json
{
  • "orgId": "string",
  • "key": "string",
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "orgId": "string",
  • "flags": [
    ]
}

Email

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.

Enqueue pending_config (and optional pending) outbox emails for send

Authorizations:
bearerAuth
Request Body schema: application/json
required
limit
integer ( 0 .. 1000 ]
includePending
boolean

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "found": -9007199254740991,
  • "enqueued": -9007199254740991,
  • "redisFailures": -9007199254740991,
  • "emailConfigured": true
}

List email outbox rows (platform admin)

Authorizations:
bearerAuth
query Parameters
status
string
Enum: "pending" "pending_config" "sent" "failed"
orgId
string
limit
integer ( 0 .. 200 ]
cursor
string

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "nextCursor": "string"
}

Webhooks

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.

/api/v1/webhooks/stripe

Responses

Response samples

Content type
application/json
{
  • "received": true,
  • "duplicate": true,
  • "type": "string"
}