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 /api/v1/pools
Section titled “GET /api/v1/pools”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 } ]}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.pools.listIterator();POST /api/v1/pools
Section titled “POST /api/v1/pools”Create a new pool for team collaboration.
This endpoint takes no parameters.
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Pool name (max 100 characters) |
description | string | No | Pool description (max 500 characters) |
settings | object | No | Arbitrary pool-level settings |
{ "name": "Production Team", "description": "Pool for production environment management", "settings": { "auto_approve": true, "max_servers": 20 }}{ "statusCode": 201, "message": "Pool created successfully", "data": { "id": "507f1f77bcf86cd799439301", "name": "Production Team", "description": "Pool for production environment management", "owner_id": "507f1f77bcf86cd799439011", "is_default": false, "settings": { "auto_approve": true, "max_servers": 20 }, "created_at": "2025-01-21T22:00:00.000Z" }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.pools.create({ name: "Production Team", description: "Pool for production environment management", settings: { auto_approve: true, max_servers: 20 }});GET /api/v1/pools/{id}
Section titled “GET /api/v1/pools/{id}”Get detailed information about a specific pool, including its members and associated servers.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Pool 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 } ] }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.pools.get("507f1f77bcf86cd799439300");PATCH /api/v1/pools/{id}
Section titled “PATCH /api/v1/pools/{id}”Update pool details (owner only).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Pool ID |
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
description | string | No | Updated description (max 500 characters) |
settings | object | No | Updated pool-level settings |
{ "description": "Pool for production environment management", "settings": { "auto_approve": true, "max_servers": 25 }}{ "statusCode": 200, "message": "Pool updated successfully", "data": { "success": true }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.pools.update("507f1f77bcf86cd799439300", { description: "Pool for production environment management", settings: { auto_approve: true, max_servers: 25 }});DELETE /api/v1/pools/{id}
Section titled “DELETE /api/v1/pools/{id}”Delete a pool. Owner-only. The default pool cannot be deleted.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Pool ID |
{ "statusCode": 200, "message": "Pool deleted successfully", "data": { "success": true }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.pools.delete("507f1f77bcf86cd799439300");Pool Members
Section titled “Pool Members”Manage user membership inside a pool. Inviting, changing roles, and removing members all require admin or owner privileges.
POST /api/v1/pools/{id}/members
Section titled “POST /api/v1/pools/{id}/members”Invite a user to join the pool (admin or owner required).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | id path parameter |
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
username | string | Yes | Username of the user to invite (1–100 chars, pattern ^[a-zA-Z0-9_-]+$) |
role | string | Yes | One of admin, user |
{ "username": "jane_admin", "role": "user"}{ "statusCode": 201, "message": "Member invited successfully", "data": { "id": "507f1f77bcf86cd799439311", "role": "user", "is_authorized": false, "invited_at": "2025-01-21T22:15:00.000Z" }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.poolMembers.invite("507f1f77bcf86cd799439300", { username: "jane_admin", role: "user"});PATCH /api/v1/pools/{id}/members/{userId}
Section titled “PATCH /api/v1/pools/{id}/members/{userId}”Update a member’s role in the pool (owner only).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Pool ID |
userId | path | string | Yes | Member user ID |
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
role | string | Yes | One of admin, user |
{ "role": "admin"}{ "statusCode": 200, "message": "Member role updated successfully", "data": { "success": true }}SDK Usage
Section titled “SDK Usage”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).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Pool ID |
userId | path | string | Yes | Member user ID |
{ "statusCode": 200, "message": "Member removed successfully", "data": { "success": true }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.poolMembers.remove("507f1f77bcf86cd799439300", "507f1f77bcf86cd799439012");Pool Invitations
Section titled “Pool Invitations”When a user is invited to a pool, the invitation is pending until it is accepted or rejected.
GET /api/v1/pools/invitations/pending
Section titled “GET /api/v1/pools/invitations/pending”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" } ]}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.poolInvitations.list();POST /api/v1/pools/{id}/accept
Section titled “POST /api/v1/pools/{id}/accept”Accept an invitation to join a pool.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Invitation ID |
{ "statusCode": 200, "message": "Invitation accepted successfully", "data": { "success": true }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.poolInvitations.accept("507f1f77bcf86cd799439350");POST /api/v1/pools/{id}/reject
Section titled “POST /api/v1/pools/{id}/reject”Reject an invitation to join a pool.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | id path parameter |
{ "statusCode": 200, "message": "Invitation rejected successfully", "data": { "success": true }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.poolInvitations.reject("507f1f77bcf86cd799439350");Rentals
Section titled “Rentals”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 /api/v1/rentals
Section titled “GET /api/v1/rentals”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" } } ]}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.rentals.listIterator();GET /api/v1/rentals/{id}
Section titled “GET /api/v1/rentals/{id}”Get detailed information about a specific rental, including hold days, usage days, the linked server, and the originating transaction.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Rental 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" } }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.rentals.get("507f1f77bcf86cd799439320");POST /api/v1/rentals/{id}/extend
Section titled “POST /api/v1/rentals/{id}/extend”Extend an existing rental for additional days. The number of days must match a pricing duration supported by the server.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Rental ID |
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
additional_days | number | Yes | Number of additional days to extend the rental (minimum 1, must match server pricing durations) |
{ "additional_days": 7}{ "statusCode": 200, "message": "Rental extended successfully", "data": { "rental": { "id": "507f1f77bcf86cd799439320", "rental_end": "2025-02-04T22:00:00.000Z", "status": "active", "amount": "140.00", "remaining_days": 13 }, "transaction": { "id": "507f1f77bcf86cd799439322", "amount": 70, "currency": "USD" } }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.rentals.extend("507f1f77bcf86cd799439320", { additional_days: 7});Server Rental
Section titled “Server Rental”The server rental surface exposes marketplace browsing, the rent action, and convenient aliases for reading your own rentals at the /servers path.
GET /api/v1/servers/available
Section titled “GET /api/v1/servers/available”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.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
country | query | string | No | Filter by country code (e.g., US, DE) |
region | query | string | No | Filter by region (e.g., us-east, eu-central) |
max_price_per_day | query | number | No | Maximum price per day in USD |
available_durations | query | array | No | Filter servers that support these rental durations (days) |
min_cpu_cores | query | number | No | Minimum CPU cores |
min_cpu_score | query | number | No | Minimum CPU benchmark score |
cpu_score_type | query | string | No | CPU benchmark type for score filtering. One of passmark, geekbench_single, geekbench_multi |
min_ram_gb | query | number | No | Minimum RAM in GB |
ram_types | query | array | No | Filter by RAM types |
min_total_storage_gb | query | number | No | Minimum total storage in GB |
disk_types | query | array | No | Filter servers with these disk types |
min_bandwidth_mbps | query | number | No | Minimum network bandwidth in Mbps |
min_traffic_tb | query | number | No | Minimum monthly traffic allowance in TB |
unlimited_traffic_only | query | boolean | No | Show only servers with unlimited traffic |
category | query | string | No | Filter by server category. One of compute, memory, storage, general, gpu |
featured_only | query | boolean | No | Show only featured servers |
curl "https://api.hoody.com/api/v1/servers/available?country=US&min_cpu_cores=32&category=compute"{ "statusCode": 200, "message": "Available servers retrieved successfully", "data": [ { "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, "category": "compute", "featured": true, "popularity_rank": 1, "setup_time_minutes": 15, "pricing": { "prices": { "1": "12.00", "7": "70.00", "30": "250.00" }, "price_tiers": { "1": { "price": "12.00", "hold_days": 1 }, "7": { "price": "70.00", "hold_days": 2 } } }, "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 } } } ]}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.serverRental.browseIterator({ country: "US", min_cpu_cores: 32, category: "compute"});POST /api/v1/servers/{id}/rent
Section titled “POST /api/v1/servers/{id}/rent”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.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Server ID |
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
pool_id | string | No | Pool ID to assign the rental to (must be a 24-character hex string) |
rental_days | number | Yes | Number of days to rent (minimum 1, must match server pricing durations) |
{ "rental_days": 7, "pool_id": "507f1f77bcf86cd799439300"}{ "statusCode": 201, "message": "Server rented successfully", "data": { "rental": { "id": "507f1f77bcf86cd799439320", "server_id": "507f1f77bcf86cd799439014", "rental_start": "2025-01-21T22:00:00.000Z", "rental_end": "2025-01-28T22:00:00.000Z", "hold_days": 2, "actual_usage_days": 0, "status": "active" }, "transaction": { "id": "507f1f77bcf86cd799439321", "amount": 70, "currency": "USD" } }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.serverRental.rent("507f1f77bcf86cd799439014", { rental_days: 7, pool_id: "507f1f77bcf86cd799439300"});GET /api/v1/servers
Section titled “GET /api/v1/servers”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 } } } } ]}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.serverRental.listIterator();GET /api/v1/servers/{id}
Section titled “GET /api/v1/servers/{id}”Alias for GET /api/v1/rentals/{id}. Returns detailed information about a specific rented server.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Rental 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" } }}SDK Usage
Section titled “SDK Usage”const { data } = await client.api.serverRental.get("507f1f77bcf86cd799439320");