Pay out an approved run now
Starts paying a scheduled run immediately (on pay day when automatic pay is off, or before pay day).
Needs Idempotency-Key and X-Step-Up-Token.
Payroll checks that the source account’s available balance covers total net pay, then asks Payments for
one hold per included line and then one NIP payout per line (transfer_id on each line). If any hold is
rejected, holds already placed for this run are released and the call fails with
422 payroll_short_funds; nothing is paid.
The run moves to processing (lines processing, response_code 09). Each line then completes
(00) or fails with the bank’s NIP code; the money for a failed line returns to the source account. The
run ends completed when every line is completed, completed with status_reason: some_lines_failed
when some failed, or failed when all failed. Payslips are issued for completed lines and emailed when
email_payslips is on. Emits payrun.completed.
Error codes: invalid_api_key, parameter_invalid, resource_not_found, scope_missing, step_up_required, csrf_token_invalid, idempotency_key_reused, payroll_short_funds, bank_unavailable, business_frozen, business_not_approved, rate_limited.
Authorizations
Server API key, scoped. pk_test_ keys hit the sandbox tenant.
Headers
Required on money-moving POSTs. Same key + same body replays the first response; same key + different body returns 409 idempotency_key_reused. Kept 7 days.
1 - 255Proof of a 2FA step-up within the last 5 minutes (POST /v1/auth/step-up).
Optional client correlation id, up to 128 characters. It is not echoed: the response's X-Request-Id is always
our own req_… id. We log your value with the request as client_request_id, so support can find a request by
either id. A longer value is refused with 400 parameter_invalid.
128Path Parameters
Pay run id (run_…).
^run_[0-9A-HJKMNP-TV-Z]{26}$Response
Executing.
A month's pay run (run_…).
run_…
Always pay_run.
"pay_run"RFC 3339, UTC.
"2026-10-27T08:41:00Z"
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
Pay month.
^\d{4}-\d{2}$"November 2026 pay run".
Calendar date, interpreted in Africa/Lagos.
"2026-11-07"
CONVENTIONS §8 lifecycle: draft → pending_approval (second approver) → scheduled (waits for pay day)
→ processing → completed | failed; rejected by the second approver; canceled from draft,
pending_approval or scheduled. UI: completed → "Paid". Pay runs are never reversed.
draft, pending_approval, scheduled, processing, completed, failed, rejected, canceled, reversed pay_day: pays on pay_date once approved. now: pays as soon as it is fully approved.
pay_day, now Narration on every salary transfer ("Salary Nov 2026").
One of the business's own PanoFlow accounts (owned by the Accounts service).
Totals over included lines. gross − deductions = net, always.
Net is above second_approval_threshold.
Approve by this time to pay on pay_date ("26 Nov, 4pm").
"2026-10-27T08:41:00Z"
Sub-state.
awaiting_second_approval, awaiting_pay_day, awaiting_execution, changed_after_approval, some_lines_failed, rejected_by_approver Deduction totals by type, with where each goes. Stays in the source account; PanoFlow does not remit them.
Whether the source account covers the run, worked out at read time. Absent once executing.
An amount in minor units (kobo, cents) with its currency. Never a decimal.
The pending or decided approval (kind is pay_run), when one was needed.
Everyone who approved, in order ("Approved by Adaeze Okafor and Tolu Martins").
Who did something. Shown in activity, approvals and the audit log.
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
One per person. Returned by getPayRun and run actions; omitted from lists.