Public reference
Profiles
Every endpoint in this group. Open one for its parameters and a worked example.
Profiles
26GET /api/v1/profiles List plans
One page of service plans, scoped to what the calling manager may actually see. A private plan is visible only to managers it was explicitly allow-listed for.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_indexView profiles
vat_percent is a STRING, not a number. It is a NUMERIC(5,2) in the database and is serialised as text so the exact value survives the round trip. Every other money field on the plan is a bare JSON number.
Parameters
| Parameter | Description |
|---|---|
filter[type]
query · enum
|
prepaid, postpaid, fup, extension or addon. |
filter[status]
query · string
|
Plan status. |
filter[assignable]
query · boolean
|
Only plans this caller may bind to a subscriber. Narrower than visibility, and the right filter behind a plan picker. |
filter[allowed_services]
query · enum
|
ppp, hotspot or both. |
filter[show_in_ucp]
query · boolean
|
Plans the subscriber portal offers for self-service renewal. |
filter[private]
query · boolean
|
Plans restricted to an explicit manager allow-list. |
filter[has_fup_chain]
query · boolean
|
Plans that fall back to another plan on expiry or quota exhaustion. |
sort
query · string
|
id, created_at, name, type or status. Defaults to name ascending. |
{
"data": [
{
"id": 7,
"tenant_id": 12,
"name": "Home 20M",
"type": "prepaid",
"base_fee": 150.00,
"end_user_price": 180.00,
"vat_percent": "14.00",
"enforce_expiration": true,
"expiration_value": 30,
"expiration_unit": "days",
"combined_bytes_limit": 107374182400,
"enforce_combined_bytes": true,
"enforce_period_seconds": false,
"download_kbps": 20480,
"upload_kbps": 4096,
"speed_share_mode": "per_session",
"allowed_services": "both",
"private": false,
"show_in_ucp": true,
"carry_over_remaining_quota": false,
"auto_renew_supported": true,
"points_award": 10
}
],
"meta": { "page": 1, "page_size": 50, "total": 18, "has_next": false }
}
POST /api/v1/profiles Create a plan
name and type are the only required fields; everything else has a schema default. A plan created with no enforce toggles on is an unlimited plan.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_createCreate profiles - Rate limit
t_mutate
A quota limit does nothing until its enforce toggle is on. Setting combined_bytes_limit while enforce_combined_bytes is false leaves the plan unlimited on data, and the number sits there looking like a cap. The two always travel together.
Parameters
| Parameter | Description |
|---|---|
namerequired
body · string
|
Display name. |
typerequired
body · enum
|
prepaid, postpaid, fup, extension or addon. |
base_fee
body · number
|
Wholesale price to the reseller, major units. |
end_user_price
body · number
|
Retail price, major units. |
expiration_value
body · integer
|
Period length, paired with expiration_unit. |
expiration_unit
body · enum
|
hours, days or months. |
GET /api/v1/profiles/all List plans for a picker
Id and name only, un-paginated, for populating a select control. Cheaper than the full list when you do not need the plan bodies.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_indexView profiles
POST /api/v1/profiles/bulk-delete Delete profiles
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_deleteDelete profiles - 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/profiles/{id} Delete a plan
Refused while the plan is still referenced — by a subscriber, a card series or another plan's fall-back chain.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_deleteDelete profiles - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
GET /api/v1/profiles/{id} Fetch one plan
The full plan definition: pricing, quota limits and their enforce toggles, speed, lifecycle flags and the fall-back chain.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_indexView profiles
A plan you may not see answers 404, identical to one that does not exist. This route carries wholesale terms (base_fee, max_price), so a 403 would have let a reseller walk plan ids and read a rival's private pricing.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
PATCH /api/v1/profiles/{id} Update a plan
Partial update. Numeric and foreign-key fields can be cleared to null by sending null explicitly, which is distinct from omitting them.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_updateEdit profiles - Rate limit
t_mutate
Editing a plan does not re-provision the subscribers already on it. Their quota and window were written at activation time; a price or limit change applies to the next activation, not retroactively.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
GET /api/v1/profiles/{id}/allowed-extensions Manage profile visibility / policy
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policy_managerManage profile visibility / policy
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
PUT /api/v1/profiles/{id}/allowed-extensions Manage profile visibility / policy
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policy_managerManage profile visibility / policy - 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/profiles/{id}/allowed-managers Read a private plan's manager allow-list
Which managers may see and assign this plan. Only meaningful while the plan is private; a public plan is visible to everyone regardless of this list.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policy_managerManage profile visibility / policy
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
PUT /api/v1/profiles/{id}/allowed-managers Replace a private plan's manager allow-list
Replaces the whole list. Managers omitted from the payload lose access.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policy_managerManage profile visibility / policy - Rate limit
t_mutate
The allow-list is inert while private is false. Setting it on a public plan stores the rows and changes nothing, which looks exactly like the restriction failing to apply.
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
GET /api/v1/profiles/{id}/allowed-parents Manage profile visibility / policy
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policy_managerManage profile visibility / policy
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
PUT /api/v1/profiles/{id}/allowed-parents Manage profile visibility / policy
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policy_managerManage profile visibility / policy - 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/profiles/{id}/clone Clone a plan
Copies the plan, including its RADIUS attributes and policies, under a new name. The usual way to build a variant without re-entering forty fields.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_createCreate profiles - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan to copy. |
GET /api/v1/profiles/{id}/policies Manage plan policy rules
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policiesManage plan policy rules
Read straight from the router that serves this instance. A hand-written description of this endpoint has not been added yet.
POST /api/v1/profiles/{id}/policies Manage plan policy rules
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policiesManage plan policy rules - 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/profiles/{id}/policies/bulk-delete Manage plan policy rules
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policiesManage plan policy rules - 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/profiles/{id}/policies/{policyID} Manage plan policy rules
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policiesManage plan policy rules - 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/profiles/{id}/policies/{policyID} Manage plan policy rules
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_policiesManage plan policy rules - 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/profiles/{id}/price-list Read a plan's per-reseller prices
The pricing-tree overrides for this plan: what each manager in the tree pays and may charge, where it differs from the plan default.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_pricingManage profile pricing
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
PUT /api/v1/profiles/{id}/price-list Replace a plan's per-reseller prices
Replaces the whole override set for this plan in one call. An entry omitted from the payload is removed, not left alone.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_pricingManage profile pricing - Rate limit
t_mutate
A price cap of 0 and an absent cap mean different things. Absent is "no cap"; 0 is a cap of zero, which blocks every sale of that plan below the manager it is set on and reads on screen as "Over cap 0.00".
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
GET /api/v1/profiles/{id}/radius-attrs List a plan's RADIUS attributes
The reply attributes this plan adds to an Access-Accept, beyond the ones derived from its speed and quota settings.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_radius_attributesManage RADIUS attributes
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
POST /api/v1/profiles/{id}/radius-attrs Add a RADIUS attribute to a plan
Adds one reply attribute. Attributes set here ride on every session of every subscriber on the plan.
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_radius_attributesManage RADIUS attributes - Rate limit
t_mutate
Parameters
| Parameter | Description |
|---|---|
idrequired
path · integer
|
Plan id. |
POST /api/v1/profiles/{id}/radius-attrs/bulk-delete Manage RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_radius_attributesManage 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/profiles/{id}/radius-attrs/{attrId} Manage RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_radius_attributesManage 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/profiles/{id}/radius-attrs/{attrId} Manage RADIUS attributes
- Authentication
- Staff token or session
- Requires permission
-
prm_profiles_radius_attributesManage 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.
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.