curl --request POST \
--url "https://v1-api.ticket-plus.app/hr-integrations/7/sync" \
--header "Authorization: Basic <base64(clientId:clientSecret)>" \
--header "Content-Type: application/json" \
--data '{
"syncId": "sync-2024-05-14-001",
"employees": [
{
"firstName": "Anna",
"lastName": "Müller",
"email": "anna.mueller@example.com",
"profileImage": null,
"dateOfBirth": "1990-04-15",
"hrId": "emp_HR_001",
"startDate": "2022-03-01",
"terminationDate": null,
"autoSyncEmployee": null,
"absences": []
}
]
}'
import requests, base64
credentials = base64.b64encode(b"<clientId>:<clientSecret>").decode()
res = requests.post(
"https://v1-api.ticket-plus.app/hr-integrations/7/sync",
headers={
"Authorization": f"Basic {credentials}",
"Content-Type": "application/json",
},
json={
"syncId": "sync-2024-05-14-001",
"employees": [
{
"firstName": "Anna",
"lastName": "Müller",
"email": "anna.mueller@example.com",
"profileImage": None,
"dateOfBirth": "1990-04-15",
"hrId": "emp_HR_001",
"startDate": "2022-03-01",
"terminationDate": None,
"autoSyncEmployee": None,
"absences": [],
}
],
},
)
print(res.status_code) # 204
const credentials = Buffer.from("<clientId>:<clientSecret>").toString("base64");
const res = await fetch(
"https://v1-api.ticket-plus.app/hr-integrations/7/sync",
{
method: "POST",
headers: {
Authorization: `Basic ${credentials}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
syncId: "sync-2024-05-14-001",
employees: [
{
firstName: "Anna",
lastName: "Müller",
email: "anna.mueller@example.com",
profileImage: null,
dateOfBirth: "1990-04-15",
hrId: "emp_HR_001",
startDate: "2022-03-01",
terminationDate: null,
autoSyncEmployee: null,
absences: [],
},
],
}),
},
);
console.log(res.status); // 204
(empty body)
Trigger HR Sync
Push the current employee roster from your HR system to JobTicket.
curl --request POST \
--url "https://v1-api.ticket-plus.app/hr-integrations/7/sync" \
--header "Authorization: Basic <base64(clientId:clientSecret)>" \
--header "Content-Type: application/json" \
--data '{
"syncId": "sync-2024-05-14-001",
"employees": [
{
"firstName": "Anna",
"lastName": "Müller",
"email": "anna.mueller@example.com",
"profileImage": null,
"dateOfBirth": "1990-04-15",
"hrId": "emp_HR_001",
"startDate": "2022-03-01",
"terminationDate": null,
"autoSyncEmployee": null,
"absences": []
}
]
}'
import requests, base64
credentials = base64.b64encode(b"<clientId>:<clientSecret>").decode()
res = requests.post(
"https://v1-api.ticket-plus.app/hr-integrations/7/sync",
headers={
"Authorization": f"Basic {credentials}",
"Content-Type": "application/json",
},
json={
"syncId": "sync-2024-05-14-001",
"employees": [
{
"firstName": "Anna",
"lastName": "Müller",
"email": "anna.mueller@example.com",
"profileImage": None,
"dateOfBirth": "1990-04-15",
"hrId": "emp_HR_001",
"startDate": "2022-03-01",
"terminationDate": None,
"autoSyncEmployee": None,
"absences": [],
}
],
},
)
print(res.status_code) # 204
const credentials = Buffer.from("<clientId>:<clientSecret>").toString("base64");
const res = await fetch(
"https://v1-api.ticket-plus.app/hr-integrations/7/sync",
{
method: "POST",
headers: {
Authorization: `Basic ${credentials}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
syncId: "sync-2024-05-14-001",
employees: [
{
firstName: "Anna",
lastName: "Müller",
email: "anna.mueller@example.com",
profileImage: null,
dateOfBirth: "1990-04-15",
hrId: "emp_HR_001",
startDate: "2022-03-01",
terminationDate: null,
autoSyncEmployee: null,
absences: [],
},
],
}),
},
);
console.log(res.status); // 204
(empty body)
422 Unprocessable Entity error.curl --request POST \
--url "https://v1-api.ticket-plus.app/hr-integrations/7/sync" \
--header "Authorization: Basic <base64(clientId:clientSecret)>" \
--header "Content-Type: application/json" \
--data '{
"syncId": "sync-2024-05-14-001",
"employees": [
{
"firstName": "Anna",
"lastName": "Müller",
"email": "anna.mueller@example.com",
"profileImage": null,
"dateOfBirth": "1990-04-15",
"hrId": "emp_HR_001",
"startDate": "2022-03-01",
"terminationDate": null,
"autoSyncEmployee": null,
"absences": []
}
]
}'
import requests, base64
credentials = base64.b64encode(b"<clientId>:<clientSecret>").decode()
res = requests.post(
"https://v1-api.ticket-plus.app/hr-integrations/7/sync",
headers={
"Authorization": f"Basic {credentials}",
"Content-Type": "application/json",
},
json={
"syncId": "sync-2024-05-14-001",
"employees": [
{
"firstName": "Anna",
"lastName": "Müller",
"email": "anna.mueller@example.com",
"profileImage": None,
"dateOfBirth": "1990-04-15",
"hrId": "emp_HR_001",
"startDate": "2022-03-01",
"terminationDate": None,
"autoSyncEmployee": None,
"absences": [],
}
],
},
)
print(res.status_code) # 204
const credentials = Buffer.from("<clientId>:<clientSecret>").toString("base64");
const res = await fetch(
"https://v1-api.ticket-plus.app/hr-integrations/7/sync",
{
method: "POST",
headers: {
Authorization: `Basic ${credentials}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
syncId: "sync-2024-05-14-001",
employees: [
{
firstName: "Anna",
lastName: "Müller",
email: "anna.mueller@example.com",
profileImage: null,
dateOfBirth: "1990-04-15",
hrId: "emp_HR_001",
startDate: "2022-03-01",
terminationDate: null,
autoSyncEmployee: null,
absences: [],
},
],
}),
},
);
console.log(res.status); // 204
(empty body)
employees array will be offboarded in JobTicket. Always include every
currently active employee in the payload.Path Parameters
Body
syncId is safe — duplicate submissions will be deduplicated.Show employee object
Show employee object
null if not available.YYYY-MM-DD format.YYYY-MM-DD format.YYYY-MM-DD format. Set this when the employee is leaving the company or has been deleted from your HR system. Pass null if the employee is still active.true or false based on the custom field value. If you are not using a custom field to control subscriptions, this field is not applicable and should be set to null.[] if there are none.Show absence object
Show absence object
YYYY-MM-DD format.YYYY-MM-DD format.true if the absence has been approved. Set to false if the absence has been rejected or deleted from your HR system.Response
204 No Content — The sync has been accepted and will process in the
background. The response body is empty.Authorizations
HTTP Basic Auth using your API key credentials. Use the username and password issued from the Developer Portal. Encode them as Base64(username:password) and pass in the Authorization: Basic <token> header.
Path Parameters
The unique numeric ID of the HR integration to sync against.
Body
A unique identifier for this sync operation. Used for idempotency and audit logging. Use a UUID or timestamp-based string.
The complete current employee roster from your HR system. Must contain at least one employee. Employees absent from this list will be offboarded in JobTicket.
1Show child attributes
Show child attributes
Response
Sync accepted and will process in the background. The response body is empty.
Empty body on success.

