Skip to content

Stop keeping this server on a rental platform

DELETE
/servers/{server_id}/platforms/{marketplace}
curl --request DELETE \
--url https://api.flotera.com/api/v1/servers/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/platforms/vast \
--cookie __Host-erm_session=<__Host-erm_session>

Drops the intent and the platform’s section of the last check report. Nothing is uninstalled and no marketplace link is touched: an agent that was installed on the host stays installed, and a linked machine stays linked. Removing here says “stop tracking this platform on this server”, which is a smaller claim than “undo it”, and conflating the two would let a stray click detach a machine that is currently earning.

Idempotent: removing a platform that is not there is not an error.

server_id
required

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

Marketplace identifier. Closed set: adding one is a migration, not a new string, because the database constrains the same two values.

Idempotency-Key
string
>= 1 characters <= 128 characters /^[\x21-\x7E]{1,128}$/

Idempotency key, 1–128 ASCII, unique per (tenant_id, operation, key) for at least 24 hours. Retrying with the same body replays the stored response; a different body returns 409 idempotency_conflict.

Platform no longer kept on this server.

Media typeapplication/json

Which rental platforms the owner keeps on this server, keyed by platform name. Always present: {} is a knowable state (“none added”), not missing information, which is why this field has no null. Keyed rather than a list, for two reasons that both showed up before the first line of UI. A list admits two entries for one platform and the bug surfaces as a duplicated tile; a key cannot. And a partial write addresses {vast}, a path that stays valid, where a list index shifts the moment somebody removes a platform — two operators adding platforms at once would lose one of the two writes. Order is not stored because order is presentation: the host system first, then by added_at, which each entry carries. The host system is deliberately absent here. It is not added and cannot be removed, so it has no intent to record; it appears only in platform_report, where having it in the same shape as the platforms is what lets one renderer draw both.

object
vast

One platform on one server. Deliberately thin: everything observed about the platform — is its agent installed, which version, what machine id — belongs to platform_report, because it is measured rather than decided, and re-measuring must never be able to damage what the owner decided.

object
added_at
required

RFC 3339 UTC with microsecond precision.

string format: date-time
added_by
Any of:

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

string format: uuid
clore

One platform on one server. Deliberately thin: everything observed about the platform — is its agent installed, which version, what machine id — belongs to platform_report, because it is measured rather than decided, and re-measuring must never be able to damage what the owner decided.

object
added_at
required

RFC 3339 UTC with microsecond precision.

string format: date-time
added_by
Any of:

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

string format: uuid
Example
{
"vast": {
"added_at": "2026-07-25T10:15:30.123456Z"
},
"clore": {
"added_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"
}

Resource does not exist in this tenant. Foreign identifiers also return 404 (anti-enumeration).

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