curl --request POST \
--url https://app.launchdarkly.com/api/v2/auditlog/counts \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
[
{
"effect": "allow",
"resources": [
"proj/*:env/*:flag/*;testing-tag"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
]
}
]
'import requests
url = "https://app.launchdarkly.com/api/v2/auditlog/counts"
payload = [
{
"effect": "allow",
"resources": ["proj/*:env/*:flag/*;testing-tag"],
"notResources": ["<string>"],
"actions": ["*"],
"notActions": ["<string>"]
}
]
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
effect: 'allow',
resources: ['proj/*:env/*:flag/*;testing-tag'],
notResources: ['<string>'],
actions: ['*'],
notActions: ['<string>']
}
])
};
fetch('https://app.launchdarkly.com/api/v2/auditlog/counts', 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/auditlog/counts",
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([
[
'effect' => 'allow',
'resources' => [
'proj/*:env/*:flag/*;testing-tag'
],
'notResources' => [
'<string>'
],
'actions' => [
'*'
],
'notActions' => [
'<string>'
]
]
]),
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/auditlog/counts"
payload := strings.NewReader("[\n {\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/*:flag/*;testing-tag\"\n ],\n \"notResources\": [\n \"<string>\"\n ],\n \"actions\": [\n \"*\"\n ],\n \"notActions\": [\n \"<string>\"\n ]\n }\n]")
req, _ := http.NewRequest("POST", 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.post("https://app.launchdarkly.com/api/v2/auditlog/counts")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/*:flag/*;testing-tag\"\n ],\n \"notResources\": [\n \"<string>\"\n ],\n \"actions\": [\n \"*\"\n ],\n \"notActions\": [\n \"<string>\"\n ]\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.launchdarkly.com/api/v2/auditlog/counts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/*:flag/*;testing-tag\"\n ],\n \"notResources\": [\n \"<string>\"\n ],\n \"actions\": [\n \"*\"\n ],\n \"notActions\": [\n \"<string>\"\n ]\n }\n]"
response = http.request(request)
puts response.read_body{
"buckets": [
{
"timestamp": 123,
"count": 123
}
],
"totalCount": 123,
"bucketIntervalMs": 123
}{
"code": "invalid_request",
"message": "Invalid request body"
}{
"code": "unauthorized",
"message": "Invalid access token"
}{
"code": "forbidden",
"message": "Forbidden. Access to the requested resource was denied."
}{
"code": "rate_limited",
"message": "You've exceeded the API rate limit. Try again later."
}Get audit log entry counts
Returns aggregate counts of audit log entries per time bucket. Used for dashboard overlays that show flag targeting changes.
curl --request POST \
--url https://app.launchdarkly.com/api/v2/auditlog/counts \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
[
{
"effect": "allow",
"resources": [
"proj/*:env/*:flag/*;testing-tag"
],
"notResources": [
"<string>"
],
"actions": [
"*"
],
"notActions": [
"<string>"
]
}
]
'import requests
url = "https://app.launchdarkly.com/api/v2/auditlog/counts"
payload = [
{
"effect": "allow",
"resources": ["proj/*:env/*:flag/*;testing-tag"],
"notResources": ["<string>"],
"actions": ["*"],
"notActions": ["<string>"]
}
]
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
effect: 'allow',
resources: ['proj/*:env/*:flag/*;testing-tag'],
notResources: ['<string>'],
actions: ['*'],
notActions: ['<string>']
}
])
};
fetch('https://app.launchdarkly.com/api/v2/auditlog/counts', 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/auditlog/counts",
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([
[
'effect' => 'allow',
'resources' => [
'proj/*:env/*:flag/*;testing-tag'
],
'notResources' => [
'<string>'
],
'actions' => [
'*'
],
'notActions' => [
'<string>'
]
]
]),
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/auditlog/counts"
payload := strings.NewReader("[\n {\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/*:flag/*;testing-tag\"\n ],\n \"notResources\": [\n \"<string>\"\n ],\n \"actions\": [\n \"*\"\n ],\n \"notActions\": [\n \"<string>\"\n ]\n }\n]")
req, _ := http.NewRequest("POST", 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.post("https://app.launchdarkly.com/api/v2/auditlog/counts")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/*:flag/*;testing-tag\"\n ],\n \"notResources\": [\n \"<string>\"\n ],\n \"actions\": [\n \"*\"\n ],\n \"notActions\": [\n \"<string>\"\n ]\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.launchdarkly.com/api/v2/auditlog/counts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"effect\": \"allow\",\n \"resources\": [\n \"proj/*:env/*:flag/*;testing-tag\"\n ],\n \"notResources\": [\n \"<string>\"\n ],\n \"actions\": [\n \"*\"\n ],\n \"notActions\": [\n \"<string>\"\n ]\n }\n]"
response = http.request(request)
puts response.read_body{
"buckets": [
{
"timestamp": 123,
"count": 123
}
],
"totalCount": 123,
"bucketIntervalMs": 123
}{
"code": "invalid_request",
"message": "Invalid request body"
}{
"code": "unauthorized",
"message": "Invalid access token"
}{
"code": "forbidden",
"message": "Forbidden. Access to the requested resource was denied."
}{
"code": "rate_limited",
"message": "You've exceeded the API rate limit. Try again later."
}Authorizations
Query Parameters
A timestamp filter, expressed as a Unix epoch time in milliseconds. Defaults to now.
A timestamp filter, expressed as a Unix epoch time in milliseconds. Required.
Number of time buckets to divide the range into. Default 50, max 500.
A member ID that lets you filter counts to changes made by that member. Repeat the parameter to filter by multiple members.
An access token ID that lets you filter counts to changes made by that token. Repeat the parameter to filter by multiple tokens.
Body
Whether this statement should allow or deny actions on the resources.
allow, deny "allow"
Resource specifier strings
["proj/*:env/*:flag/*;testing-tag"]
Targeted resources are the resources NOT in this list. The resources field must be empty to use this field.
Actions to perform on a resource
["*"]
Targeted actions are the actions NOT in this list. The actions field must be empty to use this field.