REST API for external tools (e.g. Apollo RMM) to look up machines and build one-click remote-access links.
Every /api/v1 request must carry a bearer key, generated in the Helios console under Integration → Helios API:
Authorization: Bearer helios_xxxxxxxxxxxxxxxxxxxxxxxx
Regenerating the key in the console immediately invalidates the previous one. Keep it secret — it grants machine lookup and link generation.
Every machine has a stable machineId that is the correct key for the remote-access link. A machine's display name is its hostname and can repeat across machines — never use the name as an identifier. Pull /api/v1/machines once to map each of your agents to its Helios machineId, then build the button around that id.
The authoritative list of every enrolled machine.
curl -H "Authorization: Bearer $KEY" \
https://helios.teal.net/api/v1/machines
{
"machines": [
{
"machineId": "9f3c…-stable-id",
"name": "FRONT-DESK-PC",
"os": "windows",
"version": "1.0.58",
"customerId": "ec58f1b03c45",
"customerName": "Acme Dental",
"online": true,
"lastSeen": "2026-07-20T20:23:00Z"
}
]
}
Returns the deep link your remote-access button opens. Opening the link takes the technician straight to that machine in the Helios console (logging in first if needed).
| Query | Notes |
|---|---|
id | Preferred. The stable machineId from /machines. Exact, unambiguous. |
host | Fallback by hostname. Best-effort: if the name matches more than one machine, the response sets ambiguous: true — fall back to id. |
ref | Optional. Your own correlation id — a ticket number. It is parked against this machine and claimed by the next session that opens on it, so you can fetch that session's chat later with /api/v1/sessions?ref=… instead of having to work out which session was yours. Expires in 30 minutes if the link is never used. |
curl -H "Authorization: Bearer $KEY" \
"https://helios.teal.net/api/v1/remote/connect-url?id=9f3c…-stable-id"
{
"url": "https://helios.teal.net/?connect=9f3c…-stable-id",
"machineId": "9f3c…-stable-id",
"found": true,
"online": true,
"ambiguous": false
}
Open url in the technician's browser. If found is false the machine isn't enrolled; if online is false the link still opens but the machine is currently offline.
Every Helios customer with its locations — so you can map your own clients/sites to Helios ones.
{
"customers": [
{
"id": "ec58f1b03c45",
"name": "Acme Dental",
"locations": [
{ "id": "67eafaadbda2", "name": "Front Desk" },
{ "id": "9c11a0b2de34", "name": "Back Office" }
]
}
]
}
The enroll token and ready-to-run install commands for a customer, optionally scoped to a location so a deployed agent lands in the right place. Add ?location=<locationId> (from /customers) to target a location.
curl -H "Authorization: Bearer $KEY" \
"https://helios.teal.net/api/v1/customers/ec58f1b03c45/install?location=67eafaadbda2"
{
"customerId": "ec58f1b03c45",
"customerName": "Acme Dental",
"enrollToken": "…",
"locationId": "67eafaadbda2",
"locationName": "Front Desk",
"installWindows": "& ([scriptblock]::Create((iwr …/install.ps1 …).Content)) -EnrollToken … -Server … -FolderId 67eafaadbda2",
"installMac": "curl -fsSL …/install.sh | sh -s -- --token … --server … --folder 67eafaadbda2",
"installLinux": "curl -fsSL …/install-linux.sh | sudo sh -s -- --token … --server … --folder 67eafaadbda2"
}
Run installWindows (elevated PowerShell), installMac (Terminal), or installLinux (terminal) on the target. The agent derives a stable id from the machine's OS UUID; the install script prints HeliosMachineId: <id> as its final line — capture it to wire up the remote-access button.
A machine's support sessions, newest first, each with its full chat transcript. This is the endpoint to use at the end of a remote-support job: the technician remotes in, they and the end user talk in the chat window, the session ends, and you pull the whole conversation.
A session is one visit — one continuous span with at least one technician connected. Two technicians on the same machine share one session, because they shared one conversation with the end user. A technician who drops and reconnects within two minutes stays in the same session rather than splitting the transcript.
| Query | Notes |
|---|---|
since | RFC3339. Sessions that overlap the window, so a visit that began earlier and ran into it is included. |
until | RFC3339. |
limit | Default 50. 0 means no cap. |
curl -H "Authorization: Bearer $KEY" \
"https://helios.teal.net/api/v1/machines/9f3c…-stable-id/sessions?since=2026-08-03T00:00:00Z"
{
"sessions": [
{
"sessionId": "s-8f3a2c91b47e6d05",
"machineId": "9f3c…-stable-id",
"machine": "Front Desk iMac",
"customerId": "ec58f1b03c45",
"customerName": "Vehicle Licensing Consultants",
"ref": "TICKET-123",
"techs": ["Simeon"],
"startedAt": "2026-08-03T19:21:16Z",
"endedAt": "2026-08-03T19:26:07Z",
"open": false,
"messages": [
{"tech":"Simeon","fromTech":true,"text":"Let me know how it goes","at":"2026-08-03T19:21:16Z"},
{"tech":"Simeon","fromTech":false,"text":"It worked ! Thank You!","at":"2026-08-03T19:25:00Z"}
]
}
]
}
fromTech: true is the technician talking, false is the end user. tech on a user message is the technician the reply was addressed to — the end user's chat window has no name of its own. open: true means somebody is still connected, so more messages may arrive; wait for endedAt before treating the transcript as final.
The same sessions, found by the ref you passed to connect-url — the direct way to get "the transcript for my ticket" without knowing the machine or the session id. ref is required here; since, until and limit work as above.
curl -H "Authorization: Bearer $KEY" \
"https://helios.teal.net/api/v1/sessions?ref=TICKET-123"
One session and its transcript, by the sessionId from either endpoint above. Returns the session object directly (not wrapped in a list).
/api/v1/remote/connect-url?id=<machineId>&ref=<your ticket> and open the returned url for the technician./api/v1/sessions?ref=<your ticket> (or /api/v1/machines/<machineId>/sessions?since=… if you did not pass a ref) and read messages.open is still true, somebody is connected — poll again, or wait for endedAt.Transcripts are kept for 180 days, the same window as the per-computer logs, so you can re-fetch one if your own copy is lost.
/api/v1/customers and map your clients/sites to Helios customers/locations./api/v1/customers/{id}/install?location=… and run the returned command on the target; capture the printed HeliosMachineId./api/v1/remote/connect-url?id=<machineId>./api/v1/machines and store each machine's machineId against the matching agent in your system (match by hostname)./api/v1/remote/connect-url?id=<machineId> and open the returned url.