Skip to content
ShiftlyDevelopers
Documentation menu

Rosters

One roster per location per week. Reading never creates one: a week nobody has rostered yet returns nothing. Rosters are published in Shiftly.

Needs the roster:read permission, depending on the operation. The business sees it as "Rosters and shifts".

Fields

Roster fields
FieldTypeAccessMeaning
idstringRead-onlyThe roster week.
location_idstringRead-onlyThe location the roster is for.
start_datedateRead-onlyFirst day of the week, in the location's timezone.
end_datedateRead-onlyLast day of the week, in the location's timezone.
status"draft", "unpublished", "published"Read-onlydraft (never published), unpublished (changed since it was last published) or published.
published_attimestamp, may be nullRead-onlyWhen the roster was last published.
archivedbooleanRead-onlyTrue when the record has been removed in Shiftly.
created_attimestampRead-onlyWhen the record was created.
updated_attimestampRead-onlyWhen the record last changed.

Operations

List rosters

GET/v1/rosters

Permission: roster:read

Query parameters
ParameterTypeMeaning
limitinteger, default 50, up to 200OptionalHow many records per page. Up to 200.
afterstringOptionalThe next_cursor from the previous page.
updated_sincetimestampOptionalOnly records changed at or after this moment. Pair it with include_archived to see removals.
include_archived"true", "false"OptionalInclude records that have been archived.
fromdateOptionalThe first day of the range, in the location's timezone. With to, at most 92 days.
todateOptionalThe last day of the range, inclusive.
location_idstringOptionalOnly this location.
200 response
{
  "data": [
    {
      "id": "66f1c2a4b3d9e8f7a6b5c4d3",
      "location_id": "66f1c2a4b3d9e8f7a6b5c4d3",
      "start_date": "2026-10-06",
      "end_date": "2026-10-06",
      "status": "draft",
      "published_at": "2026-10-06T09:00:00+11:00",
      "archived": true,
      "created_at": "2026-10-06T09:00:00+11:00",
      "updated_at": "2026-10-06T09:00:00+11:00"
    }
  ],
  "has_more": true,
  "next_cursor": "text"
}
Refusals
StatusWhen
400The error's code is invalid_request or range_too_long. The Errors page describes each code.
401The error's code is invalid_token or token_expired. The Errors page describes each code.
403The error's code is origin_not_allowed, permission_denied, not_available, connection_disconnected, connection_suspended or app_suspended. The Errors page describes each code.
404There is nothing at this address, or no such record in this business.
429Too many requests. Retry-After says when to try again.
500Something went wrong at Shiftly. Quote the request id.
503This environment is not set up for partner apps yet.

Get one roster

GET/v1/rosters/{id}

Permission: roster:read

200 response
{
  "id": "66f1c2a4b3d9e8f7a6b5c4d3",
  "location_id": "66f1c2a4b3d9e8f7a6b5c4d3",
  "start_date": "2026-10-06",
  "end_date": "2026-10-06",
  "status": "draft",
  "published_at": "2026-10-06T09:00:00+11:00",
  "archived": true,
  "created_at": "2026-10-06T09:00:00+11:00",
  "updated_at": "2026-10-06T09:00:00+11:00"
}
Refusals
StatusWhen
400The error's code is invalid_request or range_too_long. The Errors page describes each code.
401The error's code is invalid_token or token_expired. The Errors page describes each code.
403The error's code is origin_not_allowed, permission_denied, not_available, connection_disconnected, connection_suspended or app_suspended. The Errors page describes each code.
404There is nothing at this address, or no such record in this business.
429Too many requests. Retry-After says when to try again.
500Something went wrong at Shiftly. Quote the request id.
503This environment is not set up for partner apps yet.