Add a new add-on type to the catalog. Only the owner organization or a Super Admin can manage the catalog (403 otherwise).
Body
Required
-
Catalog id: lowercase kebab-case, convention nsec-
, ns8- or - -
Human-readable name
-
Optional longer description
-
True when grants can be narrowed to a single application instance (per-application-instance modules)
Default value is
false. -
Add-on kind
Values are
serviceormodule. Default value isservice. -
Restricts the add-on to one system type. Empty/omitted = any type.
Values are
nsecorns8. -
Old wire id (lowercase kebab-case) consumers still call on GET /auth/service/{id}
-
Application (applications.instance_of) the module applies to. Required in practice for kind=module: omitted, it falls back to the id prefix, which is wrong for hyphenated app names. Ignored for services.
-
Whether the add-on is on sale. Defaults to true when omitted.
Default value is
true.
curl \
--request POST 'https://api.your-domain.com/api/entitlements/catalog' \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{"id":"nsec-blacklist","display_name":"Blacklist","description":"IP and DNS blacklist feed for NethSecurity","scoped":false,"kind":"service","system_type":"nsec","legacy_alias":"ng-blacklist","applies_to":"nethvoice","purchasable":true}'
{
"id": "nsec-blacklist",
"display_name": "Blacklist",
"description": "IP and DNS blacklist feed for NethSecurity",
"scoped": false,
"kind": "service",
"system_type": "nsec",
"legacy_alias": "ng-blacklist",
"applies_to": "nethvoice",
"purchasable": true
}
{
"code": 201,
"message": "catalog item created successfully",
"data": {
"id": "nsec-blacklist",
"display_name": "Blacklist",
"description": "IP and DNS blacklist feed for NethSecurity",
"scoped": false,
"kind": "service",
"system_type": "nsec",
"legacy_alias": "ng-blacklist",
"applies_to": "nethvoice",
"purchasable": true,
"in_use": true,
"created_at": "2026-07-01T10:00:00Z",
"updated_at": "2026-07-01T10:00:00Z"
}
}
{
"code": 400,
"message": "validation failed",
"data": {
"type": "validation_error",
"errors": [
{
"key": "username",
"message": "required",
"value": "string"
}
]
}
}
{
"code": 401,
"message": "invalid token",
"data": {}
}
{
"code": 403,
"message": "insufficient permissions",
"data": {}
}
{
"code": 409,
"message": "catalog item already exists",
"data": {}
}
{
"code": 500,
"message": "internal server error",
"data": {}
}