Hostodo Customer API
Manage your Hostodo VPS instances, SSH keys, reverse DNS, orders, and account programmatically. The Customer API is a REST JSON API that mirrors everything you can do from the Hostodo Console.
Quick Start
List your instances in 3 steps:
curl -b cookies.txt https://api.hostodo.com/client/instances/
{ "count": 1, "results": [ { "hostname": "my-server", ... } ] }
Base URL
All Customer API endpoints live under /client/ and are served from the Hostodo API host:
Base URL: https://api.hostodo.com/client/
The Customer API is a Django REST Framework JSON API. Send Content-Type: application/json for requests with a body.
Pagination
List endpoints are paginated with the limit/offset style and return a JSON object with count, next, previous, and results keys. Pagination is controlled by query parameters (default limit is 25):
| Query param | Type | Description |
limit | integer | Number of results to return per page |
offset | integer | Zero-based offset into the full result set |
Path parameters
Colon-prefixed segments in a path are parameters that must be replaced with a resource identifier:
| Param | Meaning |
:pk / :id | Primary key of the resource (e.g. plan, template, ISO, region, order, SSH key) |
:customer_id | Customer identifier |
:instance_id | Instance identifier |
Authentication
Authenticated endpoints use a JWT stored in a session cookie scoped to the Hostodo domain. Log in through the Hostodo Console (or the auth endpoints) to obtain the cookie, then send it with each request.
Most endpoints below require authentication. Public endpoints (signup, activation, forgot-password, plans, templates, ISOs, regions, and order pricing) can be called without a session.
Note: The Customer API is designed for the Hostodo Console and the Hostodo CLI. It uses cookie-based authentication rather than bearer API keys. For AI-client access with scoped tokens, see the MCP documentation.
Errors
Endpoints return standard HTTP status codes and DRF-style JSON errors:
| Code | Meaning |
200 / 201 | Success |
400 | Invalid request or validation error |
401 / 403 | Missing, expired, or invalid session |
404 | Resource not found |
429 | Rate limit exceeded |
Signup & Activation
| Method | Path | Description | Auth |
POST | /client/signup | Create a new customer account | No |
GET | /client/signup/verify-email | Verify an email address during signup | No |
POST | /client/activate | Activate an account | No |
POST | /client/forgot-password | Request a password reset | No |
Signup request body
| Field | Type | Required | Description |
email | string | Yes | Account email address |
password | string | Yes | Account password |
first_name | string | Yes | First name |
last_name | string | Yes | Last name |
Activate request body
| Field | Type | Required | Description |
user | integer | Yes | User ID from the activation email |
confirmation_token | string | Yes | Confirmation token from the activation email |
Forgot-password request body
| Field | Type | Required | Description |
username | string | Yes | Account email address to send the reset link to |
Customer Profile
| Method | Path | Description | Auth |
GET | /client/customer | Get the authenticated customer's profile | Yes |
PUT | /client/customer/:customer_id | Update the customer profile | Yes |
PATCH | /client/customer/:customer_id | Partially update the customer profile | Yes |
Customer update request body
| Field | Type | Required | Description |
company | string | No | Company name |
street | string | Yes | Street address |
street_line_two | string | No | Address line two |
city | string | Yes | City |
state | string | Yes | State / province |
postal_code | string | Yes | Postal / ZIP code |
country | string | Yes | Country |
phone_number | string | No | Phone number |
Password
| Method | Path | Description | Auth |
PATCH | /client/user/password | Change the authenticated user's password | Yes |
Plans
| Method | Path | Description | Auth |
GET | /client/plans | List available plans | No |
GET | /client/plans/:pk | Get a single plan | No |
Templates
| Method | Path | Description | Auth |
GET | /client/templates | List available OS templates | No |
GET | /client/templates/:pk | Get a single template | No |
ISOs
| Method | Path | Description | Auth |
GET | /client/isos | List available ISOs | No |
GET | /client/isos/:pk | Get a single ISO | No |
Regions
| Method | Path | Description | Auth |
GET | /client/regions | List available regions (datacenters) | No |
GET | /client/regions/:pk | Get a single region | No |
List & Details
Instance paths take the instance ID in place of :instance_id.
| Method | Path | Description | Auth |
GET | /client/instances | List the authenticated user's instances | Yes |
GET | /client/instances/:instance_id | Get a single instance | Yes |
GET | /client/instances/:instance_id/power_status | Get the instance power status | Yes |
GET | /client/instances/:instance_id/rrd | Get RRD (bandwidth) data | Yes |
GET | /client/instances/:instance_id/events | Get the instance event log | Yes |
Power & Actions
| Method | Path | Description | Auth |
POST | /client/instances/:instance_id/start | Start the instance | Yes |
POST | /client/instances/:instance_id/stop | Stop the instance | Yes |
POST | /client/instances/:instance_id/reboot | Reboot the instance | Yes |
POST | /client/instances/:instance_id/reinstall | Reinstall the instance from a template | Yes |
POST | /client/instances/:instance_id/reset_root | Reset the root password | Yes |
POST | /client/instances/:instance_id/cancel | Request instance cancellation | Yes |
PATCH | /client/instances/:instance_id/update_info | Update instance attributes (e.g. hostname) | Yes |
GET | /client/instances/:instance_id/instance_settings | Get instance settings | Yes |
PATCH | /client/instances/:instance_id/instance_settings | Update instance settings | Yes |
POST | /client/instances/:instance_id/configure_vnc | Configure noVNC console access | Yes |
POST | /client/instances/:instance_id/mount_iso | Mount an ISO | Yes |
POST | /client/instances/:instance_id/unmount_iso | Unmount the ISO | Yes |
Update-info request body
| Field | Type | Required | Description |
hostname | string | No | New hostname (max 64 chars) |
autorenewal_enabled | boolean | No | Enable/disable autorenewal (requires a default payment method) |
Instance-settings request body (PATCH)
| Field | Type | Required | Description |
machine_type | string | No | Change the machine type |
boot_order | string | No | Change the boot order |
Reinstall request body
| Field | Type | Required | Description |
template_id | integer | Yes | ID of an enabled template to reinstall with |
ssh_key_id | integer | No | SSH key to install on the reinstalled instance |
Cancel request body
| Field | Type | Required | Description |
cancellation_reason | string | Yes | Reason for cancellation (max 256 chars) |
Network
| Method | Path | Description | Auth |
GET | /client/instances/:instance_id/network | Get instance networking | Yes |
POST | /client/instances/:instance_id/ipv6 | Add an IPv6 address | Yes |
Orders
| Method | Path | Description | Auth |
GET | /client/orders | List the authenticated user's orders | Yes |
GET | /client/orders/:pk | Get a single order | Yes |
POST | /client/orders/price | Price an order without placing it | No |
POST | /client/orders/deploy_instance | Deploy an instance from an order | Yes |
Price-order request body
| Field | Type | Required | Description |
quantity | integer | No | Quantity (default 1, min 1, max 10) |
region | string | No | Region name |
template | string | No | Template |
plan_id | string | No | Plan ID |
billing_cycle | string | No | Billing cycle |
promocode | string | No | Promo code |
deploy_page_variant | string | No | Deploy page variant |
Deploy-instance request body
| Field | Type | Required | Description |
hostname | string | Yes | Instance hostname (valid FQDN, max 253 chars) |
quantity | integer | No | Quantity (default 1, min 1, max 10) |
region | string | Yes | Region |
template | string | Yes | Template |
plan | string | Yes | Plan |
billing_cycle | string | Yes | Billing cycle |
payment_method | string | No | Payment method |
payment_method_id | string | No | Saved payment method ID |
promocode | string | No | Promo code |
ssh_key | string | No | SSH key |
deploy_page_variant | string | No | Deploy page variant |
SSH Keys
| Method | Path | Description | Auth |
GET | /client/ssh-keys | List the user's SSH keys | Yes |
POST | /client/ssh-keys | Add an SSH key | Yes |
GET | /client/ssh-keys/:pk | Get a single SSH key | Yes |
PUT | /client/ssh-keys/:pk | Update an SSH key | Yes |
PATCH | /client/ssh-keys/:pk | Partially update an SSH key | Yes |
DELETE | /client/ssh-keys/:pk | Delete an SSH key | Yes |
Add / update SSH key request body
| Field | Type | Required | Description |
name | string | Yes | Key label |
public_key | string | Yes | SSH public key (e.g. ssh-ed25519 AAAA...) |
Reverse DNS
| Method | Path | Description | Auth |
GET | /client/rdns | List the user's reverse DNS records | Yes |
POST | /client/rdns | Create a reverse DNS record | Yes |
Create reverse DNS request body
| Field | Type | Required | Description |
ip | string | Yes | IP address the PTR record applies to |
record_content | string | Yes | Reverse DNS hostname (PTR value) |
All Endpoints
Complete list of Customer API endpoints. :pk, :customer_id, and :instance_id are path parameters identifying the resource.
| Method | Path | Auth |
POST | /client/signup | No |
GET | /client/signup/verify-email | No |
POST | /client/activate | No |
POST | /client/forgot-password | No |
GET | /client/customer | Yes |
PUT | /client/customer/:customer_id | Yes |
PATCH | /client/customer/:customer_id | Yes |
PATCH | /client/user/password | Yes |
GET | /client/plans | No |
GET | /client/plans/:pk | No |
GET | /client/templates | No |
GET | /client/templates/:pk | No |
GET | /client/isos | No |
GET | /client/isos/:pk | No |
GET | /client/regions | No |
GET | /client/regions/:pk | No |
GET | /client/instances | Yes |
GET | /client/instances/:instance_id | Yes |
GET | /client/instances/:instance_id/power_status | Yes |
GET | /client/instances/:instance_id/rrd | Yes |
GET | /client/instances/:instance_id/events | Yes |
POST | /client/instances/:instance_id/start | Yes |
POST | /client/instances/:instance_id/stop | Yes |
POST | /client/instances/:instance_id/reboot | Yes |
POST | /client/instances/:instance_id/reinstall | Yes |
POST | /client/instances/:instance_id/reset_root | Yes |
POST | /client/instances/:instance_id/cancel | Yes |
PATCH | /client/instances/:instance_id/update_info | Yes |
GET | /client/instances/:instance_id/instance_settings | Yes |
PATCH | /client/instances/:instance_id/instance_settings | Yes |
POST | /client/instances/:instance_id/configure_vnc | Yes |
POST | /client/instances/:instance_id/mount_iso | Yes |
POST | /client/instances/:instance_id/unmount_iso | Yes |
GET | /client/instances/:instance_id/network | Yes |
POST | /client/instances/:instance_id/ipv6 | Yes |
GET | /client/orders | Yes |
GET | /client/orders/:pk | Yes |
POST | /client/orders/price | No |
POST | /client/orders/deploy_instance | Yes |
GET | /client/ssh-keys | Yes |
POST | /client/ssh-keys | Yes |
GET | /client/ssh-keys/:pk | Yes |
PUT | /client/ssh-keys/:pk | Yes |
PATCH | /client/ssh-keys/:pk | Yes |
DELETE | /client/ssh-keys/:pk | Yes |
GET | /client/rdns | Yes |
POST | /client/rdns | Yes |