Skip to main content

Enrollment

In order to connect to a supported server artemis must use an enrollment secret. Once a remote server accepts the enrollment request it should generate a node_key for the endpoint.
When artemis receives the node_key, it will use the node_key instead of the enrollment secret for all future communications with the remote server.

Enrollment Request

The artemis daemon expects a server.toml file in order to start the enrollment process. You may provide an optional path to the TOML file, otherwise artemis will search for a TOML file in the current directory.
The server.toml file should contain the following fields:

  • url: Remote server URL
  • port: Port number to communicate with
  • ignore_ssl: Boolean value if artemis should ignore self signed SSL certs
  • enrollment: The remote URI artemis should use to enrollment the endpoint. There should be no forward slash at the beginning.
  • config: The remote URI artemis should to request a daemon configuration for the endpoint. There should be no forward slash at the beginning.
  • collections: The remote URI artemis should use to request collection jobs. There should be no forward slash at the beginning.
  • version: Remote server version
  • key: The enrollment secret

All fields are required.

An example server.toml file is below:

[server]
url = "http://127.0.0.1"
port = 8000
ignore_ssl = false
enrollment = "endpoint/enroll"
collections = "endpoint/collections"
config = "endpoint/config"
version = 1
key = "my key"

Enrollment Payload

Once artemis reads the server.toml file, it will try to enroll to the remote server. It will try 8 attempts to enroll to the server. The remote server enrollment URI should be a combination of the enrollment URI and the remote server version.
Example: /v1/endpoint/enrollment. If the version field was 2 then the URI would be /v2/endpoint/enrollment

After each failed enrollment attempt it will pause for 6 seconds and then try again.

Each enrollment attempt it will send the following POST request to the enrollment URI

{
"enroll_key": "pre-shared enrollment secret",
"endpoint_uuid": "UUID generated by the endpoint",
"info": "basic systeminfo about the endpoint",
}

The info object is the systeminfo artifact for the endpoint. It will always contain the following info:

/**
* Systeminfo is a collection of metadata about the endpoint
*/
export interface SystemInfo {
/**Boot time for endpoint */
boot_time: string;
/**Endpoint hostname */
hostname: string;
/**Endpoint OS version */
os_version: string;
/**Uptime of endpoint */
uptime: number;
/**Endpoint kernel version */
kernel_version: string;
/**Endpoint platform */
platform: string;
/**CPU information */
cpu: Cpus[];
/**Disks information */
disks: Disks[];
/**Memory information */
memory: Memory;
/**Performance information */
performance: LoadPerformance;
/**Array of network interfaces on the endpoint */
interfaces: NetworkInterface[];
/**Artemis version number */
version: string;
/**Rust version used to compile artemis*/
rust_version: string;
/**Artemis binary build date */
build_date: string;
}

/**
* CPU information on endpoint
*/
export interface Cpus {
/**CPU frequency */
frequency: number;
/**CPU usage on endpoint */
cpu_usage: number;
/**Name of CPU */
name: string;
/**Vendor ID for CPU */
vendor_id: string;
/**CPU brand */
brand: string;
/**Core Count */
physical_core_count: number;
}

/**
* Disk information on endpoint
*/
export interface Disks {
/**Type of disk */
disk_type: string;
/**Filesystem for disk */
file_system: string;
/**Disk mount point */
mount_point: string;
/**Disk storage */
total_space: number;
/**Storage remaining */
available_space: number;
/**If disk is removable */
removable: boolean;
}

/**
* Memory information on endpoint
*/
export interface Memory {
/**Available memory on endpoint */
available_memory: number;
/**Free memory on endpoint */
free_memory: number;
/**Free swap on endpoint */
free_swap: number;
/**Total memory on endpoint */
total_memory: number;
/**Total swap on endpoint */
total_swap: number;
/**Memory in use */
used_memory: number;
/**Swap in use */
used_swap: number;
}

/**
* Average CPU load. These values are always zero (0) on Windows
*/
export interface LoadPerformance {
/**Average load for one (1) min */
avg_one_min: number;
/**Average load for five (5) min */
avg_five_min: number;
/**Average load for fifteen (15) min */
avg_fifteen_min: number;
}

export interface NetworkInterface {
/**IP address for the endpoint */
ip: string;
/**MAC address for the network interface */
mac: string;
/**Name of the network interface */
name: string;
}

Example enrollment payload:

{
"enroll_key": "my key",
"endpoint_uuid": "78db64c9-6cce-4e20-9da5-1525b449546a",
"info": {
"boot_time": "2025-05-23T00:33:39.000Z",
"hostname": "fedora",
"os_version": "41",
"uptime": 2168893,
"kernel_version": "6.8.11-300.fc40.x86_64",
"platform": "Fedora Linux",
"cpu": [
{
"frequency": 1100,
"cpu_usage": 0,
"name": "cpu0",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1100,
"cpu_usage": 0,
"name": "cpu1",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1099,
"cpu_usage": 0,
"name": "cpu2",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 3082,
"cpu_usage": 0,
"name": "cpu3",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1100,
"cpu_usage": 0,
"name": "cpu4",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 3044,
"cpu_usage": 0,
"name": "cpu5",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1042,
"cpu_usage": 0,
"name": "cpu6",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1041,
"cpu_usage": 0,
"name": "cpu7",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1100,
"cpu_usage": 0,
"name": "cpu8",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 2701,
"cpu_usage": 0,
"name": "cpu9",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 3087,
"cpu_usage": 0,
"name": "cpu10",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1196,
"cpu_usage": 0,
"name": "cpu11",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1057,
"cpu_usage": 0,
"name": "cpu12",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 3087,
"cpu_usage": 0,
"name": "cpu13",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1100,
"cpu_usage": 0,
"name": "cpu14",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1039,
"cpu_usage": 0,
"name": "cpu15",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 800,
"cpu_usage": 0,
"name": "cpu16",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 800,
"cpu_usage": 0,
"name": "cpu17",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 800,
"cpu_usage": 0,
"name": "cpu18",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 2559,
"cpu_usage": 0,
"name": "cpu19",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 800,
"cpu_usage": 0,
"name": "cpu20",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 800,
"cpu_usage": 0,
"name": "cpu21",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1953,
"cpu_usage": 0,
"name": "cpu22",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1239,
"cpu_usage": 0,
"name": "cpu23",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 799,
"cpu_usage": 0,
"name": "cpu24",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 2408,
"cpu_usage": 0,
"name": "cpu25",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 1329,
"cpu_usage": 0,
"name": "cpu26",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 894,
"cpu_usage": 0,
"name": "cpu27",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 799,
"cpu_usage": 0,
"name": "cpu28",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 2105,
"cpu_usage": 0,
"name": "cpu29",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 2458,
"cpu_usage": 0,
"name": "cpu30",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
},
{
"frequency": 2257,
"cpu_usage": 0,
"name": "cpu31",
"vendor_id": "GenuineIntel",
"brand": "13th Gen Intel(R) Core(TM) i9-13900K",
"physical_core_count": 24
}
],
"disks": [
{
"disk_type": "SSD",
"file_system": "btrfs",
"mount_point": "/",
"total_space": 5511343767552,
"available_space": 4759073714176,
"removable": false
},
{
"disk_type": "SSD",
"file_system": "ext4",
"mount_point": "/boot",
"total_space": 1020702720,
"available_space": 508649472,
"removable": false
},
{
"disk_type": "SSD",
"file_system": "btrfs",
"mount_point": "/home",
"total_space": 5511343767552,
"available_space": 4759073714176,
"removable": false
},
{
"disk_type": "SSD",
"file_system": "vfat",
"mount_point": "/boot/efi",
"total_space": 627875840,
"available_space": 607563776,
"removable": false
}
],
"memory": {
"available_memory": 114707030016,
"free_memory": 77085532160,
"free_swap": 8589930496,
"total_memory": 134865072128,
"total_swap": 8589930496,
"used_memory": 20158042112,
"used_swap": 0
},
"interfaces": [
{
"ip": "10.140.193.26",
"mac": "00:00:00:00:00:00",
"name": "wg0-mullvad"
},
{
"ip": "fe80::c1f8:451f:35b9:29ce",
"mac": "00:00:00:00:00:00",
"name": "wg0-mullvad"
},
{
"ip": "fc00:bbbb:bbbb:bb01:d:0:c:c11a",
"mac": "00:00:00:00:00:00",
"name": "wg0-mullvad"
},
{
"ip": "192.168.1.133",
"mac": "04:7c:16:49:b0:38",
"name": "enp4s0"
},
{
"ip": "2601:140:827f:9159:d745:92fa:8cd:44b",
"mac": "04:7c:16:49:b0:38",
"name": "enp4s0"
},
{
"ip": "fda9:dfeb:d274:0:4044:e997:e74d:1b56",
"mac": "04:7c:16:49:b0:38",
"name": "enp4s0"
},
{
"ip": "fda9:dfeb:d274::a2a",
"mac": "04:7c:16:49:b0:38",
"name": "enp4s0"
},
{
"ip": "fe80::ccb:fed3:57a3:59b8",
"mac": "04:7c:16:49:b0:38",
"name": "enp4s0"
},
{
"ip": "2601:140:827f:9159::a2a",
"mac": "04:7c:16:49:b0:38",
"name": "enp4s0"
},
{
"ip": "127.0.0.1",
"mac": "00:00:00:00:00:00",
"name": "lo"
},
{
"ip": "::1",
"mac": "00:00:00:00:00:00",
"name": "lo"
}
],
"performance": {
"avg_one_min": 4.34,
"avg_five_min": 3.84,
"avg_fifteen_min": 2.29
},
"version": "0.15.0",
"rust_version": "1.87.0",
"build_date": "2025-06-17"
}
}

Enrollment Response

The artemis daemon expects a response containing the following:

{
"endpoint_id": "a unique ID for our endpoint",
"endpoint_invalid": "boolean value to indicate if current endpoint_id is invalid"
}

An example response is below:

{
"endpoint_id": "3c42b534-107a-4182-b195-04ddcbac9c87",
"endpoint_invalid": false
}