List audit trail entries (ids, codes and chain fields only)
GET /audit-trail
Scope audit_log:read Plan Growth+
Requires the audit_log:read scope. Needs the audit_trail plan feature.
Example
curl "https://api.autociso.io/api/v1/audit-trail" \
-H "Authorization: Bearer <your-api-token>"import requests
response = requests.get(
"https://api.autociso.io/api/v1/audit-trail",
headers={"Authorization": "Bearer <your-api-token>"},
)
print(response.json())const response = await fetch("https://api.autociso.io/api/v1/audit-trail", {
method: "GET",
headers: { "Authorization": "Bearer <your-api-token>" },
});
console.log(await response.json());Response 200
{
"data": [
{
"action": {
"code": "employee.updated",
"group": "employee"
},
"actorId": "usr_1hgyq7m2k9xa",
"chainStatus": "verified",
"createdAt": "2026-10-12T09:15:22Z",
"id": "6707c3a91f4e2b0012ab34cd",
"seqNum": 10482,
"subjectId": "empl_1hgyun41rx48",
"subjectType": "employee"
},
{
"action": {
"code": "asset.created",
"group": "asset"
},
"actorId": "apitoken:tok_1hj4w2c8n6pz",
"chainStatus": "verified",
"createdAt": "2026-10-12T09:16:05Z",
"id": "6707c3b41f4e2b0012ab34d0",
"seqNum": 10483,
"subjectId": "ast_1hk40c2n8v3r",
"subjectType": "asset"
}
],
"error": null,
"meta": {
"hasMore": true,
"limit": 2,
"nextCursor": "c2VxOjEwNDgz"
}
}Query parameters
limitintegerPage size.offsetintegerRows to skip (offset mode). Cannot be combined with cursor.cursorstringAn opaque cursor taken from meta.nextCursor of the previous page (cursor mode). Valid for 24 hours and bound to the token and the query; do not parse or construct it.sort[createdAt]stringSort direction for createdAt."asc" | "desc"sort[id]stringSort direction for id."asc" | "desc"sort[seqNum]stringSort direction for seqNum."asc" | "desc"filter[action][eq]stringFilter action (eq).filter[action][in]stringFilter action (in). Comma-separated, at most 50 values.filter[actorId][eq]stringFilter actorId (eq).filter[actorId][in]stringFilter actorId (in). Comma-separated, at most 50 values.filter[createdAt][gte]string (date-time)Filter createdAt (gte).filter[createdAt][lt]string (date-time)Filter createdAt (lt).filter[id][eq]stringFilter id (eq).filter[id][in]stringFilter id (in). Comma-separated, at most 50 values.filter[seqNum][gte]integerFilter seqNum (gte).filter[seqNum][lt]integerFilter seqNum (lt).filter[subjectType][eq]stringFilter subjectType (eq).filter[subjectType][in]stringFilter subjectType (in). Comma-separated, at most 50 values.
Returns
The data field of the standard { data, error, meta } envelope:
An array of object:
actionobject requiredAction code and group.codestring requiredgroupstring required
actorIdstring or null requiredActor id: usr_<id> for a user, apitoken:<id> for an API token, system:<job> for the platform; null when the stored value is not an id.chainStatusstring requiredverified, accepted (a reviewed, approved chain exception) or unverified (legacy entry or a break on this page).createdAtstring (date-time) requiredWhen the entry was recorded (UTC). The trail is append-only: use createdAt (or seqNum) to sync.idstring requiredOpaque entry id (24 hex characters); the cursor tie-break.seqNuminteger or null requiredPosition in the hash chain; null for legacy entries recorded before the chain.subjectIdstring or null requiredSubject id; null when the stored value is not an id.subjectTypestring requiredKind of the subject.
Errors
| Status | Code | Retry | Meaning |
|---|---|---|---|
| 400 | - | no | The request is invalid. |
| 401 | - | no | The token is missing, malformed, expired or revoked. |
| 402 | - | no | The organisation’s plan does not include the feature this route needs. |
| 403 | - | no | The token may not use this route. |
| 429 | - | yes | Rate limit or row budget exceeded; retry after the time in Retry-After. |
| 500 | - | no | Unexpected server error. |
| 503 | - | yes | A dependency is temporarily unavailable; retry later. |
Last reviewed: 2026-10-13
Was this page helpful?