Skip to main content

2.4 API changelogs

API Changelog: Admin Panel 2.4.0

By Volodymyr Lukashkin

4 min

Listen

Add a reaction

Generated from a diff of the sim_api (hai_admin_api) repository between branch europa (old, 2026-05-19, eee4e7d5) and branch ariel (new, 2026-06-01, a30df677). 518 commits in range. Source of truth for endpoints: main.go route registrations, cross-checked against docs/swagger.json for contracts.

1. Summary

  • Old → New: europa (2026-05-19) → ariel (2026-06-01).

  • Endpoints: 37 added, 0 removed, 0 modified signatures (net registrations 426 → 463 normalized).

  • Headline additions: full KVM cluster-node management surface (22 endpoints), Marketplace OAuth/authorize + link-history/purge flow, Pod rootfs + factory-reset + scheduler-config, GPUaaS pool scheduler-config and worker rootfs enablement, and a region leader-secret endpoint.

  • Contracts: 23 new DTO definitions, ~24 existing DTOs enriched with new fields. All schema changes are additive (no fields removed or retyped) — except one restructured DTO (see Breaking Changes).

  • Breaking changes: 1.models.CreateTeam and models.UpdateTeam — policy ID fields moved from top-level into a nested general object; has_general_policies flag now required. Affects POST /api/team and PUT /api/team/{team_id}.

2. ⚠️ Breaking Changes

One breaking change. Existing clients sending a flat CreateTeam payload will receive 400: at least one of general or baremetal policies must be enabled. Update before upgrading.

Endpoints

What changed

Action required

POST /api/team
PUT /api/team/{team_id}

models.CreateTeam / models.UpdateTeam restructured: pricing_policy_id, resource_policy_id, service_policy_id, instance_type_policy_id, image_policy_id moved from top-level fields into a nested general object. New boolean flags has_general_policies and has_baremetal_policies added and at least one must be true.

Restructure request body — wrap policy IDs under "general": {...} and set "has_general_policies": true. See before/after in the Integrator Migration Guide.

GET /api/baremetal/node/{id}/logs

Response shape changed: pagination object replaced by scalar total_count. Query params page/per_page replaced by lines.

Read total_count instead of pagination; replace page/per_page with lines.

3. Added Endpoints

KVM Cluster Nodes (new domain — 22 endpoints)

Method

Path

Handler

Auth

Purpose

POST

/api/kvm/node

AddKVMClusterNode

default

Register a KVM cluster node

GET

/api/kvm/node

GetKVMClusterNodes

default

List KVM cluster nodes

GET

/api/kvm/node/{id}

GetKVMClusterNode

default

Get a node

PUT

/api/kvm/node/{id}

UpdateKVMClusterNode

default

Update a node

DELETE

/api/kvm/node/{id}

DeleteKVMClusterNode

default

Delete a node

POST

/api/kvm/node/{id}/test-connection

TestKVMClusterNodeConnection

default

Test SSH/connectivity

POST

/api/kvm/node/{id}/reconcile-tunnels

ReconcileKVMNodeTunnels

default

Reconcile SSH tunnels

POST

/api/kvm/node/{id}/scan

ScanKVMClusterNode

default

Hardware discovery scan

GET

/api/kvm/node/{id}/storage_metrics

GetKVMNodeStorageMetrics

default

Storage/disk metrics

POST

/api/kvm/node/{id}/cluster

KVMClusterNodeClusterAction

default

Cluster join/leave action

POST

/api/kvm/node/{id}/initialise

InitialiseKVMClusterNode

default

Initialise node

POST

/api/kvm/node/{id}/reset

ResetKVMClusterNode

default

Reset node

POST

/api/kvm/node/{id}/reboot

RebootKVMClusterNode

default

Reboot node

POST

/api/kvm/node/{id}/scan_interfaces

ScanKVMNodeInterfaces

default

Start NIC scan

GET

/api/kvm/node/{id}/scan_interfaces/{scan_id}

GetKVMNodeInterfaceScan

default

Get NIC scan result

GET

/api/kvm/node/{id}/interfaces

GetKVMNodeInterfaces

default

List network interfaces

POST

/api/kvm/node/{id}/network_config

CreateKVMNodeNetworkConfig

default

Create network config

GET

/api/kvm/node/{id}/network_config

GetKVMNodeNetworkConfig

default

Get network config

DELETE

/api/kvm/node/{id}/network_config

DeleteKVMNodeNetworkConfig

default

Delete network config

GET

/api/kvm/node/{id}/ssh_keys

KVMClusterNodeGetSSHKeys

default

Get node SSH keys

GET

/api/kvm/node/{id}/lifecycle-jobs/{job_id}

GetKVMLifecycleJob

default

Poll a lifecycle job

POST

/api/kvm/leader-announce

LeaderAnnounce

default

Leader announcement (cluster coordination)

Marketplace (7 endpoints)

Method

Path

Handler

Auth

Purpose

GET

/api/marketplace/oauth-info

MarketplaceOAuthInfo

open

OAuth client/config info

GET

/api/marketplace/authorize

MarketplaceAuthorizeGet

open

OAuth authorize (render)

POST

/api/marketplace/authorize/login

MarketplaceAuthorizeLogin

open

OAuth authorize login

POST

/api/marketplace/authorize/submit

MarketplaceAuthorizePost

open

OAuth authorize submit/consent

GET

/api/marketplace/gpu_pools/{id}/active_workers

GetGPUPoolActiveWorkers

MarketplaceGate + SecureServiceAccount

Active workers for a published pool

DELETE

/api/marketplace/link/history

DeleteUnlinkedHistory

Secure

Hard-delete revoked link rows (return to never-linked surface)

POST

/api/marketplace/purge-history

PurgeMarketplaceHistory

hand-rolled (revoked-token bearer)

API-to-API purge from mesh on link deletion

Pods (4 endpoints)

Method

Path

Handler

Auth

Purpose

POST

/api/pods/rootfs

PodRootfsAction

default

Rootfs action on a pod

GET

/api/pods/rootfs-status

ExtractRootfsStatus

default

Rootfs extraction status

POST

/api/pods/factory_reset

FactoryResetPod

default

Factory-reset a pod

PUT

/api/pods/{worker_id}/scheduler-config

UpdatePodSchedulerConfig

default

Update pod scheduler config

GPUaaS (3 endpoints)

Method

Path

Handler

Auth

Purpose

GET

/api/gpuaas/pool/{pool_id}/scheduler-config

GetPoolSchedulerConfig

default

Get pool scheduler config

PUT

/api/gpuaas/pool/{pool_id}/scheduler-config

UpdatePoolSchedulerConfig

default

Update pool scheduler config

PUT

/api/gpuaas/pool-workers/rootfs-enable

EnableWorkerRootfs

default

Enable rootfs persistence on workers

Regions (1 endpoint)

Method

Path

Handler

Auth

Purpose

GET

/api/regions/{id}/leader-secret

GetRegionLeaderSecret

Secure

Fetch a region's leader secret

4. Changed Endpoints

No existing endpoint changed its method, path, or auth wrapper. The only diff on existing route registrations (POST/GET/DELETE /api/marketplace/link*) is code-comment-only — behavior and contract are unchanged. Several existing endpoints return additional response fields; see Section 6. The POST /api/team and PUT /api/team/{team_id} request body was restructured — see Section 2.

5. Removed / Deprecated Endpoints

Method

Path

Status

Replacement

POST

/api/gpuaas/pool/{pool_id}/publish

Definition removed from swagger

Marketplace publish flow (publishing is now a marketplace-only action)

POST

/api/gpuaas/pool/{pool_id}/unpublish

Definition removed from swagger

Marketplace unpublish flow

These two routes were already absent from main.go on both branches; only the stale swagger definitions were cleaned up in this window. No client impact between europa and ariel.

6. Schema / DTO Changes

Restructured definitions (breaking — request body changed)

Definition

Change

models.CreateTeam
models.UpdateTeam

Policy ID fields (pricing_policy_id, resource_policy_id, service_policy_id, instance_type_policy_id, image_policy_id) moved from top-level into a nested general object (type models.TeamPolicySet). Equivalent baremetal fields moved into baremetal object. New top-level boolean flags has_general_policies and has_baremetal_policies added; at least one must be true.

New definitions (23)

ctrls.marketplaceConnectRequest, ctrls.marketplacePool, models.AsyncOperationInitResponse, models.BaremetalImageSummary, models.BaremetalInstanceTypeSummary, models.BaremetalNodeProvisionLogsResponse, models.BaremetalNodeSummary, models.ExposeServiceResult, models.ExposeServiceStatusResponse, models.FulfillBaremetalSubscriptionPayload, models.GPUaaSTeamMetrics, models.MarketplaceCreateVolumeRequest, models.MarketplaceDeleteServiceRequest, models.MarketplaceDeleteVolumeRequest, models.MarketplaceExposeServiceRequest, models.MarketplacePodActionRequest, models.MarketplacePodDeprovisionRequest, models.MarketplacePodProvisionRequest, models.MarketplacePodResizeRequest, models.MarketplaceVolumeActionRequest, models.PodStatusInfo, models.UpdateBaremetalSubscriptionPayload, models.WorkerSSHInfo.

Enriched definitions (new fields only — no removals/retypes)

Definition

Added fields

db.Region / models.Region

baremetalEnabled / baremetal_enabled

models.CreateRegionReq

baremetal_enabled

models.AddNodeGpuaasOpts

rootfs_persistence_capable

models.GPUaaSNodeDetails

rootfs_persistence_capable

models.NodeGpuaasResp

rootfs_persistence_capable

models.GPUaaSPool

pool_label

models.BaremetalImageResp

creation_type, description, file_size, hash, is_active, last_used

models.CreateBaremetalImageOpts / UpdateBaremetalImageOpts

description, file_size, hash, is_active

models.BaremetalInstanceTypeResp

creation_type, description, is_active, last_used

models.CreateBaremetalInstanceTypeOpts / UpdateBaremetalInstanceTypeOpts

description, is_active

models.BaremetalNodeResp

service_status

models.TransitionBaremetalNodeOpts

service_status

models.TestConnectionResp

status_transition

models.BaremetalSubscriptionResp

gpu_type, image, image_hash, image_id, instance_type, name, node, os_type, os_version, service_id, workspace_id

models.SubscribeToBaremetalPayload

gpu_type, image_hash, image_id, name, os_type, os_version, service_id, workspace_id

models.MarketplaceUnsubscribeRequest

marketplace_subscription_id

models.MarketplacePoolResponse / MarketplacePoolDetailResponse

gpu_spec_* (architecture, clockspeed_mhz, cores, id, max_tflops, model_id, vendor_id, vram_gb), region_* (city, country, country_code, lat, lng), time_quantum_in_sec, utilization_percent

models.ProvisionMarketplacePoolRequest

gpu_spec_* fields, pool_label, region_city

7. Doc Gaps (QA follow-up)

Mismatches found between main.go (real routes) and docs/swagger.json (generated spec). These are documentation defects, not API changes — worth a ticket:

  • KVM endpoints undocumented: all 22 new /api/kvm/* routes are registered in main.go but absent from swagger.json on both branches.

  • Documented but not routed: swagger advertises POST /marketplace/connect, /marketplace/sync, /marketplace/disconnect but they are not registered in main.go's apiRouter.

  • Path mismatch: swagger lists GET /gpuaas-npu; main.go registers GET /gpuaas-npu/all.

  • Several swagger "added paths" (e.g. /marketplace/pods/*, /marketplace/volumes/*, /baremetal/{id}/fulfill) already existed in europa's main.go — they are newly documented, not new API.