Reference
Audit Log
Read-only timeline of mutations across the workspace. Every create/update/
delete on auditable models (contacts, tags, smart-lists, etc.) appends one
row containing the actor (user_id), action verb, subject reference, and a
diff of old/new values.
List audit log entries
Lists the audit log entries of the token's location, newest first. All filters are optional and additive.
GET
/api/audit-logs
Scoped to the location the token belongs to. Entries from another location are never returned, and there is no parameter that widens it.
Everybody in the location can read it, on purpose — including viewer.
The log exists to settle an argument between two people, and a record only
one of them can open settles nothing.
Query parameters
-
subject_typestringEloquent class FQN of the audited model.
Example:
App\Models\Contact -
subject_idintegerAudited record ID.
Example:
42 -
user_idintegerFilter by actor.
Example:
7 -
actionstringOne of
created,updated,deleted,bulk_deleted,owner_changed.Example:
updated -
fromstringdate Lower bound on
created_at(inclusive, ISO-8601).Example:
2026-06-01 -
tostringdate Upper bound on
created_at(inclusive, ISO-8601).Example:
2026-06-05 -
per_pageintegerRows per page. Default 50, maximum 200. See Lists, paging and filters.
Example:
50
Body parameters
-
subject_typestringMust not be greater than 255 characters.
Example:
b -
subject_idintegerExample:
16 -
user_idintegerExample:
16 -
actionstringMust not be greater than 50 characters.
Example:
n -
fromstringMust be a valid date.
Example:
2026-08-26T02:19:50 -
tostringMust be a valid date.
Example:
2026-08-26T02:19:50 -
per_pageintegerMust be at least 1. Must not be greater than 200.
Example:
7
curl --request GET \
--get "https://klozzo.com/api/audit-logs?subject_type=App%5CModels%5CContact&subject_id=42&user_id=7&action=updated&from=2026-06-01&to=2026-06-05&per_page=50" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"subject_type\": \"b\",
\"subject_id\": 16,
\"user_id\": 16,
\"action\": \"n\",
\"from\": \"2026-08-26T02:19:50\",
\"to\": \"2026-08-26T02:19:50\",
\"per_page\": 7
}"
const url = new URL(
"https://klozzo.com/api/audit-logs"
);
const params = {
"subject_type": "App\Models\Contact",
"subject_id": "42",
"user_id": "7",
"action": "updated",
"from": "2026-06-01",
"to": "2026-06-05",
"per_page": "50",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_API_TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"subject_type": "b",
"subject_id": 16,
"user_id": 16,
"action": "n",
"from": "2026-08-26T02:19:50",
"to": "2026-08-26T02:19:50",
"per_page": 7
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://klozzo.com/api/audit-logs';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_API_TOKEN}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'subject_type' => 'App\Models\Contact',
'subject_id' => '42',
'user_id' => '7',
'action' => 'updated',
'from' => '2026-06-01',
'to' => '2026-06-05',
'per_page' => '50',
],
'json' => [
'subject_type' => 'b',
'subject_id' => 16,
'user_id' => 16,
'action' => 'n',
'from' => '2026-08-26T02:19:50',
'to' => '2026-08-26T02:19:50',
'per_page' => 7,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://klozzo.com/api/audit-logs'
payload = {
"subject_type": "b",
"subject_id": 16,
"user_id": 16,
"action": "n",
"from": "2026-08-26T02:19:50",
"to": "2026-08-26T02:19:50",
"per_page": 7
}
params = {
'subject_type': 'App\Models\Contact',
'subject_id': '42',
'user_id': '7',
'action': 'updated',
'from': '2026-06-01',
'to': '2026-06-05',
'per_page': '50',
}
headers = {
'Authorization': 'Bearer {YOUR_API_TOKEN}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()
{
"data": [
{
"id": null,
"user_id": 3783,
"location_id": null,
"action": "deleted",
"subject_type": "App\\Models\\Contact",
"subject_id": 23891,
"old_values": null,
"new_values": {
"first_name": "Rowan"
},
"ip_address": "197.119.215.250",
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/5340 (KHTML, like Gecko) Chrome/40.0.882.0 Mobile Safari/5340",
"created_at": null
},
{
"id": null,
"user_id": 3785,
"location_id": null,
"action": "created",
"subject_type": "App\\Models\\Contact",
"subject_id": 23892,
"old_values": null,
"new_values": {
"first_name": "Nelson"
},
"ip_address": "109.9.175.184",
"user_agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_5 rv:4.0; en-US) AppleWebKit/535.23.7 (KHTML, like Gecko) Version/5.0 Safari/535.23.7",
"created_at": null
}
],
"links": {
"first": "/?page=1",
"last": "/?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "/?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"path": "/",
"per_page": 50,
"to": 2,
"total": 2
}
}
-
dataobject[]-
idstring -
user_idinteger -
location_idstring -
actionstring -
subject_typestring -
subject_idinteger -
old_valuesstring -
new_valuesobject-
first_namestring
-
-
ip_addressstring -
user_agentstring -
created_atstring
-
-
linksobject-
firststring -
laststring -
prevstring -
nextstring
-
-
metaobject-
current_pageinteger -
frominteger -
last_pageinteger -
linksobject[]-
urlstring -
labelstring -
pagestring -
activeboolean
-
-
pathstring -
per_pageinteger -
tointeger -
totalinteger
-
{
"message": "This action is unauthorized."
}
Every error shares the same shape — message and errors.
See Errors.
{
"message": "Per page no puede ser mayor que 200.",
"errors": {
"per_page": [
"Per page no puede ser mayor que 200."
]
}
}
Every error shares the same shape — message and errors.
See Errors.