Create subscription alert(s)
curl --request POST \
--url https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"alert": {
"code": "storage_threshold_alert",
"thresholds": [
{
"value": 99,
"code": "warn",
"recurring": false
}
],
"alert_type": "feature_current_usage_amount",
"name": "Storage Usage Alert",
"feature_code": "storage_usage"
}
}
'import requests
url = "https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts"
payload = { "alert": {
"code": "storage_threshold_alert",
"thresholds": [
{
"value": 99,
"code": "warn",
"recurring": False
}
],
"alert_type": "feature_current_usage_amount",
"name": "Storage Usage Alert",
"feature_code": "storage_usage"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
alert: {
code: 'storage_threshold_alert',
thresholds: [{value: 99, code: 'warn', recurring: false}],
alert_type: 'feature_current_usage_amount',
name: 'Storage Usage Alert',
feature_code: 'storage_usage'
}
})
};
fetch('https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts"
payload := strings.NewReader("{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"alert_type\": \"feature_current_usage_amount\",\n \"name\": \"Storage Usage Alert\",\n \"feature_code\": \"storage_usage\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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://core.nozle.app/api/v1/subscriptions/{external_id}/alerts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"alert_type\": \"feature_current_usage_amount\",\n \"name\": \"Storage Usage Alert\",\n \"feature_code\": \"storage_usage\"\n }\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts",
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([
'alert' => [
'code' => 'storage_threshold_alert',
'thresholds' => [
[
'value' => 99,
'code' => 'warn',
'recurring' => false
]
],
'alert_type' => 'feature_current_usage_amount',
'name' => 'Storage Usage Alert',
'feature_code' => 'storage_usage'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"alert_type\": \"feature_current_usage_amount\",\n \"name\": \"Storage Usage Alert\",\n \"feature_code\": \"storage_usage\"\n }\n}")
.asString();{
"alert": {
"lago_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
"lago_organization_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
"external_subscription_id": "sub_1234567890",
"feature": {
"lago_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
"code": "seats",
"name": "Number of seats",
"feature_type": "metered",
"created_at": "2025-07-17T12:34:35Z",
"description": "Number of users of the account",
"privileges": [
{
"code": "max",
"name": "Maximum",
"value_type": "integer",
"config": {}
},
{
"code": "max_admins",
"name": "Max Admins",
"value_type": "integer",
"config": {}
},
{
"code": "root",
"name": "Allow root user",
"value_type": "boolean",
"config": {}
},
{
"code": "provider",
"name": "SSO Provider",
"value_type": "select",
"config": {
"select_options": [
"google",
"okta"
]
}
}
],
"aggregation_type": "sum_agg",
"consumable": true,
"recurring": false,
"field_name": "tokens",
"expression": "round((ended_at - started_at) * units)",
"custom_aggregator": "<string>",
"weighted_interval": "seconds",
"rounding_function": "ceil",
"rounding_precision": 2,
"filters": [
{
"key": "region",
"values": [
"us-east-1"
]
}
]
},
"alert_type": "feature_current_usage_amount",
"code": "storage_threshold_alert",
"name": "Storage Usage Alert",
"previous_value": 1000,
"last_processed_at": "2025-05-19T10:04:21Z",
"thresholds": [
{
"code": "warn",
"recurring": false,
"value": "99.0"
}
],
"created_at": "2025-03-20T10:00:00Z",
"lago_wallet_id": null,
"wallet_code": null,
"direction": "increasing"
}
}{
"status": 400,
"error": "Bad request"
}{
"status": 401,
"error": "Unauthorized"
}{
"status": 404,
"error": "Not Found",
"code": "object_not_found"
}{
"status": 422,
"error": "Unprocessable entity",
"code": "validation_errors",
"error_details": {}
}Subscriptions
Create subscription alert(s)
This endpoint allows you to create alerts for a subscription. Send a single alert object wrapped in alert key to create one alert, or an array of alert objects wrapped in alerts key to create multiple alerts atomically.
POST
/
subscriptions
/
{external_id}
/
alerts
Create subscription alert(s)
curl --request POST \
--url https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"alert": {
"code": "storage_threshold_alert",
"thresholds": [
{
"value": 99,
"code": "warn",
"recurring": false
}
],
"alert_type": "feature_current_usage_amount",
"name": "Storage Usage Alert",
"feature_code": "storage_usage"
}
}
'import requests
url = "https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts"
payload = { "alert": {
"code": "storage_threshold_alert",
"thresholds": [
{
"value": 99,
"code": "warn",
"recurring": False
}
],
"alert_type": "feature_current_usage_amount",
"name": "Storage Usage Alert",
"feature_code": "storage_usage"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
alert: {
code: 'storage_threshold_alert',
thresholds: [{value: 99, code: 'warn', recurring: false}],
alert_type: 'feature_current_usage_amount',
name: 'Storage Usage Alert',
feature_code: 'storage_usage'
}
})
};
fetch('https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts"
payload := strings.NewReader("{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"alert_type\": \"feature_current_usage_amount\",\n \"name\": \"Storage Usage Alert\",\n \"feature_code\": \"storage_usage\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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://core.nozle.app/api/v1/subscriptions/{external_id}/alerts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"alert_type\": \"feature_current_usage_amount\",\n \"name\": \"Storage Usage Alert\",\n \"feature_code\": \"storage_usage\"\n }\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts",
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([
'alert' => [
'code' => 'storage_threshold_alert',
'thresholds' => [
[
'value' => 99,
'code' => 'warn',
'recurring' => false
]
],
'alert_type' => 'feature_current_usage_amount',
'name' => 'Storage Usage Alert',
'feature_code' => 'storage_usage'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://core.nozle.app/api/v1/subscriptions/{external_id}/alerts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"alert_type\": \"feature_current_usage_amount\",\n \"name\": \"Storage Usage Alert\",\n \"feature_code\": \"storage_usage\"\n }\n}")
.asString();{
"alert": {
"lago_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
"lago_organization_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
"external_subscription_id": "sub_1234567890",
"feature": {
"lago_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
"code": "seats",
"name": "Number of seats",
"feature_type": "metered",
"created_at": "2025-07-17T12:34:35Z",
"description": "Number of users of the account",
"privileges": [
{
"code": "max",
"name": "Maximum",
"value_type": "integer",
"config": {}
},
{
"code": "max_admins",
"name": "Max Admins",
"value_type": "integer",
"config": {}
},
{
"code": "root",
"name": "Allow root user",
"value_type": "boolean",
"config": {}
},
{
"code": "provider",
"name": "SSO Provider",
"value_type": "select",
"config": {
"select_options": [
"google",
"okta"
]
}
}
],
"aggregation_type": "sum_agg",
"consumable": true,
"recurring": false,
"field_name": "tokens",
"expression": "round((ended_at - started_at) * units)",
"custom_aggregator": "<string>",
"weighted_interval": "seconds",
"rounding_function": "ceil",
"rounding_precision": 2,
"filters": [
{
"key": "region",
"values": [
"us-east-1"
]
}
]
},
"alert_type": "feature_current_usage_amount",
"code": "storage_threshold_alert",
"name": "Storage Usage Alert",
"previous_value": 1000,
"last_processed_at": "2025-05-19T10:04:21Z",
"thresholds": [
{
"code": "warn",
"recurring": false,
"value": "99.0"
}
],
"created_at": "2025-03-20T10:00:00Z",
"lago_wallet_id": null,
"wallet_code": null,
"direction": "increasing"
}
}{
"status": 400,
"error": "Bad request"
}{
"status": 401,
"error": "Unauthorized"
}{
"status": 404,
"error": "Not Found",
"code": "object_not_found"
}{
"status": 422,
"error": "Unprocessable entity",
"code": "validation_errors",
"error_details": {}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
External ID of the existing subscription
Example:
"5eb02857-a71e-4ea2-bcf9-57d3a41bc6ba"
Query Parameters
Filter by subscription status. When provided, the subscription is looked up with this status instead of the default active status. Possible values are pending, active, terminated, or canceled.
Available options:
pending, active, terminated, canceled Example:
"active"
Body
application/json
Create one or more alerts for a subscription
- Option 1
- Option 2
Show child attributes
Show child attributes
Response
Subscription alert(s) created
- Option 1
- Option 2
Show child attributes
Show child attributes