Skip to content

Where a policy would put the price

POST
/strategy/simulate
curl --request POST \
--url https://api.flotera.com/api/v1/strategy/simulate \
--header 'Content-Type: application/json' \
--cookie __Host-erm_session=<__Host-erm_session> \
--data '{ "preset": "max_profit", "offset_fraction": "example", "max_usd_per_gpu_hour": "example", "gpu_model": "example", "marketplace": "vast" }'

A pure what-if over the live market: nothing is written and the policy need not exist yet. Returns the engine’s own verdict — including its refusals — plus where the resulting price would land among current offers.

It deliberately returns no expected revenue or occupancy. Both would need a demand-elasticity model that neither this platform nor the marketplaces provide; a number in their place would be a promise presented as a calculation. offers_below answers the same question with something measurable.

Media typeapplication/json
object
preset
required
string
Allowed values: max_profit max_utilization mining_first long_rentals_only balanced custom
offset_fraction

A FRACTION, not a percent: 0.10 means ten percent above the anchor. Range -0.9 .. 10.0. Omitted means no offset.

string
max_usd_per_gpu_hour

Price ceiling. Omitted or empty means none.

string
nullable
gpu_model
required

Normalised server-side, so vendor prefixes are accepted.

string
<= 64 characters
marketplace
required
string
Allowed values: vast clore

The verdict and the placement.

Media typeapplication/json
object
outcome
required

The engine’s verdict. Four of the five are refusals, and they are the point: a pricing system that always has an answer is one that invents. thin_market means fewer offers than min_offers_for_pricing — a median over a handful of offers moves tens of percent when one seller leaves.

The engine’s sixth outcome, no_change, cannot occur here: it compares against a specific server’s CURRENT price, and a simulation has no server. It belongs to the decisions feed.

string
Allowed values: price thin_market no_market_data no_prices unsupported
target_usd_per_gpu_hour

Decimal string. Present only when outcome is price.

string
nullable
anchor

Which point of the market the preset aims at.

string
nullable
Allowed values: undercut_p25 median premium_p75
needs

What the preset is missing when outcome is unsupported — named explicitly, because “no suggestion” reads as “nothing to change”.

string
nullable
offers
required

Offers with a price on this marketplace for this model.

integer format: int64
offers_below

How many of them would be strictly cheaper than the target. Counted over the offers themselves, never interpolated between quartiles — an interpolated percentile is invented precision that reads as a measurement.

integer format: int64
nullable
p25_usd_per_gpu_hour
string
nullable
median_usd_per_gpu_hour
string
nullable
p75_usd_per_gpu_hour
string
nullable
min_offers_for_pricing
required

The threshold below which the engine refuses to price. Returned so the panel need not keep a second copy of the constant.

integer format: int64
Example
{
"outcome": "price",
"anchor": "undercut_p25"
}

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

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