Scheduling
Public API

Withdraw a Shift Claim

Changed on

The claiming employee withdraws their own pending claim. The claim stays listed as withdrawn, and claiming the shift again creates a new claim. A claim the caller cannot see answers 404 exactly as a claim that does not exist. A manager who can see a claim they do not own gets 403. Withdrawing fails with open_shifts_disabled while Open Shifts is off.

OAuth Scopes: scheduling:shifts.write

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

Request

Path parameters

claimIdstring uuid required

The ID of the claim to withdraw.

Response

The claim was withdrawn.

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