Jobs API¶
Enterprise feature
The REST API is available on Enterprise plans. Compare plans to find the right fit for your team.
The Jobs API lets you create, retrieve, update, and manage field service jobs programmatically. Use it to sync jobs with external systems, automate workflows, or build custom dashboards.
Endpoints summary¶
| Method | Path | Scope | Description |
|---|---|---|---|
GET | /api/v1/jobs | jobs:read | List jobs |
GET | /api/v1/jobs?id={id} | jobs:read | Get a single job |
POST | /api/v1/jobs | jobs:write | Create a job |
PUT | /api/v1/jobs?id={id} | jobs:write | Update a job |
PATCH | /api/v1/jobs?id={id} | jobs:write | Update job status |
Job object¶
Every job returned by the API contains these fields:
| Field | Type | Description |
|---|---|---|
job_id | integer | Unique job identifier |
job_title | string | Short description of the work |
job_description | string | Detailed notes for the technician |
job_status | string | Current status (see Valid statuses) |
job_priority | string | Low, Medium, High, or Urgent |
assigned_technician_id | integer | ID of the assigned technician, or null |
assigned_technician_name | string | Full name of the assigned technician, or null |
customer_location_id | integer | ID of the service location |
customer_location_name | string | Name of the service location |
customer_id | integer | ID of the customer |
customer_name | string | Name of the customer |
scheduled_start | string | Scheduled start time (ISO 8601), or null |
scheduled_end | string | Scheduled end time (ISO 8601), or null |
actual_start | string | Actual start time, or null |
actual_end | string | Actual end time, or null |
created_at | string | When the job was created (ISO 8601) |
updated_at | string | When the job was last updated (ISO 8601) |
assets | array | Linked assets (Enterprise only). See Assets on jobs |
List jobs¶
GET /api/v1/jobs
Returns a paginated list of jobs. Use query parameters to filter results.
Query parameters¶
| Parameter | Type | Description |
|---|---|---|
status | string | Filter by status (see Valid statuses) |
priority | string | Filter by priority: Low, Medium, High, Urgent |
assigned_technician_id | integer | Filter by assigned technician |
customer_location_id | integer | Filter by customer location |
created_after | string | Jobs created on or after this date (ISO 8601 format) |
created_before | string | Jobs created on or before this date (ISO 8601 format) |
page | integer | Page number (default: 1) |
per_page | integer | Results per page (default: 50, max: 100) |
Example request¶
curl -X GET "https://fsmnavigator.com/api/v1/jobs?status=Pending&priority=High" \
-H "X-API-Key: YOUR_API_KEY"
Example response¶
{
"data": [
{
"job_id": 123,
"job_title": "AC unit repair",
"job_description": "Customer reports AC not cooling in main office",
"job_status": "Pending",
"job_priority": "High",
"assigned_technician_id": null,
"assigned_technician_name": null,
"customer_location_id": 87,
"customer_location_name": "Main Office",
"customer_id": 201,
"customer_name": "Acme Corporation",
"scheduled_start": "2026-02-25T09:00:00Z",
"scheduled_end": "2026-02-25T11:00:00Z",
"actual_start": null,
"actual_end": null,
"created_at": "2026-02-24T14:30:00Z",
"updated_at": "2026-02-24T14:30:00Z"
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total": 1,
"total_pages": 1
},
"request_id": "a1b2c3d4e5f6"
}
Get a single job¶
GET /api/v1/jobs?id={id}
Retrieves full details for one job.
Example request¶
Example response¶
{
"data": {
"job_id": 123,
"job_title": "AC unit repair",
"job_description": "Customer reports AC not cooling in main office",
"job_status": "Pending",
"job_priority": "High",
"assigned_technician_id": 45,
"assigned_technician_name": "John Smith",
"customer_location_id": 87,
"customer_location_name": "Main Office",
"customer_id": 201,
"customer_name": "Acme Corporation",
"scheduled_start": "2026-02-25T09:00:00Z",
"scheduled_end": "2026-02-25T11:00:00Z",
"actual_start": null,
"actual_end": null,
"created_at": "2026-02-24T14:30:00Z",
"updated_at": "2026-02-24T14:30:00Z"
},
"request_id": "a1b2c3d4e5f6"
}
Create a job¶
POST /api/v1/jobs
Creates a new job and returns the created record. Returns 201 Created on success.
Request body¶
| Field | Type | Required | Description |
|---|---|---|---|
job_title | string | Yes | Short description of the work |
job_description | string | No | Detailed notes for the technician |
job_priority | string | No | Low, Medium (default), High, or Urgent |
customer_location_id | integer | Yes | ID of the customer location |
assigned_technician_id | integer | No | Assign to a specific technician |
scheduled_start | string | No | Scheduled start time (ISO 8601) |
scheduled_end | string | No | Scheduled end time (ISO 8601) |
asset_ids | array of integers | No | IDs of assets to link (Enterprise only) |
asset_relationship_type | string | No | Relationship type: serviced (default), installed, replaced, inspected, maintenance, or meter_threshold |
Example request¶
curl -X POST "https://fsmnavigator.com/api/v1/jobs" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"job_title": "AC unit repair",
"job_description": "Customer reports AC not cooling in main office",
"job_priority": "High",
"customer_location_id": 87,
"assigned_technician_id": 45,
"scheduled_start": "2026-02-25T09:00:00Z",
"scheduled_end": "2026-02-25T11:00:00Z",
"asset_ids": [42, 67]
}'
Example response¶
{
"success": true,
"message": "Job created successfully",
"data": {
"job_id": 123,
"job_title": "AC unit repair",
"job_status": "Pending",
"created_at": "2026-02-24T14:30:00Z"
},
"request_id": "a1b2c3d4e5f6"
}
Update a job¶
PUT /api/v1/jobs?id={id}
Updates one or more fields on an existing job.
Example request¶
curl -X PUT "https://fsmnavigator.com/api/v1/jobs?id=123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"job_priority": "Urgent",
"job_description": "Customer reports no cooling — escalated to urgent",
"asset_ids": [42, 67, 103]
}'
Syncing asset links
Passing asset_ids on a PUT replaces all current asset links. Pass "asset_ids": [] to remove every link.
Example response¶
{
"success": true,
"message": "Job updated successfully",
"data": {
"job_id": 123,
"job_title": "AC unit repair",
"job_status": "Pending"
},
"request_id": "a1b2c3d4e5f6"
}
Update job status¶
PATCH /api/v1/jobs?id={id}
Changes only the status of a job. The API enforces valid status transitions.
Example request¶
curl -X PATCH "https://fsmnavigator.com/api/v1/jobs?id=123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"job_status": "Assigned"}'
Example response¶
{
"success": true,
"message": "Job status updated to Assigned",
"data": {
"job_id": 123,
"job_status": "Assigned",
"previous_status": "Pending"
},
"request_id": "a1b2c3d4e5f6"
}
Valid statuses¶
Jobs can have one of nine statuses:
| Status | Description |
|---|---|
Pending | Job created, awaiting assignment |
Assigned | Technician assigned, not yet started |
In Progress | Technician actively working on the job |
On Hold | Job temporarily paused |
Completed | Work finished by the technician |
Invoiced | Invoice generated for the completed work |
Paid | Customer payment received |
Closed | Job fully closed out (terminal) |
Cancelled | Job cancelled before completion (terminal) |
Status transitions¶
| From | Allowed transitions |
|---|---|
| Pending | Assigned, Cancelled |
| Assigned | In Progress, Pending, Cancelled, On Hold |
| In Progress | Completed, Assigned, On Hold, Cancelled |
| On Hold | In Progress, Assigned, Cancelled |
| Completed | Invoiced |
| Invoiced | Paid |
| Paid | Closed |
| Cancelled | (terminal — no further transitions) |
| Closed | (terminal — no further transitions) |
Invalid transitions return an error
If you attempt an invalid transition (e.g., Pending → Completed), the API returns 400 Bad Request with a descriptive error message.
Assets on jobs¶
Enterprise feature
Asset linking requires the Asset Management module on Enterprise plans.
When creating or updating a job, you can link it to one or more assets. Linked assets appear in the detail response.
Link assets on creation¶
Include asset_ids in the POST body:
curl -X POST "https://fsmnavigator.com/api/v1/jobs" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"job_title": "Replace compressor on Unit #7",
"customer_location_id": 87,
"asset_ids": [42, 67],
"asset_relationship_type": "serviced"
}'
Relationship types¶
| Type | Description |
|---|---|
serviced | General service or repair (default) |
installed | New asset installation |
replaced | Asset being replaced |
inspected | Routine inspection |
maintenance | Scheduled maintenance |
meter_threshold | Triggered by meter reading threshold |
Assets in job response¶
When retrieving a single job, linked assets appear in the assets array:
{
"data": {
"job_id": 123,
"job_title": "Replace compressor on Unit #7",
"assets": [
{
"asset_id": 42,
"asset_tag": "HVAC-007",
"asset_name": "Rooftop AC Unit #7",
"asset_status": "In Maintenance",
"relationship_type": "serviced",
"relationship_notes": null,
"linked_at": "2026-02-25T14:30:00Z"
}
]
}
}
Update linked assets¶
Use PUT to sync the asset list. This replaces all current links:
curl -X PUT "https://fsmnavigator.com/api/v1/jobs?id=123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"asset_ids": [42, 67, 103]}'
Pass an empty array to remove all links:
curl -X PUT "https://fsmnavigator.com/api/v1/jobs?id=123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"asset_ids": []}'
Asset validation
Each asset ID is verified against your company's asset inventory. Invalid or deleted asset IDs are silently skipped.
Error responses¶
See Error codes for the full reference. Common job-specific errors:
| HTTP code | Error | Description |
|---|---|---|
400 | validation_failed | Missing required fields or invalid values |
404 | not_found | Job ID does not exist |
400 | invalid_status_transition | The requested status change is not allowed |
Related guides¶
- Endpoints overview — all available endpoints
- Authentication — API key setup
- Customers API — manage customer records
- Rate limits — request throttling
- Jobs overview — managing jobs from the web dashboard
- Assets API — manage asset records