This is an unofficial CLI that interacts with Clouding.io's REST API. Its main purpose is to provide a simple interface to create and destroy servers from snapshots/images. It is not an all-encompassing tool as it neither provides access to all API endpoints nor all actions.
tuca is on PyPi, use the package manager of your choice to set yourself up. Here is an example using uv:
uv tool install tucaThe CLI interface follows this pattern:
tuca <endpoint> <action> [options]endpointis the same as in the API documentation
💁 Not all endpoints are supported!actionis one ofcreate,listanddelete
💁 Supported actions depend on endpoint!optionsdepend onendpointandaction
💁 Consult--helpfor details!
tuca writes pretty-printed JSON (no colors) to stdout. It's human-readable and can be piped into jq for non-interactive usage. The following example shows the output from listing the keypairs endpoint (values redacted):
{
"keypairs": [
{
"fingerprint": "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00",
"id": "xxxxxxxxxxxxxxxx",
"name": "default"
}
]
}The output is
- always presented as list, even if the result count is 1 or 0
- usually named after the endpoint
- contains an opionated subset of the available attributes, but always
idandnamewhere applicable (use-vto show everything) - limited to a maximum of 100 entries
First order of business is setting up an API token. You can do that via environment variable:
export CLOUDINGIO_API_TOKEN=my_secret_tokenOr, more securely, have tuca write it into your system's keyring. The following command will give you an interactive prompt to do that:
tuca auth createIf credentials are present in both keyring and environment, the environment variable takes precedence.
Pick one of the available Windows images.
tuca images list --filter windowsOutput
{
"images": [
{
"accessMethods": {
"password": "required",
"sshKey": "not-supported"
},
"id": "Lka79zd4JDnxyr85",
"minimumSizeGb": 25,
"name": "Windows Server 2022 Datacenter (English 64Bit)"
},
{
"accessMethods": {
"password": "required",
"sshKey": "not-supported"
},
"id": "jG4bZNnEQznYx7LP",
"minimumSizeGb": 25,
"name": "Windows Server 2016 Datacenter (English 64Bit) EOL"
},
{
"accessMethods": {
"password": "required",
"sshKey": "not-supported"
},
"id": "WwQ6kDdVqb2Jeaml",
"minimumSizeGb": 25,
"name": "Windows Server 2019 Datacenter (English 64Bit) EOL"
},
{
"accessMethods": {
"password": "required",
"sshKey": "not-supported"
},
"id": "kbxmpG2bXvKwlaDg",
"minimumSizeGb": 25,
"name": "Windows Server 2025 Datacenter (English 64Bit)"
},
{
"accessMethods": {
"password": "required",
"sshKey": "not-supported"
},
"id": "jXEm7yK3MJ2VYkQ9",
"minimumSizeGb": 25,
"name": "Windows 11 (English 64Bit | Based on Windows Server 2025)"
},
{
"accessMethods": {
"password": "required",
"sshKey": "not-supported"
},
"id": "q58XEgdA0P26mA0j",
"minimumSizeGb": 25,
"name": "Windows 11 (Espa\u00f1ol 64Bit | Basado en Windows Server 2025)"
}
]
}Now pick one of the available flavors (server sizes).
tuca flavors listOutput
(output shortened)
{
"sizes/flavors": [
...
{
"id": "8x16",
"pricePerHour": 0.05472,
"ramGb": 16,
"vCores": 8.0
},
...
]
}That's sufficient to create a server with minimal configuration.
# Windows 11 compatible image
# 8 cores, 16 GB RAM
# default firewall
# default image size
tuca servers create --image jXEm7yK3MJ2VYkQ9 --name MyWinServer --flavorid 8x16 --password start123Output
{
"servers": [
{
"action": {
"completedAt": null,
"id": "aaaaaaaaaaaaaaaa",
"resourceId": "rrrrrrrrrrrrrrrr",
"resourceType": "server",
"startedAt": "2026-02-28T14:38:52.312803Z",
"status": "inProgress",
"type": "create"
},
"createdAt": "",
"id": "rrrrrrrrrrrrrrrr",
"name": "MyWinServer",
"publicPorts": [],
"status": "Pending"
}
]
}Creating the server can take some time and you can check how it's doing.
tuca servers list --name MyWinServerOutput
{
"servers": [
{
"createdAt": "2026-02-28T14:38:52",
"id": "rrrrrrrrrrrrrrrr",
"name": "MyWinServer",
"publicPorts": [
{
"id": "pppppppppppppppp",
"ipAddress": "000.000.000.000",
"macAddress": "00:00:00:00:00:00"
}
],
"status": "Creating"
}
]
}The server will be ready eventually.
Output
{
"servers": [
{
"createdAt": "2026-02-04T23:42:16",
"id": "rrrrrrrrrrrrrrrr",
"name": "MyWinServer",
"publicPorts": [
{
"id": "pppppppppppppppp",
"ipAddress": "000.000.000.000",
"macAddress": "00:00:00:00:00:00"
}
],
"status": "Active"
}
]
}