Machines of the connected account, ranked against one server
const url = 'https://api.flotera.com/api/v1/marketplaces/links/candidates?server_id=2489E9AD-2EE2-8E00-8EC9-32D5F69181C0&marketplace=vast';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/marketplaces/links/candidates?server_id=2489E9AD-2EE2-8E00-8EC9-32D5F69181C0&marketplace=vast' \ --cookie __Host-erm_session=<__Host-erm_session>Asks the marketplace which machines the account owns and says, for each of them, which facts about this server they agree on.
This endpoint exists because automatic binding turned out to be impossible for the reason nobody expected: the platform does not hand the host its machine number. On Vast the file that looks like it holds one holds machine_api_key instead, and the number arrives from their server at registration and is never written down. So the number is known only to the platform, and the only way to get it is to ask.
What comes back is evidence, not a score. A percentage cannot be checked by the person reading it; “hostname, address and GPU agree, the disk does not” can. The count is there to order the list, and the choice stays with the operator — suggested highlights a row, it never binds anything.
The platform is queried live, without a cache: this is a rare, human-initiated action, and a list served from yesterday would offer to bind a machine the owner has already removed.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”The server the candidates are ranked against.
Responses
Section titled “Responses”Candidates, strongest first.
object
object
Card occupancy, one character per card, exactly as the platform prints it. Undocumented on their side, so a string whose length disagrees with the card count means “not understood” and the card map is not drawn at all — an invented layout is worse than none.
Already bound to this server. Null means the machine is free to take.
Facts that agree, one by one. A missing fact on either side never counts as a match: otherwise two machines nobody knows anything about would look more alike than any real pair.
object
Model and count together — the model alone means little across a fleet of identical cards.
Compared with a wide tolerance: the platform advertises the space it sells, not the size of the drive.
Compared by the SIZE of the range, not its bounds. Two machines behind one router cannot share a range, which would make this the strongest fact of the five — but the platform reports only how many ports a machine has, so neighbours with equally sized ranges stay indistinguishable here.
How many facts agree. Ordering only — the decision is the operator’s, and a number cannot be checked by the person reading it.
Enough evidence to highlight the row. Three agreeing facts, not two: hostname and public address are shared by every machine of one owner behind one NAT, so on their own they cannot tell neighbours apart. Highlighting is all it does — nothing is bound without a click.
What this side knew about the server while comparing. Shown next to the list, because a list where nothing matches has two very different explanations — the machine is not there, or we know nothing about our own server — and they are indistinguishable from the candidates alone.
object
Card occupancy, one character per card, exactly as the platform prints it. Undocumented on their side, so a string whose length disagrees with the card count means “not understood” and the card map is not drawn at all — an invented layout is worse than none.
Examplegenerated
{ "candidates": [ { "external_machine_id": "example", "hostname": "example", "gpu": "example", "gpu_count": 1, "gpu_occupancy": "example", "linked_server_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "evidence": { "hostname": true, "public_ip": true, "gpu": true, "disk": true, "ports": true }, "matched": 1, "suggested": true } ], "known": { "hostname": "example", "public_ip": "example", "gpu": "example", "gpu_count": 1, "gpu_occupancy": "example", "disk_gb": 1, "port_range": "example" }}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"}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).
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"}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"}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.
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"}