List Plans

GET /v1/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": "" } ]
On this page
List Plans
Iris