Skip to content

Browse the rental marketplace, rent servers, manage active rentals, and collaborate with your team through pools and pool memberships.

Pools let teams group members and share rented servers. Each user has a default pool, and additional pools can be created for sub-teams or projects.

Get all pools the user owns or is a member of.

This endpoint takes no parameters.

{
"statusCode": 200,
"message": "Pools retrieved successfully",
"data": [
{
"id": "507f1f77bcf86cd799439300",
"name": "Development Team",
"description": "Pool for development team resources",
"is_default": false,
"settings": {
"auto_approve": false,
"max_servers": 10
},
"created_at": "2025-01-15T10:00:00.000Z",
"updated_at": "2025-01-20T14:30:00.000Z",
"owner_id": "507f1f77bcf86cd799439011",
"user_role": "owner",
"member_count": 5,
"server_count": 3
}
]
}
const { data } = await client.api.pools.listIterator();

Create a new pool for team collaboration.

This endpoint takes no parameters.

NameTypeRequiredDescription
namestringYesPool name (max 100 characters)
descriptionstringNoPool description (max 500 characters)
settingsobjectNoArbitrary pool-level settings
{
"name": "Production Team",
"description": "Pool for production environment management",
"settings": {
"auto_approve": true,
"max_servers": 20
}
}
const { data } = await client.api.pools.create({
name: "Production Team",
description: "Pool for production environment management",
settings: { auto_approve: true, max_servers: 20 }
});

Get detailed information about a specific pool, including its members and associated servers.

NameInTypeRequiredDescription
idpathstringYesPool ID
{
"statusCode": 200,
"message": "Pool retrieved successfully",
"data": {
"id": "507f1f77bcf86cd799439300",
"name": "Development Team",
"description": "Pool for development team resources",
"is_default": false,
"settings": {},
"created_at": "2025-01-15T10:00:00.000Z",
"updated_at": "2025-01-20T14:30:00.000Z",
"owner_id": "507f1f77bcf86cd799439011",
"members": [
{
"id": "507f1f77bcf86cd799439310",
"role": "admin",
"is_authorized": true,
"joined_at": "2025-01-16T11:00:00.000Z",
"user": {
"id": "507f1f77bcf86cd799439012",
"username": "jane_admin",
"alias": "Jane Smith"
}
}
],
"servers": [
{
"id": "507f1f77bcf86cd799439014",
"name": "node-us-nyc-1",
"rental_status": "active",
"is_ready": true
}
]
}
}
const { data } = await client.api.pools.get("507f1f77bcf86cd799439300");

Update pool details (owner only).

NameInTypeRequiredDescription
idpathstringYesPool ID
NameTypeRequiredDescription
descriptionstringNoUpdated description (max 500 characters)
settingsobjectNoUpdated pool-level settings
{
"description": "Pool for production environment management",
"settings": {
"auto_approve": true,
"max_servers": 25
}
}
const { data } = await client.api.pools.update("507f1f77bcf86cd799439300", {
description: "Pool for production environment management",
settings: { auto_approve: true, max_servers: 25 }
});

Delete a pool. Owner-only. The default pool cannot be deleted.

NameInTypeRequiredDescription
idpathstringYesPool ID
{
"statusCode": 200,
"message": "Pool deleted successfully",
"data": {
"success": true
}
}
const { data } = await client.api.pools.delete("507f1f77bcf86cd799439300");

Manage user membership inside a pool. Inviting, changing roles, and removing members all require admin or owner privileges.

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

NameInTypeRequiredDescription
idpathstringYesid path parameter
NameTypeRequiredDescription
usernamestringYesUsername of the user to invite (1–100 chars, pattern ^[a-zA-Z0-9_-]+$)
rolestringYesOne of admin, user
{
"username": "jane_admin",
"role": "user"
}
const { data } = await client.api.poolMembers.invite("507f1f77bcf86cd799439300", {
username: "jane_admin",
role: "user"
});

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

NameInTypeRequiredDescription
idpathstringYesPool ID
userIdpathstringYesMember user ID
NameTypeRequiredDescription
rolestringYesOne of admin, user
{
"role": "admin"
}
const { data } = await client.api.poolMembers.updateRole("507f1f77bcf86cd799439300", "507f1f77bcf86cd799439012", {
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 required).

NameInTypeRequiredDescription
idpathstringYesPool ID
userIdpathstringYesMember user ID
{
"statusCode": 200,
"message": "Member removed successfully",
"data": {
"success": true
}
}
const { data } = await client.api.poolMembers.remove("507f1f77bcf86cd799439300", "507f1f77bcf86cd799439012");

When a user is invited to a pool, the invitation is pending until it is accepted or rejected.

Get all pending pool invitations for the authenticated user.

This endpoint takes no parameters.

{
"statusCode": 200,
"message": "Pending invitations retrieved successfully",
"data": [
{
"id": "507f1f77bcf86cd799439350",
"pool_id": "507f1f77bcf86cd799439300",
"pool_name": "Development Team",
"pool_description": "Pool for development team resources",
"role": "admin",
"invited_by": {
"id": "507f1f77bcf86cd799439011",
"username": "team_lead",
"alias": "Lead Engineer"
},
"invited_at": "2025-01-21T20:00:00.000Z"
}
]
}
const { data } = await client.api.poolInvitations.list();

Accept an invitation to join a pool.

NameInTypeRequiredDescription
idpathstringYesInvitation ID
{
"statusCode": 200,
"message": "Invitation accepted successfully",
"data": {
"success": true
}
}
const { data } = await client.api.poolInvitations.accept("507f1f77bcf86cd799439350");

Reject an invitation to join a pool.

NameInTypeRequiredDescription
idpathstringYesid path parameter
{
"statusCode": 200,
"message": "Invitation rejected successfully",
"data": {
"success": true
}
}
const { data } = await client.api.poolInvitations.reject("507f1f77bcf86cd799439350");

Manage active rentals. Rentals track the lifecycle of a server you have rented: from the moment it is provisioned through its end date, including holds and usage.

Get all rentals for the authenticated user.

This endpoint takes no parameters.

{
"statusCode": 200,
"message": "Rentals retrieved successfully",
"data": [
{
"id": "507f1f77bcf86cd799439320",
"rental_start": "2025-01-21T22:00:00.000Z",
"rental_end": "2025-01-28T22:00:00.000Z",
"status": "active",
"amount": "70.00",
"remaining_days": 6,
"server_id": "507f1f77bcf86cd799439014",
"pool_id": "507f1f77bcf86cd799439300",
"is_free_tier": false,
"server": {
"id": "507f1f77bcf86cd799439014"
}
}
]
}
const { data } = await client.api.rentals.listIterator();

Get detailed information about a specific rental, including hold days, usage days, the linked server, and the originating transaction.

NameInTypeRequiredDescription
idpathstringYesRental ID
{
"statusCode": 200,
"message": "Rental retrieved successfully",
"data": {
"id": "507f1f77bcf86cd799439320",
"rental_start": "2025-01-21T22:00:00.000Z",
"rental_end": "2025-01-28T22:00:00.000Z",
"hold_days": 2,
"status": "active",
"amount": "70.00",
"remaining_days": 6,
"usage_days": 1,
"server_id": "507f1f77bcf86cd799439014",
"pool_id": "507f1f77bcf86cd799439300",
"is_free_tier": false,
"server": {
"id": "507f1f77bcf86cd799439014",
"name": "node-us-nyc-1",
"country": "US",
"region": "us-east",
"city": "New York",
"datacenter": "NYC-DC1",
"model": "Intel Xeon E5-2680 v4",
"is_vm": false,
"specs": {
"cpu": {
"model": "AMD EPYC 7763",
"cores": 64,
"threads": 128,
"score": 48500,
"score_type": "passmark"
},
"ram": {
"capacity_gb": 256,
"type": "ECC DDR5",
"speed_mhz": 4800
},
"disks": {
"config": [
{ "count": 2, "capacity_gb": 1000, "type": "NVMe", "interface": "PCIe 4.0" },
{ "count": 6, "capacity_gb": 15000, "type": "NVMe", "interface": "PCIe 4.0" }
],
"total_gb": 92000,
"summary": "2x1TB NVMe + 6x15TB NVMe"
},
"network": {
"bandwidth_mbps": 10000,
"bandwidth_formatted": "10 Gbps",
"traffic_tb": 100,
"traffic_unlimited": false
},
"additional": {
"ipv4_count": 5,
"ipv6_enabled": true
}
}
},
"transaction": {
"id": "507f1f77bcf86cd799439321",
"amount": 70,
"currency": "USD",
"created_at": "2025-01-21T22:00:00.000Z"
}
}
}
const { data } = await client.api.rentals.get("507f1f77bcf86cd799439320");

Extend an existing rental for additional days. The number of days must match a pricing duration supported by the server.

NameInTypeRequiredDescription
idpathstringYesRental ID
NameTypeRequiredDescription
additional_daysnumberYesNumber of additional days to extend the rental (minimum 1, must match server pricing durations)
{
"additional_days": 7
}
const { data } = await client.api.rentals.extend("507f1f77bcf86cd799439320", {
additional_days: 7
});

The server rental surface exposes marketplace browsing, the rent action, and convenient aliases for reading your own rentals at the /servers path.

Browse the rental marketplace. Returns available servers with pricing and specifications. Supports a rich set of query filters for narrowing by location, hardware, network, and category.

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 "https://api.hoody.com/api/v1/servers/available?country=US&min_cpu_cores=32&category=compute"
const { data } = await client.api.serverRental.browseIterator({
country: "US",
min_cpu_cores: 32,
category: "compute"
});

Rent an available server for a specified duration. The rental duration must match a pricing tier exposed by the server. Optionally assign the rental to a pool.

NameInTypeRequiredDescription
idpathstringYesServer ID
NameTypeRequiredDescription
pool_idstringNoPool ID to assign the rental to (must be a 24-character hex string)
rental_daysnumberYesNumber of days to rent (minimum 1, must match server pricing durations)
{
"rental_days": 7,
"pool_id": "507f1f77bcf86cd799439300"
}
const { data } = await client.api.serverRental.rent("507f1f77bcf86cd799439014", {
rental_days: 7,
pool_id: "507f1f77bcf86cd799439300"
});

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

This endpoint takes no parameters.

{
"statusCode": 200,
"message": "Rentals retrieved successfully",
"data": [
{
"id": "507f1f77bcf86cd799439320",
"rental_start": "2025-01-21T22:00:00.000Z",
"rental_end": "2025-01-28T22:00:00.000Z",
"status": "active",
"amount": "70.00",
"remaining_days": 6,
"server_id": "507f1f77bcf86cd799439014",
"pool_id": "507f1f77bcf86cd799439300",
"is_free_tier": false,
"server": {
"id": "507f1f77bcf86cd799439014",
"name": "node-us-nyc-1",
"country": "US",
"region": "us-east",
"city": "New York",
"datacenter": "NYC-DC1",
"model": "Intel Xeon E5-2680 v4",
"is_vm": false,
"specs": {
"cpu": {
"model": "AMD EPYC 7763",
"cores": 64,
"threads": 128,
"score": 48500,
"score_type": "passmark"
},
"ram": {
"capacity_gb": 256,
"type": "ECC DDR5",
"speed_mhz": 4800
},
"disks": {
"config": [
{ "count": 2, "capacity_gb": 1000, "type": "NVMe", "interface": "PCIe 4.0" }
],
"total_gb": 92000,
"summary": "2x1TB NVMe + 6x15TB NVMe"
},
"network": {
"bandwidth_mbps": 10000,
"bandwidth_formatted": "10 Gbps",
"traffic_tb": 100,
"traffic_unlimited": false
},
"additional": {
"ipv4_count": 5,
"ipv6_enabled": true
}
}
}
}
]
}
const { data } = await client.api.serverRental.listIterator();

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

NameInTypeRequiredDescription
idpathstringYesRental ID
{
"statusCode": 200,
"message": "Rental details retrieved successfully",
"data": {
"id": "507f1f77bcf86cd799439320",
"rental_start": "2025-01-21T22:00:00.000Z",
"rental_end": "2025-01-28T22:00:00.000Z",
"hold_days": 2,
"status": "active",
"amount": "70.00",
"remaining_days": 6,
"usage_days": 1,
"server_id": "507f1f77bcf86cd799439014",
"pool_id": "507f1f77bcf86cd799439300",
"is_free_tier": false,
"server": {
"id": "507f1f77bcf86cd799439014",
"name": "node-us-nyc-1",
"country": "US",
"region": "us-east",
"city": "New York",
"datacenter": "NYC-DC1",
"model": "Intel Xeon E5-2680 v4",
"is_vm": false,
"specs": {
"cpu": {
"model": "AMD EPYC 7763",
"cores": 64,
"threads": 128,
"score": 48500,
"score_type": "passmark"
},
"ram": {
"capacity_gb": 256,
"type": "ECC DDR5",
"speed_mhz": 4800
},
"disks": {
"config": [
{ "count": 2, "capacity_gb": 1000, "type": "NVMe", "interface": "PCIe 4.0" }
],
"total_gb": 92000,
"summary": "2x1TB NVMe + 6x15TB NVMe"
},
"network": {
"bandwidth_mbps": 10000,
"bandwidth_formatted": "10 Gbps",
"traffic_tb": 100,
"traffic_unlimited": false
},
"additional": {
"ipv4_count": 5,
"ipv6_enabled": true
}
}
},
"transaction": {
"id": "507f1f77bcf86cd799439321",
"amount": 70,
"currency": "USD",
"created_at": "2025-01-21T22:00:00.000Z"
}
}
}
const { data } = await client.api.serverRental.get("507f1f77bcf86cd799439320");