Price a plan change without ordering it
const url = 'https://api.flotera.com/api/v1/subscription/quote?plan=example';const options = { method: 'GET', headers: {cookie: '__Host-erm_session=<__Host-erm_session>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.flotera.com/api/v1/subscription/quote?plan=example' \ --cookie __Host-erm_session=<__Host-erm_session>The gate of 14 §3.2: one day of the target plan at the current fleet
size, checked against the current balance. No consumption
projection is involved. billing_effective_day follows the target
plan’s change policy (same UTC day for upgrades by default).
Only an upgrade is gated. A downgrade is never blocked by balance —
moving to a cheaper plan is exactly what a tenant short on money needs
(14 §3.3), so covered is true for downgrade and lateral
regardless of the balance.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Internal catalog code. Not the public label — labels are not unique.
Target plan code from GET /plans.
Responses
Section titled “Responses”Quote.
object
Internal catalog code. Not the public label — labels are not unique.
Computed from effective prices only, never from plan names. Only upgrade is gated by balance.
Decimal string or null when unknown.
Monthly price divided by the days in the current month (D-03).
unit_daily_rate_usd × managed_servers; 0 when not gated.
Decimal value serialized as a string, never a JSON number.
Always true for downgrade and lateral. For upgrade it is balance_usd >= required_reserve_usd; a false value is an offer to top up, not a refusal.
fleet.servers.max of the target plan; null — unlimited.
UTC calendar day.
RFC 3339 UTC with microsecond precision.
Example
{ "direction": "upgrade", "required_reserve_usd": "12.340000", "balance_usd": "12.340000", "quoted_at": "2026-07-25T10:15:30.123456Z"}Missing/invalid credentials (code=unauthorized).
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}The target plan is contract-priced, so a self-service quote is impossible (code=feature_not_entitled), or the caller lacks the scope (code=forbidden).
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}Resource does not exist in this tenant. Foreign identifiers also return 404 (anti-enumeration).
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}The tenant has no plan assignment yet (code=plan_required).
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}Request failed validation (code=validation_failed), with per-field errors.
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}