Navigate NHS Job Board
Complete API reference for the NHS Jobs Portal. Access endpoints for job listings, applications, employer management, and user authentication.
Register a new user account (jobseeker or employer). Returns access and refresh tokens upon successful registration.
| Name | Type | Description |
|---|---|---|
| email* | string | Valid email address. Must be unique. |
| password* | string | Password with minimum 8 characters. Must contain uppercase, lowercase, and numbers. |
| name* | string | Full name of the user. |
| userType* | string | Either 'jobseeker' or 'employer'. |
Success (201)
{
"success": true,
"data": {
"accessToken": "eyJhbGc...",
"refreshToken": "eyJhbGc...",
"user": {
"id": "uuid",
"email": "[email protected]",
"name": "John Doe",
"role": "jobseeker"
}
},
"message": "Registration successful"
}Error (409)
{
"success": false,
"error": "Email already registered"
}Authenticate with email and password. Returns JWT access token (15 min) and refresh token (7 days).
| Name | Type | Description |
|---|---|---|
| email* | string | Registered email address. |
| password* | string | Account password. |
Success (200)
{
"success": true,
"data": {
"accessToken": "eyJhbGc...",
"refreshToken": "eyJhbGc...",
"user": {
"id": "uuid",
"email": "[email protected]",
"name": "John Doe",
"role": "jobseeker",
"subscriptionStatus": "active"
}
},
"message": "Login successful"
}Error (401)
{
"success": false,
"error": "Invalid email or password"
}Refresh expired access token using refresh token. Returns new access and refresh tokens.
| Name | Type | Description |
|---|---|---|
| refreshToken* | string | Valid refresh token from login or previous refresh. |
Success (200)
{
"success": true,
"data": {
"accessToken": "eyJhbGc...",
"refreshToken": "eyJhbGc..."
},
"message": "Token refreshed successfully"
}Error (401)
{
"success": false,
"error": "Invalid or expired refresh token"
}Logout current user. Invalidates tokens on the server.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Logged out successfully"
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get current authenticated user's profile information.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"id": "uuid",
"email": "[email protected]",
"name": "John Doe",
"role": "jobseeker",
"createdAt": "2024-01-15T10:30:00Z",
"subscriptionStatus": "active"
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get detailed user profile with preferences and settings.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"id": "uuid",
"email": "[email protected]",
"name": "John Doe",
"bio": "Healthcare professional",
"location": "London, UK",
"preferences": {
"jobAlerts": true,
"emailNotifications": true
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Update jobseeker profile. Requires 'intent' parameter with value 'update-profile'. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'update-profile'. |
| profile* | object | Profile object containing fields: firstName, lastName, email, phone, location, specialty, currentRole, experience, preferredLocation, locationRadius, employmentTypes, salaryMin, salaryMax. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Profile updated successfully",
"data": {
"intent": "update-profile",
"profile": {
"firstName": "John",
"lastName": "Doe"
}
}
}Error (400)
{
"success": false,
"error": "Intent is required"
}Save a job listing for the current user. Add a job to the user's saved/bookmarked jobs list.
| Name | Type | Description |
|---|---|---|
| listingId* | string | UUID of the job listing to save. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (201)
{
"success": true,
"data": {
"id": "uuid",
"listingId": "uuid",
"title": "Nurse",
"company": "NHS Trust",
"savedAt": "2024-01-15T10:30:00Z"
},
"message": "Job saved successfully"
}Error (400)
{
"success": false,
"error": "Already saved"
}Get employer profile information including company details and contact information.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"id": "uuid",
"email": "[email protected]",
"profile": {
"name": "John Doe",
"jobTitle": "HR Manager"
},
"company": {
"name": "NHS Trust",
"industry": "Healthcare",
"size": "1000+"
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Update employer profile. Requires 'intent' parameter. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'update-profile'. |
| profile | object | Profile data containing name, jobTitle, etc. |
| companyName | string | Company name. |
| industry | string | Industry type. |
| companySize | string | Company size. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Profile updated successfully"
}Error (429)
{
"success": false,
"error": "Rate limit exceeded"
}Get employer's job listings with pagination.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"listings": [
{
"id": "uuid",
"title": "Nurse",
"company": "NHS Trust",
"status": "active"
}
],
"pagination": {
"total": 50,
"page": 1,
"limit": 20,
"totalPages": 3
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Create new job listing. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| title* | string | Job title. |
| description* | string | Job description. |
| department | string | Department. |
| contractType | string | Contract type (permanent, temporary, contract). |
| salary | object | Salary object with min, max, currency. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (201)
{
"success": true,
"message": "Job listing created successfully",
"data": {
"id": "uuid"
}
}Error (429)
{
"success": false,
"error": "Rate limit exceeded"
}Get applications for employer's job listings with pagination.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"applications": [
{
"id": "uuid",
"jobId": "uuid",
"jobTitle": "Nurse",
"status": "pending"
}
],
"pagination": {
"total": 100,
"page": 1,
"limit": 20,
"totalPages": 5
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get employer team members with pagination.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"team": [
{
"id": "uuid",
"name": "Jane Doe",
"email": "[email protected]",
"role": "Recruiter"
}
],
"pagination": {
"total": 10,
"page": 1,
"limit": 20,
"totalPages": 1
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Add team member. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'add-member'. |
| name* | string | Team member name. |
| email* | string | Team member email. |
| role | string | Team member role. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Team member added successfully"
}Error (429)
{
"success": false,
"error": "Rate limit exceeded"
}Get employer settings.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"id": "uuid",
"email": "[email protected]",
"company": {
"name": "NHS Trust"
},
"contact": {
"name": "John Doe"
},
"preferences": {}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Update employer settings. Requires 'intent' parameter. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'update-profile' or 'update-notifications'. |
| companyName | string | Company name for update-profile intent. |
| industry | string | Industry for update-profile intent. |
| emailAlerts | boolean | Email alerts preference for update-notifications intent. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Settings updated successfully"
}Error (429)
{
"success": false,
"error": "Rate limit exceeded"
}Reset employer settings to defaults. Rate limited to 10 requests per 15 minutes per IP.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Settings reset to defaults successfully",
"data": {
"settings": {
"notifications": {},
"preferences": {}
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Soft delete employer account. Rate limited to 10 requests per 15 minutes per IP.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Account deleted successfully"
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get specific job listing details by ID.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"job": {
"id": "uuid",
"title": "Nurse",
"description": "Job description",
"company": "NHS Trust",
"location": "London, UK",
"status": "active"
}
}
}Error (404)
{
"success": false,
"error": "Job listing not found"
}Update individual job listing. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| title | string | Job title. |
| description | string | Job description. |
| department | string | Department. |
| contractType | string | Contract type. |
| salary | object | Salary object. |
| status | string | Job status (active, inactive, closed). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Job listing updated successfully",
"data": {
"id": "uuid"
}
}Error (404)
{
"success": false,
"error": "Job listing not found"
}Archive (soft delete) job listing. Rate limited to 10 requests per 15 minutes per IP.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Job listing archived successfully",
"data": {
"id": "uuid"
}
}Error (404)
{
"success": false,
"error": "Job listing not found"
}Get specific application details by ID.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"application": {
"id": "uuid",
"jobId": "uuid",
"applicantEmail": "[email protected]",
"jobTitle": "Nurse",
"status": "pending"
}
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Update application status. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| status* | string | New status (pending, review, interview, accepted, rejected, withdrawn). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Application status updated successfully",
"data": {
"id": "uuid",
"status": "review"
}
}Error (400)
{
"success": false,
"error": "Invalid status"
}Withdraw application. Rate limited to 10 requests per 15 minutes per IP.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Application withdrawn successfully",
"data": {
"id": "uuid"
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Register a new employer account. Rate limited to 5 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| email* | string | Valid email address. Must be unique. |
| password* | string | Password with minimum 8 characters. |
| name* | string | Full name of the user. |
| companyName* | string | Company name. |
| industry | string | Industry type. |
| companySize | string | Company size. |
Success (201)
{
"success": true,
"data": {
"accessToken": "eyJhbGc...",
"refreshToken": "eyJhbGc...",
"user": {
"id": "uuid",
"email": "[email protected]",
"role": "EMPLOYER"
}
},
"message": "Registration successful"
}Error (429)
{
"success": false,
"error": "Rate limit exceeded"
}Get overall employer analytics including job counts and application statistics.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"jobs": {
"total": 50,
"active": 35,
"draft": 15
},
"applications": {
"total": 200,
"pending": 50,
"review": 75,
"interview": 30,
"accepted": 40,
"rejected": 5
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get individual job performance metrics including application counts and conversion rate.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"jobId": "uuid",
"title": "Nurse",
"views": 500,
"applications": {
"total": 25,
"pending": 10,
"review": 8,
"interview": 4,
"accepted": 3
},
"conversionRate": 5
}
}Error (404)
{
"success": false,
"error": "Job listing not found"
}Get application statistics with filters by status, time period, and job.
| Name | Type | Description |
|---|---|---|
| status | string | Filter by application status. |
| startDate | string | Filter by start date (ISO format). |
| endDate | string | Filter by end date (ISO format). |
| jobId | string | Filter by job ID. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"total": 100,
"byStatus": {
"pending": 30,
"review": 40,
"interview": 20,
"accepted": 10
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Batch create up to 100 job listings. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| jobs* | array | Array of job objects with title, description, department, contractType, salary. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Batch created: 90 jobs succeeded, 10 failed",
"data": {
"created": [
{
"id": "uuid",
"title": "Nurse"
}
],
"failed": [
{
"job": {},
"error": "title is required"
}
]
}
}Error (400)
{
"success": false,
"error": "Maximum 100 jobs per batch request"
}Batch update up to 100 job listings. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| jobs* | array | Array of job objects with id and fields to update. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Batch updated: 95 jobs succeeded, 5 failed",
"data": {
"updated": [
{
"id": "uuid"
}
],
"failed": [
{
"job": {},
"error": "Job listing not found"
}
]
}
}Error (400)
{
"success": false,
"error": "Maximum 100 jobs per batch request"
}Export application data to CSV format.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
Error (401)
{
"success": false,
"error": "Unauthorized"
}Schedule an interview for a specific application.
| Name | Type | Description |
|---|---|---|
| scheduledAt* | string | Interview date and time (ISO format). |
| location* | string | Interview location or meeting link. |
| interviewer* | string | Name of the interviewer. |
| notes | string | Additional interview notes. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Interview scheduled successfully",
"data": {
"applicationId": "uuid",
"interview": {
"scheduledAt": "2024-02-01T10:00:00Z",
"location": "Room 101",
"interviewer": "John Doe"
}
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Update interview details for a specific application.
| Name | Type | Description |
|---|---|---|
| scheduledAt | string | Updated interview date and time. |
| location | string | Updated interview location. |
| interviewer | string | Updated interviewer. |
| status | string | Interview status (scheduled, completed, cancelled). |
| outcome | string | Interview outcome (pass, fail, pending). |
| notes | string | Updated interview notes. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Interview updated successfully",
"data": {
"applicationId": "uuid",
"interview": {
"status": "completed",
"outcome": "pass"
}
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Get all scheduled interviews for the employer's jobs.
| Name | Type | Description |
|---|---|---|
| status | string | Filter by interview status. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"interviews": [
{
"applicationId": "uuid",
"jobId": "uuid",
"jobTitle": "Nurse",
"applicantName": "Jane Doe",
"applicantEmail": "[email protected]",
"status": "pending",
"interview": {
"scheduledAt": "2024-02-01T10:00:00Z",
"location": "Room 101"
}
}
],
"total": 25
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Duplicate a job listing to create a copy.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Job duplicated successfully",
"data": {
"id": "uuid",
"title": "Nurse (Copy)"
}
}Error (404)
{
"success": false,
"error": "Job listing not found"
}Extend an expired job listing's deadline.
| Name | Type | Description |
|---|---|---|
| durationDays | number | Number of days to extend (default: 30). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Job renewed successfully",
"data": {
"id": "uuid",
"status": "active",
"applicationDeadline": "2024-03-01T00:00:00Z"
}
}Error (404)
{
"success": false,
"error": "Job listing not found"
}Get organization details.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"organizationId": "352",
"company": {
"name": "NHS Trust",
"description": "Healthcare provider",
"website": "https://example.com",
"industry": "Healthcare",
"size": "1000+"
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Update organization profile.
| Name | Type | Description |
|---|---|---|
| name | string | Organization name. |
| description | string | Organization description. |
| website | string | Organization website. |
| logo | string | Organization logo URL. |
| industry | string | Industry type. |
| size | string | Organization size. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Organization updated successfully",
"data": {
"company": {
"name": "NHS Trust"
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get team member permissions.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"userId": "uuid",
"role": "EMPLOYER",
"permissions": {
"jobs": {
"create": true,
"update": true,
"delete": false
},
"applications": {
"view": true,
"update": true
}
}
}
}Error (403)
{
"success": false,
"error": "Team member not in your organization"
}Update team member permissions (Admin only).
| Name | Type | Description |
|---|---|---|
| permissions | object | Permissions object. |
| role | string | Team member role. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Team member permissions updated successfully",
"data": {
"userId": "uuid",
"permissions": {},
"role": "EMPLOYER"
}
}Error (403)
{
"success": false,
"error": "Team member not in your organization"
}Export job listings to CSV format.
| Name | Type | Description |
|---|---|---|
| format | string | Export format (only csv supported). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
Error (400)
{
"success": false,
"error": "Only CSV format is supported"
}Batch update up to 100 application statuses.
| Name | Type | Description |
|---|---|---|
| applications* | array | Array of application objects with id and status. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Batch updated: 95 applications succeeded, 5 failed",
"data": {
"updated": [
{
"id": "uuid",
"status": "review"
}
],
"failed": [
{
"appUpdate": {},
"error": "Application not found"
}
]
}
}Error (400)
{
"success": false,
"error": "Maximum 100 applications per batch request"
}Send email to applicant.
| Name | Type | Description |
|---|---|---|
| subject* | string | Email subject. |
| message* | string | Email message content. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Email queued for sending",
"data": {
"to": "[email protected]",
"subject": "Interview Invitation"
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Search and retrieve job listings with filtering, pagination, and sorting options.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| search | string | Search term for job title or description. |
| location | string | Filter by location (city or region). |
| contractType | string | Filter by contract type (permanent, temporary, contract). |
| salary_min | number | Minimum salary filter. |
| salary_max | number | Maximum salary filter. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | No |
Success (200)
{
"success": true,
"data": {
"listings": [
{
"id": "uuid",
"title": "Nurse",
"company": "NHS Trust",
"location": "London",
"salary": {
"min": 28000,
"max": 35000
},
"contractType": "permanent",
"postedAt": "2024-01-15T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1250
}
}
}Error (400)
{
"success": false,
"error": "Invalid filter parameters"
}Get detailed information about a specific job listing.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | No |
Success (200)
{
"success": true,
"data": {
"id": "uuid",
"title": "Senior Nurse",
"company": "NHS Trust",
"description": "We are looking for an experienced nurse...",
"location": "London",
"salary": {
"min": 35000,
"max": 42000
},
"contractType": "permanent",
"requirements": [
"RN License",
"5+ years experience"
],
"benefits": [
"Competitive salary",
"Pension scheme"
],
"applicationDeadline": "2024-02-15"
}
}Error (404)
{
"success": false,
"error": "Listing not found"
}Advanced search with full-text search capabilities and complex filters.
| Name | Type | Description |
|---|---|---|
| query* | string | Full-text search query. |
| filters | object | Complex filter object with location, salary, contract type, etc. |
| sort | string | Sort by: 'relevance', 'date', 'salary', 'distance'. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | No |
Success (200)
{
"success": true,
"data": {
"results": [
{
"id": "uuid",
"title": "Nurse",
"relevance": 0.95
}
],
"total": 450
}
}Error (400)
{
"success": false,
"error": "Invalid search query"
}Partially update a specific job listing. Merges provided fields with existing data.
| Name | Type | Description |
|---|---|---|
| meta* | object | Partial listing metadata to update. Merged with existing meta. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
| X-API-Key | <apiKey> | No |
Success (200)
{
"success": true,
"data": {
"uuid": "uuid",
"meta": {
"listing": {
"title": "Updated Title"
}
}
},
"message": "Listing updated successfully"
}Error (404)
{
"success": false,
"error": "Listing not found"
}Restore a soft-deleted job listing back to active status.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
| X-API-Key | <apiKey> | No |
Success (200)
{
"success": true,
"message": "Listing restored successfully"
}Error (404)
{
"success": false,
"error": "Listing not found or not deleted"
}Archive a job listing by setting status to 'archived' with timestamp.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
| X-API-Key | <apiKey> | No |
Success (200)
{
"success": true,
"message": "Listing archived successfully"
}Error (404)
{
"success": false,
"error": "Listing not found"
}Batch update multiple job listings. Limited to 100 listings per request.
| Name | Type | Description |
|---|---|---|
| array* | array | Array of listing update objects with uuid and meta fields. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
| X-API-Key | <apiKey> | No |
Success (200)
{
"success": true,
"data": [
{
"success": true,
"uuid": "uuid",
"index": 0
}
],
"message": "Batch update completed: 1/1 successful"
}Error (400)
{
"success": false,
"error": "Batch update requires an array of listings"
}Get list of job applications submitted by the current user with pagination.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"applications": [
{
"id": "uuid",
"listingId": "uuid",
"jobTitle": "Nurse",
"status": "pending",
"appliedAt": "2024-01-15T10:30:00Z"
}
],
"pagination": {
"total": 50,
"page": 1,
"limit": 20,
"totalPages": 3,
"hasNext": true,
"hasPrev": false
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Submit a job application for a specific listing. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| listingId* | string | UUID of the job listing. |
| coverLetter | string | Optional cover letter text. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (201)
{
"success": true,
"data": {
"id": "uuid",
"listingId": "uuid",
"status": "pending",
"appliedAt": "2024-01-15T10:30:00Z"
},
"message": "Application submitted successfully"
}Error (400)
{
"success": false,
"error": "Already applied to this position"
}Get details of a specific application.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"application": {
"id": "uuid",
"jobId": "uuid",
"jobTitle": "Nurse",
"status": "pending",
"appliedAt": "2024-01-15T10:30:00Z"
}
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Update application status.
| Name | Type | Description |
|---|---|---|
| status | string | New status (pending, in-progress, completed, rejected). |
| statusColor | string | CSS classes for status display. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Application updated successfully",
"data": {
"application": {
"id": "uuid",
"status": "completed"
}
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Delete a specific application.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Application deleted successfully",
"data": {
"id": "uuid"
}
}Error (404)
{
"success": false,
"error": "Application not found"
}Get list of bookmarked job listings with pagination.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"bookmarks": {
"savedJobs": [
{
"id": "uuid",
"title": "Nurse",
"company": "NHS Trust",
"savedAt": "2024-01-15T10:30:00Z"
}
]
},
"pagination": {
"total": 25,
"page": 1,
"limit": 20,
"totalPages": 2,
"hasNext": true,
"hasPrev": false
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Bookmark a job listing for later viewing. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| listingId* | string | UUID of the job listing to bookmark. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (201)
{
"success": true,
"message": "Listing bookmarked successfully"
}Error (400)
{
"success": false,
"error": "Already bookmarked"
}Get details of a specific bookmark.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"bookmark": {
"type": "job",
"id": "uuid"
}
}
}Error (404)
{
"success": false,
"error": "Bookmark not found"
}Update bookmark notes.
| Name | Type | Description |
|---|---|---|
| notes | string | Notes for the bookmark. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Bookmark updated successfully"
}Error (404)
{
"success": false,
"error": "Bookmark not found"
}Remove a specific bookmark.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Bookmark removed successfully",
"data": {
"id": "uuid",
"type": "job"
}
}Error (404)
{
"success": false,
"error": "Bookmark not found"
}Get list of user's uploaded documents (CVs, cover letters, etc.) with pagination.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"documents": [
{
"id": "uuid",
"type": "cv",
"title": "My CV",
"uploadedAt": "2024-01-15T10:30:00Z"
}
],
"pagination": {
"total": 10,
"page": 1,
"limit": 20,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Upload or manage documents. Requires 'intent' parameter. Intents: 'upload-document', 'update-document', 'delete-document', 'set-default'. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'upload-document', 'update-document', 'delete-document', or 'set-default'. |
| type | string | Document type for upload-document intent: 'cv', 'cover-letter', 'certification', 'other'. |
| title | string | Document title for upload-document or update-document intents. |
| content | string | Document content for upload-document or update-document intents. |
| fileName | string | File name for upload-document intent. |
| documentId | string | Document ID for update-document, delete-document, or set-default intents. |
| isDefault | boolean | Set as default for document type for update-document or set-default intents. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Document uploaded successfully",
"data": {
"document": {
"id": "uuid",
"type": "cv",
"title": "My CV"
}
}
}Error (400)
{
"success": false,
"error": "Intent is required"
}Get details of a specific document.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"document": {
"id": "uuid",
"type": "cv",
"title": "My CV"
}
}
}Error (404)
{
"success": false,
"error": "Document not found"
}Update document details.
| Name | Type | Description |
|---|---|---|
| title | string | Document title. |
| content | string | Document content. |
| isDefault | boolean | Set as default for document type. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Document updated successfully"
}Error (404)
{
"success": false,
"error": "Document not found"
}Delete a specific document.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Document deleted successfully"
}Error (404)
{
"success": false,
"error": "Document not found"
}Get user notifications with pagination.
| Name | Type | Description |
|---|---|---|
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 20, max: 100). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"notifications": [
{
"id": "uuid",
"type": "application",
"message": "Application received",
"read": false
}
],
"pagination": {
"total": 15,
"page": 1,
"limit": 20,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Mark notification as read. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| read | boolean | Read status. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Notification updated successfully"
}Error (404)
{
"success": false,
"error": "Notification not found"
}Delete a notification.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Notification deleted successfully"
}Error (404)
{
"success": false,
"error": "Notification not found"
}Get user analytics including application stats, bookmark counts, and profile completion.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"analytics": {
"applications": {
"total": 10,
"pending": 3
},
"bookmarks": {
"savedJobs": 25
},
"profile": {
"completion": 75
}
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get user activity timeline with pagination.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"activities": [
{
"type": "application",
"action": "applied",
"description": "Applied for Nurse",
"timestamp": "2024-01-15T10:30:00Z"
}
],
"total": 50
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Export application history in JSON or CSV format.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"applications": [
{
"id": "uuid",
"jobTitle": "Nurse",
"status": "pending"
}
]
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Export profile data in JSON or CSV format.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"profile": {
"uuid": "uuid",
"email": "[email protected]",
"profile": {
"name": "John Doe"
}
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get onboarding status and progress.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | No |
Success (200)
{
"success": true,
"onboardingComplete": true,
"onboarding": {
"steps": []
}
}Error (500)
{
"success": false,
"error": "Internal server error"
}Handle onboarding actions. Uses FormData instead of JSON body. Actions: 'capture_email', 'track_step', 'update_preferences'. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| action* | string | Action type: 'capture_email', 'track_step', or 'update_preferences'. |
| string | Email address for capture_email action. | |
| source | string | Source of email capture for capture_email action: 'apply', 'save', 'search'. |
| step | string | Onboarding step name for track_step action. |
| actionType | string | Step action type for track_step: 'viewed', 'completed', 'skipped'. |
| preferences | string | JSON string of preferences for update_preferences action. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | No |
Success (200)
{
"success": true,
"message": "Email captured for guest user",
"isGuest": true
}Error (400)
{
"success": false,
"error": "Invalid action"
}Get personalized job recommendations based on user preferences.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"recommendations": [
{
"uuid": "uuid",
"title": "Nurse",
"relevanceScore": 85
}
],
"total": 100
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Get billing information, subscription status, and available plans.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"billing": {
"subscription": {
"tier": "premium",
"status": "active",
"expiresAt": "2024-02-15T00:00:00Z",
"autoRenew": true
},
"billingHistory": [],
"plans": [
{
"id": "basic",
"name": "Basic",
"price": 0
},
{
"id": "premium",
"name": "Premium",
"price": 29.99
}
],
"paymentMethods": []
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Create subscription, cancel subscription, update payment method, or upgrade plan. Requires 'intent' parameter. Rate limited to 10 requests per 15 minutes per IP.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'create-subscription', 'cancel-subscription', 'update-payment-method', or 'upgrade-plan'. |
| planId | string | Plan ID for create-subscription or upgrade-plan intents. |
| paymentMethodId | string | Payment method ID for create-subscription or update-payment-method intents. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Billing action completed successfully",
"data": {
"intent": "create-subscription",
"subscription": {
"tier": "premium",
"status": "active"
}
}
}Error (400)
{
"success": false,
"error": "Intent is required"
}Get personalized dashboard content with recommendations, activity, and stats. Works for both authenticated and guest users.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | No |
Success (200)
{
"success": true,
"data": {
"dashboard": {
"isGuest": false,
"subscriptionStatus": {
"tier": "premium",
"isActive": true
},
"recommendations": [
{
"id": "uuid",
"title": "Nurse",
"company": "NHS Trust"
}
],
"recentActivity": [
{
"type": "application",
"title": "Applied to Nurse",
"timestamp": "2024-01-15T10:30:00Z"
}
],
"stats": {
"applicationsCount": 5,
"bookmarksCount": 10,
"recommendationsCount": 5
}
}
}
}Error (500)
{
"success": false,
"error": "Internal server error"
}Generate personalized content via AI or track dashboard actions. Requires 'intent' parameter.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'generate-personalized-content' or 'track-dashboard-action'. |
| specialty | string | Healthcare specialty for personalized content generation. |
| careerGoals | string | Career goals for personalized content generation. |
| experience | string | Experience level for personalized content generation. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Dashboard action completed successfully",
"data": {
"intent": "generate-personalized-content",
"personalizedContent": {
"headline": "Find Your Perfect Healthcare Career"
}
}
}Error (400)
{
"success": false,
"error": "Intent is required"
}Search for jobs with personalized filters. Works for both authenticated and guest users. Supports query parameters for filtering and pagination.
| Name | Type | Description |
|---|---|---|
| q | string | Search query for job title, description, or company. |
| location | string | Filter by location (city or region). |
| type | string | Filter by contract type (permanent, temporary, contract). |
| salaryMin | number | Minimum salary filter. |
| salaryMax | number | Maximum salary filter. |
| page | number | Page number (default: 1). |
| limit | number | Results per page (default: 10, max: 20). |
| sort | string | Sort by: 'postedAt', 'salary', 'title', 'location'. |
| order | string | Sort order: 'asc' or 'desc' (default: 'desc'). |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | No |
Success (200)
{
"success": true,
"data": {
"search": {
"jobs": [
{
"id": "uuid",
"title": "Nurse",
"company": "NHS Trust",
"location": {
"city": "London",
"region": "Greater London"
},
"type": "permanent",
"salary": {
"min": 28000,
"max": 35000
},
"isBookmarked": false
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 125,
"totalPages": 13,
"hasNext": true,
"hasPrev": false
}
}
}
}Error (500)
{
"success": false,
"error": "Internal server error"
}Save search preferences, update search preferences, or delete saved searches. Requires 'intent' parameter.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type: 'save-search', 'update-search-preferences', or 'delete-search'. |
| name | string | Search name for save-search intent. |
| query | string | Search query for save-search intent. |
| location | string | Location filter for save-search intent. |
| contractType | string | Contract type filter for save-search intent. |
| emailAlerts | boolean | Enable email alerts for saved search. |
| preferredLocation | string | Preferred location for update-search-preferences intent. |
| employmentTypes | array | Preferred employment types for update-search-preferences intent. |
| searchId | string | Search ID for delete-search intent. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Search action completed successfully",
"data": {
"intent": "save-search",
"savedSearches": [
{
"id": "uuid",
"name": "Nurse jobs in London",
"query": "nurse",
"location": "London"
}
]
}
}Error (400)
{
"success": false,
"error": "Intent is required"
}Get current user settings. Supports jobseeker, employer, and employer-team roles.
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"data": {
"settings": {
"id": 1,
"uuid": "uuid",
"email": "[email protected]",
"profile": {
"name": "John Doe",
"bio": "Experienced nurse"
},
"preferences": {
"notifications": {
"email": true,
"jobAlerts": false
},
"jobPreferences": {
"preferredLocation": "London"
}
},
"bookmarks": {
"savedJobs": [],
"savedSearches": []
}
}
}
}Error (401)
{
"success": false,
"error": "Unauthorized"
}Update user settings. Requires 'intent' parameter. Jobseeker intents: 'update-profile', 'update-notifications', 'update-privacy', 'update-job-preferences'. Employer intents: 'update-profile', 'update-notifications', 'update-contact', 'update-employer-profile'.
| Name | Type | Description |
|---|---|---|
| intent* | string | Action type based on user role. |
| profile | object | Profile data for update-profile intent. |
| boolean | Email notification preference for update-notifications intent. | |
| jobAlerts | boolean | Job alerts preference for update-notifications intent. |
| showProfile | boolean | Show profile preference for update-privacy intent. |
| preferredLocation | string | Preferred location for update-job-preferences intent. |
| employmentTypes | array | Preferred employment types for update-job-preferences intent. |
| Name | Value | Required |
|---|---|---|
| Authorization | Bearer <accessToken> | Yes |
Success (200)
{
"success": true,
"message": "Settings updated successfully",
"data": {
"intent": "update-profile"
}
}Error (400)
{
"success": false,
"error": "Intent is required"
}Standard error response format used across all API endpoints. Always check the 'success' field and 'error' message for debugging.
Success (400)
{
"success": false,
"error": "Bad Request - Invalid parameters",
"details": {
"field": "email",
"message": "Invalid email format"
}
}Error (500)
{
"success": false,
"error": "Internal Server Error - Please try again later"
}