Skip to content

What the engine suggested and what became of it

GET
/strategy/decisions
curl --request GET \
--url 'https://api.flotera.com/api/v1/strategy/decisions?status=suggested' \
--cookie __Host-erm_session=<__Host-erm_session>

Newest first. Each entry carries the price before and after, the market point it aimed at, and a snapshot of the market it was computed from — a week later the market is different, and the decision still has to be explainable by what was visible then.

The engine only ever SUGGESTS. Nothing is sent to a marketplace on its own: the path from a computed price to a real machine cannot be verified until an agent runs on one.

status
string
Allowed values: suggested applied dismissed rolled_back

Decision feed.

Media typeapplication/json
object
decisions
required
Array<object>
<= 200 items
object
id
required

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

string format: uuid
server_id
required

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

string format: uuid
policy_id
Any of:

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

string format: uuid
marketplace
required

Supported marketplace. The database constrains the same two values, so a third one is a migration rather than a new string.

string
Allowed values: vast clore
status
required
string
Allowed values: suggested applied dismissed rolled_back
previous_usd_per_gpu_hour

Price before. Null means it was unknown — which is not the same as zero: unknown makes any target a change, zero would mean the server was being given away.

string | null
/^-?[0-9]+(\.[0-9]{1,6})?$/
target_usd_per_gpu_hour
required

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

string
/^-?[0-9]+(\.[0-9]{1,6})?$/
anchor
required

Which point of the market the target price was derived from.

string
Allowed values: undercut_p25 median premium_p75
market_snapshot

The market as it looked when this was computed.

object
key
additional properties
any
created_at
required

RFC 3339 UTC with microsecond precision.

string format: date-time
resolved_at

RFC 3339 UTC with microsecond precision, or null.

string | null format: date-time
Example
{
"decisions": [
{
"marketplace": "vast",
"status": "suggested",
"target_usd_per_gpu_hour": "12.340000",
"anchor": "undercut_p25",
"created_at": "2026-07-25T10:15:30.123456Z"
}
]
}

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"
}

A dependency the endpoint needs is not configured or is temporarily unavailable (code=unavailable). The rest of the API keeps working — an absent external integration must not take the service down.

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"
}