Read your company’s employees, departments, branches, shifts, holidays, attendance, overtime, attendance corrections, shift changes, leave, leave balances, work from home, permissions, assets, expenses, documents on file, onboarding, daily reports, announcements, projects, performance reviews and goals, job openings, clients and payroll totals from your own software, add new employees and job candidates, record clock-ins and apply for leave, and hear by webhook when people, leave or payroll change. One address, plain JSON, and every app approved by Soom before it reads anything. An app changes nothing unless Soom approved that change for it.
A company or HR admin registers it in Settings ▸ Integrations ▸ Soom API: what it’s for, who builds it and what it needs.
02
Soom approves it
Soom reads why it needs what it asks for and approves it. The admin then makes its client secret, shown once.
03
Call the API
Swap the client id and secret for an access token and send it on every call. Answers are plain JSON, a page at a time.
Getting access
Every app gets in the same way: a company or HR admin registers it in Soom, Soom approves it, and the app swaps its client id and secret for an access token that works for an hour. An app reaches its own company only, and only what Soom approved it for.
Register the app. A company or HR admin opens Settings ▸ Integrations ▸ Soom API ▸ Register an app and says what the app is called, why it needs Soom, who builds it and what it needs to read or change. The Soom API has to be on for the company: ask your Soom contact.
Soom approves it. Soom reads why the app needs what it asks for, then approves it, maybe for less, or says what to change. The admin gets an email either way. For more later, they tick it on the same page and Soom approves that too, while the app keeps what it has.
Make the client secret. Once approved, the admin makes the app’s client secret on the same page and gives it, with the client id, to whoever builds the app. The secret is shown once; a new one stops the old one and every token it got. Keep both on your server, never in a web page or an app people download.
Get an access token. Swap the client id and secret for an access token and send it on every call. When it runs out, get another the same way.
Every call goes to https://api.soom.co.in/api/public/v1 and carries the access token in the Authorization header.
The company can switch its app off in Soom, and Soom can stop it; either way it is refused on the next call.
Getting an access token
POST/oauth/token
Send your client id and secret as a form, like OAuth libraries do, or as JSON: this is OAuth 2.0’s client credentials grant. It answers in OAuth’s own shape, not the API’s data envelope. The access token works for 60 minutes, then calls answer 401 TOKEN_EXPIRED: get another the same way.
What to send
Field
What it is
grant_typeneeded
Always client_credentials.client_credentials
client_idneeded
Your app’s client id. Or send it and the secret as HTTP Basic auth.
client_secretneeded
Your app’s client secret.
scopeoptional
For a token that can do less than your app: tick names with spaces between, like employees leave. Everything the app is approved for when left out.
The answer has
Field
What it is
access_tokenstring
Send it as Authorization: Bearer on every call. It works for an hour.
token_typestring
Always Bearer.Bearer
expires_innumber
Seconds the access token works for.
scopestring
What the token can do: tick names with spaces between.
company_idstring
Your company’s id in Soom. Every webhook event carries it as company.id.
company_namestring
Your company’s name in Soom.
Errors
Error
What it means
invalid_clientHTTP 401
The client id or secret is wrong. A new client secret stops the old one at once.
unauthorized_clientHTTP 400
Soom hasn’t approved the app yet, didn’t approve it or stopped it; the company switched the app or the Soom API off; or the company’s Soom account isn’t active. error_description says which.
invalid_scopeHTTP 400
scope asks for something the app isn’t approved for.
unsupported_grant_typeHTTP 400
grant_type must be client_credentials.
To end a token before its hour is up, post it as token to /oauth/revoke with your client id and secret.
Every address that reads answers with a list, a page at a time. Send page (from 1) and limit (up to 200; 25 when left out). total counts every item that matches, on all pages together.
Dates are written like 2026-11-30. Times are in UTC, like 2026-11-30T04:12:00.000Z.
Making changes
An address that changes something takes JSON, sent with Content-Type: application/json, and answers 201 with what it made. It goes through the same checks as Soom’s own screens. An app makes only the changes Soom approved for it; any other gets 403 SCOPE_MISSING.
Sending the same thing twice is safe: adding someone whose email is already in Soom answers 409 EMAIL_IN_USE and adds nobody, a clock-in sent again for the same day updates that day, and a leave sent again answers 409 LEAVE_OVERLAPS.
Errors
A call that fails answers with success: false and an error code you can act on.
{
"success": false,
"error": {
"code": "SCOPE_MISSING",
"message": "This app can’t read attendance. Ask for it in Settings ▸ Integrations ▸ Soom API."
}
}
Code
What it means
VALIDATION_ERRORHTTP 400
A filter, or a field you sent, is missing or isn’t valid. The message says which.
UNAUTHORIZEDHTTP 401
No access token, or it isn’t in the Authorization header.
INVALID_TOKENHTTP 401
The access token is wrong or was ended, or its app was switched off by the company or stopped by Soom.
TOKEN_EXPIREDHTTP 401
The access token has run out: each works for an hour. Get a new one with your client id and secret.
SCOPE_MISSINGHTTP 403
Your app isn’t approved for this. Ask for it in Settings ▸ Integrations ▸ Soom API, and Soom approves it.
API_ACCESS_OFFHTTP 403
The Soom API is switched off for this company.
TENANT_UNAVAILABLEHTTP 403
The company’s Soom account isn’t active.
FEATURE_OFFHTTP 403
This part of Soom, like overtime, time off, shift changes, assets, expenses, documents, onboarding, daily reports, announcements, projects, performance, recruitment or clients, isn’t switched on for the company, so there is nothing to read or add.
NOT_FOUNDHTTP 404
There is no such address.
BALANCES_IN_PAYROLLHTTP 409
The company keeps its leave balances in Xero, so Soom has none to give. Its leave is still in List leave.
PAYROLL_IN_XEROHTTP 409
The company runs its payroll in Xero, so Soom has no payroll runs or payslips to give.
EMAIL_IN_USEHTTP 409
Someone in Soom already signs in with that email, so nobody was added. Sending the same person twice gets this too.
CODE_IN_USEHTTP 409
Someone in the company already has that employee code, so nobody was added.
DAY_TAKENHTTP 409
That day already has times from somewhere else in Soom (clocked in there, typed by HR, regularized or synced), so they weren’t changed. HR can change them in Soom.
ON_LEAVEHTTP 409
The person is on approved leave all that day. That day’s leave has to be cancelled in Soom first.
PAYROLL_LOCKEDHTTP 409
That month’s payroll is locked, so its days can’t change.
LEAVE_OVERLAPSHTTP 409
The person already has leave, pending or approved, on some of those days. Sending the same leave twice gets this too.
TIMEOFF_OVERLAPSHTTP 409
The person has a request to work from home, or a permission, on those days, and the company doesn’t allow leave on the same days.
DAY_WORKEDHTTP 409
The person clocked in on a day the leave would cover in full. Ask for half that day, or apply in Soom, where the clock-in can be cancelled.
JOB_NOT_OPENHTTP 409
The job is on hold, closed or filled, so nobody can be added to it.
CANDIDATE_EXISTSHTTP 409
Someone with that email is already a candidate for that job, so nobody was added. Sending the same person twice gets this too.
LEAVE_NOT_ALLOWEDHTTP 422
The leave type’s rules don’t allow this leave: who can take it, the notice it needs, the fewest or most days, a document it needs, or it is no longer in use. Or every day is a weekly off or holiday. The message says which, ready to show the person.
RATE_LIMITEDHTTP 429
Too many calls this minute. Wait for the seconds in the Retry-After header, then try again.
Usage limits
Each app has its own calls a minute, set by your admin in Settings ▸ Integrations ▸ Soom API: 60 to start, up to 300. One address can make up to 300 calls a minute in all. Past either, the answer is 429 RATE_LIMITED with a Retry-After header saying how many seconds to wait. Ask for big pages rather than many small ones.
Employees
The people in the company: who they are, where they sit and who they report to. And adding someone new.
List employees
GET/employees
Everyone in the company, in employee code order. People who have left are only listed when you ask for them. Needs an app approved for Employees.
Filters
Filter
What it does
statusoptional
current (the default) is everyone still working, exited is people who have left, all is both.currentexitedall
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the person.
employeeCodestring or null
The code your company gave them.
firstNamestring
First name.
lastNamestring
Last name.
emailstring
The email they sign in to Soom with.
jobTitlestring or null
Job title.
employeeTypestring or null
Kind of employment.administratorconsultantcontractorfulltimehourlyfulltimeinternshipfulltimesalariedparttimehourlyparttimeinternshipparttimesalariedcasual
statusstring
Where they are in their time with the company. invited is someone who hasn’t signed in yet.invitedactiveprobationonNoticeexitedsuspended
departmentobject or null
Their department.
department.idstring
Soom’s id for it, the id in List departments.
department.namestring
Its name.
designationobject or null
Their designation.
designation.idstring
Soom’s id for it, the id in List designations.
designation.namestring
Its name.
locationobject or null
The branch they work at. Their days and shift times run on its time zone.
location.idstring
Soom’s id for it, the id in List locations.
location.namestring
Its name.
reportingManagerobject or null
Who they report to.
reportingManager.idstring
Soom’s id for the person, the id in List employees.
reportingManager.employeeCodestring or null
The code your company gave them.
reportingManager.namestring
First and last name.
hireDatedate or null
The day they joined.
exitDatedate or null
The day they left, when they have.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Adds one person, as HR ▸ Employees ▸ Add employee does: Soom emails them an invite to sign in, and HR sees they were added through the Soom API. They are invited until they sign in. Needs an app approved for Add employees.
What to send
Field
What it is
firstNamestring, needed
First name.
lastNamestring, needed
Last name.
emailstring, needed
The email they will sign in with. No one in Soom can have it already.
employeeCodestring, optional
Their employee code. The one after your latest code when left out.
jobTitlestring, optional
Job title.
employeeTypestring, optional
Kind of employment.administratorconsultantcontractorfulltimehourlyfulltimeinternshipfulltimesalariedparttimehourlyparttimeinternshipparttimesalariedcasual
departmentIdstring, optional
Their department, an id from List departments.
designationIdstring, optional
Their designation, an id from List designations.
locationIdstring, optional
The branch they work at, an id from List locations.
shiftIdstring, optional
A shift of their own, an id from List shifts. Without one they work the default shift.
reportingManagerIdstring, optional
Who they report to, the id of someone still working, from List employees.
hireDatedate, optional
The day they join, like 2026-12-01.
The answer has
Field
What it is
employeeobject
The new person, as List employees gives them.
employee.idstring
Soom’s id for the person.
employee.employeeCodestring or null
The code your company gave them.
employee.firstNamestring
First name.
employee.lastNamestring
Last name.
employee.emailstring
The email they sign in to Soom with.
employee.jobTitlestring or null
Job title.
employee.employeeTypestring or null
Kind of employment.administratorconsultantcontractorfulltimehourlyfulltimeinternshipfulltimesalariedparttimehourlyparttimeinternshipparttimesalariedcasual
employee.statusstring
Where they are in their time with the company. invited is someone who hasn’t signed in yet.invitedactiveprobationonNoticeexitedsuspended
employee.departmentobject or null
Their department.
employee.department.idstring
Soom’s id for it, the id in List departments.
employee.department.namestring
Its name.
employee.designationobject or null
Their designation.
employee.designation.idstring
Soom’s id for it, the id in List designations.
employee.designation.namestring
Its name.
employee.locationobject or null
The branch they work at. Their days and shift times run on its time zone.
employee.location.idstring
Soom’s id for it, the id in List locations.
employee.location.namestring
Its name.
employee.reportingManagerobject or null
Who they report to.
employee.reportingManager.idstring
Soom’s id for the person, the id in List employees.
employee.reportingManager.employeeCodestring or null
The code your company gave them.
employee.reportingManager.namestring
First and last name.
employee.hireDatedate or null
The day they joined.
employee.exitDatedate or null
The day they left, when they have.
employee.updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
inviteEmailSentboolean
false when the invite email couldn’t go. HR can send it again from HR ▸ Employees.
How the company is set up in Soom: its departments, designations, branches, shifts and holidays, each with the id employees point at.
List departments
GET/departments
Every department, in the order Settings ▸ Departments shows them. Needs an app approved for Company setup.
Filters
Filter
What it does
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the department, the id in an employee’s department.
namestring
Department name.
descriptionstring or null
What it does, when written down.
headobject or null
Who heads it.
head.idstring
Soom’s id for the person, the id in List employees.
head.employeeCodestring or null
The code your company gave them.
head.namestring
First and last name.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every designation, in the order Settings ▸ Designations shows them. Needs an app approved for Company setup.
Filters
Filter
What it does
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the designation, the id in an employee’s designation.
namestring
Designation name.
descriptionstring or null
What it means, when written down.
departmentobject or null
The department it belongs to, when it has one.
department.idstring
Soom’s id for it, the id in List departments.
department.namestring
Its name.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every branch, in the order Settings ▸ Locations shows them, with the time zone its people work on. Needs an app approved for Company setup.
Filters
Filter
What it does
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the branch, the id in an employee’s location.
namestring
Branch name.
citystring or null
City.
statestring or null
State.
countrystring or null
Country.
timezonestring
Time zone, like Asia/Kolkata: the clock its people’s days and shift times run on. The company’s own when the branch has none set.
isHeadquartersboolean
true for the head office.
managerobject or null
The branch manager.
manager.idstring
Soom’s id for the person, the id in List employees.
manager.employeeCodestring or null
The code your company gave them.
manager.namestring
First and last name.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every shift, with its hours, break and working days, and the rules that make a day late or a half day. Needs an app approved for Company setup.
Filters
Filter
What it does
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the shift.
namestring
Shift name.
startTimestring
When it starts, like 09:30, on the clock of the branch each person works at.
endTimestring
When it ends, like 18:30. Earlier than startTime when it ends the next morning.
isOvernightboolean
true when it ends the next morning.
breakMinutesnumber
Minutes of break in it.
workMinutesnumber
A full day on it less the break: what a day of leave or a holiday counts as.
workingDayslist of strings
The days it is worked. A person can have their own working days, and theirs win.MondayTuesdayWednesdayThursdayFridaySaturdaySunday
graceMinutesnumber
Minutes after the start someone can clock in without being late. The company’s grace when the shift has none of its own.
halfDayHoursnumber
A day worked shorter than this many hours is a half day. 0 means there is no such rule.
isDefaultboolean
true for the shift everyone without a shift of their own works.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every holiday in a year, by date, with the branches it is for. Needs an app approved for Company setup.
Filters
Filter
What it does
yearoptional
Holidays in this year, like 2026. This year on the company’s clock when left out.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the holiday.
datedate
The day.
namestring
Holiday name.
typestring
public is a day off for the people it covers. optional keeps the office open: it is marked on calendars, and leave taken for it counts.publicoptional
descriptionstring or null
A note about it, when written down.
locationslist
The branches it is for. Empty means the whole company, and someone with no branch only gets those.
locations[].idstring
Soom’s id for the branch, the id in List locations.
locations[].namestring
Branch name.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Each person’s days: clock-in and clock-out times and how the day turned out, the overtime they claimed, and what they asked to change: a day’s times, or the shift they work. And recording clock-ins from a clock of your own.
List attendance days
GET/attendance
Every day with a record between two dates, newest first. A day nobody has a record for yet is not listed. Needs an app approved for Attendance.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Days on these dates are listed.
toneeded
Last day, on or after from.
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
employeeobject or null
Who it belongs to.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
datedate
The working day.
statusstring
How the day turned out. absent is a working day with no clock-in and no leave.presentlatehalf_dayabsentleavewfhpermissionholidayoff
clockIndate-time or null
When they clocked in, in UTC.
clockOutdate-time or null
When they clocked out, in UTC.
workedMinutesnumber
Minutes worked, less the shift’s break.
lateMinutesnumber
Minutes late, after the grace period.
earlyLeaveMinutesnumber
Minutes left before the shift ended.
workFromstring or null
Where they worked from.officewfh
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Records when someone clocked in, and when they clocked out once they have, judged as their own clock-in in Soom is: the day on their branch’s clock, late and early against their shift, nothing late on a weekly off. Send the same day again with clockOut when they leave. It answers 201 when it starts a day and 200 when it updates one it started. A day with times from anywhere else in Soom is never changed. Needs an app approved for Record clock-ins.
What to send
Field
What it is
employeeCodestring, needed
Who clocked in, by the employee code your company gave them.
clockIndate-time, needed
When they clocked in, with its offset like 2026-11-09T09:28:00+05:30, or in UTC ending in Z.
clockOutdate-time, optional
When they clocked out. Leave it out until they have; a clock-out already recorded is kept when it is left out.
datedate, optional
The working day it belongs to: the clock-in’s own day on their branch’s clock when left out. Send it for a night shift clocked in after midnight; it can only be that day or the day before.
workFromstring, optional
Where they worked from. When left out: home on a day they have an approved request to work from home, or if they always work from home, else the office.officewfh
The answer has
Field
What it is
dayobject
The day, as List attendance days gives it.
day.employeeobject or null
Who it belongs to.
day.employee.idstring
Soom’s id for the person, the id in List employees.
day.employee.employeeCodestring or null
The code your company gave them.
day.employee.namestring
First and last name.
day.datedate
The working day.
day.statusstring
How the day turned out. absent is a working day with no clock-in and no leave.presentlatehalf_dayabsentleavewfhpermissionholidayoff
day.clockIndate-time or null
When they clocked in, in UTC.
day.clockOutdate-time or null
When they clocked out, in UTC.
day.workedMinutesnumber
Minutes worked, less the shift’s break.
day.lateMinutesnumber
Minutes late, after the grace period.
day.earlyLeaveMinutesnumber
Minutes left before the shift ended.
day.workFromstring or null
Where they worked from.officewfh
day.updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
createdboolean
true when this started the day, false when it updated a day it started before.
Overtime claimed for days between two dates, newest first. In Soom, time on the clock past the end of a shift is overtime only once someone claims it and the claim is approved, so only approved claims are listed unless you ask for others. Needs an app approved for Attendance.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Claims for days on these dates are listed.
toneeded
Last day, on or after from.
statusoptional
approved (the default), pending, rejected, or all of them.approvedpendingrejectedall
kindoptional
Only extra hours on working days, or only work on weekly offs.extra_hoursweekly_off
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the claim.
employeeobject or null
Who claimed it.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
datedate
The day worked.
kindstring
extra_hours is time worked past a working day. weekly_off is working on a day off.extra_hoursweekly_off
minutesnumber or null
Minutes claimed, for extra hours. null for a weekly off, which is claimed as a day: its hours are that day’s workedMinutes in List attendance days.
enteredByHandboolean
true when they typed the hours, as for work done after leaving. false when the hours come from their clock times.
statusstring
Where it stands. pending is still with an approver or HR.pendingapprovedrejected
decisionstring or null
How approved overtime is given: paid, or comp_off as days of leave. null until it is approved.paidcomp_off
compOffDaysnumber or null
Days of leave given for it, when decision is comp_off.
appliedAtdate-time or null
When it was claimed, in UTC.
decidedAtdate-time or null
When it was approved or rejected, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Requests to correct a day’s clock-in or clock-out time, for days between two dates, newest first. Soom calls them regularizations. Once one is approved, the day in List attendance days has the corrected times. Why it was asked for, and what approvers wrote, stay in Soom. Needs an app approved for Attendance.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Requests for days on these dates are listed.
toneeded
Last day, on or after from.
statusoptional
Only requests with this status.pendingapprovedrejectedcancelled
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the request.
employeeobject or null
Who asked.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
datedate
The day to correct.
clockIndate-time or null
The clock-in time asked for, in UTC. null when only the clock-out is to change.
clockOutdate-time or null
The clock-out time asked for, in UTC. null when only the clock-in is to change.
statusstring
Where it stands.pendingapprovedrejectedcancelled
appliedAtdate-time or null
When it was asked for, in UTC.
decidedAtdate-time or null
When it was approved or rejected, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Requests to work another shift on a day, for days between two dates, newest first. Once one is approved, they work that shift that day, and Soom judges the day against it. Why it was asked for, and what approvers wrote, stay in Soom. Needs an app approved for Attendance.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Requests for days on these dates are listed.
toneeded
Last day, on or after from.
statusoptional
Only requests with this status.pendingapprovedrejectedcancelled
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the request.
employeeobject or null
Who asked.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
datedate
The day.
fromShiftobject or null
The shift they had that day when they asked. null when they had none.
fromShift.idstring
Soom’s id for it, the id in List shifts.
fromShift.namestring
Its name.
toShiftobject or null
The shift they asked to work instead.
toShift.idstring
Soom’s id for it, the id in List shifts.
toShift.namestring
Its name.
statusstring
Where it stands.pendingapprovedrejectedcancelled
appliedAtdate-time or null
When it was asked for, in UTC.
decidedAtdate-time or null
When it was approved or rejected, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Leave people applied for or HR added, the company’s leave types, and what each person has left. And applying for leave for someone.
List leave
GET/leave
Every leave that touches the dates you give, latest start first, whatever its status unless you pick one. Needs an app approved for Leave.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Leave that touches any day from here to to is listed.
toneeded
Last day, on or after from.
statusoptional
Only leave with this status.pendingapprovedrejectedcancelled
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the leave.
employeeobject or null
Who it belongs to.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
leaveTypeobject or null
The leave type.
leaveType.idstring
Soom’s id for it, the id in List leave types.
leaveType.namestring
Its name.
startDatedate
First day of the leave.
endDatedate
Last day of the leave.
daysnumber
Days it takes, with half days as 0.5.
dayBreakdownlist
Each day it covers, and which part of it.
dayBreakdown[].datedate
The day.
dayBreakdown[].portionstring
The whole day, or the first or second half.fullfirstHalfsecondHalf
statusstring
Where it stands.pendingapprovedrejectedcancelled
appliedAtdate-time or null
When it was applied for, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Applies for leave for someone, as they would in Soom: weekly offs and holidays aren’t counted, the leave type’s rules hold (who can take it, the notice it needs, the fewest and most days), and it goes to their approvers, who are told as usual. It is pending until they decide, unless the person approves their own leave. A leave type that needs a document has to be applied for in Soom. Needs an app approved for Apply for leave.
What to send
Field
What it is
employeeCodestring, needed
Who the leave is for, by the employee code your company gave them.
leaveTypeIdstring, needed
The leave type, an id from List leave types. It has to be in use.
startDatedate, needed
First day of the leave, like 2026-11-26. It can be a day gone by, when the leave type needs no notice.
endDatedate, needed
Last day, on or after startDate. The same day for a one-day leave.
startPortionstring, optional
How much of startDate they are away: the whole day when left out, or only its first half (the morning) or second half.fullfirstHalfsecondHalf
endPortionstring, optional
How much of endDate they are away, for a leave longer than one day: the whole day when left out.fullfirstHalfsecondHalf
reasonstring, needed
Why, in their words, up to 1000 characters. Their approvers read it.
The answer has
Field
What it is
leaveobject
The leave, as List leave gives it.
leave.idstring
Soom’s id for the leave.
leave.employeeobject or null
Who it belongs to.
leave.employee.idstring
Soom’s id for the person, the id in List employees.
leave.employee.employeeCodestring or null
The code your company gave them.
leave.employee.namestring
First and last name.
leave.leaveTypeobject or null
The leave type.
leave.leaveType.idstring
Soom’s id for it, the id in List leave types.
leave.leaveType.namestring
Its name.
leave.startDatedate
First day of the leave.
leave.endDatedate
Last day of the leave.
leave.daysnumber
Days it takes, with half days as 0.5.
leave.dayBreakdownlist
Each day it covers, and which part of it.
leave.dayBreakdown[].datedate
The day.
leave.dayBreakdown[].portionstring
The whole day, or the first or second half.fullfirstHalfsecondHalf
leave.statusstring
Where it stands.pendingapprovedrejectedcancelled
leave.appliedAtdate-time or null
When it was applied for, in UTC.
leave.updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
beyondBalanceboolean
true when it asks for more days than they had available. It still goes for approval, and their available in List leave balances drops below 0.
Every leave type, in use or not, by name as Settings ▸ Leave Types lists them, with how its days are given and the rules for asking for it. Needs an app approved for Leave.
Filters
Filter
What it does
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the leave type, the id in a leave’s leaveType.
namestring
Leave type name.
codestring
Its short code, like CL.
descriptionstring or null
What it is for, when written down.
colorstring
The colour Soom shows it in, like #22C55E.
isPaidboolean
false for leave without pay.
accrualstring
How days are given. upfront gives the year’s days on 1 January, or on the 1st after someone joins. monthly adds daysPerMonth on the 1st of each month. none gives nothing on a schedule: days come only from comp-off or from HR.upfrontmonthlynone
daysPerYearnumber
Days given over a year. Less than 12 × daysPerMonth when some months give none.
daysPerMonthnumber
Days added each month, when accrual is monthly. 0 otherwise.
carriesForwardboolean
true when days left at the end of the year move into the next. false when they lapse.
carryForwardMaxDaysnumber
The most days that move into the next year. 0 means no limit.
hasBalanceboolean
false for leave kept off the balances, like maternity: it isn’t in List leave balances, and a request for it is never short of days.
minDaysPerRequestnumber
The fewest days one request can be for. 0.5 is half a day, 0 is any length.
maxDaysPerRequestnumber
The most days one request can be for. 0 means no limit.
noticeDaysnumber
Days ahead it has to be asked for. 0 means no notice is needed.
attachmentRequiredboolean
true when a request needs a document, like a doctor’s note.
eligibilityobject
Who can take it.
eligibility.genderstring
all, or only people of this gender.allmalefemale
eligibility.employeeTypeslist of strings
Only people with these kinds of employment, the employeeType in List employees. Empty means everyone.
isActiveboolean
false when it can’t be asked for any more. Older leave can still be of this type.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
What each person has of every leave type they can take, for one year, in employee code order: the figures HR ▸ Leave Balances shows. A company that keeps its leave balances in Xero has none in Soom, and gets BALANCES_IN_PAYROLL. Needs an app approved for Leave.
Filters
Filter
What it does
yearoptional
Balances for this year, like 2026. This year on the company’s clock when left out.
statusoptional
current (the default) is everyone still working, exited is people who have left, all is both.currentexitedall
employeeCodeoptional
Only this person, by the employee code your company gave them.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
employeeobject
Whose balances they are.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
yearnumber
The year, January to December.
balanceslist
One for each leave type they can take, by name. Types kept off the balances, and types not in use, are left out.
balances[].leaveTypeobject
The leave type.
balances[].leaveType.idstring
Soom’s id for it, the id in List leave types.
balances[].leaveType.namestring
Its name.
balances[].entitlednumber
Days given for the year so far, with any carried forward and HR’s changes.
balances[].usednumber
Days of approved leave.
balances[].pendingnumber
Days asked for and waiting for approval.
balances[].carriedForwardnumber
Days brought from last year, already counted in entitled.
balances[].encashednumber
Days paid out, or set aside to be paid out, instead of taken.
balances[].availablenumber
Days they can still ask for: entitled less used, pending and encashed. Below 0 when more was approved than they had.
Requests to work from home, and permissions: a few hours away during a working day.
List work from home
GET/work-from-home
Every request to work from home that touches the dates you give, latest start first. Someone who picked work from home when clocking in, with no request, is in List attendance days with workFrom wfh. Needs an app approved for Time off.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Requests that touch any day from here to to are listed.
toneeded
Last day, on or after from.
statusoptional
Only requests with this status.pendingapprovedrejectedcancelled
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the request.
employeeobject or null
Who it belongs to.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
startDatedate
First day.
endDatedate
Last day.
daysnumber
Days from startDate to endDate, both counted.
statusstring
Where it stands.pendingapprovedrejectedcancelled
appliedAtdate-time or null
When it was asked for, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every permission on the dates you give, latest first. A permission is a few hours away from work within a working day, like leaving at 2 for an appointment. Needs an app approved for Time off.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Permissions on these dates are listed.
toneeded
Last day, on or after from.
statusoptional
Only permissions with this status.pendingapprovedrejectedcancelled
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the permission.
employeeobject or null
Who it belongs to.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
datedate
The day.
fromTimestring or null
When it starts, like 14:00, on the clock of the branch they work at.
toTimestring or null
When it ends, like 16:00.
hoursnumber
Hours away, to 2 decimal places.
statusstring
Where it stands.pendingapprovedrejectedcancelled
appliedAtdate-time or null
When it was asked for, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
The company’s equipment: what it owns, who has each item now and who had it before, and what people have asked for.
List assets
GET/assets
Everything the company owns, in asset code order, with who has it now. Needs an app approved for Assets.
Filters
Filter
What it does
statusoptional
Only assets in this state.in_stockassignedunder_repairlostretired
categoryoptional
Only this kind, a code from List asset categories.
employeeCodeoptional
Only what this person has now, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the asset.
assetCodestring
The code on its label, like LT-0042.
namestring
Its name.
categoryobject
The kind of asset.
category.codestring
Its code, from List asset categories, or other.
category.namestring
Its name.
brandstring or null
Who made it.
modelstring or null
Its model.
serialNumberstring or null
Its serial number.
statusstring
Where it stands. in_stock is free to hand out. Something under_repair can still be with someone.in_stockassignedunder_repairlostretired
locationobject or null
The branch it belongs to.
location.idstring
Soom’s id for it, the id in List locations.
location.namestring
Its name.
heldByobject or null
Who has it now. null when nobody does.
heldBy.idstring
Soom’s id for the person, the id in List employees.
heldBy.employeeCodestring or null
The code your company gave them.
heldBy.namestring
First and last name.
heldSincedate-time or null
When they were given it, in UTC.
expectedReturnDatedate or null
When they are due to give it back, if a day was set.
purchaseDatedate or null
When the company bought it.
warrantyEndDatedate or null
The last day of its warranty.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
The kinds of asset the company keeps, in the order Settings ▸ Asset Categories lists them. A company that never changed them has Soom’s own. Needs an app approved for Assets.
Filters
Filter
What it does
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
codestring
Its code, the code in an asset’s category.
namestring
Its name.
isActiveboolean
false when nothing new can be added to it. Older assets can still be of this kind.
Every time an asset was handed to someone, newest first: who had it, from when, and when they gave it back. Needs an app approved for Assets.
Filters
Filter
What it does
statusoptional
open is what people still have, returned is what came back, all (the default) is both.openreturnedall
employeeCodeoptional
Only this person, by the employee code your company gave them.
assetCodeoptional
Only this asset, by the code on its label.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the hand-over.
assetobject or null
The asset.
asset.idstring
Soom’s id for the asset, the id in List assets.
asset.assetCodestring
The code on its label.
asset.namestring
Its name.
employeeobject or null
Who was given it.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
assignedAtdate-time
When they were given it, in UTC.
acknowledgedAtdate-time or null
When they confirmed in Soom that they have it.
expectedReturnDatedate or null
When they are due to give it back, if a day was set.
returnedAtdate-time or null
When it came back, in UTC. null while they still have it.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
What people have asked for, newest first. An approved request is waiting to be handed over; a fulfilled one has been, with the asset they were given. Why they asked is not shared. Needs an app approved for Assets.
Filters
Filter
What it does
statusoptional
Only requests with this status.pendingapprovedrejectedfulfilledcancelled
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the request.
employeeobject or null
Who asked.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
categoryobject
The kind of asset.
category.codestring
Its code, from List asset categories, or other.
category.namestring
Its name.
descriptionstring
What they asked for, in their words.
urgencystring
How soon they need it.lownormalhigh
statusstring
Where it stands.pendingapprovedrejectedfulfilledcancelled
appliedAtdate-time or null
When they asked, in UTC.
decidedAtdate-time or null
When it was approved or rejected, in UTC.
fulfilledAtdate-time or null
When it was handed over, in UTC.
assetobject or null
The asset they were given, once it was handed over.
asset.idstring
Soom’s id for the asset, the id in List assets.
asset.assetCodestring
The code on its label.
asset.namestring
Its name.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Expense claims people made and payment vouchers the company recorded: what was spent, where each stands and how it was paid. Receipts, bank details and approvers are never shared.
List expenses
GET/expenses
Every claim and voucher spent on the days you give, newest first, or paid on them with by=paid. A claim with several bills lists each bill too. Needs an app approved for Expenses.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Days are the company’s, and are the day on the bill unless by is paid.
toneeded
Last day, on or after from.
byoptional
spent (the default) picks expenses by the day on the bill; paid picks them by the day they were paid, and lists only paid ones.spentpaid
statusoptional
Only expenses at this stage.in_reviewto_be_paidpaidrejected
kindoptional
claim is someone’s own spending, paid back to them; voucher is a payment the company made to a vendor.claimvoucher
categoryoptional
Only this category, a code from List expense categories. A claim with several bills is listed when any bill is in it.
employeeCodeoptional
Only this person’s: what they claimed, or are paid back for.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the expense.
expenseNostring or null
Its number in Soom, like EXP-00042.
kindstring
claim or voucher.claimvoucher
employeeobject or null
Who made the claim, or who recorded the voucher.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
reimburseToobject or null
Who the company pays back: usually who made the claim, or the person they claimed for. null for a voucher.
reimburseTo.idstring
Soom’s id for the person, the id in List employees.
reimburseTo.employeeCodestring or null
The code your company gave them.
reimburseTo.namestring
First and last name.
vendorstring or null
Who the money went to, when written down.
categoryobject
Its category.
category.codestring
Its code, from List expense categories.
category.namestring
The company’s name for it.
otherCategorystring or null
What it was, typed when the category is other. Several categories for a claim whose bills are in more than one.
descriptionstring
What it was for.
expenseDatedate
The day on the bill; the earliest bill’s for a claim with several.
amountnumber
How much, in the company’s currency; the bills added up for a claim with several.
statusstring
Where it stands: in_review with its approvers, to_be_paid once they accepted it, then paid, or rejected.in_reviewto_be_paidpaidrejected
submittedAtdate-time or null
When it was made in Soom, in UTC.
acceptedAtdate-time or null
When its approvers accepted it to be paid, in UTC.
paidAtdate-time or null
When it was paid, in UTC. A payment recorded for an earlier day reads noon that day on the company’s clock.
paymentMethodstring or null
How it was paid.cashbank_transferupichequecredit_cardother
paymentNotesstring or null
What was noted when it was paid, like the bank reference.
paidTogetherIdstring or null
The same on every expense paid as one payment. null for one paid on its own. Linking payments together later doesn’t change updatedAt.
rejectedAtdate-time or null
When it was rejected, in UTC.
billslist
Each bill of a claim that has several. Empty for an expense with one bill, which is the expense itself.
bills[].categoryobject
Its category.
bills[].category.codestring
Its code, from List expense categories.
bills[].category.namestring
The company’s name for it.
bills[].otherCategorystring or null
What it was, typed when the category is other.
bills[].expenseDatedate
The day on the bill.
bills[].amountnumber
How much.
bills[].vendorstring or null
Who it was paid to.
bills[].notestring or null
What the bill was for.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
The categories people pick from, in the company’s order: Soom’s own, renamed or turned off as the company chose, and any the company added. Needs an app approved for Expenses.
Filters
Filter
What it does
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
codestring
Its code, the code in an expense’s category. Soom’s own are words like travel; the company’s own start with c_.
namestring
Its name.
isActiveboolean
false when it can’t be picked for a new expense. Older expenses can still be in it.
Which documents each person has on file, by the company’s document categories, and the required ones they haven’t given yet. The files, their names and the numbers on them never leave Soom.
List employee documents
GET/employee-documents
Everyone’s documents on file, a person to a row in employee code order: the category and when each was added, and the required categories they still miss. Never the files themselves. Needs an app approved for Documents.
Filters
Filter
What it does
statusoptional
current (the default) is everyone still working, exited is people who have left, all is both.currentexitedall
employeeCodeoptional
Only this person, by the employee code your company gave them.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
employeeobject
Whose documents they are.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
documentslist
Each document they have, by category in the company’s order, then oldest first.
documents[].categoryobject
The category it is filed under.
documents[].category.idstring or null
Soom’s id for the category, the id in List document categories. null when that category has since been removed.
documents[].category.namestring
Its name.
documents[].uploadedAtdate-time or null
When it was added, in UTC.
documents[].uploadedBystring or null
self when they added it themselves, hr when HR did.selfhr
missinglist
The required categories they have nothing in yet.
missing[].idstring
Soom’s id for the category, the id in List document categories.
The kinds of document the company keeps on its people, in the order Settings ▸ Document Categories lists them. Needs an app approved for Documents.
Filters
Filter
What it does
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the category.
namestring
Its name.
descriptionstring or null
What goes in it, when written down.
isRequiredboolean
true when everyone should have one. List employee documents names who doesn’t yet.
allowsMultipleboolean
true when a person can keep several files in it; false keeps one.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
{
"success": true,
"data": {
"items": [
{
"id": "665f0a11b7e94d0012a3b701",
"name": "PAN card",
"description": "A copy of the PAN card, for TDS.",
"isRequired": true,
"allowsMultiple": false,
"updatedAt": "2026-11-12T06:40:00.000Z"
}
],
"total": 1,
"page": 1,
"limit": 50
}
}
Onboarding
Each joiner’s onboarding: its steps and its checklist, and which are done. What people signed, uploaded or filled in stays in Soom.
List onboarding
GET/onboarding
Every onboarding, latest start first, with its steps and checklist in the order its template has them. Needs an app approved for Onboarding.
Filters
Filter
What it does
statusoptional
Only onboardings with this status.inProgresscompletedcancelled
employeeCodeoptional
Only this joiner’s, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the onboarding.
employeeobject or null
Who is joining.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
templatestring or null
The template it was started from.
statusstring
Where it stands.inProgresscompletedcancelled
startDatedate
The day it started, usually the day they join.
completedAtdate-time or null
When it was finished, by the joiner or by HR, in UTC.
stepslist
What the joiner goes through, in order.
steps[].titlestring
What it is.
steps[].typestring
consent is signing a form, document is uploading one, profileFields is filling in their details, policy is reading a policy, video is watching one, task is something to do.consentdocumentprofileFieldspolicyvideotask
steps[].requiredboolean
true when it has to be done to finish.
steps[].dueDatedate or null
When it is due.
steps[].doneboolean
true once it is done.
steps[].doneAtdate-time or null
When it was done, in UTC.
taskslist
The checklist around it, like ordering a laptop.
tasks[].titlestring
What it is.
tasks[].assigneestring
Who does it: HR, or the joiner.hremployee
tasks[].dueDatedate or null
When it is due.
tasks[].doneboolean
true once it is done.
tasks[].completedAtdate-time or null
When it was done, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
What people wrote they worked on each day: each piece of work, how long it took, where it stands, and the client it was for.
List daily reports
GET/daily-reports
Every daily report for days between two dates, newest first. A person has one a day at most. Needs an app approved for Daily reports.
Filters
Filter
What it does
fromneeded
First day, like 2026-11-01. Reports for days on these dates are listed.
toneeded
Last day, on or after from.
clientIdoptional
Only reports with work for this client, an id from List clients.
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the report.
employeeobject or null
Whose report it is.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
datedate
The day it is about.
taskslist
What they worked on.
tasks[].descriptionstring
What they did.
tasks[].minutesnumber
How long it took, in minutes.
tasks[].statusstring
Where it stands.completedin_progressblocked
tasks[].clientobject or null
The client it was for, when it was for one of the company’s clients.
tasks[].client.idstring
Soom’s id for it, the id in List clients.
tasks[].client.namestring
Its name.
tasks[].companystring or null
Who it was for, as they wrote it, when it wasn’t one of the company’s clients.
totalMinutesnumber
All its minutes added up.
submittedAtdate-time or null
When it was sent, in UTC.
editedAtdate-time or null
When it was last changed after that, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every announcement, pinned ones first and then newest first, as Soom shows them. Needs an app approved for Announcements.
Filters
Filter
What it does
typeoptional
Only notices, or only celebrations.noticecelebration
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the announcement.
titlestring
Its title.
bodystring
What it says, as HTML with only these tags: p, br, strong, em, u, s, ul, ol, li, a, h1 to h3, blockquote, code, pre and img.
typestring
notice is news for everyone, like a deadline or an office closing; celebration is a greeting, like for a festival.noticecelebration
pinnedboolean
true when it is pinned to the top.
publishedByobject or null
Who posted it.
publishedBy.idstring
Soom’s id for the person, the id in List employees.
publishedBy.employeeCodestring or null
The code your company gave them.
publishedBy.namestring
First and last name.
publishedAtdate-time or null
When it was posted, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Projects and their tasks: who owns and works on each, where every task stands, who has it and when it is due. Comments and files on tasks are never shared.
List projects
GET/projects
Every project, by name, with its people and how many of its tasks are at each stage. Needs an app approved for Projects.
Filters
Filter
What it does
statusoptional
Only projects with this status.activeon_holdcompletedarchived
employeeCodeoptional
Only projects this person owns or is a member of.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the project, the projectId List tasks takes.
namestring
Its name.
descriptionstring or null
What it is about, when written down.
statusstring
Where it stands.activeon_holdcompletedarchived
ownerobject or null
Who runs it.
owner.idstring
Soom’s id for the person, the id in List employees.
owner.employeeCodestring or null
The code your company gave them.
owner.namestring
First and last name.
memberslist
Who works on it, besides its owner.
members[].idstring
Soom’s id for the person, the id in List employees.
members[].employeeCodestring or null
The code your company gave them.
members[].namestring
First and last name.
clientobject or null
The client it is for, when it is work done for a client.
client.idstring
Soom’s id for the client, the id in List clients.
client.namestring
Its name.
startDatedate or null
When it starts.
dueDatedate or null
When it is due.
taskCountsobject
How many of its tasks are at each stage.
taskCounts.todonumber
Still to do.
taskCounts.in_progressnumber
Being worked on.
taskCounts.in_reviewnumber
Waiting to be checked.
taskCounts.donenumber
Finished.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every task in every project, newest first. Needs an app approved for Projects.
Filters
Filter
What it does
projectIdoptional
Only this project’s tasks, an id from List projects.
statusoptional
Only tasks at this stage.todoin_progressin_reviewdone
employeeCodeoptional
Only tasks assigned to this person.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the task.
projectobject or null
The project it belongs to.
project.idstring
Soom’s id for it, the id in List projects.
project.namestring
Its name.
titlestring
What it is.
descriptionstring or null
More about it, when written down.
statusstring
Its column on the board.todoin_progressin_reviewdone
prioritystring
How urgent it is.lowmediumhighurgent
assigneeobject or null
Who has it. null when nobody does yet.
assignee.idstring
Soom’s id for the person, the id in List employees.
assignee.employeeCodestring or null
The code your company gave them.
assignee.namestring
First and last name.
dueDatedate or null
When it is due.
createdAtdate-time or null
When it was added, in UTC.
completedAtdate-time or null
When it was moved to done, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Review cycles, where each person’s review stands, and their goals. A final rating goes out only once the review is released to the person. What anyone wrote in a review, and goals still in draft, stay in Soom.
List review cycles
GET/review-cycles
Every review cycle, the latest period first, with how many reviews are in. Needs an app approved for Performance.
Filters
Filter
What it does
statusoptional
Only cycles at this step.draftself_reviewmanager_reviewcalibrationclosed
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the cycle, the cycleId List reviews and List goals take.
namestring
Its name.
descriptionstring or null
What it is for, when written down.
periodFromdate
First day of the time it reviews.
periodTodate
Last day of the time it reviews.
statusstring
Its step: draft, people reviewing themselves, managers reviewing, HR settling the ratings, or closed.draftself_reviewmanager_reviewcalibrationclosed
selfReviewDeadlinedate or null
When self-reviews are due, when set.
managerReviewDeadlinedate or null
When managers’ reviews are due, when set.
peoplenumber
How many people it reviews.
selfReviewsDonenumber
How many sent their self-review.
managerReviewsDonenumber
How many had their manager’s review sent.
openedAtdate-time or null
When it was opened, in UTC.
closedAtdate-time or null
When it was closed, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
{
"success": true,
"data": {
"items": [
{
"id": "6b68c9d0e1f2031425364758",
"name": "April to September 2026",
"description": "How the first half of the financial year went.",
"periodFrom": "2026-04-01",
"periodTo": "2026-09-30",
"status": "closed",
"selfReviewDeadline": "2026-10-15",
"managerReviewDeadline": "2026-10-31",
"people": 42,
"selfReviewsDone": 41,
"managerReviewsDone": 42,
"openedAt": "2026-10-01T04:30:00.000Z",
"closedAt": "2026-11-06T09:30:00.000Z",
"updatedAt": "2026-11-12T06:40:00.000Z"
}
],
"total": 1,
"page": 1,
"limit": 25
}
}
List reviews
GET/reviews
Each person’s review in each cycle, newest first: who reviews them, where it stands, and the final rating once it is released to them. Never the answers or comments. Needs an app approved for Performance.
Filters
Filter
What it does
cycleIdoptional
Only this review cycle’s, an id from List review cycles.
statusoptional
Only reviews where this stands.pendingself_submittedmanager_submittedclosed
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the review.
cycleobject or null
The review cycle it is in.
cycle.idstring
Soom’s id for it, the id in List review cycles.
cycle.namestring
Its name.
employeeobject or null
Whose review it is.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
reviewerobject or null
Who reviews them, usually their manager, when someone does.
reviewer.idstring
Soom’s id for the person, the id in List employees.
reviewer.employeeCodestring or null
The code your company gave them.
reviewer.namestring
First and last name.
statusstring
Where it stands: waiting on them, self-review sent, manager’s review sent, or closed.pendingself_submittedmanager_submittedclosed
selfSubmittedAtdate-time or null
When they sent their self-review, in UTC.
managerSubmittedAtdate-time or null
When the reviewer sent theirs, in UTC.
closedAtdate-time or null
When it was closed, in UTC.
finalRatingnumber or null
The final rating, once the review is released to them: it or its cycle closed. null before.
finalRatingLabelstring or null
What that rating means on the company’s scale.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Everyone’s goals, newest first. A goal its owner still has in draft isn’t listed. Needs an app approved for Performance.
Filters
Filter
What it does
cycleIdoptional
Only this review cycle’s, an id from List review cycles.
statusoptional
Only goals where this stands.activeon_trackat_riskdonemissed
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the goal.
employeeobject or null
Whose goal it is.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
cycleobject or null
The review cycle it counts towards, when it is tied to one.
cycle.idstring
Soom’s id for it, the id in List review cycles.
cycle.namestring
Its name.
titlestring
The goal.
descriptionstring or null
More about it, when written down.
metricstring or null
How it is measured, when written down.
statusstring
Where it stands.activeon_trackat_riskdonemissed
weightnumber or null
How much it counts, out of 100, when weighted.
startDatedate or null
When it starts, when set.
dueDatedate or null
When it is due, when set.
createdAtdate-time or null
When it was set in Soom, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
{
"success": true,
"data": {
"items": [
{
"id": "6b68c9d0e1f203142536497a",
"employee": {
"id": "665f1c2ab7e94d0012a3c4d5",
"employeeCode": "EMP0032",
"name": "Priya Sharma"
},
"cycle": {
"id": "6b68c9d0e1f2031425364758",
"name": "April to September 2026"
},
"title": "Move every branch’s payroll to Soom",
"description": "Every branch paid from Soom, with no spreadsheet step.",
"metric": "Branches paid from Soom",
"status": "on_track",
"weight": 40,
"startDate": "2026-04-01",
"dueDate": "2026-09-30",
"createdAt": "2026-04-03T06:15:00.000Z",
"updatedAt": "2026-11-12T06:40:00.000Z"
}
],
"total": 1,
"page": 1,
"limit": 25
}
}
Recruitment
The company’s job openings and the candidates for them: each opening’s pipeline, and where every candidate stands. And adding the people who apply, with their resume. Salary ranges, and candidates’ phones, resumes, notes, ratings and answers, stay in Soom.
List jobs
GET/jobs
Every job opening, newest first, with how many candidates are at each stage. Ask for status=open to show what you are hiring for. Needs an app approved for Recruitment.
Filters
Filter
What it does
statusoptional
Only openings with this status.openon_holdclosedfilled
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the opening, the jobId List candidates takes.
titlestring
The role.
departmentobject or null
The department it is in.
department.idstring
Soom’s id for it, the id in List departments.
department.namestring
Its name.
locationstring or null
Where the role is, as written on the opening.
employmentTypestring
Kind of role.full_timepart_timecontractintern
descriptionstring or null
What the role is, when written down.
openingsnumber
How many people it is for.
statusstring
Where it stands. filled is when everyone was hired.openon_holdclosedfilled
hiringManagerobject or null
Who the role reports to, when set.
hiringManager.idstring
Soom’s id for the person, the id in List employees.
hiringManager.employeeCodestring or null
The code your company gave them.
hiringManager.namestring
First and last name.
candidateCountsobject
How many candidates are at each stage.
candidateCounts.appliednumber
Applied, not looked at yet.
candidateCounts.screeningnumber
Being screened.
candidateCounts.interviewnumber
In interviews.
candidateCounts.offernumber
Offered the job.
candidateCounts.hirednumber
Hired.
candidateCounts.rejectednumber
Not taken forward.
createdAtdate-time or null
When it was opened in Soom, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Every candidate, newest first, and where they stand. A hired candidate names the employee they became. Needs an app approved for Recruitment.
Filters
Filter
What it does
jobIdoptional
Only this opening’s candidates, an id from List jobs.
stageoptional
Only candidates at this stage.appliedscreeninginterviewofferhiredrejected
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the candidate.
jobobject or null
The opening they are a candidate for.
job.idstring
Soom’s id for it, the id in List jobs.
job.titlestring
The role.
namestring
Their name.
emailstring
Their email.
sourcestring
Where they came from.referrallinkedinnaukriwalk_inagencywebsiteother
stagestring
Where they stand.appliedscreeninginterviewofferhiredrejected
offerStatusstring or null
Where their offer stands, once one was sent.sentaccepteddeclinedwithdrawn
hiredEmployeeobject or null
The employee they became, once hired. Their id is the one in List employees.
hiredEmployee.idstring
Soom’s id for the person, the id in List employees.
hiredEmployee.employeeCodestring or null
The code your company gave them.
hiredEmployee.namestring
First and last name.
addedAtdate-time or null
When they were added in Soom, in UTC.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Gives a link to upload one candidate’s resume to, before Add a candidate. PUT the file to uploadUrl within expiresIn seconds, with a Content-Type header the same as contentType, then send resumeKey with the candidate. Resumes stay private in Soom: HR opens them there, and no list gives them back. Needs an app approved for Add candidates.
What to send
Field
What it is
fileNamestring, needed
The file’s name, as HR will see it.
contentTypestring, needed
What kind of file it is: a PDF, a Word file, or a photo of the resume.application/pdfapplication/mswordapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentimage/jpegimage/png
sizenumber, needed
Its size in bytes, up to 15 MB.
The answer has
Field
What it is
uploadUrlstring
PUT the file’s bytes here, with the same Content-Type, before expiresIn runs out.
resumeKeystring
Send this as resumeKey in Add a candidate, once the file is uploaded.
Adds someone who applied for an open job, as HR does in Recruitment: they start at applied, and HR sees they came through the Soom API. Sending the same email for the same job again is refused, so a retry never adds anyone twice. Needs an app approved for Add candidates.
What to send
Field
What it is
jobIdstring, needed
The job they applied for, the id of an open job from List jobs.
namestring, needed
Their full name.
emailstring, needed
Their email.
phonestring, optional
Their phone number, for HR. No list gives it back.
sourcestring, optional
Where they came from. website when left out.referrallinkedinnaukriwalk_inagencywebsiteother
resumeKeystring, optional
Their resume: the resumeKey from Upload a resume, once the file is uploaded.
The answer has
Field
What it is
candidateobject
The new candidate, as List candidates gives them.
candidate.idstring
Soom’s id for the candidate.
candidate.jobobject or null
The opening they are a candidate for.
candidate.job.idstring
Soom’s id for it, the id in List jobs.
candidate.job.titlestring
The role.
candidate.namestring
Their name.
candidate.emailstring
Their email.
candidate.sourcestring
Where they came from.referrallinkedinnaukriwalk_inagencywebsiteother
candidate.stagestring
Where they stand.appliedscreeninginterviewofferhiredrejected
candidate.offerStatusstring or null
Where their offer stands, once one was sent.sentaccepteddeclinedwithdrawn
candidate.hiredEmployeeobject or null
The employee they became, once hired. Their id is the one in List employees.
candidate.hiredEmployee.idstring
Soom’s id for the person, the id in List employees.
candidate.hiredEmployee.employeeCodestring or null
The code your company gave them.
candidate.hiredEmployee.namestring
First and last name.
candidate.addedAtdate-time or null
When they were added in Soom, in UTC.
candidate.updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
The companies your people work for: each client, who of yours works for which, and what you invoiced them. Contacts, addresses, tax numbers and the rate for each person stay in Soom.
List clients
GET/clients
Every client, by name, with how many of your people work for it now. Needs an app approved for Clients.
Filters
Filter
What it does
statusoptional
Only clients with this status.activeinactive
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the client, the clientId the other client addresses take.
namestring
Its name.
statusstring
inactive when you no longer work for it.activeinactive
currencystring
What it is invoiced in, like INR or AUD.
invoiceCyclestring
How often it is invoiced.monthlyfortnightlyweekly
timezonestring or null
Its time zone, like Australia/Sydney, when set.
activeEmployeesnumber
How many of your people work for it now.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Who of yours works for which client, newest first: their role there and from when to when. Needs an app approved for Clients.
Filters
Filter
What it does
statusoptional
active (the default) is who works for a client now, ended is who did, all is both.activeendedall
clientIdoptional
Only this client’s, an id from List clients.
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the assignment.
clientobject or null
The client.
client.idstring
Soom’s id for it, the id in List clients.
client.namestring
Its name.
employeeobject or null
Who works for it.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
rolestring or null
Their role at the client, like Backend Developer.
engagementTypestring or null
dedicated is full time for that client; contract is for a piece of work.dedicatedcontract
startDatedate or null
When they started for the client.
endDatedate or null
When they stopped, or are due to.
statusstring
active while they work for it.activeended
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
What you invoiced your clients, latest period first, with the totals. Each person’s line stays in Soom, since it shows their rate. Needs an app approved for Clients.
Filters
Filter
What it does
statusoptional
Only invoices with this status.draftapprovedsentpaidvoid
clientIdoptional
Only this client’s, an id from List clients.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the invoice.
invoiceNostring
Its number.
clientobject or null
Who it is for.
client.idstring
Soom’s id for it, the id in List clients.
client.namestring
Its name.
periodStartdate
First day it bills for.
periodEnddate
Last day it bills for.
statusstring
Where it stands. void is cancelled.draftapprovedsentpaidvoid
currencystring
What it is in, like AUD.
subtotalnumber
Before tax.
taxPercentnumber
The tax rate, like 18.
taxAmountnumber
The tax.
totalnumber
What the client pays.
issueDatedate or null
When it was sent.
dueDatedate or null
When it is to be paid by.
paidDatedate or null
When it was paid.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Each month’s payroll and each person’s payslip totals: gross pay, deductions and net pay. An app reads them only when Soom approved Payroll for it. Salaries, the lines of a payslip, bank details and PAN, UAN, PF and ESI numbers stay in Soom. A company that runs its payroll in Xero gets PAYROLL_IN_XERO.
List payroll runs
GET/payroll-runs
Each month’s payroll, latest first, with its totals and how far it has gone. Its figures are final once it is locked. Needs an app approved for Payroll.
Filters
Filter
What it does
statusoptional
Only runs with this status.draftcomputingcomputedlockedfailed
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the run.
monthstring
The month it pays, like 2026-10.
statusstring
draft is made but not worked out yet, computing is being worked out now, computed is worked out but can still change, locked is final, and failed is a work-out that stopped part-way and has to be done again in Soom.draftcomputingcomputedlockedfailed
employeeCountnumber
How many people it pays, leavers’ final settlements included.
grossPaynumber
Everyone’s pay before anything is taken off.
deductionsnumber
Everything taken off it: PF, ESI, professional tax, TDS, loan instalments and the like.
employerContributionsnumber
What the company pays on top, like its share of PF and ESI.
netPaynumber
What is taken home: gross pay less deductions.
paidCountnumber
How many of its payslips are paid.
sentCountnumber
How many people can see their payslip in Soom.
computedAtdate-time or null
When its figures were last worked out.
lockedAtdate-time or null
When it was locked.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Each person’s payslip totals, latest month first, then by employee code. A payslip is here once it is final: when its month is locked, or a leaver’s final settlement once it is settled. Until then its figures can change. Needs an app approved for Payroll.
Filters
Filter
What it does
monthoptional
Only this month’s, like 2026-10.
employeeCodeoptional
Only this person, by the employee code your company gave them.
updatedSinceoptional
Only what was added or changed at or after this moment, like 2026-11-12T09:30:00Z. The list then comes oldest change first: keep the last updatedAt you got and send it as updatedSince next time. Leave it out the first time to get everything.
pageoptional
Which page of the list, from 1.
limitoptional
How many items a page, up to 200. 25 when left out.
Each item has
Field
What it is
idstring
Soom’s id for the payslip.
monthstring
The month it pays, the month of a run in List payroll runs.
employeeobject or null
Whose it is.
employee.idstring
Soom’s id for the person, the id in List employees.
employee.employeeCodestring or null
The code your company gave them.
employee.namestring
First and last name.
kindstring
final_settlement is a leaver’s last payslip, settled on its own.monthlyfinal_settlement
paidDaysnumber
The days it pays for: the days their salary covered, less loss of pay.
lopDaysnumber
Days of loss of pay.
grossPaynumber
Their pay before anything is taken off.
deductionsnumber
Everything taken off it: PF, ESI, professional tax, TDS, loan instalments and the like.
employerContributionsnumber
What the company pays on top, like its share of PF and ESI.
netPaynumber
What is taken home: gross pay less deductions.
paidOndate or null
The day it was paid.
sentToEmployeeboolean
true once they can see it in Soom: when it is sent to them, or for a final settlement once it is paid.
updatedAtdate-time or null
When it was last added or changed in Soom, in UTC. Send it back as updatedSince.
Soom can tell your app when something happens, so it needn’t keep asking. Once Soom has approved your app, give it a webhook address in Settings ▸ Integrations ▸ Soom API, which must start with https://, and tick the events it wants. Each event goes out only while your app can read what it is about: employee events need Employees, leave events need Leave, payroll events need Payroll. Soom posts it as JSON, signed with the webhook’s secret, which is shown once, when the address is first saved.
How webhooks work
Each event is a POST to your address with a JSON body. Answer with any status from 200 to 299 within 10 seconds. Anything else, or no answer, and Soom tries again after 5 and 30 minutes, then 2, 6, 12 and 24 hours: 7 tries in all. Soom never follows a redirect.
Events can arrive out of order, and the same event can arrive twice. Use its id to do the work once, and read the list again when the order matters.
Headers
Header
What it is
Soom-Signature
t is when it was signed, in seconds since 1970. v1 is the HMAC-SHA256, in hex, of t, a full stop and the body exactly as it arrived, keyed with your signing secret. Check it, and that t is recent, before trusting the body.
Soom-Event
The event’s type, as in the body.
Soom-Delivery
This delivery’s id, the same on every try. Settings ▸ Integrations ▸ Soom API lists every delivery and how it went.
The body has
Field
What it is
idstring
The event’s id, the same on every try. Do the work for an id once.
typestring
What happened.employee.addedemployee.updatedemployee.exitedemployee.rejoinedleave.appliedleave.changedleave.approvedleave.rejectedleave.cancelledpayroll.lockedpayroll.unlockedping
createdAtdate-time
When it happened.
companyobject
The company it is about: the one your app belongs to.
company.idstring
The company’s id in Soom, the company_id your app got with its access token.
company.namestring
The company’s name in Soom.
dataobject
What it is about, shaped like its item in List employees, List leave or List payroll runs, as it stands when the event goes out.
Anyone can post to your address, so check every event before you act on it. Work out the HMAC-SHA256 of t, a full stop and the body exactly as it arrived, before any parsing, keyed with the webhook’s signing secret. It must equal v1, and t must be within five minutes of now.
Soom-Signature: t=1762422072,v1=6c3f0e…
The signing secret is shown once, when the webhook’s address is first saved. If it’s lost, make a new one in Settings ▸ Integrations ▸ Soom API; the old one stops working at once.
Someone joined the company in Soom: added by HR or through the API, hired in Recruitment, or brought in from Xero. Soom has emailed them their invite. Its data is an item of List employees.
employee.updatedneeds Employees
Something List employees shows about someone changed: their name, email, code, job title, kind of employment, status, department, designation, branch, manager, or the day they joined or left. Joining, leaving and rejoining also send their own event. Its data is an item of List employees.
employee.exitedneeds Employees
Someone’s leaving was recorded; exitDate is their last day. Its data is an item of List employees.
employee.rejoinedneeds Employees
Someone who had left is back, on the same profile, with a new hireDate. Its data is an item of List employees.
leave.appliedneeds Leave
Leave was applied for and waits on its approvers. Someone who approves their own leave may already show approved. Its data is an item of List leave.
leave.changedneeds Leave
A leave’s dates or days changed: by the person while it waited, or by HR. Its data is an item of List leave.
leave.approvedneeds Leave
A leave was approved by its last approver or by HR, or HR added it already approved. Its data is an item of List leave.
leave.rejectedneeds Leave
A leave was turned down. Its data is an item of List leave.
leave.cancelledneeds Leave
A leave was cancelled, by the person or by HR, or put aside for another approved on the same days. Its data is an item of List leave.
payroll.lockedneeds Payroll
A month’s payroll was locked: its figures are final, and its payslips are in List payslips. Its data is an item of List payroll runs.
payroll.unlockedneeds Payroll
A locked month was opened again, so its figures can change until it is locked once more. Its data is an item of List payroll runs.
pinga test
The test Settings ▸ Integrations ▸ Soom API sends when you press Send a test event. Its data is empty.