API Changelog
A record of breaking changes, deprecations, and new additions to the Huddle01 Cloud API.
All notable changes to the Cloud API are documented here. Dates follow YYYY-MM-DD format.
2026-05-19
New features
POST /infra/v1/agents/{id}/reset — redeploy on latest OpenClaw image
Agent reset now provisions the VM from the newest active public OpenClaw image in the region (same ordering as the agent create flow: newest created time, then highest version label). Flavor, storage size, billing linkage, and optional personality selection are unchanged. The previous image reference is not reused.
2026-05-13
Breaking changes
GET /billing/usage/resources — managed Postgres moved out of groups
Managed Postgres usage is no longer included in the groups array. Each database project is returned as one element in the new managed_postgres_projects array, with branches holding the same per-branch ResourceGroup objects that previously appeared as separate top-level groups entries. Non-database resources are unchanged and remain in groups.
Migration: If you consume this endpoint, read managed Postgres from managed_postgres_projects (and optionally ignore any database_* rows still present in groups when talking to older API versions until fully rolled out).
New features
GET /billing/usage/resources — managed Postgres resource_name_or_id includes project
For database usage rows, resource_name_or_id is now "{branch} · {project}" (branch name, middle dot, then the database project display name or internal name). This disambiguates the default branch main across multiple Postgres projects in the same workspace.
Bug fixes
GET /billing/usage/resources — managed Postgres status when the project is deleted first
Usage rows for managed Postgres now treat database_project.status of deleted or archived as closing the billable interval (using database_project.updated_at when the branch row has not yet been marked deleted). Previously, deleting a project set the project to deleted immediately while branch teardown ran asynchronously, so branches could still appear active in usage until MarkDatabaseResourceDeleted finished.
Rows with database_resource.deprovisioned_at set (for example failed branches in error status) are also closed for usage at that timestamp even when status is not yet deleted, so long as the earlier branches of the case do not already apply.
POST /databases/branches/{id}/pitr/restore/cancel — cancel in-flight restore
Aborts a branch that is in restoring status (in-place PITR restore or reset-from-parent): marks the branch error, records a restore_cancelled event, and deletes the CNPG Cluster so the operator stops retrying full-recovery jobs. Returns 409 if the branch is not restoring.
2026-05-07
New features
GET /billing/usage/resources — database HA count field
Detailed billing usage groups now include a count field for database resources (e.g. HA Postgres node count).
2026-05-06
New features
GET /databases/flavors — pricing fields included
Database flavor responses now include optional per-unit pricing fields (USD per unit-month) sourced from the backend billing catalog:
vcpu_monthly_usdram_gb_monthly_usdstorage_gb_monthly_usd
Pricing fix — values now correctly reported per month
These fields are now correctly returned as USD per unit-month. Previously, some environments returned per-minute unit prices, which could appear as $0.00/mo in the UI after rounding.
2026-04-22
Breaking changes
GET /instances · GET /instances/{id} — flavor_id field renamed to flavor
The instance object previously returned flavor_id (an opaque OpenStack UUID). It now returns flavor — the human-readable flavor name (e.g. "anton-2").
{
"id": "abc123",
"name": "my-vm",
- "flavor_id": "c1f52b0a-4a3d-4b2e-9d1e-8f3a2c6e7d4f",
+ "flavor": "anton-2",
"vcpus": 2,
"ram": 4096,
...
}Migration: Update any code that reads instance.flavor_id to read instance.flavor instead.
New features
POST /instances — accept flavor and image by name
The create endpoint now accepts human-readable names in addition to raw OpenStack IDs. Using names is the recommended approach going forward.
| Field | Status | Description |
|---|---|---|
flavor_name | New (preferred) | Flavor name, e.g. "anton-2", "anton-4" |
image_name | New (preferred) | Image name, e.g. "ubuntu-22.04" |
flavor_id | Deprecated | Raw OpenStack flavor UUID — still accepted, see deprecations below |
image_id | Deprecated | Raw OpenStack image UUID — still accepted, see deprecations below |
At least one of flavor_name / flavor_id is required, and at least one of image_name / image_id is required. If both are provided, the name field takes priority.
Example request using names:
curl -X POST "https://cloud.huddleapis.com/api/v1/instances" \
-H "x-api-key: $HUDDLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "my-vm",
"flavor_name": "anton-2",
"image_name": "ubuntu-22.04",
"boot_disk_size": 30,
"key_name": ["my-key"],
"sg_names": ["default"],
"region": "eu2"
}'POST /instances — deprecation_notices in response
When a deprecated field (flavor_id or image_id) is used in a create request, the response now includes a deprecation_notices array with migration guidance. The field is omitted when no deprecated fields are used.
{
"id": "abc123",
"name": "my-vm",
...
"deprecation_notices": [
"The 'flavor_id' field is deprecated and will be removed in a future version. Please use 'flavor_name' instead (e.g. \"anton-2\")."
]
}GET /instances · GET /instances/{id} — private IPs included in networks.v4
The networks.v4 array now contains both private ("fixed") and public ("floating") IPv4 addresses. Previously only floating (public) IPs were returned.
Each entry has a type field ("fixed" or "floating") to distinguish them:
{
"networks": {
"v4": [
{ "ip_address": "10.10.1.70", "type": "fixed" },
{ "ip_address": "148.113.4.91", "type": "floating" }
],
"v6": []
}
}Check your IP filtering logic
If your code accesses networks.v4[0] to get the public IP, it may now get the private IP instead.
Filter by type === "floating" to reliably select the public address.
Deprecations
The following fields are deprecated and will be removed in a future version. They continue to work today but emit a deprecation_notices entry in the response.
| Deprecated field | Replacement | Endpoint |
|---|---|---|
flavor_id (request) | flavor_name | POST /instances |
image_id (request) | image_name | POST /instances |