HaloITSM Tool
Read HaloITSM service desk tickets, the updates on them, the people they belong to, and the vocabulary that makes them readable — and raise a ticket from automation. This is the tool for open-ticket counts, SLA breach reporting and escalation digests on installations running HaloITSM.
Tool ID
haloitsm
Credential Required
Yes — the shared haloitsm credential, owned by the haloitsm connector. Configure the
tenant once and every haloitsm-* tool uses it; rotating the client secret is one edit rather
than four.
It is a server-managed OAuth credential: InTouch mints and refreshes the access token itself and
the connector never sees the secret. Halo uses the OAuth2 client credentials grant, so set
grant_type to client_credentials. The token endpoint is on YOUR tenant host, which is why
it lives in the credential rather than in the connector.
Credential Properties
| Property | Type | Default | Description |
|---|---|---|---|
client_id |
string | — | Required. Halo → Configuration → Integrations → HaloITSM API → View Applications → your application. |
client_secret |
string | — | Required. Generated beside the client id and shown once. Regenerating invalidates the previous secret. |
token_url |
string | — | Required. https://<tenant>.haloitsm.com/auth/token — your own host, shown on the API page as the Authorisation Server. |
grant_type |
string | (blank) | client_credentials for unattended use. |
scope |
string | — | all, or narrower if the application's Permissions tab was restricted. |
access_token |
string | — | Machine-managed. Leave empty; the server mints and persists it. |
refresh_token |
string | — | Not used by the client-credentials grant. |
expires_at |
string | 0 |
Machine-managed expiry, epoch seconds. Halo tokens last 9 hours. |
Halo setup
- Configuration → Integrations → HaloITSM API. The page shows your Resource Server, your Authorisation Server and your tenant name — the first two are the values this credential needs.
- View Applications → New. On Details choose Client ID and Secret (Services); the other six methods either act as a signed-in person (and so cannot be scheduled) or are not OAuth.
- Generate, then copy the secret before saving — Halo shows it once.
- Prefer Application identity over logging in as a named agent, so the integration does not
break when that person leaves. Anything
create_ticketraises is attributed to whatever it logs in as. - On Permissions, tick only what is needed. Halo's own warning is worth heeding: "'all' and 'admin' should not be used in production as they expose administration level access."
Permissions
Whatever the API application is granted in Halo. The read operations need read access to Tickets, Actions, Users, Clients and the reference tables; create_ticket needs ticket-creation rights.
Operations
1. list_tickets — List tickets
Every ticket on the desk. The SLA target rides on the ticket as fixbydate, so this is what a breach or escalation report reads. Calls GET /Tickets.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_tickets |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
2. get_ticket — Get one ticket
A single ticket in full — 108 fields on the tenant this was measured against. Calls GET /Tickets/{id}.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. get_ticket |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
id |
string | — | Required. Record id. Required by get_ticket, get_action, get_user and get_client. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
3. create_ticket — Raise a ticket
Open a ticket from automation, so a failed nightly job becomes an incident somebody sees. Halo expects an ARRAY of ticket objects here, even for one. Calls POST /Tickets.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. create_ticket |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
body |
string | — | Required. Ticket to create, as a JSON object string. Halo expects an ARRAY of ticket objects on POST /Tickets — e.g. [{"summary": "Nightly load failed", "details": "Run 481 exited 1", "tickettype_id": 1}]. Only used by create_ticket. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
4. list_actions — List ticket actions
The updates ON tickets — notes, status changes, reassignment. 'Untouched for three days' is an actions question. Calls GET /Actions.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_actions |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
5. get_action — Get one action
Needs BOTH ids: an action is identified by its own id and the ticket it belongs to. Calls GET /Actions/{id}?ticket_id={ticketId}.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. get_action |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
id |
string | — | Required. Record id. Required by get_ticket, get_action, get_user and get_client. |
ticketId |
string | — | Required. The ticket an action belongs to. Required by get_action — Halo rejects an action lookup without it. Every action in a list_actions result carries ticket_id. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
6. list_users — List users
The end users who raise tickets. Calls GET /Users.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_users |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
7. get_user — Get one user
A single user by id. Calls GET /Users/{id}.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. get_user |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
id |
string | — | Required. Record id. Required by get_ticket, get_action, get_user and get_client. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
8. list_clients — List clients
The organisations tickets belong to — one row in a single-institution install, the tenancy boundary in an MSP. Calls GET /Client.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_clients |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
9. get_client — Get one client
A single client by id. Calls GET /Client/{id}.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. get_client |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
id |
string | — | Required. Record id. Required by get_ticket, get_action, get_user and get_client. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
10. list_sites — List sites
Locations under a client — the campus, building or office a ticket came from. Calls GET /Site.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_sites |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
11. list_agents — List agents
Service desk staff. Needed to turn an assignment id into a name. Calls GET /Agent.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_agents |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
12. list_teams — List teams
The queues tickets are assigned to. Calls GET /Team.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_teams |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
13. list_statuses — List statuses
This installation's status vocabulary. Configurable per install — read it, never hardcode an id. Calls GET /Status.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_statuses |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
14. list_ticket_types — List ticket types
Incident, request, change and whatever else this install defines. Calls GET /TicketType.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_ticket_types |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
15. list_reports — List saved reports
Reporting the service desk already built, for a workflow that would rather reuse it than recompute it. Calls GET /Report.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_reports |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
16. list_priorities — List priorities
Resolves the priority_id carried on every ticket. Calls GET /Priority.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_priorities |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
17. list_slas — List SLA definitions
The SLAs themselves — what the targets on tickets are measured against. Calls GET /SLA.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_slas |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
18. list_holidays — List holidays
SLA targets are measured in WORKING time, and this is the calendar that decides which days count. Calls GET /Holiday.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_holidays |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
19. list_workdays — List working days
The working-hours definition behind the same calculation. Calls GET /WorkDay.
Properties:
| Property | Type | Default | Description |
|---|---|---|---|
operation |
string | — | Required. list_workdays |
host |
string | — | Required. Your HaloITSM hostname, e.g. acme.haloitsm.com. Required by every operation. No scheme, no trailing slash. |
query |
string | — | Optional. Halo query parameters as a JSON object string, e.g. {"open_only": true} or {"client_id": 12}. Sent as-is on the URL. You do NOT need pagination parameters — listings are drained automatically and the result carries complete:true. Halo's own default is dangerous (it returns 50 rows and a record_count that agrees with the truncation), which is why this connector always paginates. Supplying paginate/page_size/page_no yourself switches that off and hands you one page. |
Published Outputs:
- result — the JSON response body
- status — HTTP status code
Paging
Listings are drained automatically, and on Halo that is not a nicety — it is the difference between a report and a wrong report.
Halo pages by number, and its unpaginated answer misstates its own size. Measured against a live tenant on 2026-08-22:
| Call | Returned | record_count says |
Actually |
|---|---|---|---|
GET /Tickets |
50 | 50 | 420 |
GET /Asset |
50 | 50 | 115 |
GET /Actions |
0 | 0 | 1085 |
The count agrees with the truncation, so nothing in the response suggests anything is missing —
and page_size on its own is ignored. Only paginate=true makes the count tell the truth.
/Actions is the starkest: unflagged it reports an empty service desk.
So this connector always requests with the flag set, reads the real total, and walks to it. The
result carries pagesFetched and complete: true. If it ever stops at the page cap it says so —
complete: false with a warning, and the step returns WARNING rather than SUCCESS.
You do not need pagination parameters. Supplying them yourself turns this off and hands you a single page, which is occasionally what you want and usually not.
Endpoints that answer with a bare array rather than an envelope — the reference vocabularies — are not paged and are returned untouched.
Notes
Tickets carry ids, not names. status_id, priority_id, the team, the type and the agent are
all numeric. A report a person will read needs the matching list_* operation to resolve them, and
those vocabularies are per-installation — an id meaning "Resolved" in one Halo is not the same id
in another.
Read the SLA target; never recompute it. A ticket carries fixbydate — the deadline Halo
calculated — along with sla_id, excludefromsla and slaholdtime. There is no precomputed
breach flag: a breach report is fixbydate < now, which on the measured tenant was 177 of 420
tickets. Do not derive a target from dateoccurred plus a duration instead. Targets are measured
in working time against /Holiday (97 entries there) and /WorkDay, so a naive calculation
breaches tickets that spanned a weekend and are perfectly on time.
The other half of an SLA digest already exists. helpdesk-sla-digest is source-agnostic, so
list_tickets → digest → Teams message is a working escalation with nothing else written.
Family. haloitsm-assets (CMDB), haloitsm-services (service catalogue) and
haloitsm-knowledge share this connector's credential. Unlike the Microsoft Graph family the
split is not about consent — Halo issues one application and one scope — it is about keeping each
tool's purpose narrow enough to be chosen correctly.
Verification status. Every operation in this document was executed against a live HaloITSM
tenant on 2026-08-22 and returned HTTP 200 with real data. That includes the by-id lookups and
the paged listings; counts quoted above are what came back. What has NOT been exercised is
create_ticket (it writes, and the tenant is somebody's) and behaviour on a self-hosted Halo.
Self-Contained JAR
The jar bundles all runtime dependencies; only intouch-tool-api is provided by the server.
Publishes
The keys a later task may reference as {{taskName.key}}. Referencing anything not listed here resolves to nothing at run time.
completeoperationresultstatuswarning