Halo Cloud API for Desktop Applications

The desktop-application-facing Halo Cloud API from Halo Connect. Provides a token endpoint plus SQL Passthrough and FHIR query access for locally installed applications integrating with Bp Premier. OpenAPI 3.1.1, authenticated with an Azure API Management subscription key together with a bearer JWT and a DeviceId header identifying the calling device.

OpenAPI Specification

haloconnect-desktop-openapi.json Raw ↑
{
  "openapi": "3.1.1",
  "info": {
    "version": "26.619.10213",
    "title": "Halo Cloud API for Desktop Applications",
    "contact": {
      "email": "support@haloconnect.io"
    },
    "license": {
      "name": "Copyright © Halo Connect 2023",
      "url": "http://haloconnect.io"
    },
    "x-logo": {
      "url": "https://20496383.fs1.hubspotusercontent-na1.net/hubfs/20496383/halo_logo%20(1).png",
      "altText": "Halo Connect Logo"
    },
    "description": "## Introduction\nThis API reference documents the endpoints available for desktop application integration with the Halo Connect Cloud API. It covers:\n\n- **Tokens** – Obtain authorization tokens for desktop applications\n- **SQL Passthrough** – Execute SQL queries against site databases\n- **FHIR** – Query practice data using FHIR resources\n- **Registered Queries** – Execute recurring SQL queries against practice databases\n\nFor more information about Halo Connect, visit our [website](https://haloconnect.io) or [blog](https://haloconnect.io/blog).\n\n## Prerequisites\n\nAll API endpoints require an active pairing with the target site. Use the [Pair with a site](./integrator#operation/Integrator_PairSite) endpoint to establish access before making queries.\n\n## Definitions\n\nFor detailed documentation and guides, see our [documentation portal](https://docs.haloconnect.io).\n\n- **Site:** An instance of Halo Link connected to a practice's PMS database.\n- **Halo GUID:** A unique identifier for a site, used by Halo Connect to route queries.\n"
  },
  "servers": [
    {
      "url": "https://api.haloconnect.io",
      "description": "Production"
    },
    {
      "url": "https://api.stage.haloconnect.io",
      "description": "Stage"
    }
  ],
  "tags": [
    {
      "name": "Tokens",
      "description": "Obtain authorization tokens for desktop applications to authenticate API requests."
    },
    {
      "name": "SQL Passthrough",
      "description": "Send SQL queries to practices as immediate, async or registered queries.\n\n**Immediate queries** are small, time-sensitive queries that return a result in seconds. Response size is limited to 8MB.\n\n**Async queries** are queued for execution and results can be retrieved later. The workflow is:\n\n  1. **Submit async query** – Creates a query and returns a `queryId` on success.\n  2. **Get query status** – Check query status. When complete, includes pagination details.\n  3. **Get query result page** – Retrieve result pages using the pagination info from the status response.\n\n**Registered Queries** are also supported. See the [Registered Queries](#tag/Registered-Queries) section for more information.\n"
    },
    {
      "name": "FHIR",
      "description": "Query practice data using FHIR resources."
    }
  ],
  "paths": {
    "/integrator/token": {
      "post": {
        "tags": [
          "Tokens"
        ],
        "summary": "Get authorization token",
        "description": "This endpoint enables integrators to obtain an authorization token for a specific desktop application associated with a given Halo GUID.\nThe token is required to authenticate subsequent requests to the SQL Passthrough or FHIR for that desktop application.\n",
        "operationId": "obtainToken",
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "grant_type": {
                    "type": "string",
                    "enum": [
                      "urn:halo-connect:oauth:desktop-token"
                    ],
                    "description": "Must be set to urn:halo-connect:oauth:desktop-token"
                  },
                  "device_id": {
                    "type": "string",
                    "description": "The unique identifier of the device"
                  },
                  "site_id": {
                    "type": "string",
                    "description": "The Halo GUID of the site"
                  }
                },
                "required": [
                  "grant_type",
                  "device_id",
                  "site_id"
                ]
              },
              "example": {
                "grant_type": "urn:halo-connect:oauth:desktop-token",
                "device_id": "example-device-123",
                "site_id": "example-site-guid"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Token successfully obtained",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "access_token": {
                      "type": "string"
                    },
                    "token_type": {
                      "type": "string"
                    },
                    "expires_in": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not found"
          },
          "415": {
            "description": "Unsupported media type"
          }
        },
        "security": [
          {
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/queries/immediate": {
      "post": {
        "tags": [
          "SQL Passthrough"
        ],
        "summary": "Execute immediate query",
        "description": "Send an immediate query to a site and receive the result in the response.\n\nQuery status can also be retrieved using the **Get query status** endpoint.\n",
        "operationId": "createImmediateQuery",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200ImmediateQuery"
          },
          "400": {
            "$ref": "#/components/responses/400ErrorForIntegratorQuery"
          },
          "401": {
            "$ref": "#/components/responses/401ErrorForIntegratorQuery"
          },
          "403": {
            "$ref": "#/components/responses/403ErrorForIntegratorQuery"
          },
          "404": {
            "$ref": "#/components/responses/404ErrorForIntegratorQuery"
          },
          "500": {
            "$ref": "#/components/responses/500ErrorForIntegratorQuery"
          },
          "503": {
            "$ref": "#/components/responses/503ErrorForIntegratorQuery"
          },
          "504": {
            "$ref": "#/components/responses/504ErrorForIntegratorQuery"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/commandBySiteImmediatePostReqBody"
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/queries/async": {
      "post": {
        "tags": [
          "SQL Passthrough"
        ],
        "summary": "Submit async query",
        "description": "Queue an async query for execution at the specified site.",
        "operationId": "createAsyncQuery",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          }
        ],
        "responses": {
          "201": {
            "$ref": "#/components/responses/201AsyncQuery"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          },
          "503": {
            "$ref": "#/components/responses/503Error"
          },
          "504": {
            "$ref": "#/components/responses/504Error"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/commandBySiteAsyncPostReqBody"
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/queries/registered": {
      "post": {
        "tags": [
          "Registered Queries"
        ],
        "summary": "Create registered query",
        "description": "Create a registered query to be queued for execution.",
        "operationId": "createRegisteredQuery",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          }
        ],
        "responses": {
          "201": {
            "$ref": "#/components/responses/202RegisteredQuery"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/RegisteredPostReqBody"
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      },
      "get": {
        "tags": [
          "Registered Queries"
        ],
        "summary": "List registered queries",
        "description": "List all registered queries that are currently active and queued for execution.",
        "operationId": "getRegisteredQueries",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200GetRegisteredQueries"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/queries/registered/{queryId}": {
      "get": {
        "tags": [
          "Registered Queries"
        ],
        "summary": "Get registered query details",
        "description": "Get the details of a registered query.",
        "operationId": "getRegisteredQuery",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          },
          {
            "$ref": "#/components/parameters/QueryId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200RegisteredQuery"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Registered Queries"
        ],
        "summary": "Cancel registered query",
        "description": "Cancel a registered query that is currently queued for execution.",
        "operationId": "cancelRegisteredQuery",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          },
          {
            "$ref": "#/components/parameters/QueryId"
          }
        ],
        "responses": {
          "204": {
            "$ref": "#/components/responses/204RegisteredQueryDelete"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/queries/registered/{queryId}/results": {
      "get": {
        "tags": [
          "Registered Queries"
        ],
        "summary": "Get registered query results",
        "description": "Get the result of a registered query that has completed execution.",
        "operationId": "getRegisteredQueryResult",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          },
          {
            "$ref": "#/components/parameters/QueryId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200RegisteredQueryResult"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/queries/{queryId}": {
      "get": {
        "tags": [
          "SQL Passthrough"
        ],
        "summary": "Get query status",
        "description": "Check the status of an immediate or async query.\n\nFor completed async queries, the response includes a `results` object with pagination details for retrieving result pages. Immediate queries do not include pagination since results are returned with the initial request.\n",
        "operationId": "getQuery",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          },
          {
            "$ref": "#/components/parameters/QueryId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200IntegratorGetQuery"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/queries/{queryId}/results/{pageNumber}": {
      "get": {
        "tags": [
          "SQL Passthrough"
        ],
        "summary": "Get query result page",
        "description": "Get a result page from a successful async query.",
        "operationId": "getResultPage",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          },
          {
            "$ref": "#/components/parameters/QueryId"
          },
          {
            "$ref": "#/components/parameters/PageNumber"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200GetResultPage"
          },
          "400": {
            "$ref": "#/components/responses/400Error"
          },
          "401": {
            "$ref": "#/components/responses/401Error"
          },
          "403": {
            "$ref": "#/components/responses/403Error"
          },
          "404": {
            "$ref": "#/components/responses/404Error"
          },
          "410": {
            "$ref": "#/components/responses/410Error"
          },
          "500": {
            "$ref": "#/components/responses/500Error"
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/fhir/R4/{fhirParameters}": {
      "get": {
        "tags": [
          "FHIR"
        ],
        "summary": "Search FHIR resources",
        "description": "Send a FHIR query to a site and receive the result in the response.\n\nInclude the resource name and search parameters in `fhirParameters`. Example: `Patient?given=John`\n\nSee the [FHIR docs](https://docs.haloconnect.io/halo-cloud/fhir-api/overview) for supported resources and parameters.\n",
        "operationId": "getFhirQuery",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          },
          {
            "$ref": "#/components/parameters/FhirParameters"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200FhirQuery"
          },
          "400": {
            "$ref": "#/components/responses/400ErrorForFhirQuery"
          },
          "401": {
            "$ref": "#/components/responses/401ErrorForFhirQuery"
          },
          "403": {
            "$ref": "#/components/responses/403ErrorForFhirQuery"
          },
          "404": {
            "$ref": "#/components/responses/404ErrorForFhirQuery"
          },
          "500": {
            "$ref": "#/components/responses/500ErrorForFhirQuery"
          },
          "503": {
            "$ref": "#/components/responses/503ErrorForFhirQuery"
          },
          "504": {
            "$ref": "#/components/responses/504ErrorForFhirQuery"
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    },
    "/desktop/sites/{siteId}/fhir/R4/{resource}/_search": {
      "post": {
        "tags": [
          "FHIR"
        ],
        "summary": "Search FHIR resources (POST)",
        "description": "Send a FHIR search query with parameters in the request body.\n\nPOST is recommended for sensitive queries containing personally identifiable information (PII), as it avoids URL length limits and keeps parameters out of logs.\n\nSee the [FHIR docs](https://docs.haloconnect.io/halo-cloud/fhir-api/overview) for supported resources and parameters. Errors may return as HTTP errors or FHIR [OperationOutcome](https://hl7.org/fhir/R4/operationoutcome.html) resources.\n",
        "operationId": "postFhirSearch",
        "parameters": [
          {
            "$ref": "#/components/parameters/SiteId"
          },
          {
            "$ref": "#/components/parameters/FhirResource"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/200FhirSearch"
          },
          "400": {
            "$ref": "#/components/responses/400ErrorForFhirQuery"
          },
          "401": {
            "$ref": "#/components/responses/401ErrorForFhirQuery"
          },
          "403": {
            "$ref": "#/components/responses/403ErrorForFhirQuery"
          },
          "404": {
            "$ref": "#/components/responses/404ErrorForFhirQuery"
          },
          "500": {
            "$ref": "#/components/responses/500ErrorForFhirQuery"
          },
          "503": {
            "$ref": "#/components/responses/503ErrorForFhirQuery"
          },
          "504": {
            "$ref": "#/components/responses/504ErrorForFhirQuery"
          }
        },
        "requestBody": {
          "description": "FHIR search parameters.",
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              },
              "example": {
                "given": "John",
                "birthdate": "gt1900-01-01",
                "_sort": "birthdate"
              }
            }
          }
        },
        "security": [
          {
            "AuthorizationHeader": [],
            "DeviceIdHeader": []
          }
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "SubscriptionKey": {
        "type": "apiKey",
        "name": "Ocp-Apim-Subscription-Key",
        "in": "header",
        "description": "The subscription key for the API."
      },
      "AuthorizationHeader": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "Bearer token for authentication."
      },
      "DeviceIdHeader": {
        "type": "apiKey",
        "name": "DeviceId",
        "in": "header",
        "description": "Device ID of the device making the request."
      }
    },
    "parameters": {
      "SiteId": {
        "name": "siteId",
        "in": "path",
        "description": "Halo GUID of the site.",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "QueryId": {
        "name": "queryId",
        "in": "path",
        "description": "Id of the query.",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "PageNumber": {
        "name": "pageNumber",
        "in": "path",
        "description": "Page number of the results for a query.",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        }
      },
      "FhirParameters": {
        "name": "fhirParameters",
        "in": "path",
        "description": "Resource names and search parameters per the R4 FHIR specification for using [RESTful APIs](http://hl7.org/fhir/R4/http.html) and [search](http://hl7.org/fhir/R4/search.html).",
        "schema": {
          "type": "string"
        },
        "required": true
      },
      "FhirResource": {
        "name": "resource",
        "in": "path",
        "description": "The name of the FHIR resource to search for.",
        "schema": {
          "type": "string"
        },
        "required": true
      }
    },
    "schemas": {
      "ImmediateMaxTimeInQueue": {
        "type": "integer",
        "format": "milli-seconds",
        "example": 15000,
        "minimum": 0,
        "maximum": 60000,
        "default": 30000
      },
      "ExecutionMode": {
        "description": "Selects between fetching data or writing to the database. `reader` executes the command (e.g. SELECT) and returns rows of data. `nonQuery` executes the command (e.g. UPDATE, INSERT, or DELETE) and does not return data.  `scalar` returns first value of first row of query results.  For Querys using RETURN @values please use `returnValue` Parameters.",
        "type": "string",
        "enum": [
          "reader",
          "nonQuery",
          "scalar"
        ],
        "default": "reader"
      },
      "CommandType": {
        "description": "Indicates how the text property is to be interpreted. `text` executes the SQL contained within the text property. `storedProcedure` calls the stored procedure named in the text property. `storedProcedure` is currently experimental.",
        "type": "string",
        "enum": [
          "text",
          "storedProcedure"
        ],
        "default": "text"
      },
      "Direction": {
        "description": "A value that indicates whether the parameter is input-only, output-only, bidirectional, or a stored procedure return value parameter.",
        "type": "string",
        "enum": [
          "output",
          "input",
          "inputOutput",
          "returnValue"
        ]
      },
      "Type": {
        "description": "Specifies SQL Server-specific data type of a field, property.",
        "type": "string",
        "enum": [
          "BigInt",
          "Binary",
          "Bit",
          "Char",
          "String",
          "Date",
          "DateTime",
          "DateTime2",
          "DateTimeOffset",
          "Decimal",
          "Float",
          "Image",
          "Int",
          "Money",
          "NChar",
          "NText",
          "NVarChar",
          "Real",
          "SmallDateTime",
          "SmallInt",
          "SmallMoney",
          "Structured",
          "Text",
          "Time",
          "Timestamp",
          "TinyInt",
          "Udt",
          "UniqueIdentifier",
          "VarBinary",
          "VarChar",
          "Variant",
          "Xml"
        ]
      },
      "Value": {
        "description": "Gets or sets the value of the parameter.",
        "type": [
          "string",
          "null"
        ],
        "format": "base64 (output)",
        "example": "66"
      },
      "Size": {
        "description": "The maximum size, in bytes, of the data within the column.",
        "type": "integer",
        "example": 43
      },
      "Parameter": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "example": "@siteid",
            "description": "The name of the parameter."
          },
          "direction": {
            "$ref": "#/components/schemas/Direction"
          },
          "type": {
            "$ref": "#/components/schemas/Type"
          },
          "value": {
            "$ref": "#/components/schemas/Value"
          },
          "size": {
            "$ref": "#/components/schemas/Size"
          }
        }
      },
      "Command": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "example": "GetPatientID",
            "description": "The SQL statement to execute or the name of the stored procedure to run."
          },
          "executionMode": {
            "$ref": "#/components/schemas/ExecutionMode"
          },
          "type": {
            "$ref": "#/components/schemas/CommandType"
          },
          "parameters": {
            "type": "array",
            "description": "Parameters are used to supply data to, or read outputs from, a stored procedure.",
            "items": {
              "$ref": "#/components/schemas/Parameter"
            }
          }
        },
        "required": [
          "text"
        ]
      },
      "Catalogue": {
        "type": "string",
        "example": "Patients",
        "description": "Indicates which database to run against. If no catalogue is specified a default catalogue will be chosen instead. Supported for all PMS with multiple databases. Database catalogues, including the default catalogue, can be identified from the catalogue.name property returned by the Site API endpoints, and are consistent across all sites of a single PMS type."
      },
      "ImmediateCommand": {
        "allOf": [
          {
            "type": "object",
            "properties": {
              "maxTimeInQueue": {
                "$ref": "#/components/schemas/ImmediateMaxTimeInQueue"
              },
              "command": {
                "$ref": "#/components/schemas/Command"
              },
              "catalogue": {
                "$ref": "#/components/schemas/Catalogue"
              }
            },
            "required": [
              "command"
            ]
          }
        ]
      },
      "Id": {
        "type": "string",
        "format": "uuid",
        "description": "Unique identifier of the entity."
      },
      "IntegratorId": {
        "type": "string",
        "format": "uuid",
        "description": "Id of the Integrator that created the query."
      },
      "SiteId": {
        "type": "string",
        "format": "uuid",
        "description": "Halo GUID of the site."
      },
      "CommandSize": {
        "type": "integer",
        "example": 98
      },
      "RequestSize": {
        "type": "integer",
        "example": 98
      },
      "Date": {
        "type": "string",
        "format": "date-time"
      },
      "ImmediateQuery": {
        "type": "object",
        "required": [
          "id",
          "integratorId",
          "siteId",
          "mode",
          "status",
          "maxTimeInQueue",
          "commandSize",
          "createdAt",
          "updatedAt",
          "requestSize"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "integratorId": {
            "$ref": "#/components/schemas/IntegratorId"
          },
          "siteId": {
            "$ref": "#/components/schemas/SiteId"
          },
          "mode": {
            "type": "string",
            "enum": [
              "immediate"
            ]
          },
          "maxTimeInQueue": {
            "$ref": "#/components/schemas/ImmediateMaxTimeInQueue"
          },
          "commandSize": {
            "$ref": "#/components/schemas/CommandSize"
          },
          "requestSize": {
            "$ref": "#/components/schemas/RequestSize"
          },
          "createdAt": {
            "$ref": "#/components/schemas/Date"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/Date"
          }
        }
      },
      "StatusTimingImmediate": {
        "type": "object",
        "description": "The server time (UTC) at which a query entered and exited the various states.",
        "properties": {
          "initialising": {
            "properties": {
              "startTime": {
                "$ref": "#/components/schemas/Date"
              }
            },
            "required": [
              "startTime"
            ]
          },
          "executing": {
            "properties": {
              "startTime": {
                "$ref": "#/components/schemas/Date"
              }
            }
          },
          "downloading": {
            "properties": {
              "startTime": {
                "$ref": "#/components/schemas/Date"
              }
            }
          },
          "uploading": {
            "properties": {
              "startTime": {
                "$ref": "#/components/schemas/Date"
              }
            }
          }
        },
        "required": [
          "initialising",
          "executing"
        ]
      },
      "QueryMetrics": {
        "type": "object",
        "required": [
          "sqlExecutionDuration"
        ],
        "properties": {
          "sqlExecutionDuration": {
            "type": "integer",
            "example": 1000,
            "description": "The number of milli-seconds from when Halo Link Service sends a query to the database until it gets a response."
          }
        }
      },
      "Data": {
        "type": "string",
        "format": "base64",
        "description": "Result data that is base64 encoded returned from the executed query.",
        "example": "e2lk..."
      },
      "QueryResult": {
        "type": "object",
        "required": [
          "rows",
          "size",
          "data"
        ],
        "properties": {
          "rows": {
            "type": "integer",
            "example": 30
          },
          "size": {
            "type": "integer",
            "example": 25
          },
          "data": {
            "$ref": "#/components/schemas/Data"
          },
          "parameters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Parameter"
            }
          }
        }
      },
      "NonQueryResult": {
        "type": "object",
        "required": [
          "rowsAffected",
          "size"
        ],
        "properties": {
          "rowsAffected": {
            "type": "integer",
            "example": 30
          },
          "size": {
     

# --- truncated at 32 KB (76 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/best-practice/refs/heads/main/openapi/haloconnect-desktop-openapi.json