Create case¶
POST/
Cases API · Cases
Create a new case.
Parameters¶
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Tenant-ID | header | string (uuid) | Yes | Tenant ID. |
Request body¶
Content type: application/json
Request body fields
namestringrequiredCase name. Alphanumeric characters, spaces, and the following punctuation are allowed
Must match the pattern
., ,, :, (, ), !, +, _, | -, ?, \\, /, ', \", $, #.Must match the pattern
^[-\p{L}\p{Nl}\d ,!()\\/."':?#$+_|]+$. Must be at most 510 characters long.typestringrequiredCase type.
Must be one of:
Must be one of:
hunt, investigation, incident, healthCheck, duplicate, postureImprovement, customerRequest, activeThreat, exposure, managedRisk, generalRequest.managedBystringCase managed by.
Must be one of:
Must be one of:
self, sophos.severitystringCase severity.
Must be one of:
Must be one of:
notSet, critical, high, medium, low, informational.statusstringCase status.
Must be one of:
actionRequired applies only to Sophos-managed cases.Must be one of:
actionRequired, resolved, investigating, new, onHold.assigneestringThe email address of the case assignee. This field is required and can be set to
Unassigned if the case is unassigned.initialDetectionIdstringDetection ID.
Must match the pattern
Must match the pattern
^[a-f0-9_-]+$. Must be at most 150 characters long.otherDetectionIdsarray of stringAdditional detection IDs to associate with the case.
Must contain at most 100 items. Items must be unique. Each item must match the pattern
Must contain at most 100 items. Items must be unique. Each item must match the pattern
^[a-f0-9_-]+$. Each item must be at most 150 characters long.overviewstringCase overview.
Must be at most 20000 characters long.
Must be at most 20000 characters long.
Request samples¶
curl -X POST "https://api-<data-region>.central.sophos.com/cases/v1/cases" -H "Authorization: Bearer <access-token>" -H "X-Tenant-ID: <tenant-id>" -H "Content-Type: application/json" -d "{
\"name\": \"string\",
\"type\": \"hunt\",
\"managedBy\": \"self\",
\"severity\": \"notSet\",
\"status\": \"actionRequired\",
\"assignee\": \"string\",
\"initialDetectionId\": \"2e0cdd5ffec_3bad8fb8f\",
\"otherDetectionIds\": [
\"2e0cdd5ffec_3bad8fb8f\"
],
\"overview\": \"string\"
}"
import requests
response = requests.post(
"https://api-<data-region>.central.sophos.com/cases/v1/cases",
headers={
"Authorization": "Bearer <access-token>",
"X-Tenant-ID": "<tenant-id>",
"Content-Type": "application/json",
},
json={ 'name': 'string',
'type': 'hunt',
'managedBy': 'self',
'severity': 'notSet',
'status': 'actionRequired',
'assignee': 'string',
'initialDetectionId': '2e0cdd5ffec_3bad8fb8f',
'otherDetectionIds': ['2e0cdd5ffec_3bad8fb8f'],
'overview': 'string'},
)
print(response.json())
$headers = @{
"Authorization" = "Bearer <access-token>"
"X-Tenant-ID" = "<tenant-id>"
"Content-Type" = "application/json"
}
$body = '{
"name": "string",
"type": "hunt",
"managedBy": "self",
"severity": "notSet",
"status": "actionRequired",
"assignee": "string",
"initialDetectionId": "2e0cdd5ffec_3bad8fb8f",
"otherDetectionIds": [
"2e0cdd5ffec_3bad8fb8f"
],
"overview": "string"
}'
Invoke-RestMethod -Method POST -Uri "https://api-<data-region>.central.sophos.com/cases/v1/cases" -Headers $headers -Body $body -ContentType "application/json"
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
req, err := http.NewRequest("POST", "https://api-<data-region>.central.sophos.com/cases/v1/cases", strings.NewReader(`{
"name": "string",
"type": "hunt",
"managedBy": "self",
"severity": "notSet",
"status": "actionRequired",
"assignee": "string",
"initialDetectionId": "2e0cdd5ffec_3bad8fb8f",
"otherDetectionIds": [
"2e0cdd5ffec_3bad8fb8f"
],
"overview": "string"
}`))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer <access-token>")
req.Header.Set("X-Tenant-ID", "<tenant-id>")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
const response = await fetch("https://api-<data-region>.central.sophos.com/cases/v1/cases", {
method: "POST",
headers: {
"Authorization": "Bearer <access-token>",
"X-Tenant-ID": "<tenant-id>",
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "string",
"type": "hunt",
"managedBy": "self",
"severity": "notSet",
"status": "actionRequired",
"assignee": "string",
"initialDetectionId": "2e0cdd5ffec_3bad8fb8f",
"otherDetectionIds": [
"2e0cdd5ffec_3bad8fb8f"
],
"overview": "string"
}),
});
const data = await response.json();
console.log(data);
Responses¶
201 — New case.¶
Response fields
idstringrequiredCase ID.
typestringrequiredCase type.
Must be one of:
Must be one of:
hunt, investigation, incident, healthCheck, duplicate, postureImprovement, customerRequest, activeThreat, exposure, managedRisk, generalRequest.namestringrequiredCase name.
Must be at most 510 characters long.
Must be at most 510 characters long.
tenantobjectrequiredTenant reference.
Show child attributesHide child attributes
idstring (uuid)Tenant ID.
managedBystringCase managed by.
Must be one of:
Must be one of:
self, sophos.createdAtstring (date-time)requiredCase created date-time.
createdByobjectPrincipal reference.
Show child attributesHide child attributes
idstringPrincipal ID. This is the client ID for service principals.
typestring (enum)Principal type.
Must be one of:
Must be one of:
user, service.namestringPrincipal name. This doesn't apply to service principals.
accountTypestringAccount type.
Must be one of:
Must be one of:
partner, tenant, organization.accountIdstring (uuid)Account ID.
resolvedAtstring (date-time)Case resolved date-time.
updatedAtstring (date-time)Case updated date-time.
severitystringCase severity.
Must be one of:
Must be one of:
notSet, critical, high, medium, low, informational.statusstringrequiredCase status.
Must be one of:
actionRequired applies only to Sophos-managed cases.Must be one of:
actionRequired, resolved, investigating, new, onHold.initialDetectionobjectInitial Detection in a Case.
Show child attributesHide child attributes
idstringDetection ID.
severityintegerSeverity of the detection. A higher score implies a more severe detection.
Must be ≥ 1 and ≤ 10.
Must be ≥ 1 and ≤ 10.
typestringType of the detection.
detectionRulestringDetection rule ID.
mitreAttacksarray of objectList of MITRE ATT&CK objects associated with this detection.
MITRE ATT&CK name and description.
Show child attributesHide child attributes
tacticobjectTactic used in the MITRE ATT&CK.
Show child attributesHide child attributes
idstringID of the tactic.
namestringMITRE ATT&CK name.
techniquesarray of objectMITRE ATT&CK techniques.
Technique used in the MITRE ATT&CK.
Show child attributesHide child attributes
idstringID of the technique.
namestringName of the technique.
timestring (timestamp)Detection event time.
sensorobjectThe sensor which generated the detection.
Show child attributesHide child attributes
idstringrequiredID of the sensor.
typestringrequiredSensor type where detection occurred.
Must be one of:
Must be one of:
cloud, endpoint, email, firewall, iam, network, compound, backupAndRecovery.sourcestringrequiredThe name of the sensor source.
versionstringrequiredThe version of the sensor provided by the vendor.
namestringThe name of the sensor.
assigneeobjectPrincipal reference.
Show child attributesHide child attributes
idstringPrincipal ID. This is the client ID for service principals.
typestring (enum)Principal type.
Must be one of:
Must be one of:
user, service.namestringPrincipal name. This doesn't apply to service principals.
accountTypestringAccount type.
Must be one of:
Must be one of:
partner, tenant, organization.accountIdstring (uuid)Account ID.
assignedAtstring (date-time)Assignee set date-time.
overviewstringCase overview.
Must be at most 20000 characters long.
Must be at most 20000 characters long.
detectionCountintegerCount of detections associated with the case.
verdictstringCase verdict.
Must be one of:
Must be one of:
falsePositive, truePositiveMalicious, truePositiveBenign, truePositive, inconclusive.escalatedbooleanCase escalated.
Errors¶
| Status | Meaning |
|---|---|
400 | Bad request. |
401 | Unauthorized. |
403 | Forbidden. |
500 | Unexpected error. |
All error responses share the same shape — see the error response object.
Response examples¶
201¶
{
"id": "string",
"type": "hunt",
"name": "string",
"tenant": {
"id": "00000000-0000-0000-0000-000000000000"
},
"managedBy": "self",
"createdAt": "2026-07-28T00:00:00Z",
"createdBy": {
"id": "string",
"type": "user",
"name": "string",
"accountType": "partner",
"accountId": "00000000-0000-0000-0000-000000000000"
},
"resolvedAt": "2026-07-28T00:00:00Z",
"updatedAt": "2026-07-28T00:00:00Z",
"severity": "notSet",
"status": "actionRequired",
"initialDetection": {
"id": "string",
"severity": 5,
"type": "Threat",
"detectionRule": "WIN-MITRE-Behavioral-TA0011-T1105",
"mitreAttacks": [
{
"tactic": {
"id": "TA0002",
"name": "Execution",
"techniques": [
{
"id": "T1059",
"name": "Command and Scripting Interpreter"
}
]
}
}
],
"time": "string",
"sensor": {
"id": "SophosSensorID",
"type": "cloud",
"source": "Sophos",
"version": "1.18.1",
"name": "string"
}
},
"assignee": {
"id": "string",
"type": "user",
"name": "string",
"accountType": "partner",
"accountId": "00000000-0000-0000-0000-000000000000"
},
"assignedAt": "2026-07-28T00:00:00Z",
"overview": "string",
"detectionCount": 0,
"verdict": "falsePositive",
"escalated": true
}
See the guide for a narrative walkthrough of this API.