Skip to content

Server fleet with filters and presence

GET
/servers
curl --request GET \
--url 'https://api.flotera.com/api/v1/servers?limit=50&presence=online' \
--cookie __Host-erm_session=<__Host-erm_session>

Paginated view over the versioned fleet snapshot (dash:v1:{tenant}:servers:{filter_hash}, 60 s). Presence comes from the presence read model, vitals from latest telemetry.

cursor
string
>= 1 characters <= 512 characters

Opaque pagination cursor from a previous next_cursor.

limit
integer
default: 50 >= 1 <= 200

Page size.

presence

Presence read model over the agent’s WebSocket session (the channel commands travel on): suspect after 60 s without a heartbeat, offline after 300 s. HTTPS-only liveness (agent hello) never makes a server online.

string
Allowed values: online suspect offline
fsm_state
string
<= 64 characters
marketplace
string
<= 64 characters
group_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
tag
string
<= 128 characters

Exact tag match (key or key:value).

q
string
<= 128 characters

Substring match on server name/hostname.

If-None-Match
string
<= 256 characters

Return 304 Not Modified when the entity tag still matches.

Page of servers over a consistent snapshot.

Media typeapplication/json
object
generated_at
required

When this snapshot was computed.

string format: date-time
data_as_of
required

Source watermark the snapshot is based on.

string format: date-time
version
required

Snapshot form version (cache-shape version).

integer
stale
required

True when serving stale-while-revalidate data.

boolean
stale_reason
string | null
<= 256 characters
items
required
Array<object>
<= 200 items

One fleet-list row (config + presence + latest vitals).

object
id
required

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
name
required
string
<= 128 characters
agent_version

Null until an agent registers on the server.

string | null
<= 32 characters
gpu_count
required
integer
gpu_model
required
string
<= 128 characters
fsm_state
required

Historical field. The server FSM it was meant to carry has no writer anywhere in the system, so this is always new; read maintenance for what the owner declared, and the marketplace link for a rental or a listing. Kept in the response so existing clients do not break.

string
<= 32 characters
maintenance
One of:

The owner’s declaration that the machine is out of service. Absent on a machine in service — a machine is not «not under maintenance», it just works, and an object of nulls would say otherwise.

object
since
required

When it was declared; repeating the declaration keeps it.

string format: date-time
reason
string | null
<= 256 characters
presence
required

Presence read model over the agent’s WebSocket session (the channel commands travel on): suspect after 60 s without a heartbeat, offline after 300 s. HTTPS-only liveness (agent hello) never makes a server online.

string
Allowed values: online suspect offline
marketplace

Active marketplace assignment; null when unassigned.

string | null
<= 32 characters
price_usd_gpu_h

Decimal string or null when unknown.

string | null
/^-?[0-9]+(\.[0-9]{1,6})?$/
health
string | null
<= 32 characters
last_seen_at

Last WebSocket heartbeat of the agent session — the same source presence is derived from, so the two never disagree. Null until the command channel comes up at least once; an agent that only reaches the core over HTTPS (hello) does not move this field.

string | null format: date-time
revenue_today_usd
required

Decimal value serialized as a string, never a JSON number.

string
/^-?[0-9]+(\.[0-9]{1,6})?$/
max_temp_core_c
number | null
max_temp_hotspot_c
number | null
max_temp_vram_c
number | null
max_fan_pct
number | null
avg_util_pct

Average GPU utilization percentage over the server’s GPUs.

string | null
/^-?[0-9]+(\.[0-9]{1,6})?$/
group_id
Any of:

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
tags
required

key or key:value tags; empty until any tag is set.

Array<string>
<= 64 items
gpu_vitals
Array<object>
<= 128 items

One per-GPU vitals sample for the fleet Temp/Fan bars, ordered by GPU index.

object
temp_c
number | null
fan_pct
number | null
next_cursor
required

Opaque cursor for the next page; null when there are no more rows.

string | null
>= 1 characters <= 512 characters
Example
{
"generated_at": "2026-07-25T10:15:30.123456Z",
"data_as_of": "2026-07-25T10:15:30.123456Z",
"items": [
{
"presence": "online",
"revenue_today_usd": "12.340000"
}
]
}
ETag
string
<= 256 characters

Entity tag of the returned snapshot/resource version.

Not modified; the cached representation is still valid.

Missing/invalid credentials (code=unauthorized).

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}

Authenticated but not permitted. code=forbidden — role/scope mismatch; code=feature_not_entitled — the plan does not include the capability; code=account_frozen — the account is frozen and this operation is declared x-ermeon-frozen: deny. The three are deliberately distinct: only the last one is fixed by a top-up (13 §5.6).

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}

Request failed validation (code=validation_failed), with per-field errors.

Media typeapplication/problem+json

RFC 9457 problem document with a stable machine code.

object
type
required
string format: uri
title
required
string
<= 256 characters
status
required
integer
>= 100 <= 599
code
required

Stable machine-readable error code (03 §2.4).

string
Allowed values: unauthorized forbidden csrf_rejected not_found conflict idempotency_conflict validation_failed rate_limited payload_too_large unsupported_agent_version temporarily_unavailable offline_queue_full online_queue_full plan_required server_limit_reached feature_not_entitled account_in_grace account_frozen payment_pending payment_expired payment_amount_mismatch change_already_pending change_already_applied change_effective reserve_not_covered direction_changed
detail
string
<= 2048 characters
instance
string
<= 512 characters
request_id

UUID (v7 for new entities; v4 accepted during migration).

string format: uuid
errors
Array<object>
<= 100 items
object
path
required

JSON Pointer to the offending field.

string
<= 512 characters
code
required
string
<= 64 characters
Example
{
"type": "https://ermeon.com/problems/validation",
"code": "unauthorized"
}