Sync clients
Keep another system's client list in step with Imploy.
This guide copies clients from Imploy into another system, then keeps them current. It uses GET /clients with updated_since, and POST or PATCH to send changes back.
Token permissions: Clients Read to pull. Clients Read-write to create or update.
Pull clients
Do a first full load
Call GET /clients?per_page=100 and keep requesting the next page until you pass meta.last_page.
Save a checkpoint
Store the time you started the load. Use it as updated_since next run.
Run on a schedule
Each run, request updated_since with your checkpoint, then move the checkpoint forward. Match records on the Imploy id.
const base = "https://app.imploy.com.au/api/integrations/v1";
const headers = { Authorization: `Bearer ${process.env.IMPLOY_TOKEN}` };
async function* clientsSince(since) {
let page = 1;
while (true) {
const url = new URL(`${base}/clients`);
url.searchParams.set("per_page", "100");
url.searchParams.set("page", String(page));
if (since) url.searchParams.set("updated_since", since);
const res = await (await fetch(url, { headers })).json();
yield* res.data;
if (page >= res.meta.last_page) return;
page += 1;
}
}
for await (const client of clientsSince("2026-01-01")) {
console.log(client.id, client.first_name, client.last_name, client.status);
}
import os
import requests
base = "https://app.imploy.com.au/api/integrations/v1"
headers = {"Authorization": f"Bearer {os.environ['IMPLOY_TOKEN']}"}
def clients_since(since=None):
page = 1
while True:
params = {"per_page": 100, "page": page}
if since:
params["updated_since"] = since
res = requests.get(f"{base}/clients", params=params, headers=headers).json()
yield from res["data"]
if page >= res["meta"]["last_page"]:
return
page += 1
for client in clients_since("2026-01-01"):
print(client["id"], client["first_name"], client["last_name"], client["status"])
Archived clients still come back from the list with a status of Archived. Treat that as inactive in your system rather than deleting the record.
Create clients
Call GET /clients/create-options first. It lists the required fields, client types, business locations and custom attributes, so you can collect everything in one go.
Creating a client needs first_name, last_name, client_type and business_id. Use POST /clients/bulk to send up to 50 at once.
- Send the batch with
"dry_run": true. Nothing is created and you get a result for every row. - Fix any rows that failed.
- Send again without
dry_run.
A possible duplicate is refused unless you send allow_duplicates. Check the match first instead of switching it on.
Update a client
PATCH /clients/{id} changes only the fields you send. An unsupported field returns a 422 validation error. DELETE /clients/{id} archives the client.
Keep it live
updated_since polling is simple and reliable. To hear about changes sooner, add a webhook for client.created and client.updated, and keep the polling as a safety net. See Keep a local copy up to date.