List Add-ons
Optional paid add-ons available on top of any subscription plan — extra log retention, dedicated IPs, custom SSL slots, additional traffic capacity, etc. Each add-on is its own line item on the user's invoice and can be subscribed to or cancelled independently of the base plan.
Use this to render the "Add-ons" section of the billing page. The user's currently-active add-ons appear in the billing/subscription endpoint, not here.
Response (200 OK)
Array of add-on objects:
id int64
Numeric add-on ID. Used in billing endpoints.
slug string
Stable identifier (
extra-retention-90d, dedicated-ip, custom-ssl-slot).name string
Display name.
description string
Sentence-long description of what the add-on does.
price_monthly, price_yearly number
Monthly / yearly prices in the deployment's currency.
currency string
ISO 4217 code.
category string
Logical grouping for UI:
retention, networking, security, ai.is_purchasable boolean
Whether new subscriptions are accepted right now (a sold-out dedicated-IP region might be temporarily
false).requires_plan string[]
Plan slugs the add-on requires. Empty array means "any plan". Use to grey out add-ons the user can't buy without upgrading first.
Errors
401 Unauthorized
Missing or invalid auth.
Request
curl "https://api.ngris.com/v1/addons" \
-H "X-API-KEY: <your_api_key>"
Python
from ngris import Ngris
client = Ngris(api_key="<your_api_key>")
for a in client.regions.list_addons():
if a["is_purchasable"]:
print(f"{a['name']}: ${a['price_monthly']}/mo")
Response — 200 OK
[
{
"id": 1,
"slug": "extra-retention-90d",
"name": "90-day Log Retention",
"description": "Extends traffic-log retention from 7 to 90 days.",
"price_monthly": 10,
"price_yearly": 100,
"currency": "USD",
"category": "retention",
"is_purchasable": true,
"requires_plan": []
},
{
"id": 2,
"slug": "dedicated-ip",
"name": "Dedicated IP",
"description": "An unshared IPv4 address you can attach to one endpoint.",
"price_monthly": 30,
"price_yearly": 300,
"currency": "USD",
"category": "networking",
"is_purchasable": true,
"requires_plan": ["pro", "team"]
}
]