---
title: "Reseller — API reference"
description: "Reseller (bayi) accounts manage their own end-customers, assign services, mint end-customer keys and read usage reports. Services stay on the reseller"
url: https://www.gyrohosting.com/developers/en/api/reseller.html
language: en
openapi: https://www.gyrohosting.com/developers/openapi.json
api_version: 2.30.0
---

# Reseller

Reseller (bayi) accounts manage their own end-customers, assign services, mint end-customer keys and read usage reports. Services stay on the reseller account and use its discount.

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


## GET /cloud/reseller/settings

**Reseller settings** · operationId `getResellerSettings` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/getResellerSettings.json




### Responses

- **200**: Settings
- **403**: Key lacks the scope, IP not allowed, or feature disabled

### Examples

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

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/reseller/settings", 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/reseller/settings", {
  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}`);
```


## PUT /cloud/reseller/settings

**Save reseller settings (white label)** · operationId `saveResellerSettings` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/saveResellerSettings.json




### Request body

| Field | Type | Description |
|---|---|---|
| `white_label` | boolean |  |

### Responses

- **200**: Settings
- **403**: Key lacks the scope, IP not allowed, or feature disabled

### Examples

```bash
curl -s -X PUT 'https://www.gyrohosting.com/api/v1/client/cloud/reseller/settings' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"white_label": true}'
```
```bash
gyro reseller setting set --help    # all flags
```
```python
import os, uuid, requests

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


## GET /cloud/reseller/report

**Usage and billing report per end-customer** · operationId `resellerReport` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/resellerReport.json




### Parameters

| Field | in | Type | Description |
|---|---|---|---|
| `from` | query | string |  |
| `to` | query | string |  |

### Responses

- **200**: Report
- **403**: Key lacks the scope, IP not allowed, or feature disabled

### Examples

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

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/reseller/report", 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/reseller/report", {
  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/reseller/assign

**Assign a service to an end-customer (customer_id 0 = unassign)** · operationId `assignService` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/assignService.json




### Request body

| Field | Type | Description |
|---|---|---|
| `service_id` (required) | integer |  |
| `customer_id` (required) | integer |  |

### Responses

- **200**: Assignment
- **404**: Not found — also returned for objects owned by someone else

### Examples

```bash
curl -s -X POST 'https://www.gyrohosting.com/api/v1/client/cloud/reseller/assign' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"service_id": 1, "customer_id": 1}'
```
```bash
gyro reseller assign --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/reseller/assign", headers=h, json={"service_id": 1, "customer_id": 1}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/reseller/assign", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"service_id": 1, "customer_id": 1}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/reseller/customers

**List end-customers** · operationId `listResellerCustomers` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/listResellerCustomers.json




### Parameters

| Field | in | Type | Description |
|---|---|---|---|
| `external_ref` | query | string |  |
| `page` | query | integer |  |
| `limit` | query | integer |  |

### Responses

- **200**: Customers
- **403**: Key lacks the scope, IP not allowed, or feature disabled

### Examples

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```bash
gyro reseller customer list
```
```hcl
# resource gyro_reseller_customer: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/reseller_customer
# Reseller (bayi) accounts only
resource "gyro_reseller_customer" "acme" {
  name         = "Acme Ltd"
  external_ref = "acme-001"
  allow_order  = true # Acme's keys may order servers, paid from YOUR balance at your discount
}
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers", 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/reseller/customers", {
  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/reseller/customers

**Create an end-customer** · operationId `createResellerCustomer` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/createResellerCustomer.json




### Request body

| Field | Type | Description |
|---|---|---|
| `name` | string |  |
| `email` | string |  |
| `external_ref` | string | Your own customer id (unique per reseller) |
| `note` | string |  |
| `status` | string (active, suspended) |  |
| `allow_order` | boolean | May this customer's keys order servers (paid from YOUR balance)? |

### Responses

- **201**: Created
- **409**: State conflict (`server_locked`, `not_actionable`, `ssh_key_exists`, `server_limit`, `idempotency_in_flight`)
- **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/reseller/customers' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme Ltd", "external_ref": "acme-001", "allow_order": false}'
```
```bash
gyro reseller customer create --help    # all flags
```
```hcl
# resource gyro_reseller_customer: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/reseller_customer
# Reseller (bayi) accounts only
resource "gyro_reseller_customer" "acme" {
  name         = "Acme Ltd"
  external_ref = "acme-001"
  allow_order  = true # Acme's keys may order servers, paid from YOUR balance at your discount
}
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.post("https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers", headers=h, json={"name": "Acme Ltd", "external_ref": "acme-001", "allow_order": False}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"name": "Acme Ltd", "external_ref": "acme-001", "allow_order": false}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## GET /cloud/reseller/customers/{id}

**Get an end-customer** · operationId `getResellerCustomer` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/getResellerCustomer.json




### Parameters

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

### Responses

- **200**: Customer
- **404**: Not found — also returned for objects owned by someone else

### Examples

```bash
curl -s 'https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers/12345' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```bash
gyro reseller customer get 12345
```
```hcl
# resource gyro_reseller_customer: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/reseller_customer
# Reseller (bayi) accounts only
resource "gyro_reseller_customer" "acme" {
  name         = "Acme Ltd"
  external_ref = "acme-001"
  allow_order  = true # Acme's keys may order servers, paid from YOUR balance at your discount
}
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers/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/reseller/customers/12345", {
  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}`);
```


## PATCH /cloud/reseller/customers/{id}

**Update an end-customer (suspend = its keys stop working)** · operationId `updateResellerCustomer` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/updateResellerCustomer.json




### Parameters

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

### Request body

| Field | Type | Description |
|---|---|---|
| `name` | string |  |
| `email` | string |  |
| `external_ref` | string | Your own customer id (unique per reseller) |
| `note` | string |  |
| `status` | string (active, suspended) |  |
| `allow_order` | boolean | May this customer's keys order servers (paid from YOUR balance)? |

### Responses

- **200**: Customer
- **404**: Not found — also returned for objects owned by someone else

### Examples

```bash
curl -s -X PATCH 'https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers/12345' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "string", "email": "string", "external_ref": "string", "note": "string", "status": "active", "allow_order": true}'
```
```bash
gyro reseller customer update 12345 --help    # all flags
```
```hcl
# resource gyro_reseller_customer: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/reseller_customer
# Reseller (bayi) accounts only
resource "gyro_reseller_customer" "acme" {
  name         = "Acme Ltd"
  external_ref = "acme-001"
  allow_order  = true # Acme's keys may order servers, paid from YOUR balance at your discount
}
```
```python
import os, uuid, requests

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


## DELETE /cloud/reseller/customers/{id}

**Delete an end-customer (revokes keys and webhooks, unassigns services)** · operationId `deleteResellerCustomer` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/deleteResellerCustomer.json




### Parameters

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

### Responses

- **200**: Deleted
- **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/reseller/customers/12345' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```bash
gyro reseller customer delete 12345
```
```hcl
# resource gyro_reseller_customer: https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs/resources/reseller_customer
# Reseller (bayi) accounts only
resource "gyro_reseller_customer" "acme" {
  name         = "Acme Ltd"
  external_ref = "acme-001"
  allow_order  = true # Acme's keys may order servers, paid from YOUR balance at your discount
}
```
```python
import os, uuid, requests

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.delete("https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers/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/reseller/customers/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}`);
```


## GET /cloud/reseller/customers/{id}/keys

**List an end-customer's keys** · operationId `listResellerCustomerKeys` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/listResellerCustomerKeys.json




### Parameters

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

### Responses

- **200**: Keys
- **404**: Not found — also returned for objects owned by someone else

### Examples

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

h = {"Authorization": "Bearer " + os.environ["GYRO_TOKEN"]}
r = requests.get("https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers/12345/keys", 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/reseller/customers/12345/keys", {
  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/reseller/customers/{id}/keys

**Mint a key for an end-customer (token returned once)** · operationId `createResellerCustomerKey` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/createResellerCustomerKey.json




### Parameters

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

### Request body

| Field | Type | Description |
|---|---|---|
| `name` (required) | string |  |
| `scopes` | array<string (cloud_read, cloud_write, cloud_order, cloud_delete, services_read, services_write, webhooks)> |  |
| `services` | array<integer> | Optional service allow list |
| `actions` | array<string> | Optional action allow list: server actions (reboot) or tool:action / tool:* / method:name |
| `ips` | array<string> |  |
| `rate_limit` | integer | Requests per minute (<= your own limit; 0 = default) |

### Responses

- **201**: Created
- **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/reseller/customers/12345/keys' \
  -H "Authorization: Bearer $GYRO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "string", "scopes": ["cloud_read"], "services": [1], "actions": ["string"], "ips": ["string"], "rate_limit": 1}'
```
```bash
gyro reseller customer key create 12345 --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/reseller/customers/12345/keys", headers=h, json={"name": "string", "scopes": ["cloud_read"], "services": [1], "actions": ["string"], "ips": ["string"], "rate_limit": 1}, timeout=60)
r.raise_for_status()
print(r.json()["data"])
```
```js
const res = await fetch("https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers/12345/keys", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GYRO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"name": "string", "scopes": ["cloud_read"], "services": [1], "actions": ["string"], "ips": ["string"], "rate_limit": 1}),
});
const { data, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
```


## DELETE /cloud/reseller/customers/{id}/keys/{kid}

**Revoke an end-customer key** · operationId `deleteResellerCustomerKey` · scope `reseller` · OpenAPI fragment: https://www.gyrohosting.com/developers/spec/ops/deleteResellerCustomerKey.json




### Parameters

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

### Responses

- **200**: Deleted
- **404**: Not found — also returned for objects owned by someone else

### Examples

```bash
curl -s -X DELETE 'https://www.gyrohosting.com/api/v1/client/cloud/reseller/customers/12345/keys/1' \
  -H "Authorization: Bearer $GYRO_TOKEN"
```
```bash
gyro reseller customer key 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/reseller/customers/12345/keys/1", 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/reseller/customers/12345/keys/1", {
  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}`);
```
