Public reference
Billing
Every endpoint in this group. Open one for its parameters and a worked example.
Billing
3GET /api/v1/billing/invoices List invoices across subscribers
Every invoice the caller may see, in one list, with filters for reconciling a period. A caller without tenant-wide visibility sees only invoices belonging to subscribers in their own manager subtree.
- Authentication
- Staff token or session
- Requires permission
-
prm_billingBilling & invoices
username is populated only on this cross-subscriber list, which joins the subscriber table. The per-subscriber list and the single-invoice fetch leave it empty, because there the subscriber is already known.
Parameters
| Parameter | Description |
|---|---|
filter[status]
query · string
|
Payment status. |
filter[username]
query · string
|
Narrow to one subscriber by username. |
filter[date_from]
query · string
|
Inclusive lower bound. A malformed value is a 400, not an ignored filter. |
filter[date_to]
query · string
|
Inclusive upper bound. |
filter[amount_min]
query · number
|
Inclusive lower amount bound. |
filter[amount_max]
query · number
|
Inclusive upper amount bound. |
{
"data": [
{
"id": 51204,
"user_id": 4711,
"username": "ahmed",
"invoice_number": "INV-2026-000512",
"type": "activation",
"amount": 171.00,
"discount": 0.00,
"vat": 14.00,
"status": "paid",
"description": "Home 20M (activate)",
"payment_method": "manager_balance",
"due_date": "2026-09-20 00:00:00",
"paid_on": "2026-09-20 09:15:02",
"created_by_manager_id": 41,
"created_by_name": "cairo-reseller",
"created_at": "2026-09-20 09:15:02"
}
],
"meta": { "page": 1, "page_size": 50, "total": 1284, "has_next": true }
}
POST /api/v1/billing/invoices Issue an invoice
Creates an invoice against a named subscriber from line items. discount and vat are percentages from 0 to 100, and the total is computed from the items — never taken from the request.
- Authentication
- Staff token or session
- Requires permission
-
prm_billingBilling & invoices - Rate limit
t_mutate
discount and vat are PERCENTAGES, and the validator rejects anything above 100. Sending 171.00 in the vat field to mean "171 in tax" is a 400, not a silently large invoice.
Parameters
| Parameter | Description |
|---|---|
user_idrequired
body · integer
|
The subscriber being invoiced. |
itemsrequired
body · array
|
At least one line, each with name, qty, unit_price and an optional per-line tax. |
discount
body · number
|
Percentage from 0 to 100, not an amount. |
vat
body · number
|
Percentage from 0 to 100, not an amount. |
due_date
body · string
|
yyyy-MM-dd HH:mm:ss in UTC. |
mark_paid
body · boolean
|
Record the new invoice as already settled. |
POST /api/v1/billing/invoices/bulk-pay Billing & invoices
- Authentication
- Staff token or session
- Requires permission
-
prm_billingBilling & 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.
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.