MethodPathSummaryAuth
GET/v1/admin/package-groupsList package catalog groupsSession
POST/v1/admin/package-groupsCreate a package catalog groupSession
PATCH/v1/admin/package-groups/{id}Replace package group fields using optimistic concurrencySession
DELETE/v1/admin/package-groups/{id}Soft-delete an unused package groupSession

Contract file:api/openapi/v1/control.yaml

Operation details

GET /v1/admin/package-groups

List package catalog groups

operationId
listPackageGroups
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires packages.manage in the platform scope, or reseller.packages.manage in an active reseller tenant scope; each scope sees and changes only the groups and packages it owns (owner_scope_id), and another owner's package returns permission_denied. Unknown or repeated query parameters are rejected.

Responses

listPackageGroups Responses
StatusDescription
200All active groups ordered by sort order and then name.

Fields:items: array<PackageGroup> total: integer(int64)

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
500The request could not be completed because of an internal failure.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/package-groups

Create a package catalog group

operationId
createPackageGroup
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires packages.manage in the platform scope, or reseller.packages.manage in an active reseller tenant scope; each scope sees and changes only the groups and packages it owns (owner_scope_id), and another owner's package returns permission_denied. The same idempotency key and normalized input replay the original response; a changed input returns idempotency_conflict, and a duplicate active name returns package_name_conflict.

Parameters

createPackageGroup Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createPackageGroup Request body
NameTypeRequiredDescription
namestringYes—
visiblebooleanYesWhether the group is shown in package selection surfaces.
sort_orderintegerYes—

Responses

createPackageGroup Responses
StatusDescription
201Group created, or an identical idempotent request replayed.

Fields:id: string(uuid) owner_scope_id: string(uuid) name: string visible: boolean sort_order: integer revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
409The requested state conflicts with an existing resource or idempotency fact.
500The request could not be completed because of an internal failure.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

PATCH /v1/admin/package-groups/{id}

Replace package group fields using optimistic concurrency

operationId
updatePackageGroup
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires packages.manage in the platform scope, or reseller.packages.manage in an active reseller tenant scope; each scope sees and changes only the groups and packages it owns (owner_scope_id), and another owner's package returns permission_denied. expected_revision is checked atomically; stale input returns version_conflict. An identical idempotent request replays the original response.

Parameters

updatePackageGroup Parameters
NameInTypeRequiredDescription
idpathstring(uuid)YesPackage group or package product UUID.
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

updatePackageGroup Request body
NameTypeRequiredDescription
expected_revisioninteger(int64)Yes—
namestringYes—
visiblebooleanYesWhether the group is shown in package selection surfaces.
sort_orderintegerYes—

Responses

updatePackageGroup Responses
StatusDescription
200Group fields replaced and revision incremented, or an identical request replayed.

Fields:id: string(uuid) owner_scope_id: string(uuid) name: string visible: boolean sort_order: integer revision: integer(int64) created_at: string(date-time) updated_at: string(date-time)

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
500The request could not be completed because of an internal failure.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

DELETE /v1/admin/package-groups/{id}

Soft-delete an unused package group

operationId
deletePackageGroup
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires packages.manage in the platform scope, or reseller.packages.manage in an active reseller tenant scope; each scope sees and changes only the groups and packages it owns (owner_scope_id), and another owner's package returns permission_denied. If-Match supplies the expected revision. A group referenced by an active package returns package_group_in_use; a stale revision returns version_conflict.

Parameters

deletePackageGroup Parameters
NameInTypeRequiredDescription
idpathstring(uuid)YesPackage group or package product UUID.
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Responses

deletePackageGroup Responses
StatusDescription
204Group soft-deleted, or an identical idempotent request replayed.
400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
500The request could not be completed because of an internal failure.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list