Cases API
The Cases endpoint of the Investigation Service exposes CRUD operations on cases. Cases are containers for evidences and examinations and are the entry point for organising forensic investigations.
For the conceptual background see Cases and Evidence.
- You have generated client code from the OpenAPI specification.
- You have read the API integration overview and obtained an OAuth2 access token.
Operations
| Operation | Verb / path |
|---|---|
| Case creation | PUT cases/{caseId}/create |
| Case retrieval | GET cases/{caseId} |
| Case update | PUT cases/{caseId}/update |
| Case soft-delete | POST cases/{caseId}/delete |
| Personal case retrieval | GET cases/personal/{userId} |
Client instance
Communication with the Investigation Service is wrapped in a generated CasesApi client. A small helper builds the client with the right base path and headers.
- C#
- Java
using Innovatrics.Abis.Rest.Api;
static CasesApi GetCasesApiInstance(string accessToken)
{
return new CasesApi(BuildAbisConfiguration(accessToken));
}
import com.innovatrics.abis.rest.api.CasesApi;
private static CasesApi getCasesApiInstance(String accessToken) {
return new CasesApi(buildAbisClient(accessToken));
}
Creation
Cases can be created using the createCase operation. Cases can be of two types: shared (accessible to multiple users) or personal (private to a single user).
- C#
- Java
var ca = GetCasesApiInstance(accessToken);
var createCaseRequest = new CreateCaseRequest
{
Name = "Investigation Case 2026-001",
Type = CaseType.Shared,
Category = "UNASSIGNED",
Description = "Vehicle theft investigation",
Location = "Downtown District",
CrimeType = "Theft",
AssignedToId = 1
};
var caseId = Guid.NewGuid().ToString();
var caseResponse = ca.CreateCase(caseId, createCaseRequest);
Console.WriteLine($"Case created with ID: {caseResponse.Id}");
CasesApi ca = getCasesApiInstance(accessToken);
CreateCaseRequest createCaseRequest = new CreateCaseRequest()
.name("Investigation Case 2026-001")
.type(CaseType.SHARED)
.category("UNASSIGNED")
.description("Vehicle theft investigation")
.location("Downtown District")
.crimeType("Theft")
.assignedToId(1L);
String caseId = UUID.randomUUID().toString();
CaseResponse caseResponse = ca.createCase(caseId, createCaseRequest);
System.out.println("Case created with ID: " + caseResponse.getId());
Retrieval
Cases can be retrieved by ID. The response includes everything needed to render the case – metadata plus the list of related evidences. Evidence binary data is referenced by URL.
- C#
- Java
var ca = GetCasesApiInstance(accessToken);
var caseResponse = ca.GetCase("existing-case-id");
Console.WriteLine($"Case Name: {caseResponse.Name}");
Console.WriteLine($"Case Type: {caseResponse.Type}");
Console.WriteLine($"Description: {caseResponse.Description}");
CasesApi ca = getCasesApiInstance(accessToken);
CaseResponse caseResponse = ca.getCase("existing-case-id");
System.out.println("Case Name: " + caseResponse.getName());
System.out.println("Case Type: " + caseResponse.getType());
System.out.println("Description: " + caseResponse.getDescription());
Update
The updateCase operation modifies the parameters of an existing case. The response contains the updated case representation, including the list of evidences.
- C#
- Java
var ca = GetCasesApiInstance(accessToken);
var updateCaseRequest = new UpdateCaseRequest
{
Name = "Updated Investigation Case 2026-001",
Description = "Vehicle theft investigation - Updated with new evidence",
Location = "Extended to include surrounding areas",
AssignedToId = 2
};
var updatedCase = ca.UpdateCase("existing-case-id", updateCaseRequest);
Console.WriteLine($"Case updated: {updatedCase.Name}");
CasesApi ca = getCasesApiInstance(accessToken);
UpdateCaseRequest updateCaseRequest = new UpdateCaseRequest()
.name("Updated Investigation Case 2026-001")
.description("Vehicle theft investigation - Updated with new evidence")
.location("Extended to include surrounding areas")
.assignedToId(2L);
CaseResponse updatedCase = ca.updateCase("existing-case-id", updateCaseRequest);
System.out.println("Case updated: " + updatedCase.getName());
Deletion
Cases are soft-deleted; the record stays in ABIS but is marked as deleted. Soft-deletion also marks every evidence inside the case as deleted.
- C#
- Java
var ca = GetCasesApiInstance(accessToken);
var deletedCase = ca.DeleteCase("case-to-delete");
Console.WriteLine($"Case deleted: {deletedCase.Id}");
Console.WriteLine($"Deleted at: {deletedCase.DeletedAt}");
CasesApi ca = getCasesApiInstance(accessToken);
CaseResponse deletedCase = ca.deleteCase("case-to-delete");
System.out.println("Case deleted: " + deletedCase.getId());
System.out.println("Deleted at: " + deletedCase.getDeletedAt());
Personal case retrieval
Each user has exactly one personal case. The getPersonalCase operation retrieves it by user ID.
- C#
- Java
var ca = GetCasesApiInstance(accessToken);
var personalCase = ca.GetPersonalCase(123);
Console.WriteLine($"Personal Case ID: {personalCase.Id}");
Console.WriteLine($"Assigned to User: {personalCase.AssignedToId}");
CasesApi ca = getCasesApiInstance(accessToken);
CaseResponse personalCase = ca.getPersonalCase(123);
System.out.println("Personal Case ID: " + personalCase.getId());
System.out.println("Assigned to User: " + personalCase.getAssignedToId());
Migration
Whole-case import / export uses the Migration API of the Investigation Service. Cases are exchanged in standard ANSI/NIST-ITL containers, including every evidence, snapshot and visual annotation. The migration endpoints are documented in the ABIS Integration documentation under Investigation Endpoints – Migration API.