Skip to main content
PUT
/
subscriptions
/
{external_id}
/
alerts
/
{code}
Update a subscription alert
curl --request PUT \
  --url https://api.getlago.com/api/v1/subscriptions/{external_id}/alerts/{code} \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "alert": {
    "code": "storage_threshold_alert",
    "name": "Storage Usage Alert",
    "thresholds": [
      {
        "value": 99,
        "code": "warn",
        "recurring": false
      }
    ],
    "billable_metric_code": "storage_usage"
  }
}
'
import requests

url = "https://api.getlago.com/api/v1/subscriptions/{external_id}/alerts/{code}"

payload = { "alert": {
"code": "storage_threshold_alert",
"name": "Storage Usage Alert",
"thresholds": [
{
"value": 99,
"code": "warn",
"recurring": False
}
],
"billable_metric_code": "storage_usage"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
alert: {
code: 'storage_threshold_alert',
name: 'Storage Usage Alert',
thresholds: [{value: 99, code: 'warn', recurring: false}],
billable_metric_code: 'storage_usage'
}
})
};

fetch('https://api.getlago.com/api/v1/subscriptions/{external_id}/alerts/{code}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getlago.com/api/v1/subscriptions/{external_id}/alerts/{code}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'alert' => [
'code' => 'storage_threshold_alert',
'name' => 'Storage Usage Alert',
'thresholds' => [
[
'value' => 99,
'code' => 'warn',
'recurring' => false
]
],
'billable_metric_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;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.getlago.com/api/v1/subscriptions/{external_id}/alerts/{code}"

payload := strings.NewReader("{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"name\": \"Storage Usage Alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"billable_metric_code\": \"storage_usage\"\n }\n}")

req, _ := http.NewRequest("PUT", 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))

}
HttpResponse<String> response = Unirest.put("https://api.getlago.com/api/v1/subscriptions/{external_id}/alerts/{code}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"name\": \"Storage Usage Alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"billable_metric_code\": \"storage_usage\"\n }\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.getlago.com/api/v1/subscriptions/{external_id}/alerts/{code}")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"alert\": {\n \"code\": \"storage_threshold_alert\",\n \"name\": \"Storage Usage Alert\",\n \"thresholds\": [\n {\n \"value\": 99,\n \"code\": \"warn\",\n \"recurring\": false\n }\n ],\n \"billable_metric_code\": \"storage_usage\"\n }\n}"

response = http.request(request)
puts response.read_body
{
  "alert": {
    "lago_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
    "lago_organization_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
    "external_subscription_id": "sub_1234567890",
    "billable_metric": {
      "lago_id": "1a901a90-1a90-1a90-1a90-1a901a901a90",
      "name": "Storage",
      "code": "storage",
      "recurring": false,
      "created_at": "2022-09-14T16:35:31Z",
      "aggregation_type": "sum_agg",
      "description": "GB of storage used in my application",
      "rounding_function": "round",
      "rounding_precision": 2,
      "expression": "round((ended_at - started_at) * units)",
      "field_name": "gb",
      "weighted_interval": "seconds",
      "filters": [
        {
          "key": "region",
          "values": [
            "us-east-1"
          ]
        }
      ]
    },
    "alert_type": "billable_metric_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

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

external_id
string
required

External ID of the existing subscription

Example:

"5eb02857-a71e-4ea2-bcf9-57d3a41bc6ba"

code
string
required

Unique code of the alert

Example:

"storage_threshold_alert"

Query Parameters

subscription_status
enum<string>
default:active

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

Update an existing alert for a subscription

alert
object
required

Response

Subscription alert updated

alert
object
required