Skip to content

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
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

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.

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.1
Authorization: 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": "[email protected]",
"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 /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)

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.1
Authorization: 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 Created
Location: /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 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)

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.1
Authorization: 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)

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.1
Authorization: Bearer {token}
Content-Type: application/json
HTTP/1.1 204 No Content

Notes: 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.