List Plans
Returns the catalog of subscription plans available on this deployment. Auth is required (the endpoint sits under protected) but the response itself is plan-agnostic, so any authenticated user sees the same list. Use this to populate pricing tables and the plan-picker on the upgrade UI.
Plans flagged is_purchasable: false are still shown — those are typically grandfathered or admin-only tiers — but the billing endpoints reject checkout for them with 403.
Entitlements are not enumerated here. A plan object does not list its per-feature entitlement grants; to learn which features are available, resolve the active account's entitlements with GET /v1/account/entitlements.
Response (200 OK)
JSON array of plan objects. Each plan has:
id int64
Numeric plan ID. Used in /billing/checkout and elsewhere.
slug string
Stable identifier (
free, pro, team). Use this in URLs and config.name string
Display name (
"Free", "Pro").description string
Marketing blurb suitable for direct display.
price_monthly, price_yearly number
Prices in the deployment's default currency.
0 for free plans.currency string
ISO 4217 code (
USD, EUR, …).is_purchasable boolean
false for grandfathered or admin-only plans. /billing/checkout rejects these with 403.max_endpoints, max_tunnels, max_connections int
Per-plan limits.
0 = unlimited. An account's effective limits come from the plan assigned to that account (see /account/plan); there are no per-user overrides.bandwidth_limit, request_limit int64
Monthly bandwidth (MB) and request count caps.
0 = unlimited.allowed_protocols string
Comma-separated protocol slugs. Authoritative source is the entitlements system; this string is preserved for compatibility.
allowed_regions string
Comma-separated region slugs. Empty = all regions allowed.
stripe_price_id_monthly, stripe_price_id_yearly string
Stripe price IDs (only set for paid plans). Used internally by checkout; not needed by client code.
Errors
401 Unauthorized
Missing or invalid auth.
Request
curl "https://api.ngris.com/v1/plans" \
-H "X-API-KEY: <your_api_key>"
Python
from ngris import Ngris
client = Ngris(api_key="<your_api_key>")
for p in client.regions.list_plans():
if p["is_purchasable"]:
print(f"{p['name']}: ${p['price_monthly']}/mo")
Response — 200 OK
[
{
"id": 1,
"slug": "free",
"name": "Free",
"description": "Best for hobbyists and tinkering.",
"price_monthly": 0,
"price_yearly": 0,
"currency": "USD",
"is_purchasable": true,
"max_endpoints": 2,
"max_tunnels": 2,
"bandwidth_limit": 1024,
"allowed_protocols": "http",
"allowed_regions": "us-east-1"
},
{
"id": 3,
"slug": "pro",
"name": "Pro",
"description": "For serious projects.",
"price_monthly": 29,
"price_yearly": 290,
"currency": "USD",
"is_purchasable": true,
"max_endpoints": 20,
"max_tunnels": 10,
"bandwidth_limit": 102400,
"allowed_protocols": "http,tcp",
"allowed_regions": ""
}
]