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:

# 1. Authenticate (see Authentication below) to get a session cookie

# 2. Call an endpoint with the base URL:
curl -b cookies.txt https://api.hostodo.com/client/instances/

# 3. The API returns JSON
{ "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 paramTypeDescription
limitintegerNumber of results to return per page
offsetintegerZero-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:

ParamMeaning
:pk / :idPrimary key of the resource (e.g. plan, template, ISO, region, order, SSH key)
:customer_idCustomer identifier
:instance_idInstance 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:

CodeMeaning
200 / 201Success
400Invalid request or validation error
401 / 403Missing, expired, or invalid session
404Resource not found
429Rate limit exceeded

Signup & Activation

MethodPathDescriptionAuth
POST/client/signupCreate a new customer accountNo
GET/client/signup/verify-emailVerify an email address during signupNo
POST/client/activateActivate an accountNo
POST/client/forgot-passwordRequest a password resetNo

Signup request body

FieldTypeRequiredDescription
emailstringYesAccount email address
passwordstringYesAccount password
first_namestringYesFirst name
last_namestringYesLast name

Activate request body

FieldTypeRequiredDescription
userintegerYesUser ID from the activation email
confirmation_tokenstringYesConfirmation token from the activation email

Forgot-password request body

FieldTypeRequiredDescription
usernamestringYesAccount email address to send the reset link to

Customer Profile

MethodPathDescriptionAuth
GET/client/customerGet the authenticated customer's profileYes
PUT/client/customer/:customer_idUpdate the customer profileYes
PATCH/client/customer/:customer_idPartially update the customer profileYes

Customer update request body

FieldTypeRequiredDescription
companystringNoCompany name
streetstringYesStreet address
street_line_twostringNoAddress line two
citystringYesCity
statestringYesState / province
postal_codestringYesPostal / ZIP code
countrystringYesCountry
phone_numberstringNoPhone number

Password

MethodPathDescriptionAuth
PATCH/client/user/passwordChange the authenticated user's passwordYes

Plans

MethodPathDescriptionAuth
GET/client/plansList available plansNo
GET/client/plans/:pkGet a single planNo

Templates

MethodPathDescriptionAuth
GET/client/templatesList available OS templatesNo
GET/client/templates/:pkGet a single templateNo

ISOs

MethodPathDescriptionAuth
GET/client/isosList available ISOsNo
GET/client/isos/:pkGet a single ISONo

Regions

MethodPathDescriptionAuth
GET/client/regionsList available regions (datacenters)No
GET/client/regions/:pkGet a single regionNo

List & Details

Instance paths take the instance ID in place of :instance_id.

MethodPathDescriptionAuth
GET/client/instancesList the authenticated user's instancesYes
GET/client/instances/:instance_idGet a single instanceYes
GET/client/instances/:instance_id/power_statusGet the instance power statusYes
GET/client/instances/:instance_id/rrdGet RRD (bandwidth) dataYes
GET/client/instances/:instance_id/eventsGet the instance event logYes

Power & Actions

MethodPathDescriptionAuth
POST/client/instances/:instance_id/startStart the instanceYes
POST/client/instances/:instance_id/stopStop the instanceYes
POST/client/instances/:instance_id/rebootReboot the instanceYes
POST/client/instances/:instance_id/reinstallReinstall the instance from a templateYes
POST/client/instances/:instance_id/reset_rootReset the root passwordYes
POST/client/instances/:instance_id/cancelRequest instance cancellationYes
PATCH/client/instances/:instance_id/update_infoUpdate instance attributes (e.g. hostname)Yes
GET/client/instances/:instance_id/instance_settingsGet instance settingsYes
PATCH/client/instances/:instance_id/instance_settingsUpdate instance settingsYes
POST/client/instances/:instance_id/configure_vncConfigure noVNC console accessYes
POST/client/instances/:instance_id/mount_isoMount an ISOYes
POST/client/instances/:instance_id/unmount_isoUnmount the ISOYes

Update-info request body

FieldTypeRequiredDescription
hostnamestringNoNew hostname (max 64 chars)
autorenewal_enabledbooleanNoEnable/disable autorenewal (requires a default payment method)

Instance-settings request body (PATCH)

FieldTypeRequiredDescription
machine_typestringNoChange the machine type
boot_orderstringNoChange the boot order

Reinstall request body

FieldTypeRequiredDescription
template_idintegerYesID of an enabled template to reinstall with
ssh_key_idintegerNoSSH key to install on the reinstalled instance

Cancel request body

FieldTypeRequiredDescription
cancellation_reasonstringYesReason for cancellation (max 256 chars)

Network

MethodPathDescriptionAuth
GET/client/instances/:instance_id/networkGet instance networkingYes
POST/client/instances/:instance_id/ipv6Add an IPv6 addressYes

Orders

MethodPathDescriptionAuth
GET/client/ordersList the authenticated user's ordersYes
GET/client/orders/:pkGet a single orderYes
POST/client/orders/pricePrice an order without placing itNo
POST/client/orders/deploy_instanceDeploy an instance from an orderYes

Price-order request body

FieldTypeRequiredDescription
quantityintegerNoQuantity (default 1, min 1, max 10)
regionstringNoRegion name
templatestringNoTemplate
plan_idstringNoPlan ID
billing_cyclestringNoBilling cycle
promocodestringNoPromo code
deploy_page_variantstringNoDeploy page variant

Deploy-instance request body

FieldTypeRequiredDescription
hostnamestringYesInstance hostname (valid FQDN, max 253 chars)
quantityintegerNoQuantity (default 1, min 1, max 10)
regionstringYesRegion
templatestringYesTemplate
planstringYesPlan
billing_cyclestringYesBilling cycle
payment_methodstringNoPayment method
payment_method_idstringNoSaved payment method ID
promocodestringNoPromo code
ssh_keystringNoSSH key
deploy_page_variantstringNoDeploy page variant

SSH Keys

MethodPathDescriptionAuth
GET/client/ssh-keysList the user's SSH keysYes
POST/client/ssh-keysAdd an SSH keyYes
GET/client/ssh-keys/:pkGet a single SSH keyYes
PUT/client/ssh-keys/:pkUpdate an SSH keyYes
PATCH/client/ssh-keys/:pkPartially update an SSH keyYes
DELETE/client/ssh-keys/:pkDelete an SSH keyYes

Add / update SSH key request body

FieldTypeRequiredDescription
namestringYesKey label
public_keystringYesSSH public key (e.g. ssh-ed25519 AAAA...)

Reverse DNS

MethodPathDescriptionAuth
GET/client/rdnsList the user's reverse DNS recordsYes
POST/client/rdnsCreate a reverse DNS recordYes

Create reverse DNS request body

FieldTypeRequiredDescription
ipstringYesIP address the PTR record applies to
record_contentstringYesReverse DNS hostname (PTR value)

All Endpoints

Complete list of Customer API endpoints. :pk, :customer_id, and :instance_id are path parameters identifying the resource.

MethodPathAuth
POST/client/signupNo
GET/client/signup/verify-emailNo
POST/client/activateNo
POST/client/forgot-passwordNo
GET/client/customerYes
PUT/client/customer/:customer_idYes
PATCH/client/customer/:customer_idYes
PATCH/client/user/passwordYes
GET/client/plansNo
GET/client/plans/:pkNo
GET/client/templatesNo
GET/client/templates/:pkNo
GET/client/isosNo
GET/client/isos/:pkNo
GET/client/regionsNo
GET/client/regions/:pkNo
GET/client/instancesYes
GET/client/instances/:instance_idYes
GET/client/instances/:instance_id/power_statusYes
GET/client/instances/:instance_id/rrdYes
GET/client/instances/:instance_id/eventsYes
POST/client/instances/:instance_id/startYes
POST/client/instances/:instance_id/stopYes
POST/client/instances/:instance_id/rebootYes
POST/client/instances/:instance_id/reinstallYes
POST/client/instances/:instance_id/reset_rootYes
POST/client/instances/:instance_id/cancelYes
PATCH/client/instances/:instance_id/update_infoYes
GET/client/instances/:instance_id/instance_settingsYes
PATCH/client/instances/:instance_id/instance_settingsYes
POST/client/instances/:instance_id/configure_vncYes
POST/client/instances/:instance_id/mount_isoYes
POST/client/instances/:instance_id/unmount_isoYes
GET/client/instances/:instance_id/networkYes
POST/client/instances/:instance_id/ipv6Yes
GET/client/ordersYes
GET/client/orders/:pkYes
POST/client/orders/priceNo
POST/client/orders/deploy_instanceYes
GET/client/ssh-keysYes
POST/client/ssh-keysYes
GET/client/ssh-keys/:pkYes
PUT/client/ssh-keys/:pkYes
PATCH/client/ssh-keys/:pkYes
DELETE/client/ssh-keys/:pkYes
GET/client/rdnsYes
POST/client/rdnsYes

Need help? Open a ticket from the Hostodo Console or check the CLI documentation for terminal-based VPS management.