API
Payroll your systems can call.
A versioned REST surface for integrators. Create and calculate runs, and hear about them through signed webhooks. Money crosses the wire as integer minor units and an ISO currency code, never a float.
Keys
One key per environment, easy to replace. The key is the tenant; nothing is guessed from a header.
Safe retries
Send the same request twice and it still runs once.
Sandbox
A test surface that authenticates and validates without moving money.
Hand-written contract
Responses come from written serializers, so a column rename never breaks your integration.
Work out a month
POST /api/v1/pay_runs {
"jurisdiction": "GH",
"period_start": "2026-08-01",
"period_end": "2026-08-31",
"pay_date": "2026-09-05"
} {
"id": "run_8fj2",
"status": "calculated",
"rule_version": "GH.PAYE.v4",
"lines": [
{ "code": "SSNIT_EE", "amount": -35750 },
{ "code": "PAYE", "amount": -113412 }
],
"net": 500838,
"employer_cost": 734500
}
Amounts are minor units: 500838 is GHS 5,008.38.
The rule_version is the exact rate set the figures were priced on.
Alerts we send you
Signed, retried until they arrive, and repeatable for 90 days.
pay_run.calculated The numbers are ready. Nothing has been paid yet.
pay_run.approved A named person approved it. The run is now locked.
pay_run.paid The run was marked paid.
pay_run.reopened An approved run was reopened for a correction.
payslip.published An employee can now see their payslip.
employee.created A new employee was added.
employee.updated An employee's details changed.
employee.archived An employee was archived.
The full reference lives in the docs.
Every endpoint with its parameters and responses, generated from the same contract the API is tested against, plus a playground that sends real requests against staging.