OpenAPI Specification
openapi: 3.0.3
info:
title: Joblogic Assets Jobs API
description: 'The Joblogic API is the REST interface to the Joblogic cloud field service management (FSM) platform, covering customers, contacts, sites, assets, jobs, engineer visits, engineers, quotes, and invoices for trades, service, and maintenance contractors. All resource paths sit under `/api/v1`.
Access model: Joblogic API access is customer-provisioned and gated. A caller is issued a Client ID, Client Secret, and Tenant ID by Joblogic, and the caller''s public IP addresses are allowlisted behind Joblogic''s firewall before requests are accepted. Integrations are first developed against a per-customer UAT sandbox (web app at https://uat.joblogic.com, API host https://uatapi.joblogic.com) and then promoted to production.
Authentication: Each request must carry a Bearer access token obtained from the Joblogic IdentityServer token endpoint using the OAuth2 client-credentials grant (client_id, client_secret, grant_type, scope). Access tokens expire after one hour; expired or missing tokens return 401 Unauthorized.
Multi-tenancy: Most operations require a `tenantId` (the caller''s Joblogic tenant, a GUID) supplied as a query parameter.
Modeling note: This document is modeled by API Evangelist from Joblogic''s published Postman documentation at https://apidocs.joblogic.com/. Endpoint paths, methods, and the auth flow are confirmed from that collection. Request and response schemas are representative - the live API is IP-allowlisted, so payload bodies could not be exercised directly and are illustrative rather than exhaustive.'
version: v1
contact:
name: Joblogic Support
url: https://support.joblogic.com/docs/api-access
email: support@joblogic.com
servers:
- url: https://api.joblogic.com/api/v1
description: Production API host (live; firewall / IP-allowlisted, customer-provisioned). The exact production host is confirmed to callers during onboarding.
- url: https://uatapi.joblogic.com/api/v1
description: UAT sandbox API host used for integration development.
security:
- oauth2ClientCredentials: []
tags:
- name: Jobs
description: Work orders and their costs.
paths:
/Job/getall:
post:
operationId: searchJobs
tags:
- Jobs
summary: Search jobs
description: Searches jobs by conditions such as keyword, status, dates, and tags.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: A page of matching jobs.
content:
application/json:
schema:
$ref: '#/components/schemas/JobList'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/Job:
get:
operationId: getJobByUniqueId
tags:
- Jobs
summary: Retrieve a job by unique ID
parameters:
- $ref: '#/components/parameters/UniqueId'
- $ref: '#/components/parameters/TenantId'
- $ref: '#/components/parameters/IncludeAdditionalDetails'
responses:
'200':
description: The requested job.
content:
application/json:
schema:
$ref: '#/components/schemas/Job'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
post:
operationId: createJob
tags:
- Jobs
summary: Create a job
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Job'
responses:
'200':
description: The created job.
content:
application/json:
schema:
$ref: '#/components/schemas/Job'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
put:
operationId: updateJob
tags:
- Jobs
summary: Update a job
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Job'
responses:
'200':
description: The updated job.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteJob
tags:
- Jobs
summary: Delete a job
parameters:
- $ref: '#/components/parameters/UniqueId'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: Deletion confirmation.
'401':
$ref: '#/components/responses/Unauthorized'
/Job/GetById:
get:
operationId: getJobById
tags:
- Jobs
summary: Get job details by integer ID
parameters:
- $ref: '#/components/parameters/IntId'
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: The requested job.
content:
application/json:
schema:
$ref: '#/components/schemas/Job'
'401':
$ref: '#/components/responses/Unauthorized'
/Job/updatestatus:
put:
operationId: updateJobStatus
tags:
- Jobs
summary: Update job status
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SetStatusRequest'
responses:
'200':
description: Job status updated.
'401':
$ref: '#/components/responses/Unauthorized'
/JobCost:
get:
operationId: getJobCosts
tags:
- Jobs
summary: Get all costs for a job
parameters:
- $ref: '#/components/parameters/TenantId'
- name: jobId
in: query
required: true
schema:
type: string
responses:
'200':
description: The job's costs.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/JobCost'
'401':
$ref: '#/components/responses/Unauthorized'
/JobCost/Labour:
post:
operationId: createLabourCost
tags:
- Jobs
summary: Add a labour cost to a job
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/JobCost'
responses:
'200':
description: The created labour cost.
'401':
$ref: '#/components/responses/Unauthorized'
/JobCost/Material:
post:
operationId: createMaterialCost
tags:
- Jobs
summary: Add a material cost to a job
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/JobCost'
responses:
'200':
description: The created material cost.
'401':
$ref: '#/components/responses/Unauthorized'
components:
responses:
ValidationError:
description: The request payload failed validation.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: The requested resource was not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Missing, invalid, or expired access token.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
TooManyRequests:
description: Rate limit exceeded. Joblogic resource servers limit callers (by default up to 100 requests per minute) and respond with 429.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
JobList:
$ref: '#/components/schemas/PagedResult'
Error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: object
additionalProperties: true
Job:
type: object
properties:
id:
type: string
format: uuid
jobNumber:
type: string
description:
type: string
status:
type: string
jobType:
type: string
jobCategory:
type: string
customerId:
type: string
format: uuid
siteId:
type: string
format: uuid
priorityLevel:
type: string
dateLogged:
type: string
format: date-time
targetCompletionDate:
type: string
format: date-time
tags:
type: array
items:
type: string
SearchRequest:
type: object
description: Common search envelope used by the /GetAll and /getall endpoints. Fields shown are representative; consult the live documentation for the exact filters supported per resource.
properties:
tenantId:
type: string
format: uuid
searchTerm:
type: string
tags:
type: array
items:
type: string
activeStatus:
type: string
enum:
- active
- inactive
- all
pageNumber:
type: integer
default: 1
pageSize:
type: integer
default: 50
PagedResult:
type: object
properties:
data:
type: array
items:
type: object
additionalProperties: true
pageNumber:
type: integer
pageSize:
type: integer
totalCount:
type: integer
SetStatusRequest:
type: object
properties:
id:
type: string
tenantId:
type: string
format: uuid
status:
type: string
JobCost:
type: object
description: A cost line recorded against a job (labour, material, travel, mileage, overtime, expense, subcontractor, SOR item, callout, or other).
properties:
id:
type: string
format: uuid
jobId:
type: string
format: uuid
type:
type: string
description:
type: string
quantity:
type: number
unitCost:
type: number
total:
type: number
parameters:
TenantId:
name: tenantId
in: query
required: true
description: The caller's Joblogic tenant identifier (GUID).
schema:
type: string
format: uuid
UniqueId:
name: id
in: query
required: true
description: The resource's unique identifier (GUID).
schema:
type: string
format: uuid
IncludeAdditionalDetails:
name: includeAdditionalDetails
in: query
required: false
description: When true, expands nested/related detail in the response.
schema:
type: boolean
default: false
IntId:
name: id
in: query
required: true
description: The resource's integer identifier.
schema:
type: integer
format: int64
securitySchemes:
oauth2ClientCredentials:
type: oauth2
description: 'OAuth2 client-credentials grant against the Joblogic IdentityServer. The confirmed UAT token endpoint is https://uatidentityserver.joblogic.com/connect/token; the production IdentityServer token endpoint is provided to callers during onboarding. Send client_id, client_secret, grant_type=client_credentials, and the issued scope, then pass the returned access token as `Authorization: Bearer <access_token>`. Tokens expire after one hour.'
flows:
clientCredentials:
tokenUrl: https://uatidentityserver.joblogic.com/connect/token
scopes: {}