RahalCorporate
TravelersReference

API Reference

API endpoints for traveler, passport, and document management

API Reference

API endpoints for managing travelers, passports, and documents.

All endpoints require authentication. Admin endpoints require appropriate admin permissions.

Traveler Endpoints

List Travelers (Admin)

GET /api/admin/travelers

Query Parameters:

ParameterTypeDescription
pagenumberPage number (default: 1)
perPagenumberItems per page (default: 10)
searchstringSearch by name, email, phone, passport
companyIdstringFilter by company
travelerTypestringFilter by type (ADT, CHD, INF)
sortBystringSort field (createdAt, firstName, lastName)
sortOrderstringSort direction (asc, desc)

Response:

{
  "status": "success",
  "data": [
    {
      "id": "clx123...",
      "userId": "clx456...",
      "title": "mr",
      "firstName": "John",
      "lastName": "Smith",
      "emailAddress": "john@example.com",
      "phone": "+9647701234567",
      "birthDate": "1990-05-15T00:00:00.000Z",
      "age": 35,
      "travelerType": "ADT",
      "passports": [...],
      "user": {...},
      "_count": { "documents": 3 }
    }
  ],
  "total": 150,
  "page": 1,
  "perPage": 10
}

Get Traveler (Admin)

GET /api/admin/travelers/:id

Response: Single traveler object with full details.

Create Traveler (Admin)

POST /api/admin/travelers

Request Body:

{
  "userId": "clx456...",
  "title": "mr",
  "firstName": "John",
  "lastName": "Smith",
  "emailAddress": "john@example.com",
  "phonePrefix": "+964",
  "phoneNumber": "7701234567",
  "birthDate": "1990-05-15"
}

Create Traveler with Passport (Admin)

POST /api/admin/travelers/with-passport
Content-Type: multipart/form-data

Form Fields:

FieldTypeRequired
userIdstringYes
titlestringYes
firstNamestringYes
lastNamestringYes
emailAddressstringNo
phonePrefixstringYes
phoneNumberstringYes
birthDatestring (date)Yes
passportNumberstringYes
passportNationalitystringYes
passportIssuingCountrystringYes
passportIssuingDatestring (date)Yes
passportExpiryDatestring (date)Yes
passportIsPrimarybooleanNo
passportDocumentsFile[]No

Update Traveler (Admin)

PATCH /api/admin/travelers/:id

Request Body: Partial traveler object (only fields to update).

Delete Traveler (Admin)

DELETE /api/admin/travelers/:id

Response: 204 No Content

Travelers with pending booking requests cannot be deleted. Returns 400 Bad Request.

Passport Endpoints

List Passports by Traveler

GET /api/travelers/:travelerId/passports

Response:

{
  "status": "success",
  "data": [
    {
      "id": "clx789...",
      "travelerId": "clx123...",
      "passportNumber": "A12345678",
      "nationality": "US",
      "issuingCountry": "US",
      "issuingDate": "2020-01-15T00:00:00.000Z",
      "expiryDate": "2030-01-15T00:00:00.000Z",
      "isPrimary": true,
      "expiresInDays": 1450
    }
  ]
}

Get Passport

GET /api/passports/:id

Create Passport

POST /api/travelers/:travelerId/passports

Request Body:

{
  "passportNumber": "A12345678",
  "nationality": "US",
  "issuingCountry": "US",
  "issuingDate": "2020-01-15",
  "expiryDate": "2030-01-15",
  "isPrimary": true
}

Create Passport with Documents

POST /api/travelers/:travelerId/passports/with-documents
Content-Type: multipart/form-data

Form Fields:

FieldTypeRequired
passportNumberstringYes
nationalitystringYes
issuingCountrystringYes
issuingDatestring (date)Yes
expiryDatestring (date)Yes
isPrimarybooleanNo
passportDocumentsFile[]No

Update Passport

PATCH /api/passports/:id

Request Body: Partial passport object.

Delete Passport

DELETE /api/passports/:id

Set Primary Passport

POST /api/passports/:id/set-primary

Request Body:

{
  "travelerId": "clx123..."
}

Document Endpoints

List Documents by Traveler

GET /api/travelers/:travelerId/documents

Query Parameters:

ParameterTypeDescription
categorystringFilter by category

Upload Document

POST /api/travelers/:travelerId/documents
Content-Type: multipart/form-data

Form Fields:

FieldTypeRequired
fileFileYes
documentCategorystringYes
labelstringNo
relatedEntityIdstringNo
relatedEntityTypestringNo

Get Document Download URL

GET /api/documents/:id/download

Response:

{
  "status": "success",
  "data": {
    "url": "https://storage.example.com/signed-url...",
    "expiresAt": "2026-01-26T12:00:00.000Z"
  }
}

Delete Document

DELETE /api/documents/:id

Error Responses

Standard Error Format

{
  "status": "error",
  "message": "Error message here",
  "code": "ERROR_CODE"
}

Common Error Codes

CodeHTTP StatusDescription
TRAVELER_NOT_FOUND404Traveler does not exist
PASSPORT_NOT_FOUND404Passport does not exist
DOCUMENT_NOT_FOUND404Document does not exist
DUPLICATE_NATIONALITY400Passport with nationality exists
TRAVELER_IN_BOOKING400Cannot delete - pending bookings
INVALID_DATES400Expiry date before issuing date
FILE_TOO_LARGE400File exceeds 10MB limit
INVALID_FILE_TYPE400Unsupported file format

Pagination

All list endpoints return paginated results:

{
  "data": [...],
  "total": 150,
  "page": 1,
  "perPage": 10
}
FieldDescription
dataArray of items for current page
totalTotal number of items
pageCurrent page number
perPageItems per page

Rate Limits

Endpoint TypeLimit
Read endpoints100 requests/minute
Write endpoints30 requests/minute
File uploads10 requests/minute

On this page