Helios API v1

REST API for external tools (e.g. Apollo RMM) to look up machines and build one-click remote-access links.

Authentication

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.

Machine identity

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.

Endpoints

GEThttps://helios.teal.net/api/v1/machines

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"
    }
  ]
}
GEThttps://helios.teal.net/api/v1/remote/connect-url

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).

QueryNotes
idPreferred. The stable machineId from /machines. Exact, unambiguous.
hostFallback by hostname. Best-effort: if the name matches more than one machine, the response sets ambiguous: true — fall back to id.
refOptional. 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.

GEThttps://helios.teal.net/api/v1/customers

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" }
      ]
    }
  ]
}
GEThttps://helios.teal.net/api/v1/customers/{id}/install

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.

GEThttps://helios.teal.net/api/v1/machines/{machineId}/sessions

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.

QueryNotes
sinceRFC3339. Sessions that overlap the window, so a visit that began earlier and ran into it is included.
untilRFC3339.
limitDefault 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.

GEThttps://helios.teal.net/api/v1/sessions?ref=YOUR-REF

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"
GEThttps://helios.teal.net/api/v1/sessions/{sessionId}

One session and its transcript, by the sessionId from either endpoint above. Returns the session object directly (not wrapped in a list).

Getting a session transcript (typical flow)

  1. Call /api/v1/remote/connect-url?id=<machineId>&ref=<your ticket> and open the returned url for the technician.
  2. They work on the machine and chat with the end user.
  3. When they disconnect, call /api/v1/sessions?ref=<your ticket> (or /api/v1/machines/<machineId>/sessions?since=… if you did not pass a ref) and read messages.
  4. If 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.

Deploying & mapping (typical flow)

  1. Pull /api/v1/customers and map your clients/sites to Helios customers/locations.
  2. To deploy, pull /api/v1/customers/{id}/install?location=… and run the returned command on the target; capture the printed HeliosMachineId.
  3. Store that id against your agent, and build the remote button on /api/v1/remote/connect-url?id=<machineId>.

Building the remote-access button

  1. Generate a key in Helios (Integration → Helios API).
  2. Once, pull /api/v1/machines and store each machine's machineId against the matching agent in your system (match by hostname).
  3. For the button, call /api/v1/remote/connect-url?id=<machineId> and open the returned url.