Content-Type: application/json(ormultipart/form-datafor operating procedure uploads)- Property names are camelCase; enum values are PascalCase (
Sentinel,High,TwentyFourHours) - Workspace IDs and most other identifiers are GUIDs
- Source segment values:
Sentinel,DefenderXDR,CrowdStrike,QRadar,Splunk,SentinelOne,SumoLogic. The segment is case-insensitive, so the lowercasedsourcefrom a webhook event can be used as is. Any other value returns400 VALIDATION_ERRORwith the accepted values listed undererrors.source.
Workspace-Scoped Endpoints
Path prefix:/workspaces/{workspaceId}/...
The workspace ID is a GUID and identifies the customer environment the request operates against. The credential’s service account must have a role on the target workspace, otherwise the request returns 403 INSUFFICIENT_WORKSPACE_ROLE.
- incidents:read
- incidents:write
- incidents:comments
- gamebooks:read
- gamebooks:execute
- datasources:read
- tickets:read / tickets:manage
- investigation:read
Every incident is the child of one SIEM source — the source is encoded as a route segment, not a query parameter.
Separate endpoints for the incident summary, entities, alert rules, bulk updates and the high-severity list are not on the v2 surface yet. They will be added once their handlers operate against an explicit source rather than implicitly defaulting to Sentinel. An incident’s entities are already returned in
investigationDetails.entities by GET /workspaces/{workspaceId}/incidents/{source}/{incidentId}.Cross-Workspace Endpoints
These endpoints span every workspace your service account can see — no workspace ID in the path. The handlers filter results to the workspaces the credential has been mapped to.Paginating /incidents/across-workspaces
The cross-workspace incidents list uses opaque continuation tokens. The first request leaves the token map empty; every subsequent request echoes the previous response’s tokens back unchanged. Tokens are server-encrypted strings — treat them as a single blob the API gave you, never parse or construct one yourself.
First request:
isFirstCall: false and pass sourcePageTokens back verbatim as workspacePageTokens:
moreIncidentsAvailable: false. A workspace that has finished paging drops out of sourcePageTokens on subsequent responses; do not synthesize entries for it. Page size is server-controlled.
A token that has been modified or hand-built returns 400 VALIDATION_ERROR with the message One or more pagination tokens are invalid. Use the tokens from the previous response unmodified. Recover by restarting from the first call with an empty workspacePageTokens array.
Syncing incident updates with filterByLastModified
By default timeFilterSelection bounds the incident’s creation time, so a list call cannot tell you which existing incidents changed. If you mirror incidents into an external system and need to pick up updates, set filterByLastModified: true. The same window then bounds the incident’s last-modified time as recorded by the vendor (Microsoft Sentinel lastModifiedTimeUtc, Microsoft Defender XDR lastUpdateDateTime), and the page is ordered by last-modified time descending.
Sentinel and Defender XDR move that timestamp on every change recorded on the incident: an alert grouped in, a severity change, a status change, an owner change, a label, or a comment. Incidents created long before the window are returned as soon as they are touched. Note that the two modes are not equivalent for a bounded window: an incident created inside the window but modified after its end matches the creation-time query and not the last-modified one. In a polling loop whose windows end at the time of each call, that incident simply shows up in the next poll.
Polling pattern:
customStartUtc to your previous customEndUtc minus a short overlap (one or two minutes), page until moreIncidentsAvailable is false, then fetch by id only the incidents whose lastModificationTime differs from the copy you stored. An unchanged incident returned twice because of the overlap compares equal and costs nothing.
Things to know:
- The filter uses the vendor’s last-modified time, not
lastActivityTime.lastActivityTimeis the event time of the latest alert and is usually earlier than the incident’s creation time; it does not move when an analyst edits the incident. - The response carries the incident as it is now, not the fields that changed. Keep comparing against your stored copy.
- Supported for
SentinelandDefenderXDR. Leavesourcesempty to query both; naming any other source together withfilterByLastModifiedreturns400 VALIDATION_ERROR(FilterByLastModified is supported for Sentinel, DefenderXDR only; …). - Changes that exist only inside ContraForce and are not written to the vendor incident do not move the vendor timestamp.
- In this mode each workspace’s window is returned in full in one call unless it exceeds the server’s page cap (several hundred incidents per workspace). If
moreIncidentsAvailablecomes backtrue, narrow the window and call again rather than paging: vendor continuations are positional, and an incident edited past the window’s end between two calls can shift them. A short polling window never hits the cap. - Each page is ordered by last-modified time descending. Sources are merged per page, so if you do page, read every page before assuming you have the full window.
Organization-Scoped Endpoints
These endpoints operate on the organization (service provider). The credential’s service account must hold the relevant org-level scope; workspace mappings are not required.- webhooks:read / webhooks:manage
- org:service-accounts:read / manage
- org:users:read / manage / roles
- org:azure:read / manage
Read (
webhooks:read):Manage (
webhooks:manage):What Comes Back
Every successful response is wrapped in the standard envelope:pagination block; see the object models page for shapes per endpoint family.
Error responses are RFC 7807 ProblemDetails (application/problem+json) with a stable code extension you can switch on — the error reference lists every code.