API Reference: Audit Log
Query the audit log of data changes by record, collection, user, action type, or date range.
Overview
The Audit Log records data changes in your Simply360 team — INSERT, UPDATE, and DELETE operations with user attribution, timestamp, and (on detail reads) before/after value snapshots. Use it for compliance reporting, debugging unexpected changes, and reconstructing deleted data.
Key Concepts
- Change tracking — Each entry captures the operation type (
INSERT/UPDATE/DELETE), the affected table and record, and the changed columns. - Attribution — Each entry carries the acting user (or API principal) and an
operationSourcedescribing the producer path (dashboard, API, automation, wizard, sync, and so on). - Queryable — Filter by table, record, operation type, source, actor, and date range.
- Immutable — Audit log entries cannot be modified or deleted via the API.
Endpoints
| Method | Path | Purpose |
|---|---|---|
GET | /v1/audit-log | List audit log entries with filters. |
GET | /v1/audit-log/stats | Aggregate statistics (totals by operation type, recent activity). |
GET | /v1/audit-log/tables/summary | Per-table change summaries. |
GET | /v1/audit-log/records/{tableName}/{recordSimplyId} | Full history for one record (with value snapshots). |
GET | /v1/audit-log/{auditLogEntryKey} | One entry's details (with value snapshots). |
List Audit Log Entries
Query by Record
Record filters take the table name plus the record's public simplyId (recordSimplyId requires tableName).
const history = await s360.auditLog.list({
tableName: 'DataRecord',
recordSimplyId: 'WXYZ-5678-IJKL',
limit: 100,
});
for (const entry of history.data) {
console.log(`${entry.operationAt}: ${entry.operationType} (${entry.operationSource})`);
}
curl -s "https://api.simply360.app/v1/audit-log?tableName=DataRecord&recordSimplyId=WXYZ-5678-IJKL&limit=100" \
-H "Authorization: Bearer $S360_API_KEY"
Query by Operation Type and Date Range
const updates = await s360.auditLog.list({
operationType: 'UPDATE',
dateFrom: '2026-06-01T00:00:00Z',
dateTo: '2026-07-01T00:00:00Z',
limit: 100,
});
curl -s "https://api.simply360.app/v1/audit-log?operationType=UPDATE&dateFrom=2026-06-01T00:00:00Z&limit=100" \
-H "Authorization: Bearer $S360_API_KEY"
Get a Specific Entry
Each list entry includes an opaque auditLogEntryKey. Pass it back to fetch the entry's details, including operationContext, previousValues, and newValues.
const entry = await s360.auditLog.get(entryKeyFromList);
console.log(entry.data.previousValues, entry.data.newValues);
curl -s "https://api.simply360.app/v1/audit-log/$AUDIT_LOG_ENTRY_KEY" \
-H "Authorization: Bearer $S360_API_KEY"
Filter Parameters
| Parameter | Type | Description |
|---|---|---|
tableName | string | Filter by audited table (e.g. DataRecord). |
recordSimplyId | string | Filter by one record's public simplyId. Requires tableName. |
operationType | string | INSERT, UPDATE, or DELETE. |
operationSource | string | Producer path filter (e.g. API, automation, wizard, sync). |
operationByUserSimplyId | string | Filter by acting user. |
operationByTeamUserLinkSimplyId | string | Filter by acting team-user link. |
dateFrom / dateTo | string | ISO 8601 bounds on operationAt. |
search | string | Free-text match against table name and record key. |
sortField / sortOrder | string | operationAt (default), tableName, operationType, operationSource, or recordKey; ASC or DESC (default). |
limit | integer | Entries per page (default 50, max 100). |
offset | integer | Skip count for pagination. |
Per-Record Audit Trail
For convenience, the Data Records SDK exposes a record-scoped helper that calls the audit-log records endpoint with the table name pre-filled:
const trail = await s360.dataRecords.getAuditLog('WXYZ-5678-IJKL', { limit: 50 });
curl -s "https://api.simply360.app/v1/audit-log/records/DataRecord/WXYZ-5678-IJKL?limit=50" \
-H "Authorization: Bearer $S360_API_KEY"
Usage Notes
- All audit-log endpoints require the
DATA_RECORD_LOGSfeature permission. Session tokens and OAuth tokens additionally need therecords:readscope. - The single-entry and per-record endpoints return
previousValues/newValuessnapshots and therefore require full data access (403 DATA_PERMISSION_DENIEDotherwise). Certain sensitive columns are always redacted from snapshots. auditLogEntryKeyis an opaque key returned by the list endpoint — treat it as a token, not a simplyId.- Batch operations generate individual audit entries for each affected record.
- Each list entry includes
changedColumns; use the detail endpoints when you need the retained before/after values.