---
title: "Update group type"
method: PATCH
path: "/group-types/{id}"
tags: ["group-types"]
---

# Update group type

`PATCH /group-types/{id}`

## Request

- Base URL: `https://api.instruxi.dev/api/v1/enforcer`
- URL: `https://api.instruxi.dev/api/v1/enforcer/group-types/{id}`
- Auth: one of:
  - API key in header `Authorization`
  - API key in header `X-API-Key`

Patches a group type's name, description or metadata. 403 group_type_reserved on a RESERVED type (reserved_for set): those change by migration only.

## Path parameters

- `id` string, required

## Request body

- EnforcerV3InternalUsecaseGrouptypesUpdateInput
  - `description` string
  - `email_notifications` boolean: EmailNotifications: tri-state like the rest of the patch — absent keeps the current value.
  - `metadata` object
  - `name` string

## Response `200`

OK

- InternalDeliveryHttpHandlerGroupTypeResponse
  - `data` EnforcerV3InternalDomainGrouptypeGroupType
    - `created_at` string
    - `created_by` string
    - `description` string
    - `email_notifications` boolean: EmailNotifications: adding a member to a group of this type sends the groups.member_added / member_joined emails (docs/EMAILS.md, migration 000115). Default false; an untyped group never mails. A type-level switch on purpose: the kind of group decides whether joining it is worth an email, and tenants already own their own types.
    - `group_count` integer: GroupCount is how many live groups use this type — computed on list reads (read-only column), never stored. The console used to pull 500 groups to count per type client-side; wrong past 500, wasteful before.
    - `id` string
    - `metadata` object: Metadata carries client presentation hints (icon, color, ordering …); the server never interprets it.
    - `name` string
    - `reserved_for` string: ReservedFor is the SERVICE LABEL (ENFORCER_SERVICE_KEYS) that alone may create groups of this type and change their membership over GroupService (migration 000106). Nil = an ordinary type. Read-only here: only a migration sets it, so no HTTP write can reserve or release a type.
    - `slug` string
    - `tenant_id` string: nil = global
    - `updated_at` string
  - `success` boolean

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden

---

[API](https://skmtc.dev/instruxi/apis/enforcer-api.md) · [All operations](https://skmtc.dev/instruxi/apis/enforcer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/instruxi/apis/enforcer-api/revisions/fa82bc1becc0?raw)
