Audit log
List Audit Log
Your organization’s own audit trail, newest first. Every call to this API is recorded, and so is every write an organization key makes while acting as a workspace on the public API, with the key, the workspace, the action and the HTTP status.
Scope: none. Any valid organization key can read the audit log.
GET
/
audit-log
List Audit Log
curl --request GET \
--url https://api.clustr-ai.com/api/org/v1/audit-log \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.clustr-ai.com/api/org/v1/audit-log"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.clustr-ai.com/api/org/v1/audit-log', 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.clustr-ai.com/api/org/v1/audit-log",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.clustr-ai.com/api/org/v1/audit-log"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.clustr-ai.com/api/org/v1/audit-log")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clustr-ai.com/api/org/v1/audit-log")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"organizationId": "5d8e2b1a-0c3f-4e7d-9a6b-1f2e3d4c5b6a",
"apiKeyId": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"action": "POST /api/org/v1/tenants",
"method": "POST",
"path": "/api/org/v1/tenants",
"status": 201,
"createdAt": "2026-10-13T09:30:00Z"
},
{
"organizationId": "5d8e2b1a-0c3f-4e7d-9a6b-1f2e3d4c5b6a",
"apiKeyId": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"action": "POST /api/public/network/import/connectors",
"tenantId": "3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9e1f42",
"method": "POST",
"path": "/api/public/network/import/connectors",
"status": 200,
"createdAt": "2026-10-13T09:31:00Z"
}
]
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or revoked API key"
}
}{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests"
}
}{
"success": false,
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The organization service is unavailable"
}
}Authorizations
Organization API key (clo_...). The X-API-Key header is also accepted in place of Authorization: Bearer.
Query Parameters
Entries to return. Default 100, at most 500.
Required range:
1 <= x <= 500⌘I
List Audit Log
curl --request GET \
--url https://api.clustr-ai.com/api/org/v1/audit-log \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.clustr-ai.com/api/org/v1/audit-log"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.clustr-ai.com/api/org/v1/audit-log', 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.clustr-ai.com/api/org/v1/audit-log",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.clustr-ai.com/api/org/v1/audit-log"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.clustr-ai.com/api/org/v1/audit-log")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.clustr-ai.com/api/org/v1/audit-log")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"organizationId": "5d8e2b1a-0c3f-4e7d-9a6b-1f2e3d4c5b6a",
"apiKeyId": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"action": "POST /api/org/v1/tenants",
"method": "POST",
"path": "/api/org/v1/tenants",
"status": 201,
"createdAt": "2026-10-13T09:30:00Z"
},
{
"organizationId": "5d8e2b1a-0c3f-4e7d-9a6b-1f2e3d4c5b6a",
"apiKeyId": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"action": "POST /api/public/network/import/connectors",
"tenantId": "3f6c1d2e-8a4b-4c1f-9e2d-7b5a0c9e1f42",
"method": "POST",
"path": "/api/public/network/import/connectors",
"status": 200,
"createdAt": "2026-10-13T09:31:00Z"
}
]
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or revoked API key"
}
}{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests"
}
}{
"success": false,
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The organization service is unavailable"
}
}