Update Shift
PATCH {{base_url}}/api/v3/shifts/{{SHIFT_ID}}
Required scope: shifts:write
Partially updates an operator-owned shift. Requires admin credentials. Send user_id: null to unassign the runner.
The merged final shift is validated: times must remain ordered and within 12 hours, resources must belong to the caller’s operator, and rider overlaps return 409. Toast-clocked shifts reject changes to times, rider, or location with 409.
Request body
Section titled “Request body”{ "start": "2026-10-20T14:00:00.000Z", "stop": "2026-10-20T18:00:00.000Z", "user_id": "{{RUNNER_ID}}", "bonus_pay": 15, "reason": "Schedule adjustment"}Examples
Section titled “Examples”curl --request PATCH '${base_url}/api/v3/shifts/550e8400-e29b-41d4-a716-446655440000' \ --header 'Content-Type: application/json' \ --data '{ "start": "2026-10-20T14:00:00.000Z", "stop": "2026-10-20T18:00:00.000Z", "user_id": "{{RUNNER_ID}}", "bonus_pay": 15, "reason": "Schedule adjustment"}'const response = await fetch("${base_url}/api/v3/shifts/550e8400-e29b-41d4-a716-446655440000", { "method": "PATCH", "headers": { "Content-Type": "application/json" }, "body": "{\n \"start\": \"2026-10-20T14:00:00.000Z\",\n \"stop\": \"2026-10-20T18:00:00.000Z\",\n \"user_id\": \"{{RUNNER_ID}}\",\n \"bonus_pay\": 15,\n \"reason\": \"Schedule adjustment\"\n}"})const data = await response.json()import requests
response = requests.request( "PATCH", "${base_url}/api/v3/shifts/550e8400-e29b-41d4-a716-446655440000", headers={ 'Content-Type': 'application/json'}, data="{\n \"start\": \"2026-10-20T14:00:00.000Z\",\n \"stop\": \"2026-10-20T18:00:00.000Z\",\n \"user_id\": \"{{RUNNER_ID}}\",\n \"bonus_pay\": 15,\n \"reason\": \"Schedule adjustment\"\n}",)response.raise_for_status()Saved responses
Section titled “Saved responses”{ "type": "success", "data": { "id": "550e8400-e29b-41d4-a716-446655440000", "start": "2026-10-20T14:00:00.000Z", "stop": "2026-10-20T18:00:00.000Z", "user_id": "1697c3af-450f-42f4-8609-669a4350c22f", "bonus_pay": 15, "checked_in": null }}{ "type": "error", "message": "A shift cannot exceed 12 hours", "status": 400}{ "type": "error", "message": "Toast-managed shifts cannot change time, rider, or location", "status": 409}{ "type": "error", "message": "Shift not found", "status": 404}
