---
title: "Batch add and update group specialties"
method: PATCH
path: "/groups/{id}/specialties"
tags: ["Group"]
---

# Batch add and update group specialties

`PATCH /groups/{id}/specialties`

Adds new specialty associations and/or updates existing specialty associations for a group in a single request. New entries create group–specialty records; update entries modify existing associations (effective/termination dates, specialty linkage). Use this endpoint for bulk specialty management — for single-specialty additions use POST /groups/{id}/specialties, and for date-only updates to a single specialty use PUT /groups/{id}/specialties. Permission note: if any update entry includes a non-blank newTenantSpecialtyId (reassigning the specialty), the caller must also hold the group:correct:specialty permission — such a request without that permission returns 403. Pure additions or date/isPrimary-only updates only require the standard group:update permission.

## Path parameters

- `id` string, required

## Headers

- `tenant-id` string

## Request body

- ManageGroupSpecialtiesRequest
  - `updates` UpdateSpecialtyItem1[] — Existing specialties to update
    - `tenantGroupSpecialtyId` string, required — ID of the existing TenantGroupSpecialty record to update
    - `newTenantSpecialtyId` string — ID of the new TenantSpecialty to replace the current one
    - `effectiveDate` string — New effective date in YYYY-MM-DD format
    - `isPrimary` boolean — Whether this specialty is primary
    - `atLeastOneFieldProvided` boolean
  - `additions` AddSpecialtyItem1[] — New specialties to add
    - `tenantSpecialtyId` string, required — ID of the tenant specialty to associate
    - `effectiveDate` string — Effective date in YYYY-MM-DD format
    - `isPrimary` boolean — Whether this specialty is primary
  - `changeReason` string — Optional reason for change, applied to all operations

## Response `200`

Group specialties successfully managed

- ManageGroupSpecialtiesResponse
  - `updatedSpecialties` object[] — Results from updated specialty records
  - `addedSpecialties` object[] — Results from newly added specialty associations
  - `errors` SpecialtyNotCreated[] — Operations that failed, empty when all succeeded
    - `level` 'GROUP' | 'LOCATION' | 'NETWORK_GROUP' | 'NETWORK_LOCATION', required
    - `reason` 'MISSING_DEPENDENCY' | 'DOWNSTREAM_ERROR' | 'CONFLICT' | 'VALIDATION_ERROR', required
    - `message` string, required — User-facing message explaining what went wrong and how to fix it

## Other responses

- `400` — Invalid request body or missing required parameters
- `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)
