Huddle01 Cloud

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_usd
  • ram_gb_monthly_usd
  • storage_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.

FieldStatusDescription
flavor_nameNew (preferred)Flavor name, e.g. "anton-2", "anton-4"
image_nameNew (preferred)Image name, e.g. "ubuntu-22.04"
flavor_idDeprecatedRaw OpenStack flavor UUID — still accepted, see deprecations below
image_idDeprecatedRaw 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 /instancesdeprecation_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 fieldReplacementEndpoint
flavor_id (request)flavor_namePOST /instances
image_id (request)image_namePOST /instances