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
What you send
{
  "jurisdiction": "GH",
  "period_start": "2026-08-01",
  "period_end": "2026-08-31",
  "pay_date": "2026-09-05"
}
What comes back
{
  "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.