Skip to content
Hoody.com

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.

Browse machines available for immediate rental and machines that can be ordered with a delivery lead time.

Browse machines available to order. These are servers that are not in stock but can be reserved with a delivery lead time (1..720 hours).

Terminal window
curl -X GET "https://api.hoody.com/api/v1/offers" \
-H "Authorization: Bearer <token>"

Browse the rental marketplace and filter available in-stock servers.

NameInTypeRequiredDescription
countryquerystringNoFilter by country code (e.g., US, DE)
regionquerystringNoFilter by region (e.g., us-east, eu-central)
max_price_per_dayquerynumberNoMaximum price per day in USD
available_durationsqueryarrayNoFilter servers that support these rental durations (days)
min_cpu_coresquerynumberNoMinimum CPU cores
min_cpu_scorequerynumberNoMinimum CPU benchmark score
cpu_score_typequerystringNoCPU benchmark type for score filtering. One of passmark, geekbench_single, geekbench_multi
min_ram_gbquerynumberNoMinimum RAM in GB
ram_typesqueryarrayNoFilter by RAM types
min_total_storage_gbquerynumberNoMinimum total storage in GB
disk_typesqueryarrayNoFilter servers with these disk types
min_bandwidth_mbpsquerynumberNoMinimum network bandwidth in Mbps
min_traffic_tbquerynumberNoMinimum monthly traffic allowance in TB
unlimited_traffic_onlyquerybooleanNoShow only servers with unlimited traffic
categoryquerystringNoFilter by server category. One of compute, memory, storage, general, gpu
featured_onlyquerybooleanNoShow only featured servers
Terminal window
curl -X GET "https://api.hoody.com/api/v1/servers/available?country=US&min_cpu_cores=32&featured_only=true" \
-H "Authorization: Bearer <token>"

Manage reservations against offers (machines not in stock but orderable with a lead time).

List your reservations.

NameInTypeRequiredDescription
limitqueryintegerNoMaximum number of results to return. Default: 50
offsetqueryintegerNoNumber of results to skip. Default: 0
Terminal window
curl -X GET "https://api.hoody.com/api/v1/reservations?limit=20&offset=0" \
-H "Authorization: Bearer <token>"

Retrieve a single reservation by ID.

NameInTypeRequiredDescription
idpathstringYesReservation ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/reservations/507f1f77bcf86cd799439400" \
-H "Authorization: Bearer <token>"

Reserve an offer. Charges immediately.

NameInTypeRequiredDescription
idpathstringYesOffer ID
NameTypeRequiredDescription
daysnumberYesMust be one of the offer’s pricing_rules keys.
max_charge_centsnumberNoCeiling 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_keystringYesCaller-generated. Replaying it returns the original reservation, unpaid twice.
pool_idstringNoMust be a pool you own. Defaults to your default pool.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/offers/507f1f77bcf86cd799439050/reserve" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"days": 30,
"max_charge_cents": 27500,
"idempotency_key": "reserve-2025-01-21-abc123",
"pool_id": "507f1f77bcf86cd799439300"
}'

Manage active and historical rentals.

List all rentals for the authenticated user.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/rentals" \
-H "Authorization: Bearer <token>"

Retrieve detailed information about a specific rental.

NameInTypeRequiredDescription
idpathstringYesRental ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/rentals/507f1f77bcf86cd799439320" \
-H "Authorization: Bearer <token>"

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.

NameInTypeRequiredDescription
idpathstringYesRental ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/rentals/507f1f77bcf86cd799439320/runtime" \
-H "Authorization: Bearer <token>"

Extend an existing rental for additional days.

NameInTypeRequiredDescription
idpathstringYesRental ID
NameTypeRequiredDescription
expected_rental_endstringYesThe 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_daysintegerYesNumber of additional days to extend the rental (must match server pricing durations, max 3650).
max_charge_centsintegerNoThe 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.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/rentals/507f1f77bcf86cd799439320/extend" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"expected_rental_end": "2025-01-28T22:00:00.000Z",
"additional_days": 7,
"max_charge_cents": 7000
}'

/api/v1/servers and /api/v1/servers/{id} are aliases for the rentals endpoints and return the same data.

List all rented servers for the authenticated user. Alias for GET /api/v1/rentals.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/servers" \
-H "Authorization: Bearer <token>"

Retrieve detailed information about a specific rented server. Alias for GET /api/v1/rentals/{id}.

NameInTypeRequiredDescription
idpathstringYesServer/Rental ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/servers/507f1f77bcf86cd799439320" \
-H "Authorization: Bearer <token>"

Live CPU/memory/disk usage for a rented server. Alias for GET /api/v1/rentals/{id}/runtime.

NameInTypeRequiredDescription
idpathstringYesServer/Rental ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/servers/507f1f77bcf86cd799439320/runtime" \
-H "Authorization: Bearer <token>"

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.

NameInTypeRequiredDescription
idpathstringYesServer ID
NameTypeRequiredDescription
pool_idstringNoPool ID (24-character hex).
rental_daysintegerYesNumber of days to rent (must match server pricing durations, max 3650).
max_charge_centsintegerNoCeiling 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.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/servers/507f1f77bcf86cd799439014/rent" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"pool_id": "507f1f77bcf86cd799439300",
"rental_days": 7,
"max_charge_cents": 9500
}'

Organize servers and team members into shared pools.

List all pools the authenticated user owns or is a member of.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/pools" \
-H "Authorization: Bearer <token>"

Retrieve detailed information about a specific pool, including members and servers.

NameInTypeRequiredDescription
idpathstringYesPool ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439300" \
-H "Authorization: Bearer <token>"

Create a new pool for team collaboration.

NameTypeRequiredDescription
namestringYesPool name (max 100 characters).
descriptionstringNoPool description (max 500 characters).
settingsobjectNoPool settings object.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/pools" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Production Team",
"description": "Pool for production environment management",
"settings": { "auto_approve": true, "max_servers": 20 }
}'

Update pool details (owner only).

NameInTypeRequiredDescription
idpathstringYesPool ID
NameTypeRequiredDescription
descriptionstringNoPool description (max 500 characters).
settingsobjectNoPool settings object.
Terminal window
curl -X PUT "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439301" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated pool description",
"settings": { "auto_approve": false, "max_servers": 25 }
}'

Delete a pool (owner only, cannot delete default pool).

NameInTypeRequiredDescription
idpathstringYesPool ID
Terminal window
curl -X DELETE "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439301" \
-H "Authorization: Bearer <token>"

Invite, role-update, and remove members in a pool.

Invite a user to join the pool (admin or owner only).

NameInTypeRequiredDescription
idpathstringYesid path parameter
NameTypeRequiredDescription
usernamestringYesUsername of the user to invite (1-100 chars, matches ^[a-zA-Z0-9_-]+$).
rolestringYesRole to assign. One of admin, user.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439300/members" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"username": "new_member",
"role": "user"
}'

Update a member’s role in the pool (owner only).

NameInTypeRequiredDescription
idpathstringYesPool ID
userIdpathstringYesUser ID of the member
NameTypeRequiredDescription
rolestringYesNew role. One of admin, user.
Terminal window
curl -X PUT "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439300/members/507f1f77bcf86cd799439311" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "role": "admin" }'

DELETE /api/v1/pools/{id}/members/{userId}

Section titled “DELETE /api/v1/pools/{id}/members/{userId}”

Remove a member from the pool (admin or owner only).

NameInTypeRequiredDescription
idpathstringYesPool ID
userIdpathstringYesUser ID of the member to remove
Terminal window
curl -X DELETE "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439300/members/507f1f77bcf86cd799439311" \
-H "Authorization: Bearer <token>"

View and act on pool invitations.

List all pending pool invitations for the authenticated user.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/pools/invitations/pending" \
-H "Authorization: Bearer <token>"

Accept an invitation to join a pool.

NameInTypeRequiredDescription
idpathstringYesInvitation ID
Terminal window
curl -X POST "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439311/accept" \
-H "Authorization: Bearer <token>"

Reject an invitation to join a pool.

NameInTypeRequiredDescription
idpathstringYesid path parameter
Terminal window
curl -X POST "https://api.hoody.com/api/v1/pools/507f1f77bcf86cd799439311/reject" \
-H "Authorization: Bearer <token>"