{"info":{"_postman_id":"5aa325f5-1fa6-5f99-a15b-31b160ed97fd","name":"Shiftly Partner API (v1)","description":"Every request a partner app can make to the Shiftly Partner API.\n\n1. Choose the Sandbox environment and fill in `clientId` and `clientSecret`.\n2. Ask your Shiftly contact to add `https://oauth.pstmn.io/v1/callback` as a return address on your sandbox app. Sandbox apps only: for production, paste a credential from your own product as a bearer token.\n3. On this collection's Authorization tab, choose Get New Access Token and sign in as the sandbox business owner.\n\nThe collection asks for every permission. If sign-in stops with \"This app may not ask for\", delete the permissions it names from the Scope field.\n\nUse the Postman desktop app. Shiftly refuses calls made from a web page. Postman on the web can send requests through the Postman desktop agent, but its sign-in may still run in the browser and be refused; if it is, paste a bearer token instead.","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"oauth2","oauth2":[{"key":"grant_type","value":"authorization_code_with_pkce","type":"string"},{"key":"challengeAlgorithm","value":"S256","type":"string"},{"key":"authUrl","value":"{{oauthBaseUrl}}/oauth/authorize","type":"string"},{"key":"accessTokenUrl","value":"{{oauthBaseUrl}}/oauth/token","type":"string"},{"key":"refreshTokenUrl","value":"{{oauthBaseUrl}}/oauth/token","type":"string"},{"key":"clientId","value":"{{clientId}}","type":"string"},{"key":"clientSecret","value":"{{clientSecret}}","type":"string"},{"key":"client_authentication","value":"header","type":"string"},{"key":"redirect_uri","value":"https://oauth.pstmn.io/v1/callback","type":"string"},{"key":"useBrowser","value":false,"type":"boolean"},{"key":"scope","value":"roster:read timesheets:read leave:read people:read pay:read settings:read payrules:read ondemand:read roster:write timesheets:write leave:write projects:write ondemand:write offline_access","type":"string"},{"key":"state","value":"{{$guid}}","type":"string"},{"key":"tokenName","value":"Shiftly","type":"string"},{"key":"addTokenTo","value":"header","type":"string"}]},"variable":[{"key":"baseUrl","value":"https://demo.shiftly.au/v1"},{"key":"oauthBaseUrl","value":"https://demo.shiftly.au"}],"item":[{"name":"Connection","item":[{"name":"Connection","description":"The link between your app and one business. Every access credential belongs to exactly one.","item":[{"name":"Get this connection","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/connection","host":["{{baseUrl}}"],"path":["connection"]}},"response":[]}]}]},{"name":"Business","item":[{"name":"Business","description":"The business this connection is for.","item":[{"name":"Get the connected business","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/business","host":["{{baseUrl}}"],"path":["business"]},"description":"Needs the settings:read permission."},"response":[]}]},{"name":"Locations","description":"The places a business operates. A location owns the timezone for everything that happens there.","item":[{"name":"List locations","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/locations","host":["{{baseUrl}}"],"path":["locations"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true}]},"description":"Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read."},"response":[]},{"name":"Get one location","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/locations/:id","host":["{{baseUrl}}"],"path":["locations",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read."},"response":[]}]},{"name":"Positions","description":"The jobs people are rostered into at a location.","item":[{"name":"List positions","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/positions","host":["{{baseUrl}}"],"path":["positions"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true}]},"description":"Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read."},"response":[]},{"name":"Get one position","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/positions/:id","host":["{{baseUrl}}"],"path":["positions",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read."},"response":[]}]},{"name":"Public holidays","description":"The public holidays each location observes, worked out the way Shiftly pays them, including days the business added or removed.","item":[{"name":"List public holidays at each location in a date range","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/public-holidays?from=2026-10-06&to=2026-10-06","host":["{{baseUrl}}"],"path":["public-holidays"],"query":[{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 366 days."},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive."},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true}]},"description":"Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read."},"response":[]}]},{"name":"Projects","description":"Jobs or cost centres that shifts and timesheets are recorded against. The business may call them something else in Shiftly. Archive a project by changing its status; projects are not deleted.","item":[{"name":"List projects","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/projects","host":["{{baseUrl}}"],"path":["projects"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"status","value":"active","description":"Only records in this status.","disabled":true}]},"description":"Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read."},"response":[]},{"name":"Create a project","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/projects","host":["{{baseUrl}}"],"path":["projects"]},"body":{"mode":"raw","raw":"{\n  \"name\": \"text\",\n  \"code\": \"text\",\n  \"colour\": \"text\",\n  \"employee_ids\": [\n    \"66f1c2a4b3d9e8f7a6b5c4d3\"\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"Needs the projects:write permission."},"response":[]},{"name":"Get one project","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/projects/:id","host":["{{baseUrl}}"],"path":["projects",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs any one of: settings:read, roster:read, timesheets:read, people:read, leave:read."},"response":[]},{"name":"Change or archive a project","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/projects/:id","host":["{{baseUrl}}"],"path":["projects",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"body":{"mode":"raw","raw":"{\n  \"name\": \"text\",\n  \"code\": \"text\",\n  \"colour\": \"text\",\n  \"employee_ids\": [\n    \"66f1c2a4b3d9e8f7a6b5c4d3\"\n  ],\n  \"status\": \"active\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the projects:write permission."},"response":[]}]}]},{"name":"People","item":[{"name":"Employees","description":"The people who work at the business. A person is added in Shiftly, not through the API. Someone who has left is an archived employment; their own record is no longer shared with the business.","item":[{"name":"List employees","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/employees","host":["{{baseUrl}}"],"path":["employees"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true}]},"description":"Needs the people:read permission."},"response":[]},{"name":"Get one employee","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/employees/:id","host":["{{baseUrl}}"],"path":["employees",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the people:read permission."},"response":[]}]},{"name":"Employments","description":"A person's job at the business: when it started, on what basis, and (with the pay permission) what they are paid. An employment is created and ended in Shiftly.","item":[{"name":"List employments","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/employments","host":["{{baseUrl}}"],"path":["employments"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true}]},"description":"Needs the people:read permission."},"response":[]},{"name":"Get one employment","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/employments/:id","host":["{{baseUrl}}"],"path":["employments",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the people:read permission."},"response":[]}]}]},{"name":"Rostering","item":[{"name":"Rosters","description":"One roster per location per week. Reading never creates one: a week nobody has rostered yet returns nothing. Rosters are published in Shiftly.","item":[{"name":"List rosters","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/rosters","host":["{{baseUrl}}"],"path":["rosters"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days.","disabled":true},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive.","disabled":true},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true}]},"description":"Needs the roster:read permission."},"response":[]},{"name":"Get one roster","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/rosters/:id","host":["{{baseUrl}}"],"path":["rosters",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the roster:read permission."},"response":[]}]},{"name":"Shifts","description":"Rostered shifts. A shift your app creates is a draft until a manager publishes the roster in Shiftly. Any shift that has not started can be changed or deleted; a change to a published shift makes it a draft again until a manager republishes.","item":[{"name":"List shifts","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/shifts","host":["{{baseUrl}}"],"path":["shifts"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days.","disabled":true},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive.","disabled":true},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true}]},"description":"Needs the roster:read permission."},"response":[]},{"name":"Create one draft shift","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/shifts","host":["{{baseUrl}}"],"path":["shifts"]},"body":{"mode":"raw","raw":"{\n  \"location_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"employee_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"start_time\": \"2026-10-06T09:00:00+11:00\",\n  \"end_time\": \"2026-10-06T09:00:00+11:00\",\n  \"breaks\": [\n    {\n      \"offset_minutes\": 1,\n      \"duration_minutes\": 1,\n      \"paid\": true\n    }\n  ],\n  \"notes\": \"text\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the roster:write permission."},"response":[]},{"name":"Create up to 100 at once","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/shifts","host":["{{baseUrl}}"],"path":["shifts"]},"body":{"mode":"raw","raw":"{\n  \"data\": [\n    {\n      \"location_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"employee_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"start_time\": \"2026-10-06T09:00:00+11:00\",\n      \"end_time\": \"2026-10-06T09:00:00+11:00\",\n      \"breaks\": [\n        {\n          \"offset_minutes\": 1,\n          \"duration_minutes\": 1,\n          \"paid\": true\n        }\n      ],\n      \"notes\": \"text\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"Needs the roster:write permission."},"response":[]},{"name":"Get one shift","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/shifts/:id","host":["{{baseUrl}}"],"path":["shifts",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the roster:read permission."},"response":[]},{"name":"Change a shift that has not started","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/shifts/:id","host":["{{baseUrl}}"],"path":["shifts",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"body":{"mode":"raw","raw":"{\n  \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"employee_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"start_time\": \"2026-10-06T09:00:00+11:00\",\n  \"end_time\": \"2026-10-06T09:00:00+11:00\",\n  \"breaks\": [\n    {\n      \"offset_minutes\": 1,\n      \"duration_minutes\": 1,\n      \"paid\": true\n    }\n  ],\n  \"notes\": \"text\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the roster:write permission."},"response":[]},{"name":"Delete a shift that has not started","request":{"method":"DELETE","header":[{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/shifts/:id","host":["{{baseUrl}}"],"path":["shifts",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the roster:write permission."},"response":[]}]},{"name":"Who can cover a shift","description":"Staff at the shift's location who may work its position and are free: no overlapping shift, no approved or pending leave, and not unavailable. The list is not ranked.","item":[{"name":"List who can cover a shift","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/shifts/:id/covers","host":["{{baseUrl}}"],"path":["shifts",":id","covers"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the roster:read permission."},"response":[]}]},{"name":"Open-shift requests","description":"Staff asking to work a published shift nobody holds. Managers decide them in Shiftly. A request is removed, not kept, when the shift is deleted or the person is given an overlapping shift.","item":[{"name":"List open-shift requests","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/open-shift-requests","host":["{{baseUrl}}"],"path":["open-shift-requests"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"status","value":"pending","description":"Only records in this status.","disabled":true},{"key":"shift_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true}]},"description":"Needs the roster:read permission."},"response":[]},{"name":"Get one open-shift request","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/open-shift-requests/:id","host":["{{baseUrl}}"],"path":["open-shift-requests",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the roster:read permission."},"response":[]}]},{"name":"Shift swaps","description":"Staff offering a shift to a named colleague, who accepts or declines in Shiftly. A cancelled offer is removed, not kept.","item":[{"name":"List shift swaps","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/shift-swaps","host":["{{baseUrl}}"],"path":["shift-swaps"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"status","value":"pending","description":"Only records in this status.","disabled":true},{"key":"shift_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true}]},"description":"Needs the roster:read permission."},"response":[]},{"name":"Get one shift swap","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/shift-swaps/:id","host":["{{baseUrl}}"],"path":["shift-swaps",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the roster:read permission."},"response":[]}]},{"name":"Availability","description":"When people have said they can and cannot work. Each record is a rule that may repeat, not a list of days.","item":[{"name":"List availability rules that apply in a date range","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/availability?from=2026-10-06&to=2026-10-06","host":["{{baseUrl}}"],"path":["availability"],"query":[{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days."},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive."},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true}]},"description":"Needs the roster:read permission."},"response":[]}]}]},{"name":"OnDemand","item":[{"name":"OnDemand shifts","description":"Shifts a venue offers to independent workers through Shiftly OnDemand. Your app can create, change and delete drafts. The venue sets the hourly rate and publishes each shift in Shiftly. Nothing about the worker is shared.","item":[{"name":"List OnDemand shifts","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/on-demand-shifts","host":["{{baseUrl}}"],"path":["on-demand-shifts"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days.","disabled":true},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive.","disabled":true},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"status","value":"draft","description":"Only records in this status.","disabled":true}]},"description":"Needs the ondemand:read permission."},"response":[]},{"name":"Create one draft OnDemand shift","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/on-demand-shifts","host":["{{baseUrl}}"],"path":["on-demand-shifts"]},"body":{"mode":"raw","raw":"{\n  \"location_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"start_time\": \"2026-10-06T09:00:00+11:00\",\n  \"end_time\": \"2026-10-06T09:00:00+11:00\",\n  \"notes\": \"text\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the ondemand:write permission."},"response":[]},{"name":"Create up to 100 at once","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/on-demand-shifts","host":["{{baseUrl}}"],"path":["on-demand-shifts"]},"body":{"mode":"raw","raw":"{\n  \"data\": [\n    {\n      \"location_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"start_time\": \"2026-10-06T09:00:00+11:00\",\n      \"end_time\": \"2026-10-06T09:00:00+11:00\",\n      \"notes\": \"text\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"Needs the ondemand:write permission."},"response":[]},{"name":"Get one OnDemand shift","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/on-demand-shifts/:id","host":["{{baseUrl}}"],"path":["on-demand-shifts",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the ondemand:read permission."},"response":[]},{"name":"Change a draft OnDemand shift that has not started","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/on-demand-shifts/:id","host":["{{baseUrl}}"],"path":["on-demand-shifts",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"body":{"mode":"raw","raw":"{\n  \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"start_time\": \"2026-10-06T09:00:00+11:00\",\n  \"end_time\": \"2026-10-06T09:00:00+11:00\",\n  \"notes\": \"text\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the ondemand:write permission."},"response":[]},{"name":"Delete a draft OnDemand shift","request":{"method":"DELETE","header":[{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/on-demand-shifts/:id","host":["{{baseUrl}}"],"path":["on-demand-shifts",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the ondemand:write permission."},"response":[]}]}]},{"name":"Time","item":[{"name":"Timesheets","description":"Worked time. A timesheet your app creates is pending until a manager approves it in Shiftly. Pay is always worked out by Shiftly.","item":[{"name":"List timesheets","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/timesheets","host":["{{baseUrl}}"],"path":["timesheets"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days.","disabled":true},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive.","disabled":true},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true}]},"description":"Needs the timesheets:read permission."},"response":[]},{"name":"Create one pending timesheet","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/timesheets","host":["{{baseUrl}}"],"path":["timesheets"]},"body":{"mode":"raw","raw":"{\n  \"employee_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"location_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"shift_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"start_time\": \"2026-10-06T09:00:00+11:00\",\n  \"end_time\": \"2026-10-06T09:00:00+11:00\",\n  \"breaks\": [\n    {\n      \"start\": \"2026-10-06T09:00:00+11:00\",\n      \"end\": \"2026-10-06T09:00:00+11:00\",\n      \"paid\": true\n    }\n  ],\n  \"note\": \"text\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the timesheets:write permission."},"response":[]},{"name":"Create up to 100 at once","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/timesheets","host":["{{baseUrl}}"],"path":["timesheets"]},"body":{"mode":"raw","raw":"{\n  \"data\": [\n    {\n      \"employee_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"location_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"shift_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n      \"start_time\": \"2026-10-06T09:00:00+11:00\",\n      \"end_time\": \"2026-10-06T09:00:00+11:00\",\n      \"breaks\": [\n        {\n          \"start\": \"2026-10-06T09:00:00+11:00\",\n          \"end\": \"2026-10-06T09:00:00+11:00\",\n          \"paid\": true\n        }\n      ],\n      \"note\": \"text\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"Needs the timesheets:write permission."},"response":[]},{"name":"Get one timesheet","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/timesheets/:id","host":["{{baseUrl}}"],"path":["timesheets",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the timesheets:read permission."},"response":[]},{"name":"Correct a pending timesheet","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/timesheets/:id","host":["{{baseUrl}}"],"path":["timesheets",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"body":{"mode":"raw","raw":"{\n  \"position_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"start_time\": \"2026-10-06T09:00:00+11:00\",\n  \"end_time\": \"2026-10-06T09:00:00+11:00\",\n  \"breaks\": [\n    {\n      \"start\": \"2026-10-06T09:00:00+11:00\",\n      \"end\": \"2026-10-06T09:00:00+11:00\",\n      \"paid\": true\n    }\n  ],\n  \"note\": \"text\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the timesheets:write permission."},"response":[]},{"name":"Delete a pending timesheet","request":{"method":"DELETE","header":[{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/timesheets/:id","host":["{{baseUrl}}"],"path":["timesheets",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the timesheets:write permission."},"response":[]}]},{"name":"Who's on now","description":"Staff clocked in right now: one row per open timesheet started in the last 24 hours, earliest clock-in first. It says where a person is, so read it when you need it rather than polling it.","item":[{"name":"List the staff clocked in now","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/whos-on","host":["{{baseUrl}}"],"path":["whos-on"],"query":[{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true}]},"description":"Needs the timesheets:read permission."},"response":[]}]},{"name":"Timesheet totals","description":"Hours, counts and cost of timesheets started in a date range, split into approved and pending. Rejected timesheets and timesheets still open are left out, and a range with none returns no rows. Totals are rounded once, so they can differ by a few cents from adding up each timesheet.","item":[{"name":"Total timesheets over a date range","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/timesheet-totals?from=2026-10-06&to=2026-10-06","host":["{{baseUrl}}"],"path":["timesheet-totals"],"query":[{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days."},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive."},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true},{"key":"group_by","value":"employee","disabled":true}]},"description":"Needs the timesheets:read permission."},"response":[]}]},{"name":"Labour costs","description":"Rostered and actual hours and cost per calendar day and location, against the location's labour target. Rostered figures need rostering access and actual figures need timesheet access; costs need pay access. Days with no shifts or timesheets are left out. Sales are not included, so the labour percentage itself is yours to work out.","item":[{"name":"List rostered and actual labour by day and location","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/labour-costs?from=2026-10-06&to=2026-10-06","host":["{{baseUrl}}"],"path":["labour-costs"],"query":[{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 31 days."},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive."},{"key":"location_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this location.","disabled":true},{"key":"group_by","value":"position","disabled":true}]},"description":"Needs any one of: roster:read, timesheets:read."},"response":[]}]}]},{"name":"Leave","item":[{"name":"Leave requests","description":"Requests for leave. A request your app submits is pending until a manager decides it in Shiftly. Dates are calendar days at the business's first location.","item":[{"name":"List leave requests","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/leave-requests","host":["{{baseUrl}}"],"path":["leave-requests"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days.","disabled":true},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive.","disabled":true},{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person.","disabled":true},{"key":"status","value":"pending","description":"Only records in this status.","disabled":true}]},"description":"Needs the leave:read permission."},"response":[]},{"name":"Submit a pending leave request for a person","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/leave-requests","host":["{{baseUrl}}"],"path":["leave-requests"]},"body":{"mode":"raw","raw":"{\n  \"employee_id\": \"66f1c2a4b3d9e8f7a6b5c4d3\",\n  \"leave_type\": \"text\",\n  \"start_date\": \"2026-10-06\",\n  \"end_date\": \"2026-10-06\",\n  \"note\": \"text\"\n}","options":{"raw":{"language":"json"}}},"description":"Needs the leave:write permission."},"response":[]},{"name":"Get one leave request","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/leave-requests/:id","host":["{{baseUrl}}"],"path":["leave-requests",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the leave:read permission."},"response":[]},{"name":"Cancel a pending leave request your app submitted","request":{"method":"POST","header":[{"key":"Idempotency-Key","value":"{{$guid}}","description":"Makes a retry safe. Postman sends a new one each time; keep it the same to retry."}],"url":{"raw":"{{baseUrl}}/leave-requests/:id/cancel","host":["{{baseUrl}}"],"path":["leave-requests",":id","cancel"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the leave:write permission."},"response":[]}]},{"name":"Leave blackout periods","description":"Periods when the business limits leave, such as a busy season. Dates are calendar days at the business's first location.","item":[{"name":"List leave blackout periods","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/leave-blackouts","host":["{{baseUrl}}"],"path":["leave-blackouts"],"query":[{"key":"limit","value":"50","description":"How many records per page. Up to 200.","disabled":true},{"key":"after","value":"text","description":"The next_cursor from the previous page.","disabled":true},{"key":"updated_since","value":"2026-10-05T22:00:00Z","description":"Only records changed at or after this moment. Pair it with include_archived to see removals.","disabled":true},{"key":"include_archived","value":"true","description":"Include records that have been archived.","disabled":true},{"key":"from","value":"2026-10-06","description":"The first day of the range, in the location's timezone. With to, at most 92 days.","disabled":true},{"key":"to","value":"2026-10-06","description":"The last day of the range, inclusive.","disabled":true}]},"description":"Needs the leave:read permission."},"response":[]},{"name":"Get one leave blackout period","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/leave-blackouts/:id","host":["{{baseUrl}}"],"path":["leave-blackouts",":id"],"variable":[{"key":"id","value":"66f1c2a4b3d9e8f7a6b5c4d3"}]},"description":"Needs the leave:read permission."},"response":[]}]},{"name":"Leave balances","description":"What leave a person has, by leave type. Worked out when you ask, so there is nothing to page through.","item":[{"name":"List one person's leave balances","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/leave-balances?employee_id=66f1c2a4b3d9e8f7a6b5c4d3","host":["{{baseUrl}}"],"path":["leave-balances"],"query":[{"key":"employee_id","value":"66f1c2a4b3d9e8f7a6b5c4d3","description":"Only this person."}]},"description":"Needs the leave:read permission."},"response":[]}]},{"name":"Leave types","description":"The kinds of leave this business offers and how each builds up.","item":[{"name":"List the leave types the business offers","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/leave-types","host":["{{baseUrl}}"],"path":["leave-types"]},"description":"Needs the leave:read permission."},"response":[]}]}]},{"name":"Pay rules","item":[{"name":"Awards","description":"The Fair Work awards this business pays under.","item":[{"name":"List the business's awards","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/awards","host":["{{baseUrl}}"],"path":["awards"]},"description":"Needs the payrules:read permission."},"response":[]}]}]}]}