<!-- BusyBot node reference — https://busybot.net/tools/halo-psa/ -->

> Node: HaloPSA (`halo_psa`) · Action · v1
> Category: Communication · Credentials: HaloPSA API (`haloPsaApi`)
> Updated: 2026-08-16

# HaloPSA

> Manage clients, sites, tickets, and users in HaloPSA

## Overview

HaloPSA is a professional services automation (PSA) and IT service management (ITSM) platform. This tool enables CRUD operations on clients, sites, tickets, and users. It uses OAuth2 client credentials for authentication and supports filtering, pagination, and simplified output modes.

**Category:** Communication  
**Tool Name:** `halo_psa`  
**Version:** 1

**Appearance:** Icon: `lucide-Wrench` | Color: `#2ACAEA`

## Node Type

**Action** — processes input items and produces output

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **HaloPSA API** credentials.
See the [Credentials Guide](https://busybot.net/credentials/halo-psa-api/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Client | `client` |
| Site | `site` |
| Ticket | `ticket` |
| User | `user` |

### Operations

Every resource offers the same five operations.

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new record |
| Delete | `delete` | Delete a record by ID |
| Get | `get` | Retrieve one record by ID |
| Get Many | `getAll` | List records, with filtering and pagination |
| Update | `update` | Update an existing record |

### Parameters

#### Client: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Name (`clientName`) | `string` | Yes | — | The name of the client to create. Supports expressions like {{ $json.company }}. |
| Additional Fields | `collection` | No | `{}` | Optional client attributes. Add only the ones you need. |
| — Account Status (`inactive`) | `options` | No | `false` | Whether the client account is active. |
| | | | | Options: `false` (Active), `true` (Inactive) |
| — Notes | `string` | No | — | Free-text notes stored on the client. |
| — VIP (`is_vip`) | `boolean` | No | `false` | Whether the client is VIP or not. |
| — Website | `string` | No | — | The client's website URL. |

#### Client: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Client ID | `string` | Yes | — | The ID of the client. Supports expressions. |
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |

#### Client: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the client list. Add only the filters you need. |
| — Active Status (`activeStatus`) | `options` | No | `active` | Which accounts to include. |
| | | | | Options: `active` (Active Only), `all`, `inactive` (Inactive Only) |
| — Text To Filter By (`search`) | `string` | No | — | Filter clients by your search string. |

#### Client: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Client ID | `string` | Yes | — | The ID of the client to update. Supports expressions. |
| Update Fields | `collection` | No | `{}` | Fields to change on the client. Add only the ones you need. |
| — Account Status (`inactive`) | `options` | No | `false` | Whether the client account is active. |
| | | | | Options: `false` (Active), `true` (Inactive) |
| — Name | `string` | No | — | The client's name. |
| — Notes | `string` | No | — | Free-text notes stored on the client. |
| — VIP (`is_vip`) | `boolean` | No | `false` | Whether the client is VIP or not. |
| — Website | `string` | No | — | The client's website URL. |

#### Client: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Client ID | `string` | Yes | — | The ID of the client. Supports expressions. |

#### Site: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Name (`siteName`) | `string` | Yes | — | The name of the site to create. Supports expressions. |
| Client ID | `string` | Yes | — | The ID of the client this site belongs to. Find in HaloPSA under Clients. Supports expressions. |
| Additional Fields | `collection` | No | `{}` | Optional site attributes. Add only the ones you need. |
| — Main Contact (`maincontact_name`) | `string` | No | — | Name of the site's main contact. |
| — Notes | `string` | No | — | Free-text notes stored on the site. |
| — Phone Number (`phonenumber`) | `string` | No | — | Telephone number for the site. |

#### Site: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Site ID | `string` | Yes | — | The ID of the site. Supports expressions. |
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |

#### Site: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the site list. Add only the filters you need. |
| — Active Status (`activeStatus`) | `options` | No | `all` | Which sites to include. |
| | | | | Options: `active` (Active Only), `all`, `inactive` (Inactive Only) |
| — Text To Filter By (`search`) | `string` | No | — | Filter sites by your search string. |

#### Site: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Site ID | `string` | No | — | The ID of the site to update. Supports expressions. |
| Update Fields | `collection` | No | `{}` | Fields to change on the site. Add only the ones you need. |
| — Client ID (`client_id`) | `string` | No | — | The ID of the client this site belongs to. |
| — Main Contact (`maincontact_name`) | `string` | No | — | Name of the site's main contact. |
| — Name | `string` | No | — | Enter site name. |
| — Notes | `string` | No | — | Free-text notes stored on the site. |
| — Phone Number (`phonenumber`) | `string` | No | — | Telephone number for the site. |

#### Site: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Site ID | `string` | Yes | — | The ID of the site. Supports expressions. |

#### Ticket: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Ticket Type ID (`ticketType`) | `string` | Yes | — | The ID of the ticket type. Find in HaloPSA under Configuration > Ticket Types. Note: types containing "Request", "Offboarding", "Onboarding", "Other Hardware", or "Software Change" may fail with 400 errors as they require CAB approval. |
| Summary | `string` | Yes | — | The summary/title of the ticket. Supports expressions. |
| Details | `string` | Yes | — | The details/description of the ticket. Supports expressions. |
| Additional Fields | `collection` | No | `{}` | Optional ticket attributes. Add only the ones you need. |
| — Assigned Agent ID (`agent_id`) | `string` | No | — | The ID of the agent to assign. Find in HaloPSA under Configuration > Agents. |
| — Start Date (`startdate`) | `string` | No | — | The start date for the ticket (ISO 8601 format). |
| — Target Date (`targetdate`) | `string` | No | — | The target/due date for the ticket (ISO 8601 format). |

#### Ticket: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Ticket ID | `string` | Yes | — | The ID of the ticket. Supports expressions. |
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |

#### Ticket: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the ticket list. Add only the filters you need. |
| — Active Status (`activeStatus`) | `options` | No | `all` | Which tickets to include. |
| | | | | Options: `active` (Active Only), `all`, `inactive` (Inactive Only) |
| — Text To Filter By (`search`) | `string` | No | — | Filter tickets by your search string. |

#### Ticket: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Ticket ID | `string` | No | — | The ID of the ticket to update. Supports expressions. |
| Update Fields | `collection` | No | `{}` | Fields to change on the ticket. Add only the ones you need. |
| — Assigned Agent ID (`agent_id`) | `string` | No | — | The ID of the agent to assign. Find in HaloPSA under Configuration > Agents. |
| — Details | `string` | No | — | The details/description of the ticket. |
| — Start Date (`startdate`) | `string` | No | — | The start date for the ticket (ISO 8601 format). |
| — Summary | `string` | No | — | The summary/title of the ticket. |
| — Target Date (`targetdate`) | `string` | No | — | The target/due date for the ticket (ISO 8601 format). |

#### Ticket: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Ticket ID | `string` | Yes | — | The ID of the ticket. Supports expressions. |

#### User: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Name (`userName`) | `string` | Yes | — | The name of the user to create. Supports expressions. |
| Site ID | `string` | Yes | — | The ID of the site the user belongs to. Find in HaloPSA under Clients > Sites. Supports expressions. |
| Additional Fields | `collection` | No | `{}` | Optional user attributes. Add only the ones you need. |
| — Email (`emailaddress`) | `string` | No | — | The user's email address. |
| — Notes | `string` | No | — | Free-text notes stored on the user. |
| — Password | `string` | No | — | Must be at least 8 characters long and contain at least one letter, one number or symbol, one upper case and one lower case character. |
| — Surname | `string` | No | — | The user's surname. |
| — User Is Inactive (`inactive`) | `boolean` | No | `false` | Whether the user account is inactive. |

#### User: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| User ID | `string` | Yes | — | The ID of the user. Supports expressions. |
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |

#### User: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response instead of the raw data. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the user list. Add only the filters you need. |
| — Active Status (`activeStatus`) | `options` | No | `all` | Which users to include. |
| | | | | Options: `active` (Active Only), `all`, `inactive` (Inactive Only) |
| — Text To Filter By (`search`) | `string` | No | — | Filter users by your search string. |

#### User: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| User ID | `string` | No | — | The ID of the user to update. Supports expressions. |
| Update Fields | `collection` | No | `{}` | Fields to change on the user. Add only the ones you need. |
| — Email (`emailaddress`) | `string` | No | — | The user's email address. |
| — Name | `string` | No | — | Enter user name. |
| — Notes | `string` | No | — | Free-text notes stored on the user. |
| — Password | `string` | No | — | Must be at least 8 characters long and contain at least one letter, one number or symbol, one upper case and one lower case character. |
| — Site ID (`site_id`) | `string` | No | — | The ID of the site to assign the user to. Find in HaloPSA under Clients > Sites. |
| — Surname | `string` | No | — | The user's surname. |
| — User Is Inactive (`inactive`) | `boolean` | No | `false` | Whether the user account is inactive. |

#### User: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| User ID | `string` | Yes | — | The ID of the user. Supports expressions. |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Max Concurrency | `number` | No | `10` | Maximum number of items to process concurrently. |

## Output Data

The HaloPSA record is merged into the incoming item JSON at the top level, so the fields you sent in pass through and binary data is forwarded.

| Operation | Output items |
|-----------|--------------|
| `create`, `update` | One item — the record HaloPSA returns. Simplify does not apply to writes, so the full record comes back. |
| `get` | One item — the record, trimmed by Simplify when it is on. |
| `getAll` | **Fans out** — one output item per record. Return All pages through the whole result set; otherwise up to Limit records. |
| `delete` | One item — HaloPSA's delete response. |

**Simplify** keeps only the fields that matter for most workflows, and differs per resource:

| Resource | Fields kept when Simplify is on |
|----------|--------------------------------|
| Client | `id`, `name`, `notes`, `is_vip`, `website` |
| Site | `id`, `name`, `client_id`, `maincontact_name`, `notes`, `phonenumber` |
| Ticket | `id`, `summary`, `details`, `agent_id`, `startdate`, `targetdate` |
| User | `id`, `name`, `site_id`, `emailaddress`, `notes`, `surname`, `inactive` |

Turn Simplify off when a downstream node needs a field that is not in that list.

## Usage Examples

- Create a new client in HaloPSA
- Get all open tickets from HaloPSA
- Update a HaloPSA user email address
- Delete a site in HaloPSA
- List all HaloPSA clients filtered by search term

## Example Configuration

Get one client, simplified:

```json
{
  "type": "halo_psa",
  "parameters": {
    "resource": "client",
    "operation": "get",
    "clientId": "123",
    "simplify": true
  }
}
```

List active clients matching a search string:

```json
{
  "type": "halo_psa",
  "parameters": {
    "resource": "client",
    "operation": "getAll",
    "returnAll": false,
    "limit": 50,
    "simplify": true,
    "filters": {
      "activeStatus": "active",
      "search": "Acme"
    }
  }
}
```

Update a client:

```json
{
  "type": "halo_psa",
  "parameters": {
    "resource": "client",
    "operation": "update",
    "clientId": "123",
    "updateFields": {
      "name": "Acme Corporation Ltd",
      "notes": "Updated company name after incorporation",
      "website": "https://acmecorp.com",
      "is_vip": true
    }
  }
}
```

Create a site under a client returned by an upstream node:

```json
{
  "type": "halo_psa",
  "parameters": {
    "resource": "site",
    "operation": "create",
    "siteName": "Acme Headquarters",
    "clientId": "{{ $json.id }}",
    "additionalFields": {
      "maincontact_name": "John Smith",
      "phonenumber": "+1-555-0123",
      "notes": "Main office location"
    }
  }
}
```

Raise a ticket:

```json
{
  "type": "halo_psa",
  "parameters": {
    "resource": "ticket",
    "operation": "create",
    "ticketType": "1",
    "summary": "Network connectivity issues",
    "details": "Users are experiencing intermittent network connectivity issues in the main office.",
    "additionalFields": {
      "agent_id": "5",
      "startdate": "2024-01-15T09:00:00Z",
      "targetdate": "2024-01-15T17:00:00Z"
    }
  }
}
```

Create a user on a site:

```json
{
  "type": "halo_psa",
  "parameters": {
    "resource": "user",
    "operation": "create",
    "userName": "Jane Doe",
    "siteId": "789",
    "additionalFields": {
      "emailaddress": "jane.doe@acmecorp.com",
      "surname": "Doe",
      "password": "TempPassword123!",
      "notes": "New employee - IT Department",
      "inactive": false
    }
  }
}
```

List active users without trimming the response:

```json
{
  "type": "halo_psa",
  "parameters": {
    "resource": "user",
    "operation": "getAll",
    "returnAll": false,
    "limit": 100,
    "simplify": false,
    "filters": {
      "activeStatus": "active"
    }
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Manage clients, sites, tickets, and users in HaloPSA for IT service management and helpdesk workflows.

### Notes

- **Build the hierarchy in order.** A site needs a Client ID and a user needs a Site ID, so create the client first, feed its `id` into the site, then feed the site's `id` into the user.
- **The Name field has a different internal name per resource.** In a JSON config it is `clientName`, `siteName` or `userName` depending on the resource — but plain `name` inside Update Fields.
- **Some ticket types need approval.** Types whose names contain "Request", "Offboarding", "Onboarding", "Other Hardware" or "Software Change" can be rejected with a 400 because HaloPSA requires CAB approval for them.
- **Simplify is on by default.** If a downstream expression reads a field that is missing, turn Simplify off before assuming the record is incomplete.