Skip to main content

API Changelog: User Panel 2.4.1

Generated from a diff of the hostedai-user backend between branch ariel (2.4.0, 2026-06-11, 8c4bd682) and branch ariel_1 (2.4.1, 2026-07-01, f534bbbe). 410 commits in range. Endpoint changes are verified against actual route registration in main.go, not Swagger annotations alone; schema changes are diffed from docs/swagger.json.

1. Summary

  • Old → New: 2.4.0 (ariel) → 2.4.1 (ariel_1).

  • Endpoints (live routes):7 added, 0 removed. 1 method migration (/logout — see §3). Registered routes 330 → 337.

  • Headline additions: a full user-facing recipe execution-logs surface (list / get / ansible-logs / delete / report), a team GPU metrics endpoint, and a POST /logout endpoint.

  • Headline contract change: a large internal Go package reorganization — DTOs were split out of the models package into domain packages (types, pricing, resourcepolicy, gpuaas, baremetalsub, sharedvolume, common). This renames ~128 Swagger schema definitions with identical fields. The JSON wire format is unchanged; only generated schema names change (see §7.1 and §3).

  • Breaking changes (wire contract): 0. No JSON request/response field was removed or retyped for any live endpoint.

  • Deprecations: 1GET /logout is now a deprecated back-compat alias for POST /logout.

Metric

Count

Registered routes (main.go)

330 → 337

Documented operations (Swagger)

327 → 333

Genuinely new endpoints (live routes)

7

Newly documented endpoints (already live in 2.4.0)

1

Removed endpoints (live routes)

0

Removed from Swagger only (doc cleanup, never routed)

3

Breaking changes (wire contract)

0

Deprecations

1 (GET /logout)

Renamed schemas / DTOs (package move, identical fields)

~128 (2 gained fields)

New schemas / DTOs

39

Removed schemas / DTOs (stale, never routed)

3

2. ⚠️ Breaking Changes

No breaking wire changes. Every live endpoint keeps its JSON request/response field names and types. The one item integrators must act on is a code-generation concern, not a runtime one — see §3 (schema-name refactor) and the Integrator Migration Guide.

3. ⚠️ Deprecation Notices & Code-generation Impact

Item

Status

Detail & recommended path

GET /logout

DEPRECATED

Logout moved to POST /logout. GET /logout is retained only for backward compatibility and is marked in code for removal once front-ends migrate (// backward compat — deprecated, remove once FE moves to POST). Migrate clients to POST /logout.

Package-prefixed Swagger schema names (~128 definitions)

CHANGING

DTOs were moved out of models into domain packages, so schema names changed (e.g. models.ApiKeytypes.ApiKey, models.PricingPolicypricing.PricingPolicy). Fields are identical — raw-JSON clients are unaffected. Clients that generate SDKs from the OpenAPI spec will see renamed model classes and must regenerate. This reorganization is ongoing; further schema-name changes are expected in upcoming releases.

What this refactor is not: it is not a removal of 128 models. Matching old and new definitions by name shows 128 pairs with byte-identical field sets. Only 2 gained fields (both additive): sharedvolume.SharedVolumeListing (+ currency_code, currency_symbol) and common.ErrorJson (+ trace_id).

4. New Endpoints (live routes)

All verified as new route registrations in main.go (not present in 2.4.0).

Method

Path

Handler

Purpose

GET

/api/user/recipes/execution-logs

GetUserRecipeExecutionLogs

List the user's recipe execution logs (paginated).

GET

/api/user/recipes/execution-logs/{id}

GetUserRecipeExecutionLog

Get a single recipe execution log.

GET

/api/user/recipes/execution-logs/{id}/ansible-logs

GetUserRecipeAnsibleLogs

Get the Ansible logs for a recipe execution.

DELETE

/api/user/recipes/execution-logs/{id}

RemoveUserRecipeExecutionLog

Delete a recipe execution log.

POST

/api/user/recipes/execution-logs/{id}/report

ReportRecipeExecutionIssue

Report an issue with a recipe execution.

GET

/api/pods/team-metrics

TeamMetrics

GPU/team usage metrics (gpuaas.TeamMetricsResponse).

POST

/api/logout

LogOut

New primary logout method (replaces GET /logout — see §3).

5. Newly Documented & Doc-only Endpoints

Method

Path

Note

GET

/api/team/{team_id}/suspend-impact

Newly documented. Live route in both 2.4.0 and 2.4.1 (handler GetTeamSuspendImpact); only its Swagger annotation is new. Response DTO models.TeamSuspendImpact.

POST

/api/global-admin/users

DOC GAP Appears in Swagger (summary “Create a full-admin user (test provisioning)”, DTO ctrls.CreateAdminUserInput) but is not registered in main.go in either branch. It is a documentation annotation only — not a live endpoint. Worth a QA ticket.

6. Removed / Cleaned-up (documentation only)

No live route was removed. The following left Swagger only; none was a callable endpoint in 2.4.0. No client impact.

Swagger path (2.4.0)

Reason

GET /logout

Superseded by POST /logout in the docs. The GET route still exists as a deprecated back-compat alias (§3).

GET /policy-team

Handler GetPolicyTeamByIDs was never registered in main.go (documentation-only in both branches; also flagged in the previous changelog). Swagger entry removed.

POST /instant-stats

Never registered as a live route in either branch. Swagger entry removed.

7. Schema / DTO Changes

7.1 Package reorganization (~128 renamed definitions — identical fields)

DTOs were moved from models into domain packages. Swagger definition names changed accordingly; field names and types are unchanged. Representative examples below — see §3 for integrator impact.

Target package

Examples (old → new)

types

models.ApiKeytypes.ApiKey, models.Usertypes.User, models.Team, models.Instance, models.InstanceType, models.Workspace, models.Network, models.StorageBlock, models.Currency, models.SSHKey

pricing

models.PricingPolicy, models.PricingPolicyDetails, models.CardPricing, models.ResourcePricing, models.ServicePricing

resourcepolicy

models.ResourcePolicyListing, models.ResourcePolicyDetails, models.AvailableResource, models.RegionAccess

gpuaas

models.AllGpuPoolList, models.PoolSubscriptionDetails, models.TeamMetricsResponse, models.Metrics

baremetalsub

models.BaremetalSubscriptionResp, models.FulfillBaremetalRequestPayload, models.UpdateBaremetalSubscriptionPayload

sharedvolume

models.SharedVolume, models.CreateSharedVolumeOpts, models.SharedVolumeListing (+ currency_code, currency_symbol)

common

utils.ErrorJsoncommon.ErrorJson (+ trace_id), utils.FieldErrorcommon.FieldError

7.2 New definitions (39)

New feature DTOs

New domain-package representations (created by the ongoing refactor)

7.3 Removed definitions (3)

models.InstantStats, models.CreateInstantStatsOpts (tied to the never-routed POST /instant-stats), and models.PolicyTeam (tied to the never-routed GET /policy-team). No client impact — the endpoints were never callable.

8. QA Follow-up

  • Doc gap:POST /global-admin/users is documented but not routed (§5). Either register the route or remove the annotation.

  • Schema-name churn: the package reorganization (§7.1) is in progress across releases. Recommend stabilizing OpenAPI schema names (e.g. via swaggo@name directives) and adding a CI gate that fails on unintended schema-name/field changes, to prevent this recurring in 2.4.2+.

The customer-facing companion to this page is the child page User Panel API — 2.4.0 → 2.4.1 (Integrator Migration Guide). Keep both in sync when the diff is revised.