Public reference
Users
Every endpoint in this group. Open one for its parameters and a worked example.
Users
92GET /api/v1/users List subscribers
One page of subscribers under the caller's authority. A manager without tenant-wide visibility sees only subscribers owned by their own manager subtree, and that scope is injected server-side, so a filter can narrow within it but never widen past it.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users - Rate limit
user_list
The per-subscriber scan token (lookup_token) is deliberately absent from list rows. It is served by GET /users/{id} and GET /users/resolve only, because a page of a thousand rows is a bulk harvest of codes that each unlock a subscriber record.
Parameters
| Parameter | Description |
|---|---|
q
query · string
|
Searches username, email, first and last name, phone, contract id, national id and static IP. A purely numeric term also matches the subscriber id exactly. |
filter[enabled]
query · boolean
|
The admin suspend flag. Not the same thing as expired. |
filter[expired]
query · boolean
|
Subscription window has passed. |
filter[online]
query · boolean
|
An open RADIUS session exists right now. |
filter[profile_id]
query · integer
|
Bound plan. |
filter[parent_id]
query · integer
|
Owning manager. Ignored, not honoured, when it would widen a restricted caller's scope. |
filter[username_exact]
query · string
|
Case-insensitive exact username, for a caller that already knows the identity and wants one deterministic row instead of a page of substring hits. |
filter[expiring_within_days]
query · integer
|
Future expiries only. |
filter[created_from]
query · string
|
yyyy-MM-dd HH:mm:ss in UTC. A malformed value is a 400, not an ignored filter. |
{
"data": [
{
"id": 4711,
"tenant_id": 12,
"username": "ahmed",
"email": "ahmed@example.test",
"enabled": true,
"status": {
"enabled": true,
"deleted": false,
"online": true,
"expired": false,
"have_quota": true,
"fup": false,
"can_connect": true
},
"profile_id": 7,
"profile_name": "Home 20M",
"parent_id": 41,
"parent_username": "cairo-reseller",
"bytes_remaining": 48318382080,
"plan_bytes_limit": 107374182400,
"used_bytes": 59055800320,
"expiration": "2026-10-14 00:00:00",
"balance": 0.00,
"debt": 0.00,
"mac_lock_enabled": false,
"mac_locked_addrs": [],
"enforces_bytes": true,
"enforces_seconds": false,
"created_at": "2026-03-02 11:40:12"
}
],
"meta": { "page": 1, "page_size": 50, "total": 812, "has_next": true }
}
POST /api/v1/users Create a subscriber
Creates the account and its identity only. It does not activate a plan, take money or grant quota — binding profile_id here is metadata. Use the activation endpoint for the paid part.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_createCreate users - Rate limit
t_mutate
debt_limit is tri-state and the two falsy values mean opposite things. Omitted or null is unlimited credit; 0 is no credit at all. Sending 0 to mean "no opinion" silently blocks every future debit.
Parameters
| Parameter | Description |
|---|---|
usernamerequired
body · string
|
Unique within the tenant, not globally. |
passwordrequired
body · string
|
The RADIUS password. Stored recoverable, because CHAP and MS-CHAPv2 need it that way. |
parent_id
body · integer
|
Owning manager. Defaults to the caller. A subscriber is never parent-less, and a named owner must be a manager the caller may act on. |
profile_id
body · integer
|
Plan to bind. Must be one the acting manager may actually assign. |
expiration
body · string
|
yyyy-MM-dd HH:mm:ss in UTC. |
debt_limit
body · number
|
Credit ceiling. Omitted or null is unlimited, 0 is no credit. |
portal_password
body · string
|
Optional portal-only password, hashed before storage and distinct from the RADIUS password above. |
custom_fields
body · object
|
Tenant-defined form values, validated against the user form schema. |
{
"data": {
"id": 4712,
"tenant_id": 12,
"username": "ahmed",
"enabled": true,
"profile_id": 7,
"parent_id": 41,
"balance": 0.00,
"debt": 0.00,
"created_at": "2026-09-20 09:14:55"
}
}
POST /api/v1/users/bulk-add-days Extend subscription
- Authentication
- Staff token or session
- Requires permission
-
prm_users_extendExtend subscription - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-add-hours Extend subscription
- Authentication
- Staff token or session
- Requires permission
-
prm_users_extendExtend subscription - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-add-traffic Add traffic
- Authentication
- Staff token or session
- Requires permission
-
prm_users_add_trafficAdd traffic - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-delete Delete users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_deleteDelete users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-deposit Deposit to user wallet
- Authentication
- Staff token or session
- Requires permission
-
prm_users_depositDeposit to user wallet - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-deposit/preview Deposit to user wallet
- Authentication
- Staff token or session
- Requires permission
-
prm_users_depositDeposit to user wallet - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-disable Suspend many subscribers
Takes an array of ids and suspends each. One request against the per-tenant write budget instead of one per subscriber, which is the difference between fitting in a minute and not.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_enable_disableEnable / suspend users - Rate limit
t_mutate
A bulk call reports per-id outcomes and returns 200 even when some ids failed. failed is always present, as an array, and each entry carries a stable reason (not_found, not_authorized, error) alongside a localized message. Branch on reason; treating the 200 as "all of them worked" is the mistake this shape exists to prevent.
Parameters
| Parameter | Description |
|---|---|
idsrequired
body · array
|
Subscriber ids. |
{
"data": {
"updated": [4711, 4713],
"failed": [
{ "id": 4712, "reason": "not_authorized", "message": "You may not act on this record." }
]
}
}
POST /api/v1/users/bulk-disconnect Live traffic / disconnect
- Authentication
- Staff token or session
- Requires permission
-
prm_users_live_trafficLive traffic / disconnect - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-enable Enable / suspend users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_enable_disableEnable / suspend users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-extend
- Authentication
- Staff token or session
- Requires any one of
-
prm_users_activateprm_users_extend - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-extend/preview
- Authentication
- Staff token or session
- Requires any one of
-
prm_users_activateprm_users_extend - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-reset-balance Withdraw / settle user debt
- Authentication
- Staff token or session
- Requires permission
-
prm_users_withdrawalWithdraw / settle user debt - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-reset-quota Reset user quota
- Authentication
- Staff token or session
- Requires permission
-
prm_users_reset_quotaReset user quota - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-set-expiration Extend subscription
- Authentication
- Staff token or session
- Requires permission
-
prm_users_extendExtend subscription - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-set-group Assign groups
- Authentication
- Staff token or session
- Requires permission
-
prm_groups_assignAssign groups - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-set-parent Change user parent
- Authentication
- Staff token or session
- Requires permission
-
prm_users_change_parentChange user parent - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-set-profile Change user profile
- Authentication
- Staff token or session
- Requires permission
-
prm_users_change_profileChange user profile - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-withdraw Withdraw / settle user debt
- Authentication
- Staff token or session
- Requires permission
-
prm_users_withdrawalWithdraw / settle user debt - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/bulk-withdraw/preview Withdraw / settle user debt
- Authentication
- Staff token or session
- Requires permission
-
prm_users_withdrawalWithdraw / settle user debt - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/owner-context Create users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_createCreate users
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/resolve Resolve a subscriber by scan code
Exchanges the opaque per-subscriber scan token, the one encoded in a printed QR code, for the subscriber record. Scoped to the caller's subtree exactly like a direct fetch.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users - Rate limit
user_resolve
Parameters
| Parameter | Description |
|---|---|
coderequired
query · string
|
The scan token. The QR payload is prefixed with xr:u: — strip the prefix before sending. |
GET /api/v1/users/summary Count subscribers by state
Fleet-health counters over exactly the same authority scope as the list, so a count and the rows behind it always agree.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
active means enabled AND not expired, not the bare enabled flag. total is every non-deleted subscriber, so the four other counters do not sum to it.
{
"data": {
"total": 812,
"active": 640,
"disabled": 44,
"online": 318,
"expired": 128
}
}
DELETE /api/v1/users/{id} Delete a subscriber
Soft-deletes the account and frees its username slot by renaming the row. The subscriber's live portal sessions are ended.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_deleteDelete users - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
GET /api/v1/users/{id} Fetch one subscriber
The full record, including the computed status object and the fields the list projection leaves out.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
A subscriber that exists but sits outside your subtree returns the same 404 as one that does not exist, byte for byte including details.reason. That is deliberate: a 403 would confirm the id and make the id space enumerable.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
{
"data": {
"id": 4711,
"tenant_id": 12,
"username": "ahmed",
"enabled": true,
"status": { "online": true, "expired": false, "have_quota": true, "can_connect": true },
"profile_id": 7,
"fup_profile_id": null,
"bytes_remaining": 48318382080,
"seconds_remaining": null,
"expiration": "2026-10-14 00:00:00",
"balance": 0.00,
"debt": 0.00,
"debt_limit": null,
"mac_lock_enabled": false,
"mac_locked_addrs": [],
"simultaneous_sessions": 1,
"allowed_services": "both",
"lookup_token": "n8Qk2vRa1pLd7WxYzB0cEf",
"custom_fields": {},
"created_at": "2026-03-02 11:40:12"
}
}
PATCH /api/v1/users/{id} Update a subscriber
Partial update. An omitted field is left alone. Three fields are separately permission-gated and are dropped silently rather than refused when the caller lacks the right: parent_id, profile_id and expiration.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_updateEdit users - Rate limit
t_mutate
A stored mac_locked_addrs list is inert until mac_lock_enabled is true. Writing the list alone locks nothing, which reads on screen like the lock silently failed. Set both.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
form_name
body · string
|
Which custom-field schema to validate custom_fields against. Defaults to the user form. |
POST /api/v1/users/{id}/activate Un-suspend a subscriber
Sets enabled back to true. This is the inverse of suspend and has nothing to do with activating a plan — that is the activation endpoint, which charges money.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_enable_disableEnable / suspend users - Rate limit
t_mutate
The name is a historical trap. This endpoint lifts a suspension and takes no money. POST /users/{id}/activation is the one that prices, charges and provisions a plan.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
POST /api/v1/users/{id}/activation Charge and provision an activation
Prices, charges and provisions in one operation. Funds are reserved first, then the plan is applied, and both halves are keyed off your request_id, so a retry after a crash re-runs neither the charge nor the grant.
- Authentication
- Staff token or session
- Requires any one of
-
prm_users_activateprm_users_extend - Rate limit
t_mutate- Idempotency key
request_id
The nested activation object is serialised with Go field names (UserID, NewSubscriptionEnd) and RFC3339 timestamps, unlike every other object on this API. Everything around it uses snake_case and yyyy-MM-dd HH:mm:ss. Do not write a parser that assumes one convention.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
request_idrequired
body · string
|
Idempotency key, up to 255 characters, no colon or pipe. Reuse the same one on every retry of one intent. |
money_collected
body · boolean
|
Defaults to true. |
card_code
body · string
|
Required when method is card. The voucher must be in the caller's subtree. |
issue_invoice
body · boolean
|
Also record an invoice document. Skipped on a replay so a retry never double-issues. |
{
"data": {
"quote": { "profile_id": 7, "required_amount": 171.00, "new_expiration": "2026-10-14 00:00:00" },
"activation": {
"UserID": 4711,
"ProfileID": 7,
"NewSubscriptionEnd": "2026-10-14T00:00:00Z",
"BytesRemaining": 107374182400,
"SecondsRemaining": -1,
"PointsAwarded": 10,
"QuotaCarried": false,
"Replay": false
},
"manager_balance": 4029.00,
"replay": false
}
}
POST /api/v1/users/{id}/activation-quote Price an activation or extension
Read-only preview of what an activation would cost and grant: unit price, VAT, the computed new expiration, the plan's quota, both wallets, reward points and whether the chosen method can cover it. Writes nothing, so it is safe to call on every keystroke of a form.
- Authentication
- Staff token or session
- Requires any one of
-
prm_users_activateprm_users_extend - Rate limit
t_mutate
A quota figure of -1 means unlimited, and 0 means none. They are not interchangeable and the difference is load-bearing on the RADIUS gate. Read uptime_seconds -1 above as "no time cap on this plan", not "no time left".
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
profile_id
body · integer
|
Plan to price. Defaults to the subscriber's current plan. |
operation
body · enum
|
activate or extend. Defaults to activate. |
method
body · enum
|
manager_balance, user_balance, reward_points or card. |
units
body · integer
|
How many periods to buy. |
user_price
body · number
|
Retail price override. Silently ignored for a caller without the price-override permission, which then falls back to the plan or pricing-tree price. |
{
"data": {
"user_id": 4711,
"username": "ahmed",
"profile_id": 7,
"profile_name": "Home 20M",
"operation": "activate",
"method": "manager_balance",
"units": 1,
"unit_price": 150.00,
"end_user_price": 180.00,
"vat_percent": 14.00,
"vat_amount": 21.00,
"required_amount": 171.00,
"price_overridden": false,
"duration_value": 30,
"duration_unit": "days",
"total_bytes": 107374182400,
"uptime_seconds": -1,
"old_expiration": "2026-09-14 00:00:00",
"new_expiration": "2026-10-14 00:00:00",
"manager_balance": 4200.00,
"manager_available": 4200.00,
"user_balance": 0.00,
"points_awarded": 10,
"can_afford": true,
"warnings": [],
"debitable": false
}
}
POST /api/v1/users/{id}/add-traffic Grant quota directly
Adds bytes and/or seconds to the subscriber's remaining period quota without pricing or charging anything, and drops the hot-path quota cache so the grant applies on the next RADIUS request.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_add_trafficAdd traffic - Rate limit
t_mutate
request_id is accepted here for your own tracing but is not enforced, because adding traffic is not naturally idempotent. Two calls add twice. Do not build a retry loop on this endpoint the way you would on deposit.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
bytes
body · integer
|
Bytes to add. At least one of bytes or seconds must be present and positive. |
seconds
body · integer
|
Seconds to add. |
POST /api/v1/users/{id}/addon-quote Sell add-ons
- Authentication
- Staff token or session
- Requires permission
-
prm_users_addonSell add-ons - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/addons Sell add-ons
- Authentication
- Staff token or session
- Requires permission
-
prm_users_addonSell add-ons - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/approve Approve pending signups
- Authentication
- Staff token or session
- Requires permission
-
prm_users_approve_signupApprove pending signups - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/assign-profile Edit users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_updateEdit users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
PUT /api/v1/users/{id}/bucket-order Set the bucket drain order
Replaces the subscriber's custom drain order. Every id must be one of their active buckets, except the sentinel 0, which stands for the plan's own main quota and may be placed anywhere in the sequence.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_bucketsManage quota buckets - Rate limit
t_mutate
The 0 in that array is meaningful and positional. It is the main plan quota, so stripping non-positive ids as "empty" would silently reorder the drain sequence rather than reject it.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
orderrequired
body · array
|
Bucket ids in drain order. 0 is the main quota, not a missing value. |
POST /api/v1/users/{id}/cancel-service Cancel service
- Authentication
- Staff token or session
- Requires permission
-
prm_users_cancelCancel service - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/change-parent Move a subscriber to another owner
Re-points the subscriber at a different owning manager. The destination must be a manager the caller may act on, because the owner is both the creditor on a debt and the revenue attribution. Naturally idempotent, so request_id is accepted for your own tracing but is not enforced.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_change_parentChange user parent - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
parent_idrequired
body · integer
|
The new owning manager. |
POST /api/v1/users/{id}/change-profile Change user profile
- Authentication
- Staff token or session
- Requires permission
-
prm_users_change_profileChange user profile - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/compensate Compensate users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_compensateCompensate users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/compensations/{reqId}/approve Approve/reject compensation requests
- Authentication
- Staff token or session
- Requires permission
-
prm_users_compensate_approveApprove/reject compensation requests - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/compensations/{reqId}/reject Approve/reject compensation requests
- Authentication
- Staff token or session
- Requires permission
-
prm_users_compensate_approveApprove/reject compensation requests - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/cpe-console Remote access to user's CPE (router admin UI)
- Authentication
- Staff token or session
- Requires permission
-
prm_users_remoteRemote access to user's CPE (router admin UI) - Rate limit
t_probe
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/debt Read a subscriber's debt
Total outstanding debt across all creditors, plus the slice of it owed to the calling manager specifically, read live off the loan ledger.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
{
"data": { "total": 340.00, "owed_to_me": 120.00 }
}
POST /api/v1/users/{id}/deposit Credit a subscriber wallet
Moves money into the subscriber's wallet and writes the matching ledger line. Idempotent on request_id through a unique constraint on the ledger itself, so the charge and the record of it cannot disagree.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_depositDeposit to user wallet - Rate limit
t_mutate- Idempotency key
request_id
replay true means this exact request already happened and nothing moved this time. It is a success, and the balance shown is the one from the original operation.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
amountrequired
body · number
|
Major units, a bare JSON number. 150.50, not "150.50" and not 15050. |
request_idrequired
body · string
|
Idempotency key. |
issue_invoice
body · boolean
|
Also record an invoice document. Skipped on a replay. |
{
"data": {
"journal_id": 90412,
"balance": 250.00,
"debt": 0.00,
"replay": false
}
}
GET /api/v1/users/{id}/documents Manage user documents
- Authentication
- Staff token or session
- Requires permission
-
prm_users_documentsManage user documents
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/documents Manage user documents
- Authentication
- Staff token or session
- Requires permission
-
prm_users_documentsManage user documents - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/documents/bulk-delete Manage user documents
- Authentication
- Staff token or session
- Requires permission
-
prm_users_documentsManage user documents - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
DELETE /api/v1/users/{id}/documents/{docId} Manage user documents
- Authentication
- Staff token or session
- Requires permission
-
prm_users_documentsManage user documents - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
PATCH /api/v1/users/{id}/documents/{docId} Manage user documents
- Authentication
- Staff token or session
- Requires permission
-
prm_users_documentsManage user documents - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/documents/{docId}/download Manage user documents
- Authentication
- Staff token or session
- Requires permission
-
prm_users_documentsManage user documents
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/free-zone-traffic View free-zone traffic
- Authentication
- Staff token or session
- Requires permission
-
prm_users_freezone_trafficView free-zone traffic - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/free-zones View free-zone traffic
- Authentication
- Staff token or session
- Requires permission
-
prm_users_freezone_trafficView free-zone traffic
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/history View usage history
- Authentication
- Staff token or session
- Requires permission
-
prm_users_historyView usage history
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/invoices List one subscriber's invoices
Invoices belonging to a single subscriber, newest first.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_viewView user invoices
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
POST /api/v1/users/{id}/invoices Create an invoice for a subscriber
The per-subscriber form of issuing an invoice. Same validation and the same server-computed total; the subscriber comes from the path rather than the body.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_createCreate user invoices - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
itemsrequired
body · array
|
At least one line item. |
POST /api/v1/users/{id}/invoices/bulk-pay Edit / pay user invoices
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_editEdit / pay user invoices - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/invoices/bulk-unpay Edit / pay user invoices
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_editEdit / pay user invoices - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
DELETE /api/v1/users/{id}/invoices/{invoiceId} Delete an invoice
Deletes a hand-created invoice. Auto-issued documents cannot be deleted here, for the same reason they cannot be edited.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_deleteDelete user invoices - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
invoiceIdrequired
path · integer
|
Invoice id. |
GET /api/v1/users/{id}/invoices/{invoiceId} Fetch one invoice
The invoice with its line items.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_viewView user invoices
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
invoiceIdrequired
path · integer
|
Invoice id. |
PATCH /api/v1/users/{id}/invoices/{invoiceId} Edit an invoice
Edits a hand-created invoice. Auto-issued documents — activations, extensions, add-ons, deposits and withdrawals — are not editable through this path.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_editEdit / pay user invoices - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
invoiceIdrequired
path · integer
|
Invoice id. |
POST /api/v1/users/{id}/invoices/{invoiceId}/pay Mark an invoice paid
Records the invoice as settled and stamps paid_on. This is bookkeeping: it does not move money between wallets.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_editEdit / pay user invoices - Rate limit
t_mutate
Marking an invoice paid and taking a payment are different operations. This one changes a status; a deposit changes a balance. Doing one does not do the other.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
invoiceIdrequired
path · integer
|
Invoice id. |
GET /api/v1/users/{id}/invoices/{invoiceId}/render-data View user invoices
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_viewView user invoices
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/invoices/{invoiceId}/unpay Mark an invoice unpaid
Reverses the paid stamp. Again, bookkeeping only.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_invoices_editEdit / pay user invoices - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
invoiceIdrequired
path · integer
|
Invoice id. |
GET /api/v1/users/{id}/journal View users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/login-as Log in as subscriber
- Authentication
- Staff token or session
- Requires permission
-
prm_users_login_asLog in as subscriber - Rate limit
user_login_as
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/lookup-token/rotate Edit users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_updateEdit users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/parental Manage parental controls
- Authentication
- Staff token or session
- Requires permission
-
prm_users_parentalManage parental controls
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/parental/reset-pin Manage parental controls
- Authentication
- Staff token or session
- Requires permission
-
prm_users_parentalManage parental controls - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/pay-debt Withdraw / settle user debt
- Authentication
- Staff token or session
- Requires permission
-
prm_users_withdrawalWithdraw / settle user debt - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/payments View users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/quota-buckets List a subscriber's quota buckets
Separately-metered grants layered on top of the plan's own quota — add-ons, extensions, card top-ups — in the order they will be drained.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
Un-paginated: the whole list is page 1 and has_next is always false. Do not write a paging loop against it. A subscriber may hold at most 50 active buckets, and a grant that would exceed the cap is refused before any money moves.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
{
"data": [
{
"id": 331,
"source": "addon",
"label": "Night 50GB",
"priority": 10,
"bytes_granted": 53687091200,
"bytes_remaining": 41231686144,
"seconds_granted": 0,
"seconds_remaining": 0,
"activated_at": "2026-09-12 20:04:01",
"valid_until": "2026-10-12 20:04:01",
"works_when_expired": false,
"status": "active"
}
],
"meta": { "page": 1, "page_size": 1, "total": 1, "has_next": false }
}
POST /api/v1/users/{id}/quota-buckets/{bid}/cancel Manage quota buckets
- Authentication
- Staff token or session
- Requires permission
-
prm_users_bucketsManage quota buckets - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/quota-history View usage history
- Authentication
- Staff token or session
- Requires permission
-
prm_users_historyView usage history
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/radius-attrs Manage user RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_users_radius_attributesManage user RADIUS attributes
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/radius-attrs Manage user RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_users_radius_attributesManage user RADIUS attributes - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/radius-attrs/bulk-delete Manage user RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_users_radius_attributesManage user RADIUS attributes - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
DELETE /api/v1/users/{id}/radius-attrs/{attrId} Manage user RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_users_radius_attributesManage user RADIUS attributes - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
PATCH /api/v1/users/{id}/radius-attrs/{attrId} Manage user RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_users_radius_attributesManage user RADIUS attributes - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/receipts View users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/redeem-points Redeem reward points
- Authentication
- Staff token or session
- Requires permission
-
prm_users_reward_pointsRedeem reward points - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/refund-activation Refund last activation
- Authentication
- Staff token or session
- Requires permission
-
prm_users_refundRefund last activation - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/rename Rename users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_renameRename users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/reset-password Edit users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_updateEdit users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/reset-quota Reset quota counters
Always zeroes the daily counters. With clear_period true it also nulls the period quota, which is the destructive form. Lifts a daily FUP throttle and kicks the live session so full speed returns immediately. An empty body is accepted and means clear_period false.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_reset_quotaReset user quota - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
clear_period
body · boolean
|
Also null the period quota counters. Defaults to false. |
reason
body · string
|
Free-text note recorded on the quota-history audit row. |
GET /api/v1/users/{id}/sessions List a subscriber's session history
Accounting history for this subscriber, newest first, paginated with the standard list parameters.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_sessions_indexView user sessions
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
filter[status]
query · string
|
Narrows to open or closed sessions. |
DELETE /api/v1/users/{id}/speed Edit users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_updateEdit users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
GET /api/v1/users/{id}/speed View users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_indexView users
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
PUT /api/v1/users/{id}/speed Edit users
- Authentication
- Staff token or session
- Requires permission
-
prm_users_updateEdit users - Rate limit
t_mutate
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/suspend Suspend a subscriber
Sets enabled to false and, when the tenant has disconnect-on-update enabled, kicks any live session so the suspension takes effect now rather than at the next re-auth.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_enable_disableEnable / suspend users - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
{
"data": {
"id": 4711,
"username": "ahmed",
"enabled": false,
"status": { "enabled": false, "can_connect": false }
}
}
GET /api/v1/users/{id}/usage-history View usage history
- Authentication
- Staff token or session
- Requires permission
-
prm_users_historyView usage history
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/users/{id}/withdraw Debit a subscriber wallet
The inverse of deposit. Refuses to take the balance below zero unless allow_negative is set.
- Authentication
- Staff token or session
- Requires permission
-
prm_users_withdrawalWithdraw / settle user debt - Rate limit
t_mutate- Idempotency key
request_id
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Subscriber id. |
amountrequired
body · number
|
Major units. |
request_idrequired
body · string
|
Idempotency key. |
allow_negative
body · boolean
|
Permit the withdrawal to drive the balance below zero. |
No endpoint matches that search.
Written to be read by machines too
The reference is public and needs no account, so a tool that has never seen X-Radius can reach a correct first call on its own.
- /llms.txt
- An index of every page, with one-line summaries.
- /llms-full.txt
- The whole reference as one Markdown file, with no navigation to crawl.
- /openapi.json
- OpenAPI 3.1, generated from the router that serves this instance.
- /skill.md
- A ready-made skill file for an assistant: authentication, the response envelope and the error codes in one page.
<page-url>.md- Append .md to any reference URL for the same page as Markdown.
Accept: text/markdown- Send this header on the ordinary URL and the answer comes back as Markdown instead.
Read https://x-radius.com/llms.txt, then fetch the endpoint you need as Markdown by appending .md to its URL.