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.
Request
Responses
- 200
- 400
- 401
- 403
- 404
- 409
- 500
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 CorePractitioner crosswalk is still expired in that case, this is not an error. Since CP-37330 tenantPractitionerExpired means "the practitioner-level expiry step ran", not that the TenantPractitioner row was stamped: the termination is recorded on the CorePractitioner tenant: slice. On FULL_EXIT corePractitionerTerminationDateSet is therefore always true and the skip-reason key never appears — an unresolvable NPI now fails the request instead. Both keys remain reachable on INFERRED_LOCATION, which keeps the soft-skip.
Bad request - Invalid input, date conflict, or location not found, including a terminationType=FULL_EXIT or terminationType=INFERRED_LOCATION request missing the mandatory certifyPractitionerId (both types identify the practitioner that way; tenantPractitionerId is ignored for them). For FULL_EXIT also returned when terminationDate or terminationInformedDate is not a valid YYYY-MM-DD date (an out-of-range month or day is rejected, never coerced), or when the practitioner's operational value carries no NPI so the termination could not be recorded on any crosswalk. A transient failure of that NPI lookup is reported as a server error rather than a 400.
Unauthorized - Authentication required
Forbidden - Insufficient permissions
Association not found
Conflict - Termination blocked by active credentialing or monitoring workflows
Internal server error