The Servers API covers the full rental lifecycle: browsing the marketplace, reserving ordered machines, managing active rentals, and organizing servers into team pools. Use these endpoints to list available servers, rent or extend a server, monitor runtime metrics, and manage pool membership.
All endpoints are scoped to the control plane at https://api.hoody.com and require a valid JWT token in the Authorization header.
Ceiling on the TOTAL debit (rent + any one-time setup fee). REQUIRED for every paid reservation, not only ones carrying a setup fee. Compute it as pricing_rules[days] plus setup_fee_rules[days] when that key is present, else setup_fee_cents. A present override wins even when it is 0. If you get a 409, that error’s data carries the authoritative total_cents for the duration you asked for.
idempotency_key
string
Yes
Caller-generated. Replaying it returns the original reservation, unpaid twice.
pool_id
string
No
Must be a pool you own. Defaults to your default pool.
The listing is no longer active because it was withdrawn. Withdrawing an offer never affects reservations that were already placed against it.
Re-read GET /api/v1/offers and present what is currently purchasable.
OUT_OF_STOCK
Offer is sold out
Stock is exhausted. Also returned when another customer took the last unit a moment earlier — nothing was charged.
Re-read GET /api/v1/offers; the offer may return to stock later.
IDEMPOTENCY_INTENT_MISMATCH
Idempotency key reused for a different purchase
The supplied idempotency_key was already used for a reservation with different terms. Returning the original would silently give the caller something other than what this request asked for, so it fails instead.
Use a fresh idempotency_key for a genuinely new purchase.
SETUP_FEE_CONFIRMATION_REQUIRED
One-time setup fee must be confirmed
This machine carries a one-time setup fee. The request omitted max_charge_cents, so the total was never confirmed and nothing was charged.
Read the totals in this error’s data, show them to the customer, then retry with max_charge_cents set to data.total_cents. Do not compute the total yourself.
CHARGE_CONFIRMATION_REQUIRED
The total must be confirmed before money moves
The request would debit an account and carried no max_charge_cents. Nothing was charged. Applies to every paid purchase, including servers with no one-time setup fee.
Read the current total, show it to the customer, and retry with max_charge_cents set to the value they confirmed. Never auto-retry with the total from this error.
CHARGE_EXCEEDS_MAX
Price changed since the quote
The live total is higher than the max_charge_cents ceiling supplied with the request, so nothing was charged.
Re-read the listing, show the user the new total, and retry with an updated max_charge_cents once they confirm. Do NOT auto-retry with the returned actual value.
{
"statusCode":500,
"error":"PRICING_INVALID",
"message":"Server pricing is misconfigured and cannot be charged. Please contact support."
}
Error Code
Title
Description
Resolution
PRICING_INVALID
Stored pricing is misconfigured
The server’s stored pricing did not pass validation when the charge was attempted. The request fails closed and nothing is charged.
This server cannot be rented until its pricing is corrected. Please contact support. Retrying beforehand cannot succeed.
Get live CPU/memory/disk usage for a rented server or subserver. Served from a short-TTL cache so it can be polled frequently. First-party JWT only. Physical scope requires the server to have no subservers; a shared or system host returns 409. Subserver scope may be disabled on this deployment.
The rental’s CURRENT rental_end, exactly as the API returned it. The extension is applied only if it still matches, so a retried request is refused with 409 EXTENSION_ALREADY_APPLIED instead of charging and extending a second time. Re-read the rental before retrying; never resend blindly.
additional_days
integer
Yes
Number of additional days to extend the rental (must match server pricing durations, max 3650).
max_charge_cents
integer
No
The total you confirmed, in whole cents. The extension is refused if it would cost more. REQUIRED when the rental has no frozen renewal price (409 CHARGE_CONFIRMATION_REQUIRED). Optional when the rental still carries frozen tiers, which are themselves a ceiling.
"message":"This rental has already been extended. Re-read it and confirm the new total before extending again.",
"data":{
"rental_id":"507f1f77bcf86cd799439320",
"rental_end":"2026-09-01T00:00:00.000Z",
"expected_rental_end":"2026-08-01T00:00:00.000Z"
}
}
Error Code
Title
Description
Resolution
EXTENSION_ALREADY_APPLIED
That extension has already been applied
The rental’s end date no longer matches the expected_rental_end sent with the request, so the extension was not applied again. Nothing was charged.
Re-read the rental. If its end date already reflects the extension you wanted, you are done. Otherwise retry with expected_rental_end set to the value you just read. Never retry with the original value.
CHARGE_CONFIRMATION_REQUIRED
The total must be confirmed before money moves
The request would debit an account and carried no max_charge_cents. Nothing was charged.
Read the current total, show it to the customer, and retry with max_charge_cents set to the value they confirmed. Never auto-retry with the total from this error.
CHARGE_EXCEEDS_MAX
Price changed since the quote
The live total is higher than the max_charge_cents ceiling supplied with the request, so nothing was charged.
Re-read the listing, show the user the new total, and retry with an updated max_charge_cents once they confirm. Do NOT auto-retry with the returned actual value.
Rent an available in-stock server for a specified duration. Some servers carry a one-time setup fee charged only on this first payment (never on extension); when they do, the request must confirm the total via max_charge_cents.
Number of days to rent (must match server pricing durations, max 3650).
max_charge_cents
integer
No
Ceiling on the TOTAL debit (rental price + one-time setup fee), in integer cents. REQUIRED for every paid rental. Omitting it returns 409 CHARGE_CONFIRMATION_REQUIRED, or 409 SETUP_FEE_CONFIRMATION_REQUIRED when the server also carries a one-time fee. Only a total of zero needs no ceiling. If the live total exceeds this ceiling the request is rejected with 409 CHARGE_EXCEEDS_MAX. A ceiling (not an exact match) so a price DROP still succeeds. Read it from pricing.price_tiers[rental_days].total_first_payment.
The wallet balance is below the total required for this rental. The response data breaks the total down into rental_cents, setup_fee_cents, required_cents and available_cents.
Top up the wallet to at least required_cents, then retry.
INVALID_DURATION
Rental duration not offered
rental_days must match a duration the server actually prices. There is no interpolation: 5 days is unrentable unless a “5” tier exists.
Pick one of pricing.available_durations and retry.
NO_PRICING
Server has no pricing configured
The server has no pricing row, or none covering the requested duration.
Choose a different server, or contact support to have pricing configured for it.
{
"statusCode":409,
"error":"SERVER_UNAVAILABLE",
"message":"Server not available for rental"
}
Error Code
Title
Description
Resolution
SERVER_UNAVAILABLE
Server not available for rental
The server is not rentable: it is already rented, not ready, or not offered for rental. Also returned when a concurrent request won the race for it.
Re-read GET /api/v1/servers/available and pick a currently available server.
SETUP_FEE_CONFIRMATION_REQUIRED
One-time setup fee must be confirmed
This machine carries a one-time setup fee. The request omitted max_charge_cents, so the total was never confirmed and nothing was charged.
Read the totals in this error’s data, show them to the customer, then retry with max_charge_cents set to data.total_cents. Do not compute the total yourself.
CHARGE_CONFIRMATION_REQUIRED
The total must be confirmed before money moves
The request would debit an account and carried no max_charge_cents. Nothing was charged. Applies to every paid purchase, including servers with no one-time setup fee.
Read the current total, show it to the customer, and retry with max_charge_cents set to the value they confirmed. Never auto-retry with the total from this error.
CHARGE_EXCEEDS_MAX
Price changed since the quote
The live total is higher than the max_charge_cents ceiling supplied with the request, so nothing was charged.
Re-read the listing, show the user the new total, and retry with an updated max_charge_cents once they confirm. Do NOT auto-retry with the returned actual value.
{
"statusCode":500,
"error":"PRICING_INVALID",
"message":"Server pricing is misconfigured and cannot be charged. Please contact support."
}
Error Code
Title
Description
Resolution
PRICING_INVALID
Stored pricing is misconfigured
The server’s stored pricing did not pass validation when the charge was attempted. The request fails closed and nothing is charged.
This server cannot be rented until its pricing is corrected. Please contact support. Retrying beforehand cannot succeed.