# /resellers/{id}/promote - Promote reseller to distributor **PATCH /resellers/{id}/promote** Move a reseller one level up to distributor, in place. Restricted to owner-level authority: a user of the Owner organization, or a Super Admin. A Super Admin that does not belong to the Owner organization acts within its own scope only — it can promote the resellers its own organization manages, never a peer's and never the organization it belongs to (403 otherwise). The organization keeps its `id` and `logto_id`, so its customers, users, systems, applications, alert history and Mimir tenant stay attached. Its `custom_data.createdBy` moves to the Owner organization, so the distributor that manages it drops it — and the customers under it — from its scope, and the alerting config chain stops inheriting that distributor's layer. Members get the `Distributor` organization role in place of `Reseller`, so each of them picks up the new level at the next login or token refresh. Rejected with 409 when the reseller is suspended (reactivate it first), when it is not yet synced with Logto, or when the Owner organization cannot be resolved; with 400 when its VAT already belongs to an active distributor (VAT is unique per level). Both carry the `validation_error` shape with stable `message` codes — see the individual responses. ## Servers - Backend API server (port 8080): https://api.your-domain.com/api (Backend API server (port 8080)) - Collect API server (port 8081): https://collect.your-domain.com/api (Collect API server (port 8081)) ## Authentication methods - Bearer auth ## Parameters ### Path parameters - **id** (string) Reseller Logto ID ## Responses ### 200 Reseller promoted successfully #### Body: application/json (object) - **code** (integer) - **message** (string) - **data** (object) ### 400 Validation failed. `data.type` is always `validation_error` and `data.errors[]` carries a stable `message` code the UI turns into an i18n key: `already exists` on `custom_data.vat` when the VAT already belongs to an active distributor (`value` is the VAT). #### Body: application/json (object) - **code** (integer) HTTP error code - **message** (string) Error message - **data** (object) ### 401 Unauthorized - invalid or missing token #### Body: application/json (object) - **code** (integer) - **message** (string) - **data** (object | null) ### 403 Forbidden - insufficient permissions #### Body: application/json (object) - **code** (integer) - **message** (string) - **data** (object | null) ### 404 Resource not found #### Body: application/json (object) - **code** (integer) HTTP error code - **message** (string) Error message - **data** (object) ### 409 The organization cannot be promoted in its current state. Same `validation_error` shape as the 400, on key `promote`, with stable `message` codes: `organization_is_suspended` (reactivate it first), `organization_not_synced` (no Logto organization yet), `owner_organization_not_found` (no Owner organization to attach it to). #### Body: application/json (object) - **code** (integer) HTTP error code - **message** (string) Error message - **data** (object) [Powered by Bump.sh](https://bump.sh)