---
title: "Get Shift Blocks"
method: GET
path: "/scheduling/shift-blocks"
tags: ["scheduling"]
---

# Get Shift Blocks

`GET /scheduling/shift-blocks`

## 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/shift-blocks`
- Auth: HTTP bearer

## Query parameters

- `start` string, date, required
- `end` string, date, required

## Response `200`

Successful Response

- GetShiftBlocksResponse
  - `blocks` ShiftBlockModel[], required: Every shift overlapping the requested range, ordered by start. Overlapping shifts are normal - a 15-minute handoff is two of them.
    - `id` string, uuid, required: The shift ID. Stable across move and resize.
    - `group_id` string, uuid, required: The coverage group being scheduled.
    - `shift_date` string, date, required: Center-local calendar date the shift STARTS on.
    - `start_minute` integer, required: Minutes after local midnight of shift_date (0-1439, multiple of 15).
    - `end_minute` integer, required: Minutes after local midnight of shift_date. Exceeds 1440 for an overnight shift (1560 = 02:00 the next day); at most start_minute + 1440.
    - `start_time` string, required: start_minute as center-local HH:MM.
    - `end_time` string, required: end_minute as center-local HH:MM.
    - `end_day_offset` integer, required: 0 when the shift ends on shift_date, 1 when it runs past midnight.
    - `notes` string, nullable: Free-form notes about the shift.
    - `color` string, nullable: Optional per-shift display color (hex). Null = inherit the coverage group's color.
    - `seats` ShiftSeatModel[], required: Seated operators in seat order - index 0 is the PRIMARY. May be EMPTY: an unassigned block is a real product state (it reads as a coverage gap), not an error.
      - `id` string, uuid, required: The seat's own ID. Stable across reseats the operator survives - the calendar-invite work keys an iCalendar UID on it.
      - `operator_id` string, uuid, required: The seated operator.
      - `seat_order` integer, required: Position in the seat list, contiguous from 0. Seat 0 is the shift's PRIMARY, who bears a miss during the shift.
  - `operator_names` object, required: operator_id -> display name for every operator seated in blocks.

## Other responses

- `422`: Validation Error

---

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