API Employee
The Employee actions keep staff in step between your software and Microkeeper. upsert_employees adds new staff and updates existing ones. get_employees returns staff profiles, either everyone changed since a date or the staff you name. get_group_config lists the account's Groups.
| Actions | upsert_employees, get_employees, get_group_config |
|---|---|
| Business key access | HR/Staff: Read/Write to upsert, Read Only to get |
This guide covers how to:
- Identify staff.
- Add and update staff.
- Get staff profiles.
- Get the Groups.
Before you start, make your keys and test your connection: see Microkeeper API.
How staff are identified
Each employee has three IDs:
| ID | What it is | Example |
|---|---|---|
EmployeeID | Your software's ID for the employee. You set it | MEL-F-012 |
eusername | Their Microkeeper username, made from their name when they're added | ava_patel |
EID | Their ID in Microkeeper | 53613 |
Use EmployeeID to keep staff in step: it's the only one you choose, and the only way to add staff through the API. It's up to 20 characters, and unique in the business.
For staff already in Microkeeper, ask the business to fill in each employee's Employee ID in their profile before your first sync, or match them by eusername. A request with an EmployeeID Microkeeper hasn't seen adds a new employee, even when its eusername matches someone.
Add and update staff with upsert_employees
Send a list of staff in Employees. Each one is matched in this order:
EmployeeID: a known one updates that employee; a new one adds an employee.eusername: updates that employee.EID: updates that employee.
Every employee needs firstname and lastname, updates included. Each ID can appear only once in a request.
Example
{
"Employees": [
{
"EmployeeID": "MEL-C-031",
"firstname": "Noah",
"lastname": "Reid",
"email": "noah.reid@outlook.com",
"phoneno": "0491570160",
"startdate2": "2026-12-01",
"status": "Casual",
"rate": "30",
"super_fund": "STA0100AU",
"eBSB_A": "062-000",
"eAccountNo": "10000031",
"custom_emergency_contact": "Mia Reid",
"welcome": "email"
},
{
"EmployeeID": "MEL-F-012",
"firstname": "Amelia",
"lastname": "Brown",
"address": "14 Smith Street",
"city": "Fitzroy",
"state": "VIC",
"postcode": "3065"
}
]
}Noah is added and sent a welcome email. Amelia's address is updated.
Response
{
"success": "1",
"authenticated": "1",
"message": "User added or updated to Microkeeper",
"data": {
"added": { "EID": { "MEL-C-031": "55572" } },
"updated": { "EID": { "MEL-F-012": "53529" } }
}
}added and updated give each employee's EID, keyed by the EmployeeID you sent. Staff matched by eusername or EID are listed as "updated":{"EID":["53613"]}. Each list is there only when it has something in it.
Adding staff
A new employee's username is made from their name, such as noah_reid, with a number added if it's taken. Find it in get_employees. New staff are active, and added to any Groups set to add new staff automatically.
To send the employee their login, add welcome: email, sms or both.
Fields you leave out take Microkeeper's defaults, such as Full Time status and the account's leave entitlements for that status. After adding staff, ask the business to check their profiles in Microkeeper before their first pay run.
Updating staff
An update changes only the fields you send, from the Update column below. Send dates as YYYY-MM-DD.
Name, date of birth, status, pay type, basic hours, default Location and Role, position and super options are set when the employee is added. To change them later, the business changes them in the employee's profile in Microkeeper.
Changing email or phoneno asks the employee to verify the new one.
Fields
| Field | What it is | Update |
|---|---|---|
| Name and contact | ||
firstname, lastname | Required on every employee | No |
email | Email address | Yes |
phoneno, home_no | Mobile and home numbers | Yes |
address, address2, city, state, postcode, country | Address. state is VIC, NSW, ACT, QLD, SA, WA, TAS, NT, or OTH outside Australia | Yes |
timezone | Time zone, such as Australia/Victoria. Set from state if you leave it out | Yes |
kin_name, kin_no | Emergency contact's name and number | Yes |
sex | F, M, I or O | Yes |
dob2 | Date of birth | No |
| Employment | ||
startdate2, terdate2 | Start and termination dates | Yes |
cessation_type | Why employment ended, for STP: V voluntary, I ill health, D deceased, R redundancy, F dismissal, C contract ended, T transfer | Yes |
active | TRUE active, FALSE terminated, PAUSE paused | Yes |
status | Full Time, Part Time, Casual, Sub-Contractor or Subby-Super | No |
abn, businessname | A sub-contractor's ABN and business name | Yes |
position | Job title | No |
default_LID, default_ROID | Default Location and Role IDs | No |
| Pay | ||
rate | Hourly pay rate | Yes |
RRNID | The Rate Rule's ID | Yes |
salary | T salaried, F paid by the hour | No |
basichours | Basic hours a week | No |
ts_min_hrs | Timesheet minimum hours | Yes |
| Tax | ||
etfn | Tax file number. It's never returned | No |
tax | 1 Australian resident, 5 foreign resident, 8 working holiday maker | Yes |
tax_free, help, tsl, sfss, senior_tax | 1 or 0: tax-free threshold claimed, study and training loan, Trade Support Loan, Student Financial Supplement Scheme, Seniors and Pensioners Tax Offset | Yes |
tax_per, tax_add | A fixed tax percentage, or an amount from -1000 to 1000 to add to the tax withheld | Yes |
income_type, employment_override | STP Income Type and Status Override codes. See STP Reporting Codes | Yes |
| Super | ||
super_fund | The fund's USI, in capitals, such as STA0100AU | Yes |
super_no | Member number | Yes |
| Bank accounts | ||
eTitle, eBSB_A, eAccountNo | The first account's name, BSB and number. BSB as 062-000 or 062000 | Yes |
eTitle2, eBSB_B, eAccountNo2 | A second account | Yes |
split_pay, split_amount | How much goes to the second account: fix a fixed amount or per a percentage, and the amount | Yes |
eTitle3, eBSB_C, eAccountNo3, split_pay3, split_amount3 | A third account, and how much goes to it | Yes |
| Leave | ||
entitledal, entitledsickleave | Annual and personal leave entitlements, in weeks a year | Yes |
leaveloading | Annual leave loading, as a percentage | Yes |
entitled_long | Long service leave: 1 week for every this many weeks worked | Yes |
rdo | RDO hours accrued a week | Yes |
show_annu, show_sick, show_long, show_rdo | 1 to show the balance on payslips, 0 to hide it | Yes |
open_balance, leave_quota | Opening balances and other leave types. See below | Yes |
| Other | ||
custom_ and the field's name | A custom field, such as custom_emergency_contact. See below | Yes |
PCID_third_ID | Moves the employee into the pay cycle with this ID from your software. See API Accounts | Yes |
welcome | On adding: email, sms or both sends the employee their login | Add only |
Custom fields
Send the business's custom fields as custom_ followed by the field's name, as get_employees returns it. Send dates as YYYY-MM-DD. Archived custom fields, and names that don't match, are skipped.
Opening balances: open_balance
Set the hours or amounts an employee starts with, by financial year:
"open_balance": { "2026": { "al": 80, "sick": 40, "pregross": 25000 } }| Key | Balance | Unit |
|---|---|---|
al, sick, lsl, rdo, toil, off, com | Annual, Personal, Long Service, RDO, Time Off In Lieu, Unpaid and Compassionate Leave | Hours |
pregross, presuper, pretax, prenet | Gross pay, super, tax withheld and net pay so far this year | Dollars |
Other leave types: leave_quota
For leave types the business has added, set how much the employee accrues, and whether the balance shows on payslips:
"leave_quota": { "stud": { "accrual_amount": 1, "payslip_hide": 0 } }Annual, personal, long service and RDO entitlements use the leave fields above instead.
Errors
An error stops the request, and no staff are changed:
JSON missing Employees fieldJSON missing firstname or lastname field: every employee needs both.EmployeeID is present twice in payload: MEL-C-031, and the same forEIDandeusername.eusername must be present in Microkeeper: noah_red,EID must be present in Microkeeper: 99999: to add someone, send anEmployeeID.A unique ID must be supplied either: EmployeeID, EID or eusernameNo employees added or updated in Microkeeper: nothing in the request changed anyone.
Get staff with get_employees
Ask for staff changed since a date, all active staff, or the staff you name:
mk_data | Returns |
|---|---|
{"config":{"last_modified":"2026-10-01"}} | Everyone changed on or after the date, active or not. The date can be up to a year back |
{"config":{"last_modified":"active"}} | All active staff |
{"config":{"user_list":{"EmployeeID":["MEL-F-012","MEL-C-031"]}}} | The staff with these IDs. Use EmployeeID, EID or eusername, each as a list |
To keep a copy of the business's staff, get active once, then the staff changed since your last sync. An employee's last_modified is the date their profile last changed, in Microkeeper or through the API.
Response
{
"success": "1",
"authenticated": "1",
"message": "1 staff retrieved from Microkeeper",
"data": {
"employees": [
{
"EID": "53613",
"EmployeeID": "",
"eusername": "ava_patel",
"firstname": "Ava",
"lastname": "Patel",
"email": "ava.patel@outlook.com",
"phoneno": "0491570156",
"startdate2": "2026-06-01",
"terdate2": "0000-00-00",
"last_modified": "2026-10-20",
"rate": "32",
"status": "Casual",
"active": "TRUE",
"etfn": "set",
"super_fund": { "SFID": "8", "name": "AustralianSuper", "ABN": "65714394898", "USI": "STA0100AU", "spin": "STA0100AU" },
"super_no": "500000001",
"eBSB": "062-000",
"eAccountNo": "10000001",
"groups": [ { "GID": "59467", "per": "100" }, { "GID": "59462", "per": "100" } ],
"open_balance": 0,
"leave_quota": 0,
"custom_emergency_contact": "Sam Patel",
"...": "..."
}
]
}
}Staff are listed by username, with the fields above and a few more. These come back differently from how you send them:
etfnissetornot_set. The tax file number itself is never returned.- BSBs are
eBSB,eBSB2andeBSB3. super_fundis the fund'sSFID,name,ABN,USIandspin, or0if none is set. A self-managed fund has no USI: use its ABN.groupslists each Group'sGIDand the percentage of the employee's cost it carries (per), or is0.open_balanceandleave_quotahave the shapes above, or are0.- Custom fields are all listed, blank if not filled in. Dates are
YYYY-MM-DD.
Messages
No employees have been updated: no staff match. The response has"success":"1"and nodata.last_modified must be within the last yearEmployeeID is not object list or empty, and the same forEIDandeusername: send a list with at least one ID.config missing last_modified or user_list field
Get the Groups with get_group_config
Groups organise staff for rosters, access, pay cycles and reports. Use their GIDs to read the groups on each employee.
| Field | Value |
|---|---|
mk_action | get_group_config |
mk_data | {"config":{"active_status":"active"}}: active (the default), hidden or all |
Response
{
"success": "1",
"authenticated": "1",
"message": "2 groups retrieved from Microkeeper",
"data": {
"groups": [
{ "GID": 59467, "name": "Melbourne Staff", "auto_add": 0, "access": 0, "access_name": "All", "hide": 0 },
{ "GID": 59462, "name": "Melbourne Weekly", "auto_add": 0, "access": 4, "access_name": "Pay Cycle", "hide": 0 }
]
}
}| Field | What it is |
|---|---|
GID | The Group's ID |
name | The Group's name |
auto_add | 1 if new staff are added to the Group automatically |
access, access_name | Where the Group is used: 0 All, 1 Payroll, 2 Roster, 4 Pay Cycle, 5 Contracted Hours |
hide | 1 if the Group is hidden |