Scheduling
Public API

Decline a Shift Claim

Changed on

A manager declines a pending claim. The claim stays listed as declined with the resolution reason manager_denied, and that employee cannot claim the shift again. Declining runs no evaluation and needs no open spot, so it works on a shift that is full, started, or no longer published. A claim the caller cannot see answers 404 exactly as a claim that does not exist, and a caller who can see it but may not edit the shift gets 403. Declining fails with open_shifts_disabled while Open Shifts is off.

OAuth Scopes: scheduling:shifts.write

post/api/v1/scheduling/shift-claims/{claimId}/decline

Request

Path parameters

claimIdstring uuid required

The ID of the claim to decline.

Response

The claim was declined.

idstring uuid required

The unique ID of this claim.

shiftIdstring uuid required

The ID of the shift being claimed.

employeeIdinteger required

The ID of the employee who claimed the shift.

status'pending' | 'approved' | 'declined' | 'withdrawn' required

Where the claim stands. Only a pending claim can be withdrawn. A first-come-first-served claim is never pending because it is approved when it is created.

resolutionReason'manager_denied' | 'shift_filled' | 'shift_deleted' | 'claiming_disabled' | 'assignment_blocked' nullable required

Why the claim was declined. Kept separate from status so that being denied and the shift filling are distinguishable.

createdAtstring date-time required

UTC timestamp when the claim was received. This is the single source of truth for queue order.

updatedAtstring date-time nullable required

UTC timestamp when the claim was last updated.

Example response

{
  "id": "019aa0a1-1c44-7b2e-9f10-2ad0eb6038aa",
  "shiftId": "019aa09f-0712-74cb-9186-8ad0eb6038dc",
  "employeeId": 49283,
  "status": "pending",
  "createdAt": "2026-08-25T16:04:12Z",
  "updatedAt": "2026-08-25T16:04:12Z"
}

Changes