List action items
const url = 'https://safe-api.safetyradar.com/v2/action-items?page=1&limit=20&status=open&updatedAfter=2026-09-01T00%3A00%3A00%2B00%3A00&updatedBefore=2026-09-30T00%3A00%3A00%2B00%3A00&fieldFilters=%5B%7B%22key%22%3A%22crew%22%2C%22op%22%3A%22eq%22%2C%22value%22%3A%22A-shift%22%7D%5D&fieldSort=%7B%22key%22%3A%22crew%22%2C%22direction%22%3A%22asc%22%7D';const options = { method: 'GET', headers: {'x-team': 'my-team-slug', Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://safe-api.safetyradar.com/v2/action-items?page=1&limit=20&status=open&updatedAfter=2026-09-01T00%3A00%3A00%2B00%3A00&updatedBefore=2026-09-30T00%3A00%3A00%2B00%3A00&fieldFilters=%5B%7B%22key%22%3A%22crew%22%2C%22op%22%3A%22eq%22%2C%22value%22%3A%22A-shift%22%7D%5D&fieldSort=%7B%22key%22%3A%22crew%22%2C%22direction%22%3A%22asc%22%7D' \ --header 'Authorization: Bearer <token>' \ --header 'x-team: my-team-slug'Get a paginated list of action items. Filter by status, assignedToUserId, entityType/entityId, externalId (the action item’s own correlation ID) or eventExternalId (scopes results to that event). A filter that matches nothing returns an empty page.
Poll for changes with updatedAfter / updatedBefore — strict ISO 8601 instants with a timezone offset, exclusive on both ends. When either is present the default sort changes from createdAt descending to updatedAt ascending, so the updatedAt of the last record on a page can be passed back as updatedAfter to fetch only what has changed since. Timestamps serialize to millisecond precision but are stored with microsecond precision, so the boundary record may be re-sent once; rows are never skipped. Treat the poll as at-least-once and de-duplicate on id.
Filter and sort on your organization’s custom fields with fieldFilters and fieldSort — JSON in the query string, ANDed with the filters above. A key your organization has not defined, or an operator its type does not accept, is a 400 rather than an ignored filter. Call GET /v2/modules/action_item/fields for the keys, types and the operators each one accepts.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”The action item’s own external ID
The action item’s own external ID
Event external ID; scopes results to that event
Event external ID; scopes results to that event
Only action items updated strictly after this instant (exclusive). ISO 8601 with a timezone offset. When either updatedAt bound is present, results sort by updatedAt ascending so the last-seen value works as a cursor.
Example
2026-09-01T00:00:00+00:00Only action items updated strictly after this instant (exclusive). ISO 8601 with a timezone offset. When either updatedAt bound is present, results sort by updatedAt ascending so the last-seen value works as a cursor.
Only action items updated strictly before this instant (exclusive). ISO 8601 with a timezone offset.
Example
2026-09-30T00:00:00+00:00Only action items updated strictly before this instant (exclusive). ISO 8601 with a timezone offset.
JSON array of custom-field filters, ANDed together. Each entry is {“key”,“op”,“value”}; isNull / isNotNull take no value and in takes an array. The operators a field accepts are returned as ops by GET /v2/modules/action_item/fields. Example: [{“key”:“crew”,“op”:“in”,“value”:[“A”,“B”]},{“key”:“corrective_cost”,“op”:“gte”,“value”:1000}]
Example
[{"key":"crew","op":"eq","value":"A-shift"}]JSON array of custom-field filters, ANDed together. Each entry is {“key”,“op”,“value”}; isNull / isNotNull take no value and in takes an array. The operators a field accepts are returned as ops by GET /v2/modules/action_item/fields. Example: [{“key”:“crew”,“op”:“in”,“value”:[“A”,“B”]},{“key”:“corrective_cost”,“op”:“gte”,“value”:1000}]
JSON custom-field sort: {“key”,“direction”} with direction “asc” or “desc” (default “asc”). Records holding no value for the key sort last on “asc” and first on “desc” (Postgres NULL ordering). Replaces the default createdAt sort.
Example
{"key":"crew","direction":"asc"}JSON custom-field sort: {“key”,“direction”} with direction “asc” or “desc” (default “asc”). Records holding no value for the key sort last on “asc” and first on “desc” (Postgres NULL ordering). Replaces the default createdAt sort.
Header Parameters
Section titled “Header Parameters”Deprecated — accepted but ignored; the v2 API is org-scoped.
Example
my-team-slugDeprecated — accepted but ignored; the v2 API is org-scoped.
Responses
Section titled “Responses”Paginated list of action items
object
object
object
The organization’s custom module fields, keyed by definition key. Always present; {} when the organization has configured none, and a defined key this item holds no value for is absent rather than null. Discover the keys, types and filter operators at GET /v2/modules/action_item/fields.
object
Verbatim, unvalidated. Use fields — typed, admin-defined, validated. See GET /v2/modules/action_item/fields.
object
object
object
Example
{ "data": [ { "priority": "low", "statusGroup": "new", "status": "open", "fields": { "crew": "A-shift", "corrective_cost": 1250 } } ]}Malformed fieldFilters / fieldSort, or a key or operator the organization’s definitions refuse
object
object
Examplegenerated
{ "code": "example", "message": "example", "details": { "additionalProperty": "example" }}Unauthorized
object
object
Examplegenerated
{ "code": "example", "message": "example", "details": { "additionalProperty": "example" }}Referenced event not found
object
object
Examplegenerated
{ "code": "example", "message": "example", "details": { "additionalProperty": "example" }}
