---
title: "Update shifts"
method: PUT
path: "/scheduler/v2/schedulers/{schedulerId}/shifts"
tags: ["Schedule:v2:Schedulers:Schedule:Shifts (V2):Shifts"]
---

# Update shifts

`PUT /scheduler/v2/schedulers/{schedulerId}/shifts`

## Request

- Base URL: `https://api.connecteam.com`
- URL: `https://api.connecteam.com/scheduler/v2/schedulers/{schedulerId}/shifts`
- Auth: one of:
  - API key in header `X-API-KEY`
  - OAuth 2
    - Client credentials
    - Token URL: `/oauth/v1/token` scopes: `schedule.write`

Update single or multiple shifts under a specific schedule

## Path parameters

- `schedulerId` integer, required: The unique identifier of the schedule

## Query parameters

- `notifyUsers` boolean, nullable: Indicates whether to send a notification to the users assigned to the shifts. This applies only to shifts that are published.

## Request body

- ShiftUpdateRequest[]
  - `shiftId` string, required: The unique identifier of the shift
  - `startTime` integer, nullable: Integer with minimum value of 1
  - `endTime` integer, nullable: Integer with minimum value of 1
  - `isOpenShift` boolean, nullable: Indicates whether the shift is an open shift. Creates only with 1 open spot
  - `timezone` string, nullable: The timezone in Tz format (e.g. America/New_York)
  - `title` string, nullable: The title of the shift
  - `isPublished` boolean, nullable: Indicates whether the shift is published
  - `jobId` string, nullable: The ID of the associated job
  - `locationData` LocationDataAPI
    - `isReferencedToJob` boolean, required: Indicates whether the location is referenced to a job. can only be true if job id isn't empty
    - `gps` GpsDataV2
      - `address` string, nullable: The address associated with the GPS data.
      - `longitude` number, nullable: The longitude coordinate.
      - `latitude` number, nullable: The latitude coordinate.
  - `isRequireAdminApproval` boolean, nullable: Indicates whether admin approval is required for the shift. Can only be set if the shift is an open shift
  - `assignedUserIds` integer[], nullable: The list of assigned user IDs for the shift. Required for V2 Vision targeted base/group edits when isEditForAllUsers is explicitly false. When vision is enabled, multiple user IDs can be specified. Otherwise, only one user ID can be specified.
  - `notes` HTMLNoteData[], nullable: Additional notes for the shift
    - `html` string, required: The HTML content of the note
  - `breaks` ShiftUpdateBreakDataApi[], nullable: The list of breaks for the shift
    - `id` string, nullable: The unique identifier of the break. If this field is left empty, a new break will be created
    - `name` string, required: The name of the break.
    - `type` 'paid' | 'unpaid', required
    - `startTime` integer, nullable: Integer with minimum value of 0
    - `duration` integer, required: The time the break lasts in minutes
  - `tasks` ShiftUpdateTaskDataApi[], nullable: Replaces the shift's tasks with this list. Pass the id of an existing task to keep it (and its completion state); omit the id to create a new task. Pass an empty list to remove all tasks
    - `id` string, nullable: The unique identifier of the task. If this field is left empty, a new task will be created
    - `title` string, required: The title of the task
  - `isEditForAllUsers` boolean: Indicates whether the update should be applied to all users assigned to the shift
  - `color` string, nullable: The color associated with the shift. Should be one of the following colors: ['#4B7AC5', '#801A1A', '#AE2121', '#DC7A7A', '#B0712E', '#D4985A', '#E4B37F', '#AE8E2D', '#CBA73A', '#D9B443', '#487037', '#6F9B5C', '#91B282', '#365C64', '#5687B3', '#7C9BA2', '#3968BB', '#85A6DA', '#225A8C', '#548CBE', '#81A8CC', '#4E3F75', '#604E8E', '#8679AA', '#983D73', '#A43778', '#D178AD', '#6B2E4C', '#925071', '#B57D9A', '#3a3a3a', '#616161', '#969696']
  - `openSpots` integer, nullable: Integer with minimum value of 0
  - `customFields` BaseCustomFieldV2[], nullable: Custom field values for the shift
    - `customFieldId` integer, required: The custom field unique id
    - `value` unknown, required

## Response `200`

Successful Response

- APIResponseV2ShiftUpdateBulkResponse
  - `requestId` string
  - `data` ShiftUpdateBulkResponse, required
    - `shifts` V2FeaturesShiftschedulerExternalApiV1SchedulersSchedulerShiftsModelsShiftResponseShiftResponse[], required: The shifts
      - `id` string, required: The ID of the shift
      - `color` string, required: The color of the shift
      - `assignedUserIds` integer[]: The IDs of the assigned users
      - `startTime` integer, required: The start time of the shift
      - `endTime` integer, required: The end time of the shift
      - `timezone` string, required: The timezone of the shift
      - `isOpenShift` boolean, required: Whether the shift is an open shift
      - `title` string, required: The title of the shift
      - `jobId` string, nullable: The ID of the job
      - `locationData` LocationDataAPI
        - `isReferencedToJob` boolean, required: Indicates whether the location is referenced to a job. can only be true if job id isn't empty
        - `gps` GpsDataV2
          - `address` string, nullable: The address associated with the GPS data.
          - `longitude` number, nullable: The longitude coordinate.
          - `latitude` number, nullable: The latitude coordinate.
      - `isPublished` boolean, required: Whether the shift is published
      - `isRequireAdminApproval` boolean, nullable: Whether the shift requires admin approval
      - `updateTime` integer, nullable: Integer with minimum value of 1
      - `creationTime` integer, nullable: Integer with minimum value of 1
      - `createdBy` integer, nullable: Integer with minimum value of 1
      - `openSpots` integer, nullable: The number of open spots
      - `notes` union[]: The notes of the shift
        - union
          - HTMLNoteDataOut
            - `type` string: HTML note type
            - `html` string, required: The HTML content of the note
          - AlbumNoteDataOut
            - `type` string: Album note type
            - `album` ImageNoteDataOut[], required: The list of images in the album
              - …
          - FileNoteDataOut
            - `url` string, required: The url of the file to upload
            - `type` string: URL note type
            - `name` string, required: The name of the file
      - `statuses` StatusData[]: The statuses of the shift
        - `statusId` string, required: The ID of the status
        - `status` 'accepted' | 'checked_in' | 'completed' | 'rejected' | 'claimed' | 'claim_requested' | 'unclaimed' | 'unclaim_requested' | 'cancel_claim_request' | 'reset', required
        - `note` string, nullable: The note of the status
        - `attachments` string[], nullable: The attachments of the status
        - `creationTime` integer, nullable: The creation time of the status
        - `updateTime` integer, nullable: The update time of the status
        - `creatingUserId` integer, required: The ID of the user who created the status
        - `modifyingUserId` integer, nullable: The ID of the user who modified the status
        - `gps` GpsDataV2
          - `address` string, nullable: The address associated with the GPS data.
          - `longitude` number, nullable: The longitude coordinate.
          - `latitude` number, nullable: The latitude coordinate.
        - `assignedUserId` integer, nullable: The ID of the user assigned to the status
      - `breaks` ShiftBreakDataApi[]: The breaks of the shift
        - `id` string, required: The id of the break
        - `name` string, required: The name of the break.
        - `type` 'paid' | 'unpaid', required
        - `startTime` integer, nullable: Integer with minimum value of 0
        - `duration` integer, required: The time the break lasts in minutes
      - `shiftDetails` ShiftDetailsOutput, required
        - `shiftLayers` ShiftLayerOutput[]: The various layers of information associated with the shift
          - `id` string, required: The unique identifier of the shift layer
          - `title` string, required: The name of the shift layer
          - `value` ShiftLayerInstanceOutput, required
            - `id` string, required: The unique identifier of the value
            - `displayName` string, required: The name of the value
        - `shiftSource` string, nullable: The source of the shift
      - `customFields` CustomFieldResponseV2[]: The shift's custom fields
        - `customFieldId` integer, required: The custom field unique id
        - `value` unknown, required
        - `type` 'email' | 'date' | 'phone' | 'number' | 'str' | 'dropdown' | 'file' | 'directManager' | 'birthday' | 'link' | 'location', required
        - `name` string, required: The custom field name
      - `tasks` ShiftTaskDataApi[]: The tasks of the shift
        - `id` string, nullable: The id of the task. Can be empty on older tasks
        - `title` string, required: The title of the task
        - `isComplete` boolean, required: Whether the task was completed
        - `completingUserId` integer, nullable: Integer with minimum value of 1
        - `completionTime` integer, nullable: Integer with minimum value of 1
    - `deletedShiftIds` string[]: The IDs of the shifts that were deleted during the update operation
    - `createdShifts` V2FeaturesShiftschedulerExternalApiV1SchedulersSchedulerShiftsModelsShiftResponseShiftResponse[]: The shifts that were created during the update operation
      - `id` string, required: The ID of the shift
      - `color` string, required: The color of the shift
      - `assignedUserIds` integer[]: The IDs of the assigned users
      - `startTime` integer, required: The start time of the shift
      - `endTime` integer, required: The end time of the shift
      - `timezone` string, required: The timezone of the shift
      - `isOpenShift` boolean, required: Whether the shift is an open shift
      - `title` string, required: The title of the shift
      - `jobId` string, nullable: The ID of the job
      - `locationData` LocationDataAPI
        - `isReferencedToJob` boolean, required: Indicates whether the location is referenced to a job. can only be true if job id isn't empty
        - `gps` GpsDataV2
          - `address` string, nullable: The address associated with the GPS data.
          - `longitude` number, nullable: The longitude coordinate.
          - `latitude` number, nullable: The latitude coordinate.
      - `isPublished` boolean, required: Whether the shift is published
      - `isRequireAdminApproval` boolean, nullable: Whether the shift requires admin approval
      - `updateTime` integer, nullable: Integer with minimum value of 1
      - `creationTime` integer, nullable: Integer with minimum value of 1
      - `createdBy` integer, nullable: Integer with minimum value of 1
      - `openSpots` integer, nullable: The number of open spots
      - `notes` union[]: The notes of the shift
        - union
          - HTMLNoteDataOut
            - `type` string: HTML note type
            - `html` string, required: The HTML content of the note
          - AlbumNoteDataOut
            - `type` string: Album note type
            - `album` ImageNoteDataOut[], required: The list of images in the album
              - …
          - FileNoteDataOut
            - `url` string, required: The url of the file to upload
            - `type` string: URL note type
            - `name` string, required: The name of the file
      - `statuses` StatusData[]: The statuses of the shift
        - `statusId` string, required: The ID of the status
        - `status` 'accepted' | 'checked_in' | 'completed' | 'rejected' | 'claimed' | 'claim_requested' | 'unclaimed' | 'unclaim_requested' | 'cancel_claim_request' | 'reset', required
        - `note` string, nullable: The note of the status
        - `attachments` string[], nullable: The attachments of the status
        - `creationTime` integer, nullable: The creation time of the status
        - `updateTime` integer, nullable: The update time of the status
        - `creatingUserId` integer, required: The ID of the user who created the status
        - `modifyingUserId` integer, nullable: The ID of the user who modified the status
        - `gps` GpsDataV2
          - `address` string, nullable: The address associated with the GPS data.
          - `longitude` number, nullable: The longitude coordinate.
          - `latitude` number, nullable: The latitude coordinate.
        - `assignedUserId` integer, nullable: The ID of the user assigned to the status
      - `breaks` ShiftBreakDataApi[]: The breaks of the shift
        - `id` string, required: The id of the break
        - `name` string, required: The name of the break.
        - `type` 'paid' | 'unpaid', required
        - `startTime` integer, nullable: Integer with minimum value of 0
        - `duration` integer, required: The time the break lasts in minutes
      - `shiftDetails` ShiftDetailsOutput, required
        - `shiftLayers` ShiftLayerOutput[]: The various layers of information associated with the shift
          - `id` string, required: The unique identifier of the shift layer
          - `title` string, required: The name of the shift layer
          - `value` ShiftLayerInstanceOutput, required
            - `id` string, required: The unique identifier of the value
            - `displayName` string, required: The name of the value
        - `shiftSource` string, nullable: The source of the shift
      - `customFields` CustomFieldResponseV2[]: The shift's custom fields
        - `customFieldId` integer, required: The custom field unique id
        - `value` unknown, required
        - `type` 'email' | 'date' | 'phone' | 'number' | 'str' | 'dropdown' | 'file' | 'directManager' | 'birthday' | 'link' | 'location', required
        - `name` string, required: The custom field name
      - `tasks` ShiftTaskDataApi[]: The tasks of the shift
        - `id` string, nullable: The id of the task. Can be empty on older tasks
        - `title` string, required: The title of the task
        - `isComplete` boolean, required: Whether the task was completed
        - `completingUserId` integer, nullable: Integer with minimum value of 1
        - `completionTime` integer, nullable: Integer with minimum value of 1

## Other responses

- `400`: Invalid shift update request. For targeted V2 Vision base/group edits, assignedUserIds must be provided when isEditForAllUsers is explicitly false.
- `422`: Validation Error

## Changes

- **2026-11-03** `a01dde7c27fb`: 3 info
  - added the new optional request property `items/tasks`
  - added the optional property `data/createdShifts/items/tasks` to the response with the `200` status
  - added the optional property `data/shifts/items/tasks` to the response with the `200` status

[Operation history](https://skmtc.dev/connecteam/apis/connecteam-api-documentation/changes/scheduler/v2/schedulers/:schedulerId/shifts/put.md)

---

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