curl --request GET \
--url https://api.nozle.app/core/api/v1/plans \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.nozle.app/core/api/v1/plans"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.nozle.app/core/api/v1/plans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nozle.app/core/api/v1/plans"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://api.nozle.app/core/api/v1/plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nozle.app/core/api/v1/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://api.nozle.app/core/api/v1/plans")
.header("Authorization", "Bearer <token>")
.asString();{
"plans": [
{
"nozle_id": "00000000-0000-4000-8000-000000000001",
"name": "Starter INR",
"invoice_display_name": null,
"created_at": "2026-01-15T10:00:00Z",
"code": "starter_inr",
"interval": "monthly",
"description": null,
"amount_cents": 49900,
"amount_currency": "INR",
"trial_period": null,
"pay_in_advance": true,
"bill_charges_monthly": null,
"bill_fixed_charges_monthly": null,
"parent_id": null,
"pending_deletion": false,
"charges": [],
"entitlements": [],
"usage_thresholds": [],
"applicable_usage_thresholds": [],
"taxes": [],
"credit_grant_rules": [],
"credit_pool_policies": []
},
{
"nozle_id": "00000000-0000-4000-8000-000000000002",
"name": "Metered credits",
"invoice_display_name": null,
"created_at": "2026-01-15T10:00:00Z",
"code": "payg_credits",
"interval": "monthly",
"description": null,
"amount_cents": 0,
"amount_currency": "USD",
"trial_period": null,
"pay_in_advance": false,
"bill_charges_monthly": null,
"bill_fixed_charges_monthly": null,
"parent_id": null,
"pending_deletion": false,
"charges": [
{
"nozle_id": "00000000-0000-4000-8000-000000000003",
"feature_id": "00000000-0000-4000-8000-000000000004",
"code": "api_calls",
"invoice_display_name": null,
"feature_code": "api_calls",
"created_at": "2026-01-15T10:00:00Z",
"charge_model": "standard",
"invoiceable": true,
"regroup_paid_fees": null,
"pay_in_advance": false,
"prorated": false,
"min_amount_cents": 0,
"accepts_target_wallet": false,
"properties": {
"amount": "0"
},
"applied_pricing_unit": null,
"parent_id": null,
"filters": [],
"taxes": []
}
],
"entitlements": [],
"usage_thresholds": [],
"applicable_usage_thresholds": [],
"taxes": [],
"credit_grant_rules": [
{
"nozle_id": "00000000-0000-4000-8000-000000000005",
"plan_id": "00000000-0000-4000-8000-000000000002",
"plan_code": "payg_credits",
"credit_system_id": "00000000-0000-4000-8000-000000000006",
"credit_system_code": "ai_credits",
"amount": "100.0",
"interval": "lifetime",
"interval_count": 1,
"scope": "customer",
"entity_join_policy": null,
"entity_leave_policy": null,
"upgrade_policy": "grant_difference",
"downgrade_policy": "next_period",
"status": "active",
"created_at": "2026-01-15T10:00:00Z",
"updated_at": "2026-01-15T10:00:00Z"
}
],
"credit_pool_policies": []
}
],
"meta": {
"current_page": 1,
"next_page": null,
"prev_page": null,
"total_pages": 1,
"total_count": 2
}
}{
"status": 401,
"error": "Unauthorized"
}List all plans
This endpoint retrieves all existing plans.
Publishable keys. A publishable pk_ key may call this endpoint and GET /plans/{code}, and nothing else. Any other request with a pk_ key returns 403 with the code publishable_key_not_allowed.
With a pk_ key you receive a trimmed plan, still with charges, taxes, minimum_commitment, usage_thresholds, entitlements, credit_grant_rules, credit_pool_policies and metadata. Invoice names, internal ids, margin settings, grant policies and timestamps are left out, and plans pending deletion are not returned. A secret key receives the whole plan.
- All top-level plans of the organization are returned, newest first. There is no listed or public flag. Plans with a trial (
trial_period) and pay-in-arrears plans (pay_in_advance: false) are included. Plans pending deletion (pending_deletion: true) are included for a secret key only. Per-customer override plans (parent_idset) are not. - Items do not include
fixed_charges; useGET /plans/{code}for those. - The Engine host serves this list at
https://api.nozle.app/engine/api/v1/planswith the same body. Engine forwardspageandper_pageto Core. - A publishable key, or a secret key with
include_hidden=false, does not receive the plans of plan families hidden from the pricing table, andfamilies[].featuresleaves out hidden features. Hiding is a listing setting only: every plan carries all its entitlements and charges, including those of hidden features.
Because a publishable key ships in browsers, anything stored on a plan is readable by anyone who has the key. See Public plan catalog.
curl --request GET \
--url https://api.nozle.app/core/api/v1/plans \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.nozle.app/core/api/v1/plans"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.nozle.app/core/api/v1/plans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nozle.app/core/api/v1/plans"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://api.nozle.app/core/api/v1/plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nozle.app/core/api/v1/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://api.nozle.app/core/api/v1/plans")
.header("Authorization", "Bearer <token>")
.asString();{
"plans": [
{
"nozle_id": "00000000-0000-4000-8000-000000000001",
"name": "Starter INR",
"invoice_display_name": null,
"created_at": "2026-01-15T10:00:00Z",
"code": "starter_inr",
"interval": "monthly",
"description": null,
"amount_cents": 49900,
"amount_currency": "INR",
"trial_period": null,
"pay_in_advance": true,
"bill_charges_monthly": null,
"bill_fixed_charges_monthly": null,
"parent_id": null,
"pending_deletion": false,
"charges": [],
"entitlements": [],
"usage_thresholds": [],
"applicable_usage_thresholds": [],
"taxes": [],
"credit_grant_rules": [],
"credit_pool_policies": []
},
{
"nozle_id": "00000000-0000-4000-8000-000000000002",
"name": "Metered credits",
"invoice_display_name": null,
"created_at": "2026-01-15T10:00:00Z",
"code": "payg_credits",
"interval": "monthly",
"description": null,
"amount_cents": 0,
"amount_currency": "USD",
"trial_period": null,
"pay_in_advance": false,
"bill_charges_monthly": null,
"bill_fixed_charges_monthly": null,
"parent_id": null,
"pending_deletion": false,
"charges": [
{
"nozle_id": "00000000-0000-4000-8000-000000000003",
"feature_id": "00000000-0000-4000-8000-000000000004",
"code": "api_calls",
"invoice_display_name": null,
"feature_code": "api_calls",
"created_at": "2026-01-15T10:00:00Z",
"charge_model": "standard",
"invoiceable": true,
"regroup_paid_fees": null,
"pay_in_advance": false,
"prorated": false,
"min_amount_cents": 0,
"accepts_target_wallet": false,
"properties": {
"amount": "0"
},
"applied_pricing_unit": null,
"parent_id": null,
"filters": [],
"taxes": []
}
],
"entitlements": [],
"usage_thresholds": [],
"applicable_usage_thresholds": [],
"taxes": [],
"credit_grant_rules": [
{
"nozle_id": "00000000-0000-4000-8000-000000000005",
"plan_id": "00000000-0000-4000-8000-000000000002",
"plan_code": "payg_credits",
"credit_system_id": "00000000-0000-4000-8000-000000000006",
"credit_system_code": "ai_credits",
"amount": "100.0",
"interval": "lifetime",
"interval_count": 1,
"scope": "customer",
"entity_join_policy": null,
"entity_leave_policy": null,
"upgrade_policy": "grant_difference",
"downgrade_policy": "next_period",
"status": "active",
"created_at": "2026-01-15T10:00:00Z",
"updated_at": "2026-01-15T10:00:00Z"
}
],
"credit_pool_policies": []
}
],
"meta": {
"current_page": 1,
"next_page": null,
"prev_page": null,
"total_pages": 1,
"total_count": 2
}
}{
"status": 401,
"error": "Unauthorized"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Page number.
1
Number of records per page.
20
Secret keys only. Send false to get the pricing table view that a publishable key always gets, without the plans of plan families hidden from the pricing table and without hidden features in families[].features. Any other value, or no value, returns everything. A publishable key ignores it.
false
Response
Plans