Create a shift
Needs: Roster, Read-write
Creates a shift (optionally recurring) using the same rules as the Imploy roster: funding and budget checks, leave, duplicates, segments and billing. One client is a normal shift, two or more is a group shift, no staff is a shift pool shift, and several staff is a multi-staff shift. It is saved as a draft unless publish is true.
Errors
422when funding or budget checks fail, the staff member is on accepted leave, the address is missing, or the end is not after the start.
Important: If the staff have warnings (double booking, availability, pending leave or compliance), nothing is saved and the response has
needs_confirmation: truewith thewarnings. Check them, then send the same request withconfirm_warnings: trueto save anyway.
Note: The response also has a
message.refslists up to 50 refs, andmore_refs_not_listedcounts any beyond that.
curl -X POST "https://app.imploy.com.au/api/integrations/v1/shifts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"clients": [
12
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"staff": [
{
"staff_id": 31
}
],
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime",
"address": "1 Example St, Perth WA 6000",
"publish": false
}'
import requests
import json
url = "https://app.imploy.com.au/api/integrations/v1/shifts"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"clients": [
12
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"staff": [
{
"staff_id": 31
}
],
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime",
"address": "1 Example St, Perth WA 6000",
"publish": false
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://app.imploy.com.au/api/integrations/v1/shifts", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"clients": [
12
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"staff": [
{
"staff_id": 31
}
],
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime",
"address": "1 Example St, Perth WA 6000",
"publish": false
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"clients": [
12
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"staff": [
{
"staff_id": 31
}
],
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime",
"address": "1 Example St, Perth WA 6000",
"publish": false
}`)
req, err := http.NewRequest("POST", "https://app.imploy.com.au/api/integrations/v1/shifts", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://app.imploy.com.au/api/integrations/v1/shifts')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
request.body = '{
"clients": [
12
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"staff": [
{
"staff_id": 31
}
],
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime",
"address": "1 Example St, Perth WA 6000",
"publish": false
}'
response = http.request(request)
puts response.body
{
"needs_confirmation": true,
"warnings": [
"..."
],
"message": "Nothing was saved. Check these with the user, then resend the same request with confirm_warnings: true to save anyway."
}
{
"message": "Invalid or expired access token."
}
{
"message": "Access token does not permit this action."
}
{
"message": "Too many requests."
}
/shifts
Target server for requests. Edit to use your own host.
An organisation access token that starts with imp_at_. Send it as Authorization: Bearer imp_at_XXXX.
imp_at_. Send it as Authorization: Bearer imp_at_XXXX.The media type of the request body
Client ids, 1 to 20. One client is a normal shift, two or more is a group shift.
Start, YYYY-MM-DD HH:MM in the organisation's time.
End, YYYY-MM-DD HH:MM. Must be after the start, and no more than 24 hours later.
Array of staff_id (required) with an optional service for that person. Empty means a shift pool shift (single client only). Several means a multi-staff shift. Up to 10.
A service name from the services endpoint. NDIS clients use NDIS services.
Up to 255 characters.
Up to 500 characters. Defaults to the client's address (or the site's).
Up to 5000 characters.
Publish to staff now. A new shift is a draft unless this is true; on edit it is unchanged.
Makes it a site shift at this site. The clients must be site participants, and services are NDIS services.
Makes the shift repeat. frequency (Day, Week or Month) is required, with ends_on (YYYY-MM-DD, within two years) or occurrences (1 to 366). Also every (1 to 52), days (Mon to Sun, weekly), month_day (1 to 31) or month_week (First to Fourth, or Last) with month_weekday.
Splits the shift into service blocks per staff member. Each needs staff_id, start, end and service. Up to 20.
One of hcp, hcp_unspent, sah, temporary, tsah, thcp, ghcp or private. Defaults to the scheduler default.
Required when funding_source is temporary.
Group shifts. Percent of the charge per client, each with client_id and percent (0 to 100), and optionally funding_source and temporary_funding_id. Defaults to an even split.
Group shifts. Charge every client 100% instead of splitting.
Staff can claim travel for this shift.
Travel details, which turn on apply_travel_claim. planned_kms (0 to 2000), charge_client (NDIS clients only), service (an NDIS travel service, required when charge_client is true) and charge_split for group shifts. On edit only the keys you send change, and null removes the travel details.
Group or site shifts only. Bills the whole shift at one service, with mode of hourly (default) or fixed. null removes it.
Create even if a matching shift was created recently.
Save despite staff warnings (double booking, availability, pending leave, compliance). Only use after confirming.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. An organisation access token that starts with imp_at_. Send it as Authorization: Bearer imp_at_XXXX.
Body
Client ids, 1 to 20. One client is a normal shift, two or more is a group shift.
Start, YYYY-MM-DD HH:MM in the organisation's time.
End, YYYY-MM-DD HH:MM. Must be after the start, and no more than 24 hours later.
Array of staff_id (required) with an optional service for that person. Empty means a shift pool shift (single client only). Several means a multi-staff shift. Up to 10.
A service name from the services endpoint. NDIS clients use NDIS services.
Up to 255 characters.
Up to 500 characters. Defaults to the client's address (or the site's).
Up to 5000 characters.
Publish to staff now. A new shift is a draft unless this is true; on edit it is unchanged.
Makes it a site shift at this site. The clients must be site participants, and services are NDIS services.
Makes the shift repeat. frequency (Day, Week or Month) is required, with ends_on (YYYY-MM-DD, within two years) or occurrences (1 to 366). Also every (1 to 52), days (Mon to Sun, weekly), month_day (1 to 31) or month_week (First to Fourth, or Last) with month_weekday.
Splits the shift into service blocks per staff member. Each needs staff_id, start, end and service. Up to 20.
One of hcp, hcp_unspent, sah, temporary, tsah, thcp, ghcp or private. Defaults to the scheduler default.
Required when funding_source is temporary.
Group shifts. Percent of the charge per client, each with client_id and percent (0 to 100), and optionally funding_source and temporary_funding_id. Defaults to an even split.
Group shifts. Charge every client 100% instead of splitting.
Staff can claim travel for this shift.
Travel details, which turn on apply_travel_claim. planned_kms (0 to 2000), charge_client (NDIS clients only), service (an NDIS travel service, required when charge_client is true) and charge_split for group shifts. On edit only the keys you send change, and null removes the travel details.
Group or site shifts only. Bills the whole shift at one service, with mode of hourly (default) or fixed. null removes it.
Create even if a matching shift was created recently.
Save despite staff warnings (double booking, availability, pending leave, compliance). Only use after confirming.