Skip to main content

Changelog lifecycle sync

The changelog is an audit-style stream of 23 action types across incidents, events, and comments: status changes, priority changes, assignments, comments, remediations, and more. It is the backbone of any sync that needs to know what changed since it last looked.

Endpoints​

OperationEndpoint
Poll lifecycle changesGET /v2/changelog

The cursor pattern​

Every row has a sortableId. Store the highest one you have processed and pass it back as the sortable_id query parameter to resume exactly where you left off:

curl -s "https://api.cloudsek.com/v2/changelog?sortable_id=$LAST_CURSOR&sort=asc&limit=200" \
-H "Authorization: Bearer $TOKEN"

The envelope is { "data": [...], "total": n } and rows are camelCase:

{
"entityId": "XVA-24388918",
"entityType": "incident",
"actionType": "incident_status_changed",
"moduleName": "CompromisedComputers",
"currentState": { "status": "acknowledged" },
"actionedAt": "1785235193051",
"sortableId": "18042117",
"operationId": "019fa850-09bb-7114-9ed4-bb8c88999475",
"integration_metadata": { "operation_id": "...", "mapping_mode": "CONFIG_INTEGRATION_USER" }
}

Notes that save a debugging session​

  • Timestamp units differ between response and filter. actionedAt is epoch milliseconds as a string; the actioned_after filter takes epoch seconds as a number. Divide by 1000 before feeding a row's timestamp back in.
  • Look up incidents by Display ID. The entity_identifier parameter takes XVA-... for incidents (legacy UUIDs are deprecated) and the base64 event_record_identifier for events.
  • Skip your own echoes. Rows produced by your integration's writes carry integration_metadata and the operationId of the write. When you see your own operation IDs, do not mirror the change back to your system, or you will build a loop. See Two-way ticketing sync.
  • Normalize status labels. currentState.status uses internal labels (acknowledged, in-progress) rather than the write enum. Normalize before comparing against the statuses you write.
  • Retention is 30 days. A consumer that falls more than 30 days behind must resync from snapshots.

Next​

Pair this with Two-way ticketing sync to turn detected changes into ticket updates, and use Reconciliation as your fallback when a consumer drifts past the retention window.