AutoMate Technisch Help

HaloPSA Integratie - Automate365

Doel

Koppeling tussen Automate365 en HaloPSA zodat we per tenant:

  • Tickets kunnen ophalen en tonen

  • Contactpersonen kunnen koppelen/ontkoppelen aan rollen (technisch, primair, secundair, financieel)

  • Contactpersonen kunnen aanmaken

  • Tickets kunnen aanmaken en sluiten

Authenticatie

OAuth2 Client Credentials flow.

Veld

Waarde

Resource Server

https://halo.youdo365.nl/api

Authorisation Server

https://halo.youdo365.nl/auth

Token endpoint

POST /auth/token

Grant type

client_credentials

Scope

all

Content-Type

application/x-www-form-urlencoded

Token is ~1 uur geldig. Body: grant_type=client_credentials&client_id={id}&client_secret={secret}&scope=all

Matching: Automate365 tenant <> HaloPSA organisatie

Custom field: CFMicrosofTenantId

Het custom field op de HaloPSA Client:

Eigenschap

Waarde

Field ID

241

Naam

CFMicrosofTenantId (let op: 1x 't' in Microsof)

Label

Microsoft Tenant Id

Type

0 (tekst)

Usage

2 (client)

Tab

Custom Fields (tab_id: 4)

Dit veld moet per klant gevuld worden met het Microsoft tenant ID. Momenteel gevuld bij Dirkzwager Groep BV en Innovative365.

Matching strategie

Er is geen server-side filter op custom fields via de HaloPSA API. Matching gaat als volgt:

  1. Haal alle clients op: GET /api/Client?count=500

  2. Haal per client het detail op: GET /api/Client/{id}

  3. Zoek in customfields[] naar het veld met name: "CFMicrosofTenantId"

  4. Match de value met het Microsoft tenant ID uit Automate365

Het custom field zit in het customfields array van de client detail response:

{ "customfields": [ { "name": "CFMicrosofTenantId", "value": "8f3d46f0-9151-4904-be93-69420b7d9d61" } ] }

Custom field: Contactrol (CFContact)

Dropdown veld op de User/Contact entity om contactpersonen te koppelen aan een rol.

Eigenschap

Waarde

Field ID

334

Naam

CFContact

Label

Contact

Type

2 (dropdown)

Usage

4 (user/contact)

Value

Naam

1

Technisch contact 1

2

Technisch contact 2

3

Financieel contact

Contactrol lezen en schrijven

Lezen via GET /api/Users/{id}:

{ "customfields": [ { "name": "CFContact", "value": "1", "display": "Technisch contact 1" } ] }

Schrijven via POST /api/Users:

[{ "id": 651, "customfields": [ { "id": 334, "name": "CFContact", "value": "1" } ] }]

Ontkoppelen — waarde leegmaken:

[{ "id": 651, "customfields": [ { "id": 334, "name": "CFContact", "value": "" } ] }]

API Endpoints

1. Organisatie ophalen

GET /api/Client?search={naam} GET /api/Client/{id}

Relevante velden in response:

  • id — HaloPSA client ID (integer)

  • name — Organisatienaam

  • accountsid — Account code (bijv. "INN001")

  • inactive — Actief/inactief

  • customfields[] — Custom fields (incl. CFMicrosofTenantId)

  • external_links[] — Koppelingen naar Pax8 etc.

2. Tickets ophalen

GET /api/Tickets?client_id={client_id}&count={max}

Er is geen server-side filter op categorie. Filteren op category_1 == "Automate365" moet client-side.

Relevante velden per ticket:

Veld

Beschrijving

Voorbeeld

id

Ticket ID

3815

summary

Onderwerp

"Automate365 down?"

details

Omschrijving

(HTML/tekst)

category_1

Categorie

"Automate365"

status_id

Status ID

1 = open, 9 = gesloten

hasbeenclosed

Boolean gesloten

true/false

dateoccurred

Aanmaakdatum

2026-02-16T...

dateclosed

Sluitdatum

2026-02-16T...

user_id

Melder (HaloPSA user ID)

64

user_name

Melder naam

"General User"

agent_id

Toegewezen agent

1

team

Team

"YOD - 1st Line Support"

priority_id

Prioriteit

4

site_name

Locatie

"Purmerend"

3. Contactpersonen ophalen

GET /api/Users?client_id={client_id}&count=100

List view bevat basisvelden. Voor alle velden (incl. rol, contactrol en azure info) moet je de detail view gebruiken:

GET /api/Users/{user_id}

Relevante velden per contact:

Veld

Beschrijving

Voorbeeld

id

HaloPSA user ID

76

firstname

Voornaam

"Vincent"

surname

Achternaam

"Boots"

emailaddress

E-mail

"vincent.boots@innovative.nl"

phonenumber

Telefoonnummer

"+31858088690"

other1

Locatie (custom gebruik)

"Purmerend"

other2

Rol/functie (custom gebruik)

"CTO"

client_id

Organisatie ID

23

inactive

Actief/inactief

false

azure_tenant_id

MS tenant ID (alleen detail)

"8f3d46f0-..."

azureoid

Entra Object ID (alleen detail)

"5cf491f4-..."

site_name

Vestiging

"Purmerend"

customfields[]

Custom fields (incl. CFContact)

Zie sectie CFContact

4. Contactpersoon aanmaken (nog te testen)

POST /api/Users

Verwachte body (minimaal):

[{ "client_id": 23, "firstname": "Nieuwe", "surname": "Gebruiker", "emailaddress": "nieuwe@innovative.nl", "site_id": 31 }]

5. Ticket aanmaken

POST /api/Tickets Content-Type: application/json

Let op: Body moet een array zijn, niet een enkel object.

[{ "client_id": 23, "summary": "Ticket onderwerp", "details": "Omschrijving", "tickettype_id": 21, "user_name": "Vincent Boots", "category_1": "Automate365" }]

Getest en werkend. Retourneert het volledige ticket object met o.a.:

  • id — nieuw ticket ID

  • status_id: 1 — standaard open

  • priority_id: 4 — standaard Low

  • team_id: 13 — YOD - 1st Line Support (automatisch toegewezen)

  • agent_id: 1 — automatisch toegewezen agent

  • sla_id: 5 — SLA wordt automatisch gekoppeld

6. Ticket sluiten

POST /api/Tickets Content-Type: application/json
[{ "id": 4407, "status_id": 9 }]

Getest en werkend. status_id: 9 sluit het ticket. Response bevat hasbeenclosed: true en dateclosed.

7. Custom field op Client updaten

POST /api/Client Content-Type: application/json
[{ "id": 23, "customfields": [ { "id": 241, "name": "CFMicrosofTenantId", "value": "8f3d46f0-9151-4904-be93-69420b7d9d61" } ] }]

8. Custom field op User updaten (contactrol)

POST /api/Users Content-Type: application/json
[{ "id": 651, "customfields": [ { "id": 334, "name": "CFContact", "value": "1" } ] }]

Testdata: Innovative365

  • HaloPSA Client ID: 23

  • Microsoft Tenant ID: 8f3d46f0-9151-4904-be93-69420b7d9d61 (opgeslagen in CFMicrosofTenantId)

  • Aantal contactpersonen: 35

  • Automate365 tickets: 13 (allemaal gesloten, incl. test ticket #4407)

  • Categorie in Halo: Automate365

  • Danny Spits Warnars (user ID 651): CFContact = Technisch contact 1

Open punten

  • [x] Custom field CFMicrosofTenantId op HaloPSA Client — werkt, gevuld bij Innovative365 en Dirkzwager

  • [x] Ticket aanmaken via POST — getest en werkend

  • [x] Ticket sluiten via POST met status_id: 9 — getest en werkend

  • [x] Contactrol (CFContact) lezen en schrijven — getest en werkend

  • [ ] POST endpoint testen voor Users (contactpersoon aanmaken)

  • [ ] Primair contact en Secundair contact toevoegen als opties in CFContact dropdown

  • [ ] CFMicrosofTenantId vullen bij alle klanten

  • [ ] Token caching en refresh strategie bepalen

  • [ ] Rate limiting van HaloPSA API onderzoeken

Last modified: 09 July 2026