complianceCases
eDiscovery Cases. Case containers grouping holds, searches, and members. The complianceCases entity set lives under /exchange/v1.0/complianceCases in the eDiscovery & audit category.
| Fact | Value |
|---|---|
| Path | /exchange/v1.0/complianceCases |
| Category | eDiscovery & audit |
| Tier | Tier 5, Compliance |
| Read role | Compliance.IPPS.Read.All (Community) |
| Write role | Compliance.IPPS.ReadWrite.All (Enterprise) |
| Backing cmdlets | Get-ComplianceCase, New-ComplianceCase, Set-ComplianceCase, Remove-ComplianceCase |
Routes
Section titled “Routes”| Method | Path | Synopsis | Role | Plan |
|---|---|---|---|---|
| GET | /exchange/v1.0/complianceCases |
List compliance cases - Purview eDiscovery / DSR / Insider Risk case containers. Use ?caseType= to scope. | Compliance.IPPS.Read |
Community |
| POST | /exchange/v1.0/complianceCases |
POST /complianceCases - create a new compliance case. Required: name. Optional: caseType, description, externalId, sourceCaseType, secondaryCaseType. Returns 201 + Location. | Compliance.IPPS.ReadWrite |
Enterprise |
| GET | /exchange/v1.0/complianceCases/{key} |
Get a single compliance case by Identity. Requires per-case membership in Purview (see class remarks). Returns 404 if absent. | Compliance.IPPS.Read |
Community |
| PATCH | /exchange/v1.0/complianceCases/{key} |
PATCH /complianceCases/{key} - partial update. Pass {“close”: true} to close, {“reopen”: true} to reopen. Returns 200 + post-Set case. | Compliance.IPPS.ReadWrite |
Enterprise |
| DELETE | /exchange/v1.0/complianceCases/{key} |
DELETE /complianceCases/{key} - remove a case. Returns 204. | Compliance.IPPS.ReadWrite |
Enterprise |
GET /exchange/v1.0/complianceCases
Section titled “GET /exchange/v1.0/complianceCases”List compliance cases - Purview eDiscovery / DSR / Insider Risk case containers. Use ?caseType= to scope.
Backing cmdlet: Get-ComplianceCase. Role: Compliance.IPPS.Read (Community).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
caseType |
query | string | Filter by case type (eDiscovery | DSR | InsiderRisk | AdvancedEdiscovery | …). | |
recentOnly |
query | bool (switch) | Limit to cases opened recently (no specific timeframe - server-defined). | |
roleGroup |
query | string | Filter by role group with case access. |
List all compliance cases
Section titled “List all compliance cases”Enumerate Purview compliance cases (eDiscovery, DSR, Insider Risk, Advanced eDiscovery) visible to the calling principal. Backed by Get-ComplianceCase on the IPPS pool. Optional ?caseType=eDiscovery filters by case kind. Per-case RBAC applies: even with Compliance.IPPS.Read.All, the SP must be a MEMBER of each case it lists individually via GET /complianceCases/{key} - membership is managed in the Purview portal.
GET /exchange/v1.0/complianceCases HTTP/1.1Authorization: Bearer {token}HTTP/1.1 200 OK
{ "@odata.context": "https://api.contoso.com/exchange/v1.0/$metadata#complianceCases", "value": [ { "Id": "case-litigation-houston", "Name": "Houston-Litigation-2026", "Identity": "case-litigation-houston", "Status": "Active", "CaseType": "eDiscovery", "Description": "Legal hold for Q1 2026 Houston litigation matter.", "CreatedBy": "legal-admin@contoso.com", "CreatedDateTime": "2026-01-15T09:30:00Z", "LastModifiedDateTime": "2026-03-12T14:18:00Z" }, { "Id": "case-dsr-2026-0042", "Name": "DSR-2026-0042", "Identity": "case-dsr-2026-0042", "Status": "Closed", "CaseType": "DSR", "ExternalId": "TICKET-99412", "CreatedDateTime": "2026-02-01T11:00:00Z", "ClosedDateTime": "2026-04-20T16:45:00Z" } ]}Related: GET /exchange/v1.0/complianceCases/{key}, POST /exchange/v1.0/complianceCases, POST /exchange/v1.0/caseHoldPolicies
POST /exchange/v1.0/complianceCases
Section titled “POST /exchange/v1.0/complianceCases”POST /complianceCases - create a new compliance case. Required: name. Optional: caseType, description, externalId, sourceCaseType, secondaryCaseType. Returns 201 + Location.
Re-fetch skipped by design. Block 2 live-verify 2026-05-28 confirmed that Get-ComplianceCase rejects the creator SP with ComplianceCaseMemberTaskException (“you’re not a member of this compliance case”) IMMEDIATELY after New-ComplianceCase succeeds - Compliance.IPPS.ReadWrite.All grants create rights but NOT auto-membership. Doing the standard re-fetch turns a successful create into a 500 + orphans the new case in the tenant. Instead we return 201 with a stub built from the request body; the caller must be added as a case member in the Purview portal before subsequent GET /complianceCases/{key} / PATCH / DELETE work.
Backing cmdlet: New-ComplianceCase. Role: Compliance.IPPS.ReadWrite (Enterprise).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
name |
body | yes | ||
caseType |
body | |||
description |
body | |||
externalId |
body | |||
secondaryCaseType |
body | |||
sourceCaseType |
body | |||
dryRun |
query | bool (switch) |
Create a Purview compliance case
Section titled “Create a Purview compliance case”Provision a new Purview compliance case via New-ComplianceCase on the IPPS pool. Required: name. Optional: caseType (eDiscovery | DSR | InsiderRisk | AdvancedEdiscovery - default eDiscovery), description, externalId (ticketing system id), sourceCaseType, secondaryCaseType. After create, the calling SP automatically becomes the case’s creator/owner - but PER-CASE eDiscovery membership in Purview is still required for any other principal to access the case. Block 2 ships this endpoint to unblock /caseHoldPolicies self-service (which needs a parent case GUID).
POST /exchange/v1.0/complianceCases HTTP/1.1Authorization: Bearer {token}Content-Type: application/json
{ "name": "Houston-Litigation-2026", "caseType": "eDiscovery", "description": "Legal hold for Q1 2026 Houston litigation matter.", "externalId": "JIRA-LEGAL-1042"}HTTP/1.1 201 CreatedLocation: /exchange/v1.0/complianceCases/Houston-Litigation-2026
{ "@odata.context": "https://api.contoso.com/exchange/v1.0/$metadata#complianceCases/$entity", "Id": "case-litigation-houston", "Name": "Houston-Litigation-2026", "Identity": "case-litigation-houston", "Status": "Active", "CaseType": "eDiscovery", "Description": "Legal hold for Q1 2026 Houston litigation matter.", "ExternalId": "JIRA-LEGAL-1042", "CreatedBy": "00000003-0000-0ff1-ce00-000000000000", "CreatedDateTime": "2026-05-26T10:00:00Z", "LastModifiedDateTime": "2026-05-26T10:00:00Z"}Related: GET /exchange/v1.0/complianceCases, PATCH /exchange/v1.0/complianceCases/{key}, DELETE /exchange/v1.0/complianceCases/{key}, POST /exchange/v1.0/caseHoldPolicies
GET /exchange/v1.0/complianceCases/{key}
Section titled “GET /exchange/v1.0/complianceCases/{key}”Get a single compliance case by Identity. Requires per-case membership in Purview (see class remarks). Returns 404 if absent.
Backing cmdlet: Get-ComplianceCase. Role: Compliance.IPPS.Read (Community).
PATCH /exchange/v1.0/complianceCases/{key}
Section titled “PATCH /exchange/v1.0/complianceCases/{key}”PATCH /complianceCases/{key} - partial update. Pass {“close”: true} to close, {“reopen”: true} to reopen. Returns 200 + post-Set case.
Backing cmdlet: Set-ComplianceCase. Role: Compliance.IPPS.ReadWrite (Enterprise).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
caseType |
body | |||
close |
body | boolean (switch) | ||
description |
body | |||
externalId |
body | |||
name |
body | |||
reopen |
body | boolean (switch) | ||
dryRun |
query | bool (switch) |
Close (or reopen) a compliance case
Section titled “Close (or reopen) a compliance case”State-flip the case via Set-ComplianceCase on the IPPS pool. Pass {“close”: true} to close, {“reopen”: true} to reopen. These are SwitchParameters in the cmdlet - the controller forwards them only when the JSON value is exactly true. The two switches are mutually exclusive; sending both yields a cmdlet-side parameter conflict (500 with cmdlet error envelope). Block 2 omits -Confirm because the cmdlet rejects it (IPPS family-wide convention).
PATCH /exchange/v1.0/complianceCases/{key} HTTP/1.1Authorization: Bearer {token}Content-Type: application/json
{ "close": true}HTTP/1.1 200 OK
{ "@odata.context": "https://api.contoso.com/exchange/v1.0/$metadata#complianceCases/$entity", "Id": "case-litigation-houston", "Name": "Houston-Litigation-2026", "Identity": "case-litigation-houston", "Status": "Closed", "CaseType": "eDiscovery", "ClosedDateTime": "2026-05-26T10:05:12Z"}Related: GET /exchange/v1.0/complianceCases/{key}, DELETE /exchange/v1.0/complianceCases/{key}
DELETE /exchange/v1.0/complianceCases/{key}
Section titled “DELETE /exchange/v1.0/complianceCases/{key}”DELETE /complianceCases/{key} - remove a case. Returns 204.
Backing cmdlet: Remove-ComplianceCase. Role: Compliance.IPPS.ReadWrite (Enterprise).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
dryRun |
query | bool (switch) |
Delete a compliance case
Section titled “Delete a compliance case”Removes a Purview compliance case by Identity. Backed by Remove-ComplianceCase (IPPS pool). The calling service principal must be a member of the case in the Purview portal even with Compliance.IPPS.ReadWrite.All.
DELETE /exchange/v1.0/complianceCases/{key} HTTP/1.1Authorization: Bearer {token}Content-Type: application/jsonHTTP/1.1 204 No ContentNotes: Doc-derived from Wiki + write-param allowlist; not live-captured. Body fields are Wiki-valid; values are illustrative.
Related: GET /exchange/v1.0/complianceCases
?dryRun=true previews of any write stay on Community.

