import Stigg from '@stigg/typescript';
const client = new Stigg({
apiKey: process.env['STIGG_API_KEY'], // This is the default and can be omitted
});
const plan = await client.v1.plans.create({
id: 'id',
displayName: 'displayName',
productId: 'productId',
});
console.log(plan.data);import os
from stigg import Stigg
client = Stigg(
api_key=os.environ.get("STIGG_API_KEY"), # This is the default and can be omitted
)
plan = client.v1.plans.create(
id="id",
display_name="displayName",
product_id="productId",
)
print(plan.data)package main
import (
"context"
"fmt"
"github.com/stiggio/stigg-go"
"github.com/stiggio/stigg-go/option"
)
func main() {
client := stigg.NewClient(
option.WithAPIKey("My API Key"),
)
plan, err := client.V1.Plans.New(context.TODO(), stigg.V1PlanNewParams{
ID: "id",
DisplayName: "displayName",
ProductID: "productId",
})
if err != nil {
panic(err.Error())
}
fmt.Printf("%+v\n", plan.Data)
}
package io.stigg.example;
import io.stigg.client.StiggClient;
import io.stigg.client.okhttp.StiggOkHttpClient;
import io.stigg.models.v1.plans.Plan;
import io.stigg.models.v1.plans.PlanCreateParams;
public final class Main {
private Main() {}
public static void main(String[] args) {
StiggClient client = StiggOkHttpClient.fromEnv();
PlanCreateParams params = PlanCreateParams.builder()
.id("id")
.displayName("displayName")
.productId("productId")
.build();
Plan plan = client.v1().plans().create(params);
}
}require "stigg"
stigg = Stigg::Client.new(api_key: "My API Key")
plan = stigg.v1.plans.create(id: "id", display_name: "displayName", product_id: "productId")
puts(plan)using System;
using Stigg.Client;
using Stigg.Client.Models.V1.Plans;
StiggClient client = new();
PlanCreateParams parameters = new()
{
ID = "id",
DisplayName = "displayName",
ProductID = "productId",
};
var plan = await client.V1.Plans.Create(parameters);
Console.WriteLine(plan);stigg v1:plans create \
--api-key 'My API Key' \
--id id \
--display-name displayName \
--product-id productIdcurl --request POST \
--url https://api.stigg.io/api/v1/plans \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"id": "<string>",
"displayName": "<string>",
"productId": "<string>",
"description": "<string>",
"parentPlanId": "<string>",
"billingId": "<string>",
"metadata": {},
"defaultTrialConfig": {
"duration": 123,
"budget": {
"limit": 123,
"hasSoftLimit": true
}
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.stigg.io/api/v1/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => '<string>',
'displayName' => '<string>',
'productId' => '<string>',
'description' => '<string>',
'parentPlanId' => '<string>',
'billingId' => '<string>',
'metadata' => [
],
'defaultTrialConfig' => [
'duration' => 123,
'budget' => [
'limit' => 123,
'hasSoftLimit' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"data": {
"id": "plan-professional",
"displayName": "Professional",
"description": "Professional plan with advanced features",
"productId": "product-starter",
"status": "PUBLISHED",
"pricingType": "PAID",
"billingId": "price_1234567890",
"versionNumber": 1,
"isLatest": true,
"entitlements": [
{
"type": "FEATURE",
"id": "feature-advanced-analytics"
},
{
"type": "CREDIT",
"id": "api-calls"
}
],
"metadata": {},
"createdAt": "2025-10-26T10:00:00.000Z",
"updatedAt": "2025-10-26T10:00:00.000Z",
"parentPlanId": null,
"defaultTrialConfig": {
"duration": 14,
"units": "DAY",
"budget": null,
"trialEndBehavior": null
},
"compatibleAddonIds": []
}
}{
"message": "<string>",
"code": "BadUserInput",
"reason": "<string>"
}{
"message": "<string>",
"code": "Unauthenticated"
}{
"message": "<string>",
"code": "IdentityForbidden"
}{
"message": "<string>",
"code": "DuplicatedEntityNotAllowed"
}{
"message": "<string>",
"code": "RateLimitExceeded"
}Create plan
Creates a new plan in draft status.
import Stigg from '@stigg/typescript';
const client = new Stigg({
apiKey: process.env['STIGG_API_KEY'], // This is the default and can be omitted
});
const plan = await client.v1.plans.create({
id: 'id',
displayName: 'displayName',
productId: 'productId',
});
console.log(plan.data);import os
from stigg import Stigg
client = Stigg(
api_key=os.environ.get("STIGG_API_KEY"), # This is the default and can be omitted
)
plan = client.v1.plans.create(
id="id",
display_name="displayName",
product_id="productId",
)
print(plan.data)package main
import (
"context"
"fmt"
"github.com/stiggio/stigg-go"
"github.com/stiggio/stigg-go/option"
)
func main() {
client := stigg.NewClient(
option.WithAPIKey("My API Key"),
)
plan, err := client.V1.Plans.New(context.TODO(), stigg.V1PlanNewParams{
ID: "id",
DisplayName: "displayName",
ProductID: "productId",
})
if err != nil {
panic(err.Error())
}
fmt.Printf("%+v\n", plan.Data)
}
package io.stigg.example;
import io.stigg.client.StiggClient;
import io.stigg.client.okhttp.StiggOkHttpClient;
import io.stigg.models.v1.plans.Plan;
import io.stigg.models.v1.plans.PlanCreateParams;
public final class Main {
private Main() {}
public static void main(String[] args) {
StiggClient client = StiggOkHttpClient.fromEnv();
PlanCreateParams params = PlanCreateParams.builder()
.id("id")
.displayName("displayName")
.productId("productId")
.build();
Plan plan = client.v1().plans().create(params);
}
}require "stigg"
stigg = Stigg::Client.new(api_key: "My API Key")
plan = stigg.v1.plans.create(id: "id", display_name: "displayName", product_id: "productId")
puts(plan)using System;
using Stigg.Client;
using Stigg.Client.Models.V1.Plans;
StiggClient client = new();
PlanCreateParams parameters = new()
{
ID = "id",
DisplayName = "displayName",
ProductID = "productId",
};
var plan = await client.V1.Plans.Create(parameters);
Console.WriteLine(plan);stigg v1:plans create \
--api-key 'My API Key' \
--id id \
--display-name displayName \
--product-id productIdcurl --request POST \
--url https://api.stigg.io/api/v1/plans \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"id": "<string>",
"displayName": "<string>",
"productId": "<string>",
"description": "<string>",
"parentPlanId": "<string>",
"billingId": "<string>",
"metadata": {},
"defaultTrialConfig": {
"duration": 123,
"budget": {
"limit": 123,
"hasSoftLimit": true
}
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.stigg.io/api/v1/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => '<string>',
'displayName' => '<string>',
'productId' => '<string>',
'description' => '<string>',
'parentPlanId' => '<string>',
'billingId' => '<string>',
'metadata' => [
],
'defaultTrialConfig' => [
'duration' => 123,
'budget' => [
'limit' => 123,
'hasSoftLimit' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"data": {
"id": "plan-professional",
"displayName": "Professional",
"description": "Professional plan with advanced features",
"productId": "product-starter",
"status": "PUBLISHED",
"pricingType": "PAID",
"billingId": "price_1234567890",
"versionNumber": 1,
"isLatest": true,
"entitlements": [
{
"type": "FEATURE",
"id": "feature-advanced-analytics"
},
{
"type": "CREDIT",
"id": "api-calls"
}
],
"metadata": {},
"createdAt": "2025-10-26T10:00:00.000Z",
"updatedAt": "2025-10-26T10:00:00.000Z",
"parentPlanId": null,
"defaultTrialConfig": {
"duration": 14,
"units": "DAY",
"budget": null,
"trialEndBehavior": null
},
"compatibleAddonIds": []
}
}{
"message": "<string>",
"code": "BadUserInput",
"reason": "<string>"
}{
"message": "<string>",
"code": "Unauthenticated"
}{
"message": "<string>",
"code": "IdentityForbidden"
}{
"message": "<string>",
"code": "DuplicatedEntityNotAllowed"
}{
"message": "<string>",
"code": "RateLimitExceeded"
}Authorizations
Server API Key
Headers
Account ID — optional when authenticating with a user JWT (Bearer token); falls back to the user's first membership. Ignored for API-key auth.
Environment ID — required when authenticating with a user JWT (Bearer token) on environment-scoped endpoints. Ignored for API-key auth (env is intrinsic to the key).
Body
Request to create a new plan
The unique identifier for the entity
1 - 255^[a-zA-Z0-9][a-zA-Z0-9_|.-]*$The display name of the package
255The product ID to associate the plan with
1 - 255^[a-zA-Z0-9][a-zA-Z0-9_|.-]*$The description of the package
255The ID of the parent plan, if this plan should inherit entitlements from another plan. Optional — omit to create a standalone plan with no inherited entitlements.
255The pricing type of the package
FREE, PAID, CUSTOM The unique identifier for the entity in the billing provider
255The status of the package
DRAFT, PUBLISHED, ARCHIVED Metadata associated with the entity
Show child attributes
Show child attributes
Default trial configuration for the plan. When set, subscriptions provisioned on this plan without explicit trial settings automatically start in trial for the configured duration; leave unset for no automatic trial.
Show child attributes
Show child attributes
Response
The newly created plan object.
Response object
Plan configuration object
Show child attributes
Show child attributes
