Launch payroll in a new country without rebuilding payroll.
One API for country-specific gross-to-net calculation, the full pay-run lifecycle, statutory outputs, lodgement rails, and an auditable evidence chain on every write. Your team ships product — a new country becomes a versioned config pack.
Built for HRIS, workforce & vertical SaaS platforms expanding across borders — not becoming payroll compliance companies.
Every country turns payroll into a different product.
Expansion stalls because the local rules don't just change a tax number — they change the shape of your data model, your UI, your filing obligations, and your audit trail. Ledra Pay absorbs that so your product model stays stable.
The data model shifts
Employee fields, residency, tax declarations and contribution rules differ per jurisdiction — schemas you'd otherwise fork per country.
The outputs shift
Payslip schemas and statutory file formats (STP, RTI, payday filing, DGUV) are all different, versioned, and change without warning.
The obligations shift
Approval flows, lodgement deadlines and audit evidence carry legal weight — a silent calculation change is a compliance incident.
One API shape. Versioned country packs underneath.
The API never changes shape between countries. Statutory updates ship as pack releases you can pin, test, and diff — never silent behaviour changes in production.
Your platform
Product UI, customer accounts, the country toggle your users actually see.
Ledra Pay API
Stable objects: employees, timesheets, pay runs, payslips, filings, webhooks, evidence.
Certified country packs
AU-2026.1, NZ, UK, DE… tax scales, contributions & statutory schemas, independently versioned.
Lodgement rails
Direct submission where live (AU STP), compliant output files everywhere else.
Six modules. The objects your platform actually ships.
Not the internals of a calculation engine — the product surface, plus the proof and controls that make payroll safe to run programmatically.
Calculate
Stateless gross-to-net for any country pack. Start here — one endpoint, a receipt on every result.
Orchestrate
Tenants, employees, timesheets, pay runs and payslips through their full lifecycle and state machine.
File
Statutory output files today; direct lodgement rails per country — AU STP Phase 2 first.
Prove
Every write lands in an immutable evidence chain: actor, reason, input hash, output hash, policy checks.
Compare
Shadow runs replay a real pay run and produce a variance report against your incumbent before go-live.
Control
An MCP server exposes risk-tiered tools, so agents can run payroll with mandatory reasons and approval gates on anything irreversible.
From sandbox key to first calculation in minutes.
A stateless endpoint to start, the full tenant lifecycle when you're ready, and a variance-reporting shadow run when it's time to trust it with production data.
# Gross-to-net for any country pack
curl https://sandbox.ledrapay.com/v1/calculate \
-H "Authorization: Bearer lp_sandbox_…" \
-d '{
"pack": "AU-2026.1",
"frequency": "fortnightly",
"employee": { "residency": "resident",
"tax_free_threshold": true },
"earnings": [ { "type": "ordinary",
"amount": 3269.23 } ]
}'
→ 200 OK
{ "net": { "amount": "2591.85", "currency": "AUD" },
"evidence": "evd_a90b" } // every result is receipted
# Open a pay run for a tenant
curl https://sandbox.ledrapay.com/v1/pay_runs \
-H "Authorization: Bearer lp_sandbox_…" \
-d '{
"tenant": "ten_8fk2",
"pack": "AU-2026.1",
"period": "2026-P18",
"frequency": "fortnightly"
}'
→ 201 Created
{ "id": "prun_018",
"status": "draft",
"employees": 42,
"next": "POST /v1/pay_runs/prun_018/finalize" }
# Replay a real run against your incumbent
curl https://sandbox.ledrapay.com/v1/shadow_runs \
-H "Authorization: Bearer lp_sandbox_…" \
-d '{ "pay_run": "prun_018",
"baseline": "incumbent_export.csv" }'
→ 200 OK — variance report
{ "employees": 42,
"max_variance": "0.03%",
"mismatches": 0,
"evidence": "evd_shadow_5521" }
# Submit statutory filing (AU STP Phase 2)
curl https://sandbox.ledrapay.com/v1/filings \
-H "Authorization: Bearer lp_sandbox_…" \
-d '{ "pay_run": "prun_018",
"channel": "stp_phase2",
"approved_by": "usr_9021" }'
→ 202 Accepted
{ "status": "lodged",
"receipt_ref": "ATO-STP-77c1",
"evidence": "evd_file_9033" }
Thirteen packs in beta. The full stack, live, in Australia.
The calculation engine is the first thing to land in a country; lodgement rails follow, shaped with design partners. Here is exactly where each pack stands today.
| Country | Calculation engine | Statutory output | Direct lodgement rail | Status |
|---|---|---|---|---|
| AU Australia | Yes | Yes | STP Phase 2 — in build | Deepest |
| NZ New Zealand | Yes | Yes | Payday filing — planned next | Beta |
| UK United Kingdom | Yes | Yes | RTI — planned next | Beta |
| DE Germany | Yes | Yes | Rails — with design partner | Beta |
| FR France | Yes | Yes | Output files → local process | Beta |
| NL · BE · ES Benelux + ES | Yes | Yes | Output files → local process | Beta |
| PT · AT · CH · LU | Yes | Yes | Output files → local process | Beta |
| US United States | Yes | Yes | Output files → local process | Early |
All regulation packs are in beta. Australia is currently the only country with a direct statutory submission rail; every other pack returns compliant statutory output files for filing through your local process. Rail order is shaped with design partners. See full coverage detail →
Bring us one pay run. We'll prove the numbers.
Start with a zero-risk shadow run against your incumbent provider, then help shape the lodgement rails and country roadmap.
- 1 Send one anonymised historical pay run.
- 2 We replay it through the AU-2026.1 pack.
- 3 You get a variance report vs your incumbent.
- 4 Inspect the evidence chain behind every figure.