---
title: "Get reseller billing"
description: "Return the compact billing snapshot for one reseller (mode, credits, slot cap, active user count, expiration)."
---

# Get reseller billing

Return the compact billing snapshot for one reseller. The same shape appears embedded under `billing` on `GET /resellers/{id}` and as the return value of `POST /resellers/{id}/billing/adjust`, so any integration that consumes billing state can share one parser across all three.

`active_users` is always live. The endpoint recomputes `count(active non-trial users) + sum(sub-reseller max_users)` on every call, so the value can never be stale relative to the underlying rows.

## Endpoint

`GET https://<your-panel-domain>/panel-api/v1/resellers/{id}/billing`

## Authentication

Send the API key in the `Authorization: Bearer <your-api-key>` header. Only admin keys can call this endpoint.

## Required scope

`resellers:read`

## Path parameters

| Name | Type | Description |
| ---- | ---- | ----------- |
| `id` | int | The reg-user ID of the reseller. |

## Response

Every response has the five fields below. Which ones are populated depends on `mode`.

| Field | Type | Description |
| ----- | ---- | ----------- |
| `mode` | string | Either `"credits"` or `"users"`. |
| `credits` | float or null | Current credit balance. Populated only in `credits` mode. `null` in `users` mode. |
| `max_users` | int or null | Slot cap. Populated only in `users` mode. `null` in `credits` mode. |
| `active_users` | int or null | Slots currently in use (active non-trial users plus slots reserved by sub-resellers). Populated only in `users` mode. |
| `billing_expires` | int or null | Unix timestamp in seconds after which the account can no longer create or renew lines. Present in either mode when the admin has set an expiration; `null` otherwise. |

Response for a `credits`-mode reseller:

```json
{
  "mode": "credits",
  "credits": 10,
  "max_users": null,
  "active_users": null,
  "billing_expires": null
}
```

Response for a `users`-mode reseller:

```json
{
  "mode": "users",
  "credits": null,
  "max_users": 500,
  "active_users": 312,
  "billing_expires": 1793308800
}
```

## Examples

### cURL

```bash
curl -H "Authorization: Bearer <your-api-key>" \
  https://<your-panel-domain>/panel-api/v1/resellers/262260/billing
```

### PHP SDK

```php
require __DIR__ . '/api-panel-php-sdk-1.0.0/autoload.php';
use XtreamAI\PanelApi\PanelApiClient;

$client = new PanelApiClient(baseUrl: 'https://<your-panel-domain>', token: '<your-api-key>');
$billing = $client->resellers->billing(262260);
if ($billing->mode === 'credits') {
    echo 'credits balance: ', $billing->credits, PHP_EOL;
} else {
    echo 'slots: ', $billing->activeUsers, '/', $billing->maxUsers, PHP_EOL;
}
```

### Python SDK

```python
from xtream_ai_panel_api import PanelApiClient

client = PanelApiClient(base_url="https://<your-panel-domain>", token="<your-api-key>")
billing = client.resellers.billing(262260)
if billing.mode == "credits":
    print("credits balance:", billing.credits)
else:
    print("slots:", billing.active_users, "/", billing.max_users)
```

## Errors

| HTTP | Error slug | When it happens | How to fix |
| ---- | ---------- | --------------- | ---------- |
| 401 | `invalid_key` | Missing, malformed, or unknown API key. | Send a live key in `Authorization: Bearer <token>`. |
| 403 | `insufficient_scope` | The key does not carry `resellers:read`. | Use an admin key. |
| 404 | `not_found` | No reseller exists with that ID. | Verify the ID with `GET /resellers/{id}` first. |
| 429 | `rate_limited` | The per-key request budget for this minute is spent. | Back off and retry after the minute rolls over. |

## See also

- [Adjust reseller billing](/docs/?page=xai-ref-resellers-billing-adjust)
- [Get a reseller](/docs/?page=xai-ref-resellers-get)
- [Panel API Resellers overview](/docs/?page=xai-ref-resellers-list)
