{
  "info": {
    "name": "Joblogic API",
    "description": "REST interface to the Joblogic cloud field service management (FSM) platform - customers, contacts, sites, assets, jobs, engineer visits, engineers, quotes, and invoices. All resource paths sit under /api/v1. Access is customer-provisioned and IP-allowlisted: Joblogic issues a Client ID, Client Secret, and Tenant ID, and callers authenticate via OAuth2 client-credentials against a Joblogic IdentityServer (POST client_id, client_secret, grant_type=client_credentials, scope to /connect/token) to obtain a one-hour Bearer access token. Base URL: https://api.joblogic.com/api/v1 (production, firewall/IP-allowlisted) or https://uatapi.joblogic.com/api/v1 (UAT). Paths and methods are confirmed from Joblogic's published Postman documentation; request bodies are representative and modeled by API Evangelist.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      { "key": "token", "value": "{{access_token}}", "type": "string" }
    ]
  },
  "variable": [
    { "key": "baseUrl", "value": "https://api.joblogic.com/api/v1", "type": "string" },
    { "key": "tokenUrl", "value": "https://uatidentityserver.joblogic.com/connect/token", "type": "string" },
    { "key": "access_token", "value": "", "type": "string" },
    { "key": "tenantId", "value": "", "type": "string" }
  ],
  "item": [
    {
      "name": "Authentication",
      "item": [
        {
          "name": "Get access token (client credentials)",
          "request": {
            "auth": { "type": "noauth" },
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/x-www-form-urlencoded" }],
            "body": {
              "mode": "urlencoded",
              "urlencoded": [
                { "key": "client_id", "value": "{{client_id}}", "type": "text" },
                { "key": "client_secret", "value": "{{client_secret}}", "type": "text" },
                { "key": "grant_type", "value": "client_credentials", "type": "text" },
                { "key": "scope", "value": "{{scope}}", "type": "text" }
              ]
            },
            "url": { "raw": "{{tokenUrl}}", "host": ["{{tokenUrl}}"] },
            "description": "Exchanges the Joblogic-issued client_id and client_secret for a Bearer access token (valid one hour) via the IdentityServer client-credentials grant."
          }
        }
      ]
    },
    {
      "name": "Customers",
      "item": [
        {
          "name": "Search customers",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"tenantId\": \"{{tenantId}}\",\n  \"searchTerm\": \"\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Customer/GetAll", "host": ["{{baseUrl}}"], "path": ["Customer", "GetAll"] },
            "description": "Searches customers by keyword, tags, and active status."
          }
        },
        {
          "name": "Get customer by unique id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Customer?id=&tenantId={{tenantId}}&includeAdditionalDetails=false", "host": ["{{baseUrl}}"], "path": ["Customer"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }, { "key": "includeAdditionalDetails", "value": "false" }] },
            "description": "Retrieves a customer by its unique GUID."
          }
        },
        {
          "name": "Get customer by integer id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Customer/GetById?id=1&tenantId={{tenantId}}&includeAdditionalDetails=false", "host": ["{{baseUrl}}"], "path": ["Customer", "GetById"], "query": [{ "key": "id", "value": "1" }, { "key": "tenantId", "value": "{{tenantId}}" }, { "key": "includeAdditionalDetails", "value": "false" }] },
            "description": "Retrieves a customer by its integer ID."
          }
        },
        {
          "name": "Create customer",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"name\": \"Acme Facilities Ltd\",\n  \"email\": \"ops@acme.example\",\n  \"telephone\": \"01234 567890\"\n}" },
            "url": { "raw": "{{baseUrl}}/Customer", "host": ["{{baseUrl}}"], "path": ["Customer"] },
            "description": "Creates a customer."
          }
        },
        {
          "name": "Update customer",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Customer", "host": ["{{baseUrl}}"], "path": ["Customer"] },
            "description": "Updates a customer."
          }
        },
        {
          "name": "Delete customer",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Customer?id=&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Customer"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Deletes a customer by unique ID."
          }
        },
        {
          "name": "Set customer status",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"id\": \"\",\n  \"tenantId\": \"{{tenantId}}\",\n  \"status\": \"active\"\n}" },
            "url": { "raw": "{{baseUrl}}/Customer/SetStatus", "host": ["{{baseUrl}}"], "path": ["Customer", "SetStatus"] },
            "description": "Activates or deactivates a customer."
          }
        }
      ]
    },
    {
      "name": "Contacts",
      "item": [
        {
          "name": "Create contact",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"entityId\": \"\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane@acme.example\"\n}" },
            "url": { "raw": "{{baseUrl}}/Contact", "host": ["{{baseUrl}}"], "path": ["Contact"] },
            "description": "Creates a contact attached to a parent entity."
          }
        },
        {
          "name": "Get contacts by entity id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Contact/GetContactByEntityId?tenantId={{tenantId}}&entityId=", "host": ["{{baseUrl}}"], "path": ["Contact", "GetContactByEntityId"], "query": [{ "key": "tenantId", "value": "{{tenantId}}" }, { "key": "entityId", "value": "" }] },
            "description": "Lists contacts attached to a parent entity (customer, site, supplier, or subcontractor)."
          }
        },
        {
          "name": "Delete contact",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Contact?id=&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Contact"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Deletes a contact."
          }
        }
      ]
    },
    {
      "name": "Sites",
      "item": [
        {
          "name": "Search sites",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"tenantId\": \"{{tenantId}}\",\n  \"searchTerm\": \"\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Site/GetAll", "host": ["{{baseUrl}}"], "path": ["Site", "GetAll"] },
            "description": "Searches sites by keyword, tags, customer, and active status."
          }
        },
        {
          "name": "Get site by unique id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Site?id=&tenantId={{tenantId}}&includeAdditionalDetails=false", "host": ["{{baseUrl}}"], "path": ["Site"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }, { "key": "includeAdditionalDetails", "value": "false" }] },
            "description": "Retrieves a site by its unique GUID."
          }
        },
        {
          "name": "Create site",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"name\": \"Acme HQ\",\n  \"customerId\": \"\"\n}" },
            "url": { "raw": "{{baseUrl}}/Site?tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Site"], "query": [{ "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Creates a site under a customer."
          }
        },
        {
          "name": "Update site",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Site?id=&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Site"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Updates a site."
          }
        },
        {
          "name": "Delete site",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Site?id=&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Site"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Deletes a site."
          }
        }
      ]
    },
    {
      "name": "Assets",
      "item": [
        {
          "name": "Search assets",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"tenantId\": \"{{tenantId}}\",\n  \"searchTerm\": \"\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Asset/GetAll", "host": ["{{baseUrl}}"], "path": ["Asset", "GetAll"] },
            "description": "Searches assets."
          }
        },
        {
          "name": "Get asset by unique id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Asset?id=&tenantId={{tenantId}}&includeAdditionalDetails=true", "host": ["{{baseUrl}}"], "path": ["Asset"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }, { "key": "includeAdditionalDetails", "value": "true" }] },
            "description": "Retrieves an asset by its unique GUID."
          }
        },
        {
          "name": "Create asset",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"name\": \"Boiler 1\",\n  \"siteId\": \"\"\n}" },
            "url": { "raw": "{{baseUrl}}/Asset?tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Asset"], "query": [{ "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Creates an asset at a site."
          }
        },
        {
          "name": "Update asset",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Asset", "host": ["{{baseUrl}}"], "path": ["Asset"] },
            "description": "Updates an asset."
          }
        },
        {
          "name": "Delete asset",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Asset?id=&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Asset"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Deletes an asset."
          }
        }
      ]
    },
    {
      "name": "Jobs",
      "item": [
        {
          "name": "Search jobs",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"tenantId\": \"{{tenantId}}\",\n  \"searchTerm\": \"\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Job/getall", "host": ["{{baseUrl}}"], "path": ["Job", "getall"] },
            "description": "Searches jobs by conditions such as keyword, status, dates, and tags."
          }
        },
        {
          "name": "Retrieve job by unique id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Job?id=&tenantId={{tenantId}}&includeAdditionalDetails=true", "host": ["{{baseUrl}}"], "path": ["Job"], "query": [{ "key": "id", "value": "" }, { "key": "tenantId", "value": "{{tenantId}}" }, { "key": "includeAdditionalDetails", "value": "true" }] },
            "description": "Retrieves a job by its unique GUID."
          }
        },
        {
          "name": "Create job",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"description\": \"Fix boiler\",\n  \"customerId\": \"\",\n  \"siteId\": \"\",\n  \"jobType\": \"Service\"\n}" },
            "url": { "raw": "{{baseUrl}}/Job", "host": ["{{baseUrl}}"], "path": ["Job"] },
            "description": "Creates a job."
          }
        },
        {
          "name": "Update job",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Job", "host": ["{{baseUrl}}"], "path": ["Job"] },
            "description": "Updates a job."
          }
        },
        {
          "name": "Update job status",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"id\": \"\",\n  \"tenantId\": \"{{tenantId}}\",\n  \"status\": \"Completed\"\n}" },
            "url": { "raw": "{{baseUrl}}/Job/updatestatus", "host": ["{{baseUrl}}"], "path": ["Job", "updatestatus"] },
            "description": "Updates the status of a job."
          }
        },
        {
          "name": "Get job costs",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/JobCost?tenantId={{tenantId}}&jobId=", "host": ["{{baseUrl}}"], "path": ["JobCost"], "query": [{ "key": "tenantId", "value": "{{tenantId}}" }, { "key": "jobId", "value": "" }] },
            "description": "Gets all cost lines recorded against a job."
          }
        },
        {
          "name": "Add labour cost",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"jobId\": \"\",\n  \"description\": \"On-site labour\",\n  \"quantity\": 2,\n  \"unitCost\": 45\n}" },
            "url": { "raw": "{{baseUrl}}/JobCost/Labour", "host": ["{{baseUrl}}"], "path": ["JobCost", "Labour"] },
            "description": "Adds a labour cost line to a job."
          }
        }
      ]
    },
    {
      "name": "Visits",
      "item": [
        {
          "name": "Search visits",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"tenantId\": \"{{tenantId}}\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Visit/GetAll", "host": ["{{baseUrl}}"], "path": ["Visit", "GetAll"] },
            "description": "Retrieves all visits."
          }
        },
        {
          "name": "Get visit by integer id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Visit/GetById?id=1&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Visit", "GetById"], "query": [{ "key": "id", "value": "1" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Retrieves a visit by its integer ID."
          }
        },
        {
          "name": "Create visit",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"jobId\": \"\",\n  \"engineerId\": \"\",\n  \"startDateTime\": \"2026-07-13T09:00:00Z\"\n}" },
            "url": { "raw": "{{baseUrl}}/Visit", "host": ["{{baseUrl}}"], "path": ["Visit"] },
            "description": "Creates a visit against a job."
          }
        },
        {
          "name": "Deploy visit",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Visit/Deploy", "host": ["{{baseUrl}}"], "path": ["Visit", "Deploy"] },
            "description": "Deploys a visit to a mobile engineer."
          }
        }
      ]
    },
    {
      "name": "Engineers",
      "item": [
        {
          "name": "Search engineers",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"searchTerm\": \"\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Engineer/GetAll?tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Engineer", "GetAll"], "query": [{ "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Searches engineers by keyword and active status."
          }
        },
        {
          "name": "Get engineer by integer id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Engineer/GetById?id=1&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Engineer", "GetById"], "query": [{ "key": "id", "value": "1" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Retrieves an engineer by integer ID."
          }
        },
        {
          "name": "Mark engineer on-call",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Engineer/MarkOnCall", "host": ["{{baseUrl}}"], "path": ["Engineer", "MarkOnCall"] },
            "description": "Marks an engineer as on-call."
          }
        }
      ]
    },
    {
      "name": "Quotes",
      "item": [
        {
          "name": "Search quotes",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"tenantId\": \"{{tenantId}}\",\n  \"searchTerm\": \"\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Quote/GetAll", "host": ["{{baseUrl}}"], "path": ["Quote", "GetAll"] },
            "description": "Searches quotes by keyword, tags, active status, and date."
          }
        },
        {
          "name": "Create quote",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"customerId\": \"\",\n  \"siteId\": \"\"\n}" },
            "url": { "raw": "{{baseUrl}}/Quote", "host": ["{{baseUrl}}"], "path": ["Quote"] },
            "description": "Creates a quote."
          }
        },
        {
          "name": "Get quote by id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Quote/GetById?Id=1&TenantId={{tenantId}}&includeLines=false", "host": ["{{baseUrl}}"], "path": ["Quote", "GetById"], "query": [{ "key": "Id", "value": "1" }, { "key": "TenantId", "value": "{{tenantId}}" }, { "key": "includeLines", "value": "false" }] },
            "description": "Gets quote details."
          }
        },
        {
          "name": "Approve quote",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Quote/Approve", "host": ["{{baseUrl}}"], "path": ["Quote", "Approve"] },
            "description": "Approves a quote."
          }
        }
      ]
    },
    {
      "name": "Invoices",
      "item": [
        {
          "name": "Search invoices",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"searchTerm\": \"\",\n  \"pageNumber\": 1,\n  \"pageSize\": 50\n}" },
            "url": { "raw": "{{baseUrl}}/Invoice/getall?tenantid={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Invoice", "getall"], "query": [{ "key": "tenantid", "value": "{{tenantId}}" }] },
            "description": "Searches invoices by keyword and active status."
          }
        },
        {
          "name": "Create invoice",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{\n  \"customerId\": \"\",\n  \"jobId\": \"\"\n}" },
            "url": { "raw": "{{baseUrl}}/Invoice?tenantid={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Invoice"], "query": [{ "key": "tenantid", "value": "{{tenantId}}" }] },
            "description": "Creates an invoice."
          }
        },
        {
          "name": "Retrieve invoice by integer id",
          "request": {
            "method": "GET",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Invoice/GetById?id=1&tenantId={{tenantId}}", "host": ["{{baseUrl}}"], "path": ["Invoice", "GetById"], "query": [{ "key": "id", "value": "1" }, { "key": "tenantId", "value": "{{tenantId}}" }] },
            "description": "Retrieves an invoice by its integer ID."
          }
        },
        {
          "name": "Update invoice",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": { "mode": "raw", "raw": "{}" },
            "url": { "raw": "{{baseUrl}}/Invoice?tenantId={{tenantId}}&id=1", "host": ["{{baseUrl}}"], "path": ["Invoice"], "query": [{ "key": "tenantId", "value": "{{tenantId}}" }, { "key": "id", "value": "1" }] },
            "description": "Updates an invoice."
          }
        },
        {
          "name": "Delete invoice",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": { "raw": "{{baseUrl}}/Invoice?tenantId={{tenantId}}&id=1", "host": ["{{baseUrl}}"], "path": ["Invoice"], "query": [{ "key": "tenantId", "value": "{{tenantId}}" }, { "key": "id", "value": "1" }] },
            "description": "Deletes an invoice."
          }
        }
      ]
    }
  ]
}
