MethodPathSummaryAuth
GET/v1/reseller/customersA reseller lists its own customersSession
POST/v1/reseller/customersA reseller opens a customer tenant under itselfSession
GET/v1/reseller/customers/{scope_id}/sitesA reseller lists one of its customers' sites (read only)Session
PUT/v1/reseller/customers/{user_id}/statusA reseller suspends (disabled) or resumes (active) one of its customersSession

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

Operation details

GET /v1/reseller/customers

A reseller lists its own customers

operationId
listResellerCustomers
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

All of:reseller.customers.read

Description (from the contract)

Tenant session of an active reseller with reseller.customers.read or reseller.customers.manage. Items are the owner users of tenants whose parent_scope_id is the caller's scope (ManagedUser shape, metadata always set, group always null).

Parameters

listResellerCustomers Parameters
NameInTypeRequiredDescription
pagequeryintegerNo—
limitqueryintegerNo—
searchquerystringNoUsername, name, email, phone or display ID substring.
statusquerystring: active / disabledNo—

Responses

listResellerCustomers Responses
StatusDescription
200One page of customers.

Fields:items: array<ManagedUser> page: integer limit: integer 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/reseller/customers

A reseller opens a customer tenant under itself

operationId
createResellerCustomer
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

All of:reseller.customers.manage

Description (from the contract)

Creates tenant + tenant scope + owner user in one transaction with parent_scope_id = the caller's scope (the 480 guard re-checks the active reseller and customer_limit). Audit identity.user.create in both scopes. 422 reseller_customer_limit when the limit is reached; 409 username_conflict.

Parameters

createResellerCustomer Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createResellerCustomer Request body
NameTypeRequiredDescription
usernamestringYes—
passwordstringYes8 to 1024 printable ASCII characters (no space) with at least two of upper case, lower case, digits and symbols; otherwise password_policy_unmet.
display_namestringYes—
emailstring | nullNo—
phonestring | nullNo—
remarkstring | nullNo—
qqstring | nullNo—

Responses

createResellerCustomer Responses
StatusDescription
201The customer's owner user.

Fields:id: string(uuid) display_id: string scope_id: string(uuid) tenant_id: string(uuid) username: string display_name: string email: string(email) | null(email) phone: string | null status: string: active / disabled role: string: tenant_owner / tenant_viewer group_id: string(uuid) | null(uuid) group_name: string | null metadata?: ManagedUserMetadata verification?: ManagedUserVerification reseller?: ManagedUserReseller 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.
422The request is well formed but breaks a business rule (error.code names it).
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

GET /v1/reseller/customers/{scope_id}/sites

A reseller lists one of its customers' sites (read only)

operationId
listResellerCustomerSites
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

All of:reseller.customers.read

Description (from the contract)

Tenant session of an active reseller with reseller.customers.read or reseller.customers.manage. The scope must be a customer tenant under the caller's active reseller scope (same check as the reseller package-commerce routes); any other scope, the caller's own included, is 403. Items carry only id, display_id and domain, newest first.

Parameters

listResellerCustomerSites Parameters
NameInTypeRequiredDescription
scope_idpathstring(uuid)YesThe customer's tenant scope ID.
pagequeryintegerNo—
limitqueryintegerNo—
domainquerystringNoCase-insensitive domain substring.

Responses

listResellerCustomerSites Responses
StatusDescription
200One page of the customer's sites.

Fields:items: array<object> page: integer limit: integer 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.
503A required dependency is unavailable.

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.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

PUT /v1/reseller/customers/{user_id}/status

A reseller suspends (disabled) or resumes (active) one of its customers

operationId
setResellerCustomerStatus
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

All of:reseller.customers.manage

Description (from the contract)

Only the owner user of the caller's own customer tenant; anything else is 404. Disabling revokes the user's sessions. Audit reseller.customer.status in both scopes. 409 version_conflict on a stale expected_revision.

Parameters

setResellerCustomerStatus Parameters
NameInTypeRequiredDescription
user_idpathstring(uuid)Yes—

Request body

application/json · Required:Yes

setResellerCustomerStatus Request body
NameTypeRequiredDescription
statusstring: active / disabledYes—
expected_revisioninteger(int64)Yes—

Responses

setResellerCustomerStatus Responses
StatusDescription
200The customer's owner user after the change.

Fields:id: string(uuid) display_id: string scope_id: string(uuid) tenant_id: string(uuid) username: string display_name: string email: string(email) | null(email) phone: string | null status: string: active / disabled role: string: tenant_owner / tenant_viewer group_id: string(uuid) | null(uuid) group_name: string | null metadata?: ManagedUserMetadata verification?: ManagedUserVerification reseller?: ManagedUserReseller 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