Import shifts
Needs: Roster, Read-write
Migrates shifts from another system as normal roster shifts. They are not clocked in, so clock them in and out afterwards. Rows with the same clients, start, end and site become one multi-staff shift, and a row with no staff becomes a shift pool shift. A batch imports all or nothing, and shifts that already exist (same clients, times, site and staff) are skipped, so it can be sent again.
Tip: Always run
dry_runfirst. Keep thebatchid from the real run so you can undo it.
curl -X POST "https://app.imploy.com.au/api/integrations/v1/shifts/import" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"dry_run": true,
"shifts": [
{
"clients": [
"Example Client"
],
"staff": [
"Example Worker"
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime"
}
]
}'
import requests
import json
url = "https://app.imploy.com.au/api/integrations/v1/shifts/import"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"dry_run": true,
"shifts": [
{
"clients": [
"Example Client"
],
"staff": [
"Example Worker"
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime"
}
]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://app.imploy.com.au/api/integrations/v1/shifts/import", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"dry_run": true,
"shifts": [
{
"clients": [
"Example Client"
],
"staff": [
"Example Worker"
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime"
}
]
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"dry_run": true,
"shifts": [
{
"clients": [
"Example Client"
],
"staff": [
"Example Worker"
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime"
}
]
}`)
req, err := http.NewRequest("POST", "https://app.imploy.com.au/api/integrations/v1/shifts/import", 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/import')
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 = '{
"dry_run": true,
"shifts": [
{
"clients": [
"Example Client"
],
"staff": [
"Example Worker"
],
"start": "2026-03-02 09:00",
"end": "2026-03-02 13:00",
"service": "Assistance With Self-Care Activities - Standard - Weekday Daytime"
}
]
}'
response = http.request(request)
puts response.body
{
"dry_run": true,
"publish": true,
"shifts": 1,
"skipped_existing": 0,
"failed": 0,
"with_warnings": 0,
"results": [
{
"ok": true,
"status": "ready"
}
]
}
{
"batch": "7d9e0a14-3c1b-4a2f-8d55-0e6f7a8b9c10",
"created": 1,
"skipped_existing": 0,
"published": true,
"results": [
"..."
]
}
{
"message": "Invalid or expired access token."
}
{
"message": "Access token does not permit this action."
}
{
"message": "Too many requests."
}
/shifts/import
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
Up to 100 rows, merged into at most 50 shifts. Each needs clients, start, end and service. Optional: staff, site, address, title and comments. Clients and staff can be ids or exact full names, and staff can also be emails.
Publish the imported shifts. Defaults to true. Shift notes can only be imported onto published shifts.
Run the whole batch through the roster and roll it back. Reports each shift that would be created, skipped or refused, and staff warnings.
Import despite staff warnings. 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
Up to 100 rows, merged into at most 50 shifts. Each needs clients, start, end and service. Optional: staff, site, address, title and comments. Clients and staff can be ids or exact full names, and staff can also be emails.
Publish the imported shifts. Defaults to true. Shift notes can only be imported onto published shifts.
Run the whole batch through the roster and roll it back. Reports each shift that would be created, skipped or refused, and staff warnings.
Import despite staff warnings. Only use after confirming.
Responses
Dry run