Skip to main content

Partner API reference

Every endpoint. Every field. Every status code.

REST over HTTPS. JSON in, JSON out. Uniform response envelope. Idempotency keys honoured for twenty-four hours on every write.

Base URL
https://api.myaccountant.com.au
Sandbox
Available on request. Email support.
On this page
  1. Authentication
  2. Quick start
  3. Companies
  4. Employees
  5. Pay runs
  6. Timesheet ingestion
  7. Pay schedules
  8. Headless calculation engine
  9. Payslips
  10. Journal posting
  11. Reports
  12. ABA bank file
  13. Superannuation
  14. Super funds
  15. Pay item types
  16. Settings
  17. Enums
  18. Webhooks
  19. Support

Authentication.

Every request carries an API key in the Authorization header. Keys are provisioned by myaccountant by hand, there is no self-serve key portal in v1. Each key is bound to a single tenant, your organisation, and grants access to the companies your tenant owns.

Authorization: ApiKey ma_live_your_api_key_here

Headers.

Header Required Description
Authorization Yes ApiKey {your_key}
X-Company-Id Yes* The company ID for the request. Required for every endpoint except company creation.
Content-Type For POST / PUT application/json
Idempotency-Key Recommended Unique value per POST / PUT request. Prevents duplicate operations on retry within 24 hours.

* X-Company-Id is not required when creating a company, the new company is automatically linked to your tenant.

Response envelope.

Every endpoint returns the same shape. Errors return the same shape too, with isSuccess: false and a human-readable message.

{
  "data": { ... },
  "message": "...",
  "isSuccess": true,
  "errors": []
}

HTTP status codes.

Status Meaning
200Success.
201Resource created.
204Success, no body.
400Validation error or business-rule violation.
401Invalid or missing API key.
403Route not allowed or company not accessible.
429Rate limit exceeded. See the Retry-After header.

Rate limits.

The default ceiling is 60 requests per minute, scoped to the tenant. Rate limit headers are returned on every response.

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58

When the ceiling is exceeded, the response is a 429 with a Retry-After header naming the seconds to wait.

Idempotency.

Send an Idempotency-Key header on POST and PUT requests. We recommend a UUID. If the same key arrives again within 24 hours, the original response is returned without re-running the operation, finalising a pay run twice, creating duplicate employees on a retry, lodging a super contribution twice, all impossible by design.

Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

Quick start.

Six requests, end to end. Create a company, add an employee, create a pay run, finalise it, download payslips. Replace ma_live_your_key with the key issued to your tenant.

  1. 1. Create a company.

    curl -X POST https://api.myaccountant.com.au/api/company \
      -H "Authorization: ApiKey ma_live_your_key" \
      -H "Content-Type: application/json" \
      -d '{
        "companyName": "Acme Pty Ltd",
        "countryCode": "AU"
      }'

    Response includes a companyId, save it.

  2. 2. Add an employee.

    curl -X POST https://api.myaccountant.com.au/api/payroll/employees \
      -H "Authorization: ApiKey ma_live_your_key" \
      -H "X-Company-Id: abc123" \
      -H "Content-Type: application/json" \
      -d '{
        "firstName": "Jane",
        "lastName": "Smith",
        "email": "jane@acme.com",
        "startDate": "2026-01-15",
        "payFrequencyType": "Weekly",
        "annualSalary": 75000,
        "residencyType": "Resident",
        "employeeType": "Employee"
      }'
  3. 3. Create a pay run.

    curl -X POST https://api.myaccountant.com.au/api/payroll/payruns \
      -H "Authorization: ApiKey ma_live_your_key" \
      -H "X-Company-Id: abc123" \
      -H "Content-Type: application/json" \
      -d '{
        "periodStartDate": "2026-01-13",
        "periodEndDate": "2026-01-19",
        "payDate": "2026-01-20",
        "payFrequency": "Weekly"
      }'
  4. 4. Add employees to the pay run.

    curl -X POST https://api.myaccountant.com.au/api/payroll/payruns/{payRunId}/employees \
      -H "Authorization: ApiKey ma_live_your_key" \
      -H "X-Company-Id: abc123" \
      -H "Content-Type: application/json" \
      -d '{ "employeeId": "emp123" }'
  5. 5. Finalise the pay run.

    curl -X POST https://api.myaccountant.com.au/api/payroll/payruns/{payRunId}/finalise \
      -H "Authorization: ApiKey ma_live_your_key" \
      -H "X-Company-Id: abc123"
  6. 6. Download payslips.

    curl https://api.myaccountant.com.au/api/payroll/payruns/{payRunId}/payslips \
      -H "Authorization: ApiKey ma_live_your_key" \
      -H "X-Company-Id: abc123"

Companies.

Manage your client companies. Companies created via the API are automatically linked to your tenant.

POST/api/company

Create a company. companyName (string, required) and countryCode (string, required, ISO code such as AU).

GET/api/company/details

Get company details. Requires X-Company-Id. Returns company name, ABN, address, settings.

PUT/api/company

Update company. Fields: companyName, abn (11 digits), acn, streetAddress, city, state (e.g. VIC), zipCode.

Company bank details.

Used for ABA file generation and payment processing. Fields: accountName, accountNumber, ifsc (the BSB), apca, financialInstitutionCode.

GET/api/company/bank-details
PUT/api/company/bank-details
DELETE/api/company/bank-details

Employees.

GET/api/payroll/employees?page=1&pageSize=20&search=smith

List employees. Query params: page (default 1), pageSize (default 20, max 100), search (by name).

GET/api/payroll/employees/{id}

Returns full employee detail including tax, super, bank and leave records.

POST/api/payroll/employees

Create an employee.

FieldTypeRequiredDescription
firstNamestringYesFirst name.
lastNamestringYesLast name.
emailstringYesEmail address.
startDatedateYesEmployment start date (YYYY-MM-DD).
payFrequencyTypestringYesWeekly, Fortnightly, Monthly, Quarterly.
residencyTypestringYesResident or ForeignResident.
employeeTypestringYesEmployee or Contractor.
annualSalarydecimalAnnual salary. Set 0 for hourly workers.
perDayOrPerHrRatedecimalHourly or daily rate.
hoursPerWeekdecimalStandard hours (default 38).
superGuaranteeRatedecimalSuper rate percent (default 12.0).
mobilestringMobile number.
dateOfBirthdateDate of birth.
jobTitlestringJob title.
countryCodestringCountry code (default AU).
PUT/api/payroll/employees/{id}

Update. Same fields as create, only provided fields are updated.

DELETE/api/payroll/employees/{id}

Soft-delete. The employee stays in historical pay runs.

Sub-resources.

Each employee carries four sub-resources, each behind its own PUT endpoint.

PUT/api/payroll/employees/{id}/bank-details

Fields: bankBSB (6 digits), bankAccountNumber, bankAccountName, paymentModeType (0 Cash, 1 Bank, 2 Cheque).

PUT/api/payroll/employees/{id}/tax-details

Fields: tfn, categoryTaxType, taxScale2020, isSTSL, medicareLevySurcharge, taxOffsetAmount.

PUT/api/payroll/employees/{id}/super-details

Fields: superGuaranteeRate (default 12.0), superFundName, superFundABN, usiNumber, employeeMemberShipNumber, isEmployerNominatedFund.

PUT/api/payroll/employees/{id}/leave-details

Fields: annualLeaveOpeningBalance, personalLeaveOpeningBalance.

Pay runs.

GET/api/payroll/payruns?page=1&pageSize=20&status=Draft

List pay runs. Filter by status (Draft, Finalised, Submitted, Success), and by startDate / endDate on the pay date.

GET/api/payroll/payruns/{id}

Returns the pay run with all employees, pay items and calculated amounts (tax, super, net pay). Tax and super are recomputed on every GET while the pay run is in Draft.

Create a pay run, auto-populated.

POST/api/payroll/payruns

The convenience endpoint. The system auto-selects active employees and carries forward pay items from each employee's last finalised pay run. Use this when you want myaccountant to do the bookkeeping for you. For full control, use the explicit partner endpoint below.

FieldTypeRequiredDescription
periodStartDatedateYesPay period start.
periodEndDatedateYesPay period end.
payDatedateYesPayment date.
payFrequencystringYesWeekly, Fortnightly, Monthly, Quarterly.
payRunTypestringRegular (default) or Migration.
employeeIdsstring[]Pre-add specific employees. Omit to auto-select.

Create a pay run, fully explicit.

POST/api/payroll/payruns/partner

Recommended for partner integrations. Creates a pay run from a fully-explicit payload, no auto-select, no carry-forward. Your system declares every employee, every pay item, every line amount. The pay run is created in Draft, tax and super are recomputed on every GET.

Identify pay items by payItemTypeMasterId, the stable ATO master code (MPIT_AU_001 is Ordinary Earnings, see the master-id catalogue), rather than employeePayItemTypeId, the per-company hashid. If both are sent, master id wins. The master id must be activated for the company first (POST /api/payroll/company-payitemtypes).

Every level (pay run, employee row, pay item) accepts an optional externalReference stored verbatim for cross-system reconciliation.

You may pass reference grossEarnings, taxWithheld, netPay and superGuarantee figures per employee. These are not used to override our calculations, PAYG and STP correctness is the platform's liability, but they are echoed back in the response so you can reconcile.

curl -X POST https://api.myaccountant.com.au/api/payroll/payruns/partner \
  -H "Authorization: ApiKey ma_live_your_key" \
  -H "X-Company-Id: abc123" \
  -H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
  -H "Content-Type: application/json" \
  -d '{
    "payPeriodStart": "2026-01-13",
    "payPeriodEnd": "2026-01-19",
    "payDate": "2026-01-20",
    "payFrequency": "Weekly",
    "externalReference": "partner-pr-2026-w03",
    "employees": [
      {
        "employeeId": "emp_z4IEUysX",
        "externalReference": "partner-pre-aiden-w03",
        "payItems": [
          {
            "payItemTypeMasterId": "MPIT_AU_001",
            "externalReference": "partner-pi-001",
            "quantity": 20,
            "amount": 28.85
          }
        ],
        "calculations": {
          "grossEarnings": 577.00,
          "taxWithheld": 78.00,
          "netPay": 499.00,
          "superGuarantee": 69.24
        }
      }
    ]
  }'

Common rejection causes, missing both identifiers, master id not yet activated for the company, unknown employeeId, period end before period start.

Add an employee after creation.

POST/api/payroll/payruns/{payRunId}/employees
{ "employeeId": "emp123" }

Pay items are populated from the employee's assigned pay-item types or carried forward from their last finalised pay run.

Update pay items.

PUT/api/payroll/payruns/{payRunId}/payitems
{
  "payRunEmployeeId": "pre123",
  "payItems": [
    { "id": "item1", "quantity": 38, "amount": 35.10 },
    { "id": "item2", "quantity": 8, "amount": 52.65 }
  ]
}

Tax, super and net pay are recalculated automatically the next time you GET the pay run.

Lifecycle.

Two shapes. Customers and legacy callers finalise straight from Draft. Partners with an approval workflow use the checkpointed path, Draft to Preview to Approved to Finalised, with revoke and revert paths back.

Once a pay run is in Preview or Approved, it is edit-locked, pay items, employees and leave cannot be modified until reverted to Draft. Both checkpoint transitions capture the acting user's id and timestamp for audit.

TransitionEndpointNotes
Draft → PreviewPOST /api/payroll/payruns/{id}/previewCaptures previewedById + previewedAtUtc.
Preview → ApprovedPOST /api/payroll/payruns/{id}/approveCaptures approvedById + approvedAtUtc.
Approved → PreviewPOST /api/payroll/payruns/{id}/revoke-approvalClears the approval audit fields.
Preview / Approved → DraftPOST /api/payroll/payruns/{id}/revert-to-draftClears both checkpoint audit fields.
Draft → FinalisedPOST /api/payroll/payruns/{id}/finaliseLegacy direct path.
Approved → FinalisedPOST /api/payroll/payruns/{id}/finaliseSame endpoint, handler accepts either input state.

Finalise.

POST/api/payroll/payruns/{payRunId}/finalise

After finalisation, tax and super amounts are frozen, pay items are snapshotted with type names and flags, payslips can be generated, the journal can be posted, and the pay run cannot be edited unless reverted to Draft.

Delete a pay run.

DELETE/api/payroll/payruns/{id}

Only Draft pay runs can be deleted.

Remove an employee from a pay run.

DELETE/api/payroll/payruns/{payRunId}/employees/{payRunEmployeeId}

Only works on Draft pay runs.

Timesheet ingestion.

Three import paths into a Draft pay run, one generic, two vendor-specific. All three converge on the same persistence model, idempotent upserts of PayRunEmployee and PayRunEmployeePayItem rows.

Generic ingestion.

POST/api/payroll/payruns/{payRunId}/timesheets

The recommended path when you are not using Tanda or Deputy. Send a normalised payload with one entry per employee per pay-item type.

{
  "employees": [
    {
      "employeeId": "EnC5Tosm",
      "externalReference": "tanda-shift-12345",
      "items": [
        {
          "payItemTypeMasterId": "MPIT_AU_001",
          "quantity": 38,
          "amount": 35.50,
          "externalReference": "ordinary-mon-fri"
        },
        {
          "payItemTypeMasterId": "MPIT_AU_003",
          "quantity": 4,
          "amount": 53.25,
          "externalReference": "overtime-sat"
        }
      ]
    }
  ]
}

Supply exactly one item identifier. payItemTypeMasterId is the stable ATO master id and the preferred choice when your system does not store myaccountant ids, master ids never change across companies. employeePayItemTypeId is the per-company hashid, use it when you have cached the ids and want to skip the master-id join. Supplying both on the same item is a validation error.

Idempotency. Upserts are keyed on (payRunEmployeeId, employeePayItemTypeId). Re-submitting the full timesheet at any point brings the pay run back in sync with your source system, quantities and amounts are replaced, never accumulated. Safe to retry.

Failure isolation. The whole request runs in a transaction but per-employee and per-item errors (unknown employee, unactivated master id) surface in the response body rather than rolling back the rest.

{
  "isSuccess": true,
  "message": "Timesheet imported partially. Some items failed.",
  "data": {
    "successCount": 1,
    "failedCount": 1,
    "employees": [
      {
        "employeeId": "EnC5Tosm",
        "externalReference": "tanda-shift-12345",
        "isSuccess": true,
        "message": "Imported successfully.",
        "items": [
          { "employeePayItemTypeId": "epi_abc", "payItemTypeMasterId": "MPIT_AU_001",
            "externalReference": "ordinary-mon-fri", "quantity": 38, "amount": 35.50,
            "action": "Inserted" }
        ]
      },
      {
        "employeeId": "no-such-id",
        "isSuccess": false,
        "message": "Employee not found in this company.",
        "items": []
      }
    ]
  }
}

Per-item action values are Inserted, Updated, or Failed. The pay run must be in Draft. Tax, super and net pay are recalculated automatically the next time you GET the pay run.

Tanda.

POST/api/payroll/payruns/{payRunId}/import/tanda

If your customer has connected Tanda via the myaccountant UI, partners can trigger a Tanda timesheet pull on their behalf. No request body, the endpoint reads the pay run's period, calls Tanda for that window using the customer's stored OAuth token, and upserts pay items using the same idempotency contract as the generic endpoint. Tanda award names are mapped to pay-item types via the master-id catalogue.

Returns the same per-employee result shape with successCount and failedCount. Common 400 errors, Tanda not connected on the target company, pay run not in Draft, expired Tanda access token.

Deputy.

POST/api/payroll/payruns/{payRunId}/import/deputy

Same shape as the Tanda endpoint, against the customer's Deputy connection. Deputy pay rules are mapped via their pay-rule id (stable per Deputy tenant).

Pay schedules.

A pay schedule is a recurring template that auto-creates draft pay runs on cadence. Declare it once, the anchor period, the frequency, the employee roster, and a daily sweep materialises the next draft pay run whenever an occurrence falls within the schedule's lookahead window. No per-period create call needed for steady-state payroll.

Create a schedule.

POST/api/payroll/payschedules
{
  "name": "Weekly Permanents",
  "payFrequency": "Weekly",
  "anchorPeriodStart": "2026-05-11",
  "anchorPeriodEnd": "2026-05-17",
  "anchorPayDate": "2026-05-20",
  "createDraftDaysBefore": 3,
  "externalReference": "partner-sched-001",
  "employeeIds": ["emp_z4IEUysX", "emp_abc123"]
}
FieldTypeRequiredDescription
namestringYesDisplay name.
payFrequencystringYesWeekly, Fortnightly or Monthly.
anchorPeriodStartdateYesFirst period start. Defines the recurrence anchor.
anchorPeriodEnddateYesFirst period end.
anchorPayDatedateYesFirst pay date.
createDraftDaysBeforeintDays before pay date to materialise the draft (default 3).
externalReferencestringPartner-system identifier.
employeeIdsstring[]Initial roster. Can also be added later.

Every later occurrence is computed by adding multiples of the frequency to the anchor, weekly is +7 days, fortnightly is +14, monthly is +1 calendar month. The (periodEnd - periodStart) and (payDate - periodStart) offsets are preserved forever, set a Monday-to-Sunday week with Wednesday pay once and every later week is Monday-to-Sunday with Wednesday pay.

Read.

GET/api/payroll/payschedules?includeInactive=false
GET/api/payroll/payschedules/{id}

Response includes the roster size, the employee ids and the next occurrence the sweep will generate (period start, period end, pay date).

Update.

PUT/api/payroll/payschedules/{id}
{
  "name": "Weekly Permanents",
  "createDraftDaysBefore": 7,
  "isActive": true,
  "externalReference": "partner-sched-001"
}

Anchor and frequency are immutable after creation, changing them would retroactively shift every historical occurrence. To change cadence, delete and recreate.

Delete.

DELETE/api/payroll/payschedules/{id}

Historical pay runs created by the schedule are kept (PayScheduleId is set to null), only the template itself is removed.

Roster management.

POST/api/payroll/payschedules/{id}/employees

Body: { "employeeIds": ["emp_..."] }. Add is idempotent, employees already on the schedule are silently skipped. Unknown employee ids reject the whole call.

DELETE/api/payroll/payschedules/{id}/employees/{employeeId}

Force-create the next pay run.

POST/api/payroll/payschedules/{id}/create-next-payrun?force=true

Normally the daily sweep handles this. Use the explicit endpoint when a partner wants to control timing themselves (set force=true to skip the cadence check), or to recover from a missed sweep. force=false still works once the lookahead window has been entered. Idempotent, calling on the same un-generated occurrence returns the existing pay run rather than creating a duplicate.

Sweep cadence.

The background sweep runs once per day (24-hour periodic timer with a five-minute boot warmup). For every active schedule it computes the next occurrence and asks, is today on or after payDate - createDraftDaysBefore? If yes, the draft is materialised and the schedule's lastGeneratedPeriodStart cursor advances. The cursor makes the sweep idempotent across crashes and restarts.

Headless calculation engine.

The /api/payroll/engine/* endpoints expose the cert-grade calculation services as stateless functions. Use myaccountant as a tax, super and leave oracle without creating pay runs, employees, or any bookkeeping in our system. Every endpoint is a pure function of its inputs. Same input, same output. No database writes. Safe to retry.

Auth is the same as the rest of the partner API, Authorization: ApiKey ... plus an X-Company-Id header. The header value is required for auth-policy reasons but is not read by any engine handler, the math is company-agnostic.

PAYG, Schedule 1.

POST/api/payroll/engine/payg

Schedule 1 (NAT 1004) PAYG withholding for a single pay period. Implements every BIG §10.6 Tax Treatment Code path, Regular, Actor, Horticulturist, Senior, WHM, Seasonal Worker, Foreign Resident, No-TFN, ATO-Defined, Voluntary.

{
  "earningValue": 2596.00,
  "earningDays": 7,
  "payDate": "2024-10-01",
  "categoryTaxType": "R",
  "taxScale2020": "T",
  "isStsl": false,
  "medicareLevySurcharge": "X",
  "medicareLevyExemption": "F",
  "medicareLevyReduction": "X",
  "tfn": "123456782"
}

Returns { "withholding": 603.00 }.

ETP, Schedule 11.

POST/api/payroll/engine/etp

Schedule 11 (NAT 70980) ETP withholding for a single ETP line. All eight ETP codes (R, O, S, P, D, B, N, T), preservation-age rate selection, ETP cap, whole-of-income cap, no-TFN flat rate, foreign-resident treatment, multi-instalment cap reduction.

{
  "code": "R",
  "amount": 10000,
  "dateOfBirth": "1985-01-01",
  "paymentDate": "2024-10-01",
  "hasTfn": true,
  "isForeignResident": false,
  "previousEtpAmountSameTermination": 0,
  "otherTaxableIncomeYtd": 0
}

Returns { "withholdingAmount", "taxableComponent", "taxFreeComponent" }. For genuine redundancy, call /redundancy-split first and pass the post-split etpAmount here.

Redundancy split, Section 83-170.

POST/api/payroll/engine/redundancy-split

ITAA97 §83-170 tax-free split for genuine redundancy, early-retirement or invalidity payments. FY 2024-25 rates, base $12,524 plus $6,264 per completed year.

{ "totalPayment": 50000, "completedYearsOfService": 5 }

Returns { "taxFreeAmount": 43844, "etpAmount": 6156 }. The tax-free amount is reported as a Lump Sum D entry on STP (not as TerminationPayment.TaxFreeAmount), the ETP amount is taxed via Schedule 11 code R.

Schedule 7 unused leave on termination.

POST/api/payroll/engine/sch7-unused-leave

Schedule 7 (NAT 7053) unused-leave-on-termination withholding. Picks the flat 32-percent method for redundancy, early-retirement or invalidity terminations and the marginal-rates method (weekly-equivalent retax) for everything else.

{
  "lumpSumAmount": 20000,
  "terminationReason": "GenuineRedundancy",
  "normalGrossEarnings": 0,
  "normalEarningDays": 7,
  "baseTaxRequest": { /* same shape as /payg above */ }
}

Returns { "withholdingAmount": 6400, "lumpSumCode": "R" }.

Extra-pay-year averaging.

POST/api/payroll/engine/extra-pay-year

Additional withholding added to regular Sch 1 PAYG when the financial year contains 53 weekly or 27 fortnightly pays (NAT 1004, page 4). Quarterly and monthly periods always return zero.

{ "periodGrossEarnings": 2000, "earningDuration": "Week", "isExtraPayYear": true }

Returns { "extraWithholding": 10 }.

Super Guarantee.

POST/api/payroll/engine/super-guarantee

Compute the SG liability: gross × rate / 100, rounded to 2 dp.

{ "grossApplicableToSuper": 5000, "superGuaranteeRatePercent": 12 }

Returns { "superAmount": 600 }.

Leave accrual.

POST/api/payroll/engine/leave-accrual

Accrual, taken and running balance for one period for one leave type. Implements both PerPay and PerHourWorked accrual methods.

{
  "leaveType": "Annual",
  "accrualMethodType": "PerPay",
  "payFrequencyType": "Weekly",
  "entitlement": 152,
  "standardHoursPerWeek": 38,
  "totalWorkedQuantity": 0,
  "adjustment": 0,
  "lastYtdBalance": 0,
  "isFirstRecord": false,
  "openingBalance": 0,
  "payDate": "2024-10-01"
}

Returns { "accrued": 2.923, "taken": 0, "ytdBalance": 2.923, "openingBalance": 0, "isNegativeBalance": false }.

Preservation age.

POST/api/payroll/engine/preservation-age

Reference helper, preservation age for the given DOB and whether the employee has reached it by atDate.

{ "dateOfBirth": "1985-01-01", "atDate": "2024-10-01" }

Returns { "preservationAge": 60, "isPreservationAgeOrOver": false }.

Payslips.

Generate a single payslip.

POST/api/payroll/payruns/{payRunId}/payslip
{ "payRunEmployeeId": "pre123", "isDirectDownload": true }

Returns a PDF download. Set isDirectDownload: true to receive the PDF bytes directly.

Download all payslips.

GET/api/payroll/payruns/{payRunId}/payslips

Returns base64-encoded PDFs for every employee in the pay run.

Email a payslip.

POST/api/payroll/payruns/{payRunId}/payslips/email
{
  "payRunEmployeeId": "pre123",
  "emailAddresses": ["jane@acme.com"],
  "subject": "Your Payslip",
  "body": "Please find your payslip attached."
}

Journal posting.

Post payroll expense to the business accounting module. Double-entry, reversible.

POST/api/payroll/payruns/{payRunId}/journal

Creates the standard double-entry payroll posting. DR Salaries & Wages, DR Superannuation, CR PAYG Withholding Payable, CR Superannuation Payable, CR Accounts Payable.

DELETE/api/payroll/payruns/{payRunId}/journal

Reverses all journal entries for the pay run.

Reports.

Report endpoints return JSON by default. Append ?format=csv or ?format=pdf to download in those formats.

Payroll activity summary.

GET/api/payroll/reports/activity-summary?fromDate=2025-07-01&toDate=2026-06-30

One row per employee per pay run. Columns: Employee, Gross, Tax, Super, Deductions, Net Pay.

Employee year-to-date earnings.

GET/api/payroll/reports/ytd-earnings?financialYear=2026

Cumulative totals per employee for the financial year. financialYear=2026 means FY 2025-26 (1 Jul 2025 to 30 Jun 2026).

Superannuation report.

GET/api/payroll/reports/superannuation?fromDate=2025-07-01&toDate=2026-06-30

Super contributions per employee per pay period. Shows fund name, member number, SG amount.

Leave balances.

GET/api/payroll/reports/leave-balances?asOfDate=2026-03-31

Current leave balances: opening balance, accrued, taken, closing balance for annual and personal leave.

ABA bank file.

GET/api/payroll/payruns/{payRunId}/aba

Returns the ABA file for a finalised pay run, ready for upload to your bank for direct credit payments.

Superannuation.

Manage super contributions and lodgement through the bundled Beam clearing-house.

GET/api/payroll/superannuation?page=1&pageSize=20

List super records.

Create from a pay run.

POST/api/payroll/superannuation/from-payrun
{ "payRunId": "pr123", "paymentType": 0 }

Create from a date range.

POST/api/payroll/superannuation/from-date-range
{
  "periodFromDate": "2026-01-01",
  "periodToDate": "2026-03-31",
  "paymentType": 0
}

Create manually.

POST/api/payroll/superannuation/manual
{
  "periodFromDate": "2026-01-01",
  "periodToDate": "2026-03-31",
  "payDate": "2026-04-01",
  "paymentType": 0,
  "employees": [
    {
      "employeeId": "emp123",
      "superGuaranteeAmount": 750.00,
      "salarySacrificeAmount": 0
    }
  ]
}

Add employees to a super record.

POST/api/payroll/superannuation/{id}/employees

Update an employee contribution.

PUT/api/payroll/superannuation/{id}/employees/{employeeRowId}

Delete a super record.

DELETE/api/payroll/superannuation/{id}

Only Draft records can be deleted.

Super funds.

Manage employer-nominated super funds.

GET/api/payroll/superfunds
POST/api/payroll/superfunds
{
  "fundName": "Australian Retirement Trust",
  "abn": "60905317120",
  "usi": "60905317120003",
  "employerNumber": "12345"
}
PUT/api/payroll/superfunds/{id}
DELETE/api/payroll/superfunds/{id}

Pay item types.

View and manage the company's pay-item configuration.

GET/api/payroll/payitemtypes

Returns every configured pay-item type (earnings, deductions) with tax and super applicability flags.

GET/api/payroll/payitemtypes/assignments

Returns which pay items are assigned to which employees.

Settings.

GET/api/payroll/settings
PUT/api/payroll/settings
{ "isAutoLodgeSuperEnabled": true, "defaultPaymentType": 0 }

Enums.

Pay frequency.

ValueDescription
WeeklyEvery week.
FortnightlyEvery two weeks.
MonthlyOnce a month.
QuarterlyEvery three months.

Residency type.

ValueDescription
ResidentAustralian resident for tax purposes.
ForeignResidentForeign resident.

Employee type.

ValueDescription
EmployeePAYG employee.
ContractorIndependent contractor.

Pay run status.

ValueNumericDescription
Draft0Editable, not yet processed.
Finalised1Locked for payment.
Submitted2STP submitted to the ATO.
Error3STP submission error.
Success4STP accepted by the ATO.
Pending5STP submission in flight.
Preview10Edit-locked, awaiting review (optional checkpoint).
Approved11Signed off, ready to finalise (optional checkpoint).

Payment mode.

ValueDescription
CashCash payment.
BankBank transfer (direct credit).
ChequeCheque.

Webhooks Coming soon

Subscribe to events like payrun.finalised, stp.submitted and super.lodged. Delivery will be signed with HMAC-SHA256 so receivers can verify origin. Not live in v1, poll the read endpoints on a schedule for now. Targeted for the next partner-API milestone.

Support.

Stuck on something. Hit a 400 you cannot decode. Want to confirm the right shape for a fully-explicit partner pay run. We answer within two business days.

Ready to start a conversation.

Send a short brief, what you are integrating, who your customers are, what volume you expect. We will respond with sandbox credentials and a 30-minute call slot.

Email support A human responds within two business days.
Start for free

No payment details required.