curl --request GET \
--url https://service.abundly.ai/workspaceapi/agents/{agentId}/activity-log \
--header 'Authorization: Bearer <token>'import requests
url = "https://service.abundly.ai/workspaceapi/agents/{agentId}/activity-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/agents/{agentId}/activity-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/agents/{agentId}/activity-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/agents/{agentId}/activity-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/agents/{agentId}/activity-log")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://service.abundly.ai/workspaceapi/agents/{agentId}/activity-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{
"id": "<string>",
"agentId": "<string>",
"customerId": "<string>",
"timestamp": "<string>",
"eventType": "<string>",
"event": "<unknown>",
"isScriptRun": true,
"credits": 123,
"errorMessage": "<string>",
"scriptExecution": {},
"preFilter": {},
"attackDetection": {},
"plan": {},
"securityCheck": {},
"execution": {},
"voiceCallUsage": {},
"steps": [
{
"type": "<string>",
"phase": "<string>",
"timestamp": "<string>",
"toolName": "<string>",
"input": "<unknown>",
"text": "<string>",
"response": "<string>",
"status": "<string>",
"isError": true,
"finishedAt": "<string>",
"durationMs": 123,
"credits": 123
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Read the activity log
Trigger runs with their per-stage credit cost. Pass entryId for a single entry with its full steps[] trace — the most detailed audit surface in the API. Passing page or pageSize returns a paginated response that echoes both; without either you get the most recent entries capped by limit.
curl --request GET \
--url https://service.abundly.ai/workspaceapi/agents/{agentId}/activity-log \
--header 'Authorization: Bearer <token>'import requests
url = "https://service.abundly.ai/workspaceapi/agents/{agentId}/activity-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/agents/{agentId}/activity-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/agents/{agentId}/activity-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/agents/{agentId}/activity-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/agents/{agentId}/activity-log")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://service.abundly.ai/workspaceapi/agents/{agentId}/activity-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{
"id": "<string>",
"agentId": "<string>",
"customerId": "<string>",
"timestamp": "<string>",
"eventType": "<string>",
"event": "<unknown>",
"isScriptRun": true,
"credits": 123,
"errorMessage": "<string>",
"scriptExecution": {},
"preFilter": {},
"attackDetection": {},
"plan": {},
"securityCheck": {},
"execution": {},
"voiceCallUsage": {},
"steps": [
{
"type": "<string>",
"phase": "<string>",
"timestamp": "<string>",
"toolName": "<string>",
"input": "<unknown>",
"text": "<string>",
"response": "<string>",
"status": "<string>",
"isError": true,
"finishedAt": "<string>",
"durationMs": 123,
"credits": 123
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Workspace API key (wk_). GET endpoints require the Workspace read API scope, POST endpoints the Workspace write API scope.
Path Parameters
The agent id.
Query Parameters
Max entries (default 100).
1 <= x <= 500If set, return paginated results.
x >= 1Page size when page is set (default 50).
1 <= x <= 200If set, return a single activity log entry by id.
ISO date string. If set, returns only entries newer than this timestamp.
Response
Success. Empty result sets are also 200.
- Option 1
- Option 2
- Option 3
Which shape comes back depends on the parameters used.
ISO 8601 timestamp.
What woke the agent, e.g. a scheduled trigger, email or webhook.
The trigger payload. Bodies and attachments are stripped in lists.
Total credits for the run; each phase below also carries its own.
Set when the run threw rather than completing a phase.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
skipped: true means the phase never ran, which is not the same as passing.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Only hydrated for a single-entry read via entryId.
Show child attributes
Show child attributes

