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 `. Tokens expire after one hour.' flows: clientCredentials: tokenUrl: https://uatidentityserver.joblogic.com/connect/token scopes: {}