curl --request PATCH \
--url https://app.launchdarkly.com/api/v2/roles/{customRoleKey} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"patch": [
{
"op": "add",
"path": "/policy/0",
"value": {
"actions": [
"updateOn"
],
"effect": "allow",
"resources": [
"proj/*:env/qa:flag/*"
]
}
}
]
}
'import requests
url = "https://app.launchdarkly.com/api/v2/roles/{customRoleKey}"
payload = { "patch": [
{
"op": "add",
"path": "/policy/0",
"value": {
"actions": ["updateOn"],
"effect": "allow",
"resources": ["proj/*:env/qa:flag/*"]
}
}
] }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
patch: [
{
op: 'add',
path: '/policy/0',
value: {actions: ['updateOn'], effect: 'allow', resources: ['proj/*:env/qa:flag/*']}
}
]
})
};
fetch('https://app.launchdarkly.com/api/v2/roles/{customRoleKey}', 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://app.launchdarkly.com/api/v2/roles/{customRoleKey}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'patch' => [
[
'op' => 'add',
'path' => '/policy/0',
'value' => [
'actions' => [
'updateOn'
],
'effect' => 'allow',
'resources' => [
'proj/*:env/qa:flag/*'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://app.launchdarkly.com/api/v2/roles/{customRoleKey}"
payload := strings.NewReader("{\n \"patch\": [\n {\n \"op\": \"add\",\n \"path\": \"/policy/0\",\n \"value\": {\n \"actions\": [\n \"updateOn\"\n ],\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/qa:flag/*\"\n ]\n }\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "<api-key>")
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.patch("https://app.launchdarkly.com/api/v2/roles/{customRoleKey}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"patch\": [\n {\n \"op\": \"add\",\n \"path\": \"/policy/0\",\n \"value\": {\n \"actions\": [\n \"updateOn\"\n ],\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/qa:flag/*\"\n ]\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.launchdarkly.com/api/v2/roles/{customRoleKey}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"patch\": [\n {\n \"op\": \"add\",\n \"path\": \"/policy/0\",\n \"value\": {\n \"actions\": [\n \"updateOn\"\n ],\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/qa:flag/*\"\n ]\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"_id": "1234a56b7c89d012345e678f",
"_links": {},
"key": "example-custom-role",
"name": "Example custom role",
"policy": [
{
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
]
}
],
"_access": {
"denied": [
{
"action": "<string>",
"reason": {
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
],
"role_name": "<string>"
}
}
],
"allowed": [
{
"action": "<string>",
"reason": {
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
],
"role_name": "<string>"
}
}
]
},
"description": "This custom role is just an example",
"basePermissions": "reader",
"resourceCategory": "<string>",
"assignedTo": {
"membersCount": 123,
"teamsCount": 123
},
"_presetBundleVersion": 123,
"_presetStatements": [
{
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
]
}
]
}{
"code": "invalid_request",
"message": "Invalid request body"
}{
"code": "unauthorized",
"message": "Invalid access token"
}{
"code": "not_found",
"message": "Invalid resource identifier"
}{
"code": "optimistic_locking_error",
"message": "Conflict. Optimistic lock error. Try again later."
}{
"code": "rate_limited",
"message": "You've exceeded the API rate limit. Try again later."
}Update custom role
Update a single custom role. Updating a custom role uses a JSON patch or JSON merge patch representation of the desired changes. To learn more, read Updates.
To add an element to the policy array, set the path to /policy and then append /<array index>. Use /0 to add to the beginning of the array. Use /- to add to the end of the array.
curl --request PATCH \
--url https://app.launchdarkly.com/api/v2/roles/{customRoleKey} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"patch": [
{
"op": "add",
"path": "/policy/0",
"value": {
"actions": [
"updateOn"
],
"effect": "allow",
"resources": [
"proj/*:env/qa:flag/*"
]
}
}
]
}
'import requests
url = "https://app.launchdarkly.com/api/v2/roles/{customRoleKey}"
payload = { "patch": [
{
"op": "add",
"path": "/policy/0",
"value": {
"actions": ["updateOn"],
"effect": "allow",
"resources": ["proj/*:env/qa:flag/*"]
}
}
] }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
patch: [
{
op: 'add',
path: '/policy/0',
value: {actions: ['updateOn'], effect: 'allow', resources: ['proj/*:env/qa:flag/*']}
}
]
})
};
fetch('https://app.launchdarkly.com/api/v2/roles/{customRoleKey}', 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://app.launchdarkly.com/api/v2/roles/{customRoleKey}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'patch' => [
[
'op' => 'add',
'path' => '/policy/0',
'value' => [
'actions' => [
'updateOn'
],
'effect' => 'allow',
'resources' => [
'proj/*:env/qa:flag/*'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://app.launchdarkly.com/api/v2/roles/{customRoleKey}"
payload := strings.NewReader("{\n \"patch\": [\n {\n \"op\": \"add\",\n \"path\": \"/policy/0\",\n \"value\": {\n \"actions\": [\n \"updateOn\"\n ],\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/qa:flag/*\"\n ]\n }\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "<api-key>")
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.patch("https://app.launchdarkly.com/api/v2/roles/{customRoleKey}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"patch\": [\n {\n \"op\": \"add\",\n \"path\": \"/policy/0\",\n \"value\": {\n \"actions\": [\n \"updateOn\"\n ],\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/qa:flag/*\"\n ]\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.launchdarkly.com/api/v2/roles/{customRoleKey}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"patch\": [\n {\n \"op\": \"add\",\n \"path\": \"/policy/0\",\n \"value\": {\n \"actions\": [\n \"updateOn\"\n ],\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/qa:flag/*\"\n ]\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"_id": "1234a56b7c89d012345e678f",
"_links": {},
"key": "example-custom-role",
"name": "Example custom role",
"policy": [
{
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
]
}
],
"_access": {
"denied": [
{
"action": "<string>",
"reason": {
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
],
"role_name": "<string>"
}
}
],
"allowed": [
{
"action": "<string>",
"reason": {
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
],
"role_name": "<string>"
}
}
]
},
"description": "This custom role is just an example",
"basePermissions": "reader",
"resourceCategory": "<string>",
"assignedTo": {
"membersCount": 123,
"teamsCount": 123
},
"_presetBundleVersion": 123,
"_presetStatements": [
{
"effect": "allow",
"resources": [
"proj/*:env/*;qa_*:/flag/*"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
]
}
]
}{
"code": "invalid_request",
"message": "Invalid request body"
}{
"code": "unauthorized",
"message": "Invalid access token"
}{
"code": "not_found",
"message": "Invalid resource identifier"
}{
"code": "optimistic_locking_error",
"message": "Conflict. Optimistic lock error. Try again later."
}{
"code": "rate_limited",
"message": "You've exceeded the API rate limit. Try again later."
}Authorizations
Path Parameters
The custom role key
Body
Response
Custom role response
The ID of the custom role
"1234a56b7c89d012345e678f"
The location and content type of related resources
Show child attributes
Show child attributes
The key of the custom role
"example-custom-role"
The name of the custom role
"Example custom role"
An array of the policies that comprise this custom role
Show child attributes
Show child attributes
Details on the allowed and denied actions for this custom role
Show child attributes
Show child attributes
The description of the custom role
"This custom role is just an example"
Base permissions to use for this role. Defaults to no_access (older roles defaulted to reader). Recommended to set this to no_access in all cases.
"reader"
The category of resources this role is intended to manage. Can be organization, project, or any. Once set, this field cannot be changed.
The number of teams and members this role is assigned to
Show child attributes
Show child attributes
If created from a preset, the preset bundle version
If created from a preset, the read-only statements copied from the preset
Show child attributes
Show child attributes