---
title: "Panel users — API reference"
description: "Sub-users: extra panel logins with limited permissions (accountant, technical staff). Scope `users`."
url: https://www.gyrohosting.com/developers/en/api/panel-users.html
language: en
openapi: https://www.gyrohosting.com/developers/openapi.json
api_version: 2.30.0
---

# Panel users

Sub-users: extra panel logins with limited permissions (accountant, technical staff). Scope `users`.

Base URL: `https://www.gyrohosting.com/api/v1/client` · OpenAPI: https://www.gyrohosting.com/developers/openapi.json


## GET /cloud/users

**List sub-users** · operationId `listPanelUsers` · scope `users` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/listPanelUsers.json




### Responses

- **200**: Users
- **401**: Missing, invalid or revoked key
- **404**: Not found — also returned for objects owned by someone else
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)

### Examples

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/users' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```bash
gyro user list
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/users", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/users", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## POST /cloud/users

**Invite a sub-user** · operationId `createPanelUser` · scope `users` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/createPanelUser.json




### Request body

| Field | Type | Description |
|---|---|---|
| `email` (required) | string |  |
| `label` | string |  |
| `permissions` | array<string> | e.g. view_services, view_invoices, pay_invoices, view_tickets, open_tickets ... |
| `send_invite` | boolean |  |

### Responses

- **201**: Created
- **401**: Missing, invalid or revoked key
- **404**: Not found — also returned for objects owned by someone else
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)

### Examples

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/users' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"email": "string", "label": "string", "permissions": ["string"], "send_invite": true}'
```
```bash
gyro user create --help    # all flags
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/users", headers=h, json={"email": "string", "label": "string", "permissions": ["string"], "send_invite": True}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/users", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"email": "string", "label": "string", "permissions": ["string"], "send_invite": true}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## PATCH /cloud/users/{id}

**Update a sub-user (label, status, permissions)** · operationId `updatePanelUser` · scope `users` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/updatePanelUser.json




### Parameters

| Field | in | Type | Description |
|---|---|---|---|
| `id` (required) | path | integer |  |

### Request body

| Field | Type | Description |
|---|---|---|
| `label` | string |  |
| `status` | string (active, inactive) |  |
| `permissions` | array<string> |  |

### Responses

- **200**: Updated
- **401**: Missing, invalid or revoked key
- **404**: Not found — also returned for objects owned by someone else
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)

### Examples

```bash
curl -s -X PATCH 'https://www.gyrohosting.com/api/v1/client/cloud/users/12345' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"label": "string", "status": "active", "permissions": ["string"]}'
```
```bash
gyro user update 12345 --help    # all flags
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.patch("https://www.gyrohosting.com/api/v1/client/cloud/users/12345", headers=h, json={"label": "string", "status": "active", "permissions": ["string"]}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/users/12345", {
  method: "PATCH",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"label": "string", "status": "active", "permissions": ["string"]}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## DELETE /cloud/users/{id}

**Remove a sub-user** · operationId `deletePanelUser` · scope `users` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/deletePanelUser.json




### Parameters

| Field | in | Type | Description |
|---|---|---|---|
| `id` (required) | path | integer |  |

### Responses

- **200**: Deleted
- **401**: Missing, invalid or revoked key
- **404**: Not found — also returned for objects owned by someone else
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)

### Examples

```bash
curl -s -X DELETE 'https://www.gyrohosting.com/api/v1/client/cloud/users/12345' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```bash
gyro user delete 12345
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/users/12345", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/users/12345", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## POST /cloud/users/{id}/resend-invite

**Resend the invitation e-mail** · operationId `resendPanelUserInvite` · scope `users` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/resendPanelUserInvite.json




### Parameters

| Field | in | Type | Description |
|---|---|---|---|
| `id` (required) | path | integer |  |

### Responses

- **200**: Sent
- **401**: Missing, invalid or revoked key
- **404**: Not found — also returned for objects owned by someone else
- **422**: Validation or business rule failure (`confirm_required`, `invalid_image`, `tool_action_failed` ...)

### Examples

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/users/12345/resend-invite' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```bash
gyro user resend-invite 12345
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/users/12345/resend-invite", headers=h, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/users/12345/resend-invite", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
  },
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```
