API schema update — August 10, 2026
The root swagger.json was replaced with the latest export supplied by the backend team. The contract now identifies
itself as ZennoHosting API rather than ZennoHosting API (DEV). The documented runtime base URL and the OAuth2
security flow are unchanged. Operation count went from 76 to 72.
Added endpoints
- Resource limits:
GET /limitsreturns per-user quotas — projects, access tokens, networks, public IPs and the summed CPU, RAM and disk of all VMs — each with its limit, current usage and remainder. - Name-length limits:
GET /limits/name-lengthsreturns the maximum lengths for project, network, VM, SSH key and access-token names, and for an SSH public key value. These are validation rules, not quotas. - VM state counts:
GET /projects/{projectId}/vms/state-countsreturns the number of VMs in a project broken down by lifecycle status and by power state, computed server-side.
A new Limits tag groups the two limits endpoints.
Removed endpoints
- Administrative saga endpoints under
/admin/sagas— list, detail, finalize and force-compensate — announced in the July 14, 2026 update. Their generated reference pages, schemas and thesaga-type,statesandcorrelation-idparameter pages are gone with them. - Payment endpoints under
/payments. They were already excluded from the documented surface byexcludedTags, so nothing changes on the site.
Schema changes that affect clients
- New
statusfield on VMs, networks and public IPs. TheResourceStatusenum —creating,active,updating,deleting,failed— is now the recommended way to display a resource's state. The existingoperation/operationStatuspair is retained only for backward compatibility. OperationResponse.lastErrorwas replaced byfailureCode, typed as the newOperationFailureCodeenum:insufficientCapacity,timeout,internal.- New
ApiProblemDetailstype extends the problem-details body with acodemember — a stable machine-readable identifier of the error condition. It is currently declared on one response only: the409from VM creation, wherecodeisinsufficientCapacity. Every other error response still uses the base type withoutcode. ConfigurationResponsegainedavailabilityandmaxCount: advisory signals of whether the cluster can host the configuration right now.RebuildVmRequestgaineddeleteBackups, defaulting tofalse.BackupResponsegainedsourceImageId,nullfor backups created before the field existed.NetworkResponse,PublicIpResponseandVmResponsegainedstatus.ProjectResponse.vmCountis now marked deprecated in favour ofresourceCounts.vms.- Ten new schemas:
ApiProblemDetails,OperationFailureCode,ResourceLimitsResponse,ResourceNameLengthLimitsResponse,ResourceQuotaResponse,ResourceStatus,VmPowerStateCountsResponse,VmResourceLimitsResponse,VmStateCountsResponse,VmStatusCountsResponse. No schemas were removed.
Breaking changes and migration notes
- Clients reading
lastErrorfrom an operation must switch tofailureCode; the old field is gone, not deprecated. - Any tooling calling
/admin/sagaswill now get a 404. There is no replacement in this contract. - Clients displaying resource state should move from
operation/operationStatustostatus. Note thatstatusisactiveafter an operation failed but was handled normally — a start, stop, reboot or resize that can simply be retried leaves the resource active. Judge an operation's outcome from the operation record, not from the resource. - The global OAuth2 requirement is unchanged. Regenerate API types before upgrading.
Documentation follow-ups completed with this update
- New authored pages: Limits and quotas, API errors and Inventory and monitoring.
- Statuses and lifecycle was rewritten around
statusand now carries the list of fields retained only for compatibility. - The guides picked up
availability/maxCount,sourceImageIdanddeleteBackups. - Generated operation labels are now short imperative titles instead of full sentences, and internal .NET type names no longer leak into public descriptions.
Known gaps in the contract
Reported to the backend team, documented here as-is:
- Enum casing is inconsistent:
ResourceStatusandOperationFailureCodeare lower camel case (creating,internal), whileApiOperationStatus,VmBootStatusandResourceOperationare Pascal case (Queued,Running,Provision). - The
OperationFailureCodedescription refers to a fallback valueInternal, which does not exist in the enum; the actual value isinternal. ApiProblemDetailsis wired to a single response, socodecannot yet be relied on across the API.GET .../vms/{vmId}/metricsreturns deterministic mock data, andPOST .../vms/{vmId}/resizealways answers503 Service Unavailable. Both remain in the reference but are excluded from the authored guides.