Locations
The places a business operates. A location owns the timezone for everything that happens there.
Needs one of the settings:read or roster:read or timesheets:read or people:read or leave:read permissions, depending on the operation. The business sees it as "Business details and locations".
Fields
| Field | Type | Access | Meaning |
|---|---|---|---|
| id | string | Read-only | The location. |
| name | string | Read-only | The location's name. |
| timezone | string | Read-only | IANA timezone. Dates and day boundaries for records at this location use it. |
| address | object, may be null | Read-only | Where the location is. |
| opening_time | string, may be null | Read-only | Opening time, HH:mm in the location's timezone. |
| closing_time | string, may be null | Read-only | Closing time, HH:mm in the location's timezone. |
| default_shift_times | object | Read-only | The times a new shift starts with on each day of the week. |
| roster_week_start_day | integer | Read-only | The day this location's roster week starts: 0 is Sunday, 6 is Saturday. |
| clock_in_radius_metres | number | Read-only | How close to the location staff must be to clock in, in metres, unless remote clock-in is allowed. |
| remote_clock_in_allowed | boolean | Read-only | True when staff can clock in from anywhere. |
| break_tracking_enabled | boolean | Read-only | True when staff record their breaks when clocking. |
| target_labour_percentage | number, may be null | Read-only | The labour cost the business aims for, as a percentage of sales at this location. Returned only with settings:read. |
| archived | boolean | Read-only | True when the record has been removed in Shiftly. |
| created_at | timestamp | Read-only | When the record was created. |
| updated_at | timestamp | Read-only | When the record last changed. |
Operations
List locations
GET/v1/locations
Permission: settings:read, roster:read, timesheets:read, people:read, leave:read Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read.
| Parameter | Type | Meaning | |
|---|---|---|---|
| limit | integer, default 50, up to 200 | Optional | How many records per page. Up to 200. |
| after | string | Optional | The next_cursor from the previous page. |
| updated_since | timestamp | Optional | Only records changed at or after this moment. Pair it with include_archived to see removals. |
| include_archived | "true", "false" | Optional | Include records that have been archived. |
{
"data": [
{
"id": "66f1c2a4b3d9e8f7a6b5c4d3",
"name": "text",
"timezone": "text",
"address": {
"street": null,
"city": null,
"state": null,
"post_code": null,
"country": null,
"latitude": null,
"longitude": null
},
"opening_time": "text",
"closing_time": "text",
"default_shift_times": {
"monday": null,
"tuesday": null,
"wednesday": null,
"thursday": null,
"friday": null,
"saturday": null,
"sunday": null
},
"roster_week_start_day": 1,
"clock_in_radius_metres": 1.5,
"remote_clock_in_allowed": true,
"break_tracking_enabled": true,
"target_labour_percentage": 1.5,
"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"
}| Status | When |
|---|---|
| 400 | The error's code is invalid_request or range_too_long. The Errors page describes each code. |
| 401 | The error's code is invalid_token or token_expired. The Errors page describes each code. |
| 403 | The error's code is origin_not_allowed, permission_denied, not_available, connection_disconnected, connection_suspended or app_suspended. The Errors page describes each code. |
| 404 | There is nothing at this address, or no such record in this business. |
| 429 | Too many requests. Retry-After says when to try again. |
| 500 | Something went wrong at Shiftly. Quote the request id. |
| 503 | This environment is not set up for partner apps yet. |
Get one location
GET/v1/locations/{id}
Permission: settings:read, roster:read, timesheets:read, people:read, leave:read Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read.
{
"id": "66f1c2a4b3d9e8f7a6b5c4d3",
"name": "text",
"timezone": "text",
"address": {
"street": "text",
"city": "text",
"state": "text",
"post_code": "text",
"country": "text",
"latitude": 1.5,
"longitude": 1.5
},
"opening_time": "text",
"closing_time": "text",
"default_shift_times": {
"monday": {
"start": "text",
"end": "text",
"open": true
},
"tuesday": {
"start": "text",
"end": "text",
"open": true
},
"wednesday": {
"start": "text",
"end": "text",
"open": true
},
"thursday": {
"start": "text",
"end": "text",
"open": true
},
"friday": {
"start": "text",
"end": "text",
"open": true
},
"saturday": {
"start": "text",
"end": "text",
"open": true
},
"sunday": {
"start": "text",
"end": "text",
"open": true
}
},
"roster_week_start_day": 1,
"clock_in_radius_metres": 1.5,
"remote_clock_in_allowed": true,
"break_tracking_enabled": true,
"target_labour_percentage": 1.5,
"archived": true,
"created_at": "2026-10-06T09:00:00+11:00",
"updated_at": "2026-10-06T09:00:00+11:00"
}| Status | When |
|---|---|
| 400 | The error's code is invalid_request or range_too_long. The Errors page describes each code. |
| 401 | The error's code is invalid_token or token_expired. The Errors page describes each code. |
| 403 | The error's code is origin_not_allowed, permission_denied, not_available, connection_disconnected, connection_suspended or app_suspended. The Errors page describes each code. |
| 404 | There is nothing at this address, or no such record in this business. |
| 429 | Too many requests. Retry-After says when to try again. |
| 500 | Something went wrong at Shiftly. Quote the request id. |
| 503 | This environment is not set up for partner apps yet. |
