---
title: "Get On Shift Groups"
method: GET
path: "/scheduling/on-shift/groups"
tags: ["scheduling"]
---

# Get On Shift Groups

`GET /scheduling/on-shift/groups`

## Request

- Base URL: `https://api.verdun.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.verdun.ai/scheduling/on-shift/groups`
- Auth: HTTP bearer

Who is on shift now in every coverage group the caller may see.

The queue page's "On shift" chip. Same rules as `/on-shift` per group; an
unconfined caller sees every group plus the floor-wide `also_clocked_in`,
a confined caller sees only groups its tenant scope allows and an empty
`also_clocked_in`.

## Response `200`

Successful Response

- GetOnShiftGroupsResponse
  - `as_of` string, date-time, required: The instant the roster was resolved for.
  - `groups` OnShiftGroupModel[], required: The coverage groups the caller may see, sorted by name. An unconfined caller sees every group; a confined caller sees only groups holding a grant its tenant scope allows.
    - `group_id` string, uuid, required: The coverage group ID.
    - `group_name` string, required: Display name.
    - `color` string, required: The group's display colour (hex).
    - `scheduled` OnShiftOperatorModel[], required: Everyone seated on a shift of this group running now: most recently started shift first, stored seat order inside it. The primary is the first seat met, so a running shift without seats is skipped. Empty when nobody is scheduled.
      - `operator_id` string, uuid, required: The operator ID.
      - `name` string, required: Display name.
      - `primary` boolean, required: Seat 0 of the most-recently-started shift running now on this site's coverage group - the operator who bears a miss.
      - `clocked_in` boolean, required: Has an open time-clock punch right now.
      - `clocked_in_at` string, date-time, nullable: When the open punch started (null when not clocked in).
  - `also_clocked_in` OnShiftOperatorModel[], required: Operators clocked in now and seated on no running shift of ANY coverage group (punches older than 24h are treated as forgotten and left out). Floor-wide, so it is returned only to unconfined callers; a confined caller always gets an empty list.
    - `operator_id` string, uuid, required: The operator ID.
    - `name` string, required: Display name.
    - `primary` boolean, required: Seat 0 of the most-recently-started shift running now on this site's coverage group - the operator who bears a miss.
    - `clocked_in` boolean, required: Has an open time-clock punch right now.
    - `clocked_in_at` string, date-time, nullable: When the open punch started (null when not clocked in).

---

[API](https://skmtc.dev/verdun/apis/verdun-api.md) - [All operations](https://skmtc.dev/verdun/apis/verdun-api/llms.txt) - [OpenAPI document](https://skmtc.dev/verdun/apis/verdun-api/revisions/35a2a6ebedda?raw)
