Update a feature
curl --request PUT \
--url https://api.getlago.com/api/v1/features/{code} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"feature": {
"name": "Number of seats",
"description": "Number of users of the account",
"privileges": [
{
"code": "max",
"name": "Maximum",
"value_type": "integer"
},
{
"code": "max_admins",
"name": "Max Admins",
"value_type": "integer"
},
{
"code": "root",
"name": "Allow root user",
"value_type": "boolean"
},
{
"code": "provider",
"name": "SSO Provider",
"value_type": "select",
"config": {
"select_options": [
"google",
"okta"
]
}
}
]
}
}
'import requests
url = "https://api.getlago.com/api/v1/features/{code}"
payload = { "feature": {
"name": "Number of seats",
"description": "Number of users of the account",
"privileges": [
{
"code": "max",
"name": "Maximum",
"value_type": "integer"
},
{
"code": "max_admins",
"name": "Max Admins",
"value_type": "integer"
},
{
"code": "root",
"name": "Allow root user",
"value_type": "boolean"
},
{
"code": "provider",
"name": "SSO Provider",
"value_type": "select",
"config": { "select_options": ["google", "okta"] }
}
]
} }
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({
feature: {
name: 'Number of seats',
description: 'Number of users of the account',
privileges: [
{code: 'max', name: 'Maximum', value_type: 'integer'},
{code: 'max_admins', name: 'Max Admins', value_type: 'integer'},
{code: 'root', name: 'Allow root user', value_type: 'boolean'},
{
code: 'provider',
name: 'SSO Provider',
value_type: 'select',
config: {select_options: ['google', 'okta']}
}
]
}
})
};
fetch('https://api.getlago.com/api/v1/features/{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/features/{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([
'feature' => [
'name' => 'Number of seats',
'description' => 'Number of users of the account',
'privileges' => [
[
'code' => 'max',
'name' => 'Maximum',
'value_type' => 'integer'
],
[
'code' => 'max_admins',
'name' => 'Max Admins',
'value_type' => 'integer'
],
[
'code' => 'root',
'name' => 'Allow root user',
'value_type' => 'boolean'
],
[
'code' => 'provider',
'name' => 'SSO Provider',
'value_type' => 'select',
'config' => [
'select_options' => [
'google',
'okta'
]
]
]
]
]
]),
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/features/{code}"
payload := strings.NewReader("{\n \"feature\": {\n \"name\": \"Number of seats\",\n \"description\": \"Number of users of the account\",\n \"privileges\": [\n {\n \"code\": \"max\",\n \"name\": \"Maximum\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"max_admins\",\n \"name\": \"Max Admins\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"root\",\n \"name\": \"Allow root user\",\n \"value_type\": \"boolean\"\n },\n {\n \"code\": \"provider\",\n \"name\": \"SSO Provider\",\n \"value_type\": \"select\",\n \"config\": {\n \"select_options\": [\n \"google\",\n \"okta\"\n ]\n }\n }\n ]\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/features/{code}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"feature\": {\n \"name\": \"Number of seats\",\n \"description\": \"Number of users of the account\",\n \"privileges\": [\n {\n \"code\": \"max\",\n \"name\": \"Maximum\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"max_admins\",\n \"name\": \"Max Admins\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"root\",\n \"name\": \"Allow root user\",\n \"value_type\": \"boolean\"\n },\n {\n \"code\": \"provider\",\n \"name\": \"SSO Provider\",\n \"value_type\": \"select\",\n \"config\": {\n \"select_options\": [\n \"google\",\n \"okta\"\n ]\n }\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlago.com/api/v1/features/{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 \"feature\": {\n \"name\": \"Number of seats\",\n \"description\": \"Number of users of the account\",\n \"privileges\": [\n {\n \"code\": \"max\",\n \"name\": \"Maximum\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"max_admins\",\n \"name\": \"Max Admins\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"root\",\n \"name\": \"Allow root user\",\n \"value_type\": \"boolean\"\n },\n {\n \"code\": \"provider\",\n \"name\": \"SSO Provider\",\n \"value_type\": \"select\",\n \"config\": {\n \"select_options\": [\n \"google\",\n \"okta\"\n ]\n }\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"feature": {
"code": "seats",
"name": "Number of seats",
"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"
]
}
}
],
"created_at": "2025-07-17T12:34:35Z"
}
}{
"status": 400,
"error": "Bad request"
}{
"status": 401,
"error": "Unauthorized"
}{
"status": 403,
"error": "Forbidden",
"code": "feature_unavailable"
}{
"status": 404,
"error": "Not Found",
"code": "object_not_found"
}{
"status": 422,
"error": "Unprocessable entity",
"code": "validation_errors",
"error_details": {}
}Entitlements
Update a feature
This endpoint updates an existing feature representing an entitlement component of your application. Only the fields present in the payload are updated. Privileges are matched by their code, an unknown code adds a new privilege and a known one updates its name and adds the select options of the payload to the existing ones. The value type of an existing privilege cannot be changed. Privileges left out of the payload are kept, use the delete privilege endpoint to remove one.
PUT
/
features
/
{code}
Update a feature
curl --request PUT \
--url https://api.getlago.com/api/v1/features/{code} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"feature": {
"name": "Number of seats",
"description": "Number of users of the account",
"privileges": [
{
"code": "max",
"name": "Maximum",
"value_type": "integer"
},
{
"code": "max_admins",
"name": "Max Admins",
"value_type": "integer"
},
{
"code": "root",
"name": "Allow root user",
"value_type": "boolean"
},
{
"code": "provider",
"name": "SSO Provider",
"value_type": "select",
"config": {
"select_options": [
"google",
"okta"
]
}
}
]
}
}
'import requests
url = "https://api.getlago.com/api/v1/features/{code}"
payload = { "feature": {
"name": "Number of seats",
"description": "Number of users of the account",
"privileges": [
{
"code": "max",
"name": "Maximum",
"value_type": "integer"
},
{
"code": "max_admins",
"name": "Max Admins",
"value_type": "integer"
},
{
"code": "root",
"name": "Allow root user",
"value_type": "boolean"
},
{
"code": "provider",
"name": "SSO Provider",
"value_type": "select",
"config": { "select_options": ["google", "okta"] }
}
]
} }
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({
feature: {
name: 'Number of seats',
description: 'Number of users of the account',
privileges: [
{code: 'max', name: 'Maximum', value_type: 'integer'},
{code: 'max_admins', name: 'Max Admins', value_type: 'integer'},
{code: 'root', name: 'Allow root user', value_type: 'boolean'},
{
code: 'provider',
name: 'SSO Provider',
value_type: 'select',
config: {select_options: ['google', 'okta']}
}
]
}
})
};
fetch('https://api.getlago.com/api/v1/features/{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/features/{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([
'feature' => [
'name' => 'Number of seats',
'description' => 'Number of users of the account',
'privileges' => [
[
'code' => 'max',
'name' => 'Maximum',
'value_type' => 'integer'
],
[
'code' => 'max_admins',
'name' => 'Max Admins',
'value_type' => 'integer'
],
[
'code' => 'root',
'name' => 'Allow root user',
'value_type' => 'boolean'
],
[
'code' => 'provider',
'name' => 'SSO Provider',
'value_type' => 'select',
'config' => [
'select_options' => [
'google',
'okta'
]
]
]
]
]
]),
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/features/{code}"
payload := strings.NewReader("{\n \"feature\": {\n \"name\": \"Number of seats\",\n \"description\": \"Number of users of the account\",\n \"privileges\": [\n {\n \"code\": \"max\",\n \"name\": \"Maximum\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"max_admins\",\n \"name\": \"Max Admins\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"root\",\n \"name\": \"Allow root user\",\n \"value_type\": \"boolean\"\n },\n {\n \"code\": \"provider\",\n \"name\": \"SSO Provider\",\n \"value_type\": \"select\",\n \"config\": {\n \"select_options\": [\n \"google\",\n \"okta\"\n ]\n }\n }\n ]\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/features/{code}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"feature\": {\n \"name\": \"Number of seats\",\n \"description\": \"Number of users of the account\",\n \"privileges\": [\n {\n \"code\": \"max\",\n \"name\": \"Maximum\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"max_admins\",\n \"name\": \"Max Admins\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"root\",\n \"name\": \"Allow root user\",\n \"value_type\": \"boolean\"\n },\n {\n \"code\": \"provider\",\n \"name\": \"SSO Provider\",\n \"value_type\": \"select\",\n \"config\": {\n \"select_options\": [\n \"google\",\n \"okta\"\n ]\n }\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlago.com/api/v1/features/{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 \"feature\": {\n \"name\": \"Number of seats\",\n \"description\": \"Number of users of the account\",\n \"privileges\": [\n {\n \"code\": \"max\",\n \"name\": \"Maximum\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"max_admins\",\n \"name\": \"Max Admins\",\n \"value_type\": \"integer\"\n },\n {\n \"code\": \"root\",\n \"name\": \"Allow root user\",\n \"value_type\": \"boolean\"\n },\n {\n \"code\": \"provider\",\n \"name\": \"SSO Provider\",\n \"value_type\": \"select\",\n \"config\": {\n \"select_options\": [\n \"google\",\n \"okta\"\n ]\n }\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"feature": {
"code": "seats",
"name": "Number of seats",
"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"
]
}
}
],
"created_at": "2025-07-17T12:34:35Z"
}
}{
"status": 400,
"error": "Bad request"
}{
"status": 401,
"error": "Unauthorized"
}{
"status": 403,
"error": "Forbidden",
"code": "feature_unavailable"
}{
"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
Code of the existing feature.
Example:
"seats"
Body
application/json
Feature payload
Show child attributes
Show child attributes
Response
Feature updated
Show child attributes
Show child attributes