curl --request GET \
--url https://service.abundly.ai/workspaceapi/action-log \
--header 'Authorization: Bearer <token>'import requests
url = "https://service.abundly.ai/workspaceapi/action-log"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://service.abundly.ai/workspaceapi/action-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://service.abundly.ai/workspaceapi/action-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://service.abundly.ai/workspaceapi/action-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://service.abundly.ai/workspaceapi/action-log")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://service.abundly.ai/workspaceapi/action-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{
"rows": [
{
"kind": "resource",
"id": "<string>",
"timestamp": "<string>",
"eventType": "<string>",
"source": "<string>",
"data": {
"changedFields": [
"<string>"
],
"before": "<unknown>",
"after": "<unknown>"
},
"actorUserId": "<string>",
"agentId": "<string>",
"agentName": "<string>",
"targetType": "<string>",
"targetId": "<string>",
"teamName": "<string>",
"targetUserId": "<string>",
"targetUserName": "<string>",
"targetUserEmail": "<string>",
"groupName": "<string>",
"invitedByName": "<string>",
"actorUserName": "<string>",
"actorUserEmail": "<string>",
"actorAgentId": "<string>",
"actorAgentName": "<string>",
"actorWorkspaceKeyId": "<string>",
"actorWorkspaceKeyLabel": "<string>",
"staffRedacted": true,
"redactedSummary": "<string>",
"redactedDetailLines": [
"<string>"
]
}
],
"totalCount": 123,
"page": 123,
"pageSize": 123,
"agentNamesById": {},
"userNamesById": {},
"groupNamesById": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Read the user action log
Who changed which agent, team or workspace setting, who invited or added whom, and when, newest first — the same rows as Usage › User action log in the portal, restricted, personal and deleted agents included. kind tells setting changes (“resource”) from invitations and workspace and team membership (“membership”). Instruction, prompt and credential values are never stored: they appear as «redacted:…» tokens, which show that a value changed but not what it is — read /agents/:agentId/instruction-versions for the instruction text (not available for restricted and personal agents). Changes by Abundly staff show the actor as “Abundly staff” with object snapshots stripped. Filter with agentId, eventType (comma-separated), actorUserId, from and to; paginate with page and pageSize (default 50, max 200).
curl --request GET \
--url https://service.abundly.ai/workspaceapi/action-log \
--header 'Authorization: Bearer <token>'import requests
url = "https://service.abundly.ai/workspaceapi/action-log"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://service.abundly.ai/workspaceapi/action-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://service.abundly.ai/workspaceapi/action-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://service.abundly.ai/workspaceapi/action-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://service.abundly.ai/workspaceapi/action-log")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://service.abundly.ai/workspaceapi/action-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{
"rows": [
{
"kind": "resource",
"id": "<string>",
"timestamp": "<string>",
"eventType": "<string>",
"source": "<string>",
"data": {
"changedFields": [
"<string>"
],
"before": "<unknown>",
"after": "<unknown>"
},
"actorUserId": "<string>",
"agentId": "<string>",
"agentName": "<string>",
"targetType": "<string>",
"targetId": "<string>",
"teamName": "<string>",
"targetUserId": "<string>",
"targetUserName": "<string>",
"targetUserEmail": "<string>",
"groupName": "<string>",
"invitedByName": "<string>",
"actorUserName": "<string>",
"actorUserEmail": "<string>",
"actorAgentId": "<string>",
"actorAgentName": "<string>",
"actorWorkspaceKeyId": "<string>",
"actorWorkspaceKeyLabel": "<string>",
"staffRedacted": true,
"redactedSummary": "<string>",
"redactedDetailLines": [
"<string>"
]
}
],
"totalCount": 123,
"page": 123,
"pageSize": 123,
"agentNamesById": {},
"userNamesById": {},
"groupNamesById": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Workspace API key (wk_). GET endpoints require the Workspace read API scope, POST, PUT, PATCH and DELETE endpoints the Workspace write API scope, and sending or revoking invitations (POST and DELETE /workspaceapi/invites) the Invite members scope. A key stops working when it expires or is disabled.
Query Parameters
Only changes to this agent.
Comma-separated event types, e.g. "agent.instructions_changed,agent.capabilities_changed".
Only changes made by this user.
ISO date — only changes at or after this time.
ISO date — only changes at or before this time.
Page number (default 1).
x >= 1Page size (default 50, max 200).
1 <= x <= 200Response
Success. Empty result sets are also 200.
Newest first. The id → name maps resolve ids referenced inside data.

