---
title: "Terminate a practitioner with cascade"
method: PUT
path: "/practitioners/terminate"
tags: ["Practitioner"]
---

# Terminate a practitioner with cascade

`PUT /practitioners/terminate`

Terminates a practitioner and applies the appropriate termination cascade based on the supplied `terminationType`; different termination types update different sets of records and follow different cascade rules. Use this when a practitioner's engagement is ending in full or in part — for terminating a single role at a specific location-network assignment, use `PUT /practitioners/practitioner-role-assignments/{id}/terminate`, and for ending a specialty only, use `PUT /practitioners/tenant-practitioner-specialties/terminate`. The request body must include `terminationType`; an active credentialing or monitoring workflow blocks termination with a 409 response until the workflow is resolved (except `FULL_EXIT`, which bypasses this guard). The 9 supported `terminationType` values are: `GROUP` (requires `tenantPractitionerId`, `tenantGroupId`, `terminationDate`; terminates the group membership plus all network, location, and location-network associations under it, optionally narrowed to one network via `networkId`), `NETWORK` (requires `networkId`; terminates the network participation and cascades to all location-network associations under that network), `GROUP_LOCATIONS` (requires `tenantGroupLocationId`; terminates that location association, and additionally cascades to end network enrollment at that location only when both the `practitioner.termination.group-locations.cascade-network.enabled` config flag is on and the request sends `acknowledgedLocationNetworkTermination=true` — omitting it keeps the legacy GPL-only termination, not an error), `LOCATION_NETWORK` (requires `tenantGroupLocationPractitionerNetworkId`, or the `tenantGroupLocationId`/`networkId` pair; terminates that location-network record and cascades only to its location-network specialties), `NETWORK_SPECIALTY` and `GROUP_SPECIALTY` (identical cascade logic; each independently terminates the network-participation specialty when `tenantGroupPractitionerNetworkId`/`tenantGroupPractitionerSpecialtyId` are supplied and/or the location-network specialty when `tenantGroupLocationPractitionerNetworkId`/`tenantGroupPractitionerLocationSpecialtyId` are supplied, skipping whichever pair is absent rather than erroring), `GROUP_LOCATION_SPECIALTY` (independently terminates the group-location specialty when `tenantGroupPractitionerLocationId`/`tenantPractitionerSpecialtyId` are supplied and/or the location-network specialty when the same network-specialty ID pair above is supplied), `INFERRED_LOCATION` (requires `tenantGroupLocationId` but NOT `tenantGroupId` — terminates all group and network relationships at that location across every group the practitioner belongs to there; multiple matches are expected and all are terminated, not an error), and `FULL_EXIT` (**`certifyPractitionerId` is MANDATORY** — this is the only termination type that does not use `tenantPractitionerId`; a request with `terminationType=FULL_EXIT` and no `certifyPractitionerId` returns 400. `tenantGroupId` and every other scope field must also be omitted — wipes every group, network, and location relationship the practitioner has). `INFERRED_LOCATION` and `FULL_EXIT` may return 400 if not yet available for the calling tenant, when `tenantGroupLocationId` is missing for `INFERRED_LOCATION`, or when `certifyPractitionerId` is missing for `FULL_EXIT`. `INFERRED_LOCATION` additionally returns 400 when the practitioner has no active relationships matching the request at that location at all — unlike the 404 the 7 legacy types return when their scoped association isn't found. `FULL_EXIT` has no equivalent "nothing found" error: a practitioner with zero group/network relationships still succeeds with 200 — there's nothing to cascade-terminate at the group level, but the practitioner and CorePractitioner crosswalk are still expired and any active credentialing/monitoring work is still cancelled.

## Headers

- `tenant-id` string

## Request body

- TerminationRequest
  - `networkId` string — Optional network ID scope for termination
  - `tenantGroupLocationId` string — Optional tenant group location ID scope for termination. Required for INFERRED_LOCATION.
  - `tenantPractitionerId` string — Tenant practitioner ID. Required for all termination types except FULL_EXIT, which identifies the practitioner via certifyPractitionerId instead.
  - `certifyPractitionerId` string — Certify practitioner ID. MANDATORY when terminationType is FULL_EXIT (the only termination type that identifies the practitioner this way, in place of tenantPractitionerId); a request with terminationType=FULL_EXIT and no certifyPractitionerId fails with 400. Ignored for all other termination types.
  - `tenantGroupId` string — Tenant group ID. Required for all termination types except INFERRED_LOCATION and FULL_EXIT, which resolve the practitioner's group(s) without it.
  - `terminationType` string, required — Termination scope (NETWORK | GROUP | GROUP_LOCATIONS | LOCATION_NETWORK | NETWORK_SPECIALTY | GROUP_SPECIALTY | GROUP_LOCATION_SPECIALTY | INFERRED_LOCATION | FULL_EXIT)
  - `terminationDate` string, required — Termination effective date (YYYY-MM-DD)
  - `terminationReason` string — Termination reason
  - `terminationInformedDate` string — Date when termination was informed (YYYY-MM-DD)
  - `continuityOfCare` boolean — Whether Continuity of Care applies for this termination. Defaults to false when omitted.
  - `tenantSpecialtyId` string — Optional tenant specialty ID scope for termination
  - `tenantGroupPractitionerLocationId` string — Optional tenant group practitioner location ID scope for termination
  - `tenantGroupPractitionerNetworkId` string — Optional tenant group practitioner network ID scope for termination
  - `tenantGroupLocationPractitionerNetworkId` string — Optional tenant group location practitioner network ID scope for termination
  - `tenantGroupPractitionerLocationSpecialtyId` string — Optional tenant group practitioner location specialty ID scope for termination
  - `tenantGroupPractitionerSpecialtyId` string — Optional tenant group practitioner specialty ID scope for termination
  - `tenantPractitionerSpecialtyId` string — Optional practitioner specialty ID scope for termination
  - `acknowledgedLocationNetworkTermination` boolean — Optional opt-in for GROUP_LOCATIONS: when true (and the practitioner.termination.group-locations.cascade-network.enabled config flag is also on), terminating the practitioner from the selected group location also ends their network enrollment at that location (TenantGroupLocationPractitionerNetwork) — group membership (TenantGroupPractitioner) and group-wide network enrollment (TenantGroupPractitionerNetwork) are never affected either way. Omitting this field (or sending false) is not an error; it just keeps the legacy GPL-only termination, so existing callers that don't send it are unaffected.

## Response `200`

A result map reflecting the practitioner records updated by the termination cascade. For the 7 other termination types the response is unchanged: a flat two-key map, `message` and `tenantGroupPractitionerId`. For `FULL_EXIT`/`INFERRED_LOCATION` the response is additive and richer: `message`, `tenantGroupPractitionerIds` (plural), `tenantPractitionerExpired`, `workflowsCancelledCount`, and (when `tenantPractitionerExpired` is true) `corePractitionerTerminationDateSet` plus, if that is false, `corePractitionerTerminationDateSkippedReason`. `INFERRED_LOCATION` additionally includes `groupPractitionerLocationIds` and `cascadedGroupExpirations`. For `FULL_EXIT`, `tenantGroupPractitionerIds` is an empty array when the practitioner has no group/network relationships at all — the practitioner and CorePractitioner crosswalk are still expired in that case, this is not an error.

## Other responses

- `400` — Bad request - Invalid input, date conflict, or location not found, including a `terminationType=FULL_EXIT` request missing the mandatory `certifyPractitionerId`
- `401` — Unauthorized - Authentication required
- `403` — Forbidden - Insufficient permissions
- `404` — Association not found
- `409` — Conflict - Termination blocked by active credentialing or monitoring workflows
- `500` — Internal server error

---

[API](https://skmtc.net/certifyos/apis/certify-api-layer.md) · [All operations](https://skmtc.net/certifyos/apis/certify-api-layer/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/certifyos/certify-api-layer/revisions/563848e0ecc0/schema)
