---
title: "List"
method: GET
path: "/group-types"
tags: ["group-types"]
---

# List

`GET /group-types`

## Request

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

Search the caller's visible group-type catalog: global types (tenant_id NULL, the admin-managed cross-tenant set) plus ONE tenant's types, in one list — the caller's own by default (platform admins included); a platform admin may pass tenant_id for another tenant or all_tenants=true for every tenant's types. Global types are included in every scope. q matches name or description. total counts the rows matching q; an unknown sort falls back to the default order.

## Query parameters

- `q` string
- `sort` 'name' | 'slug' | 'created' | 'updated'
- `sort_dir` 'asc' | 'desc'
- `limit` integer
- `offset` integer
- `tenant_id` string, uuid
- `all_tenants` boolean

## Response `200`

OK

- InternalDeliveryHttpHandlerGroupTypePageResponse
  - `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
  - `limit` integer
  - `offset` integer
  - `success` boolean
  - `total` integer

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: forbidden: tenant_id/all_tenants beyond your own tenant without the cross_tenant grant

---

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