Skip to main content
POST
Pay out an approved run now

Authorizations

Authorization
string
header
required

Server API key, scoped. pk_test_ keys hit the sandbox tenant.

Headers

Idempotency-Key
string
required

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.

Required string length: 1 - 255
X-Step-Up-Token
string
required

Proof of a 2FA step-up within the last 5 minutes (POST /v1/auth/step-up).

X-Request-Id
string

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.

Maximum string length: 128

Path Parameters

run_id
string
required

Pay run id (run_…).

Pattern: ^run_[0-9A-HJKMNP-TV-Z]{26}$

Response

Executing.

A month's pay run (run_…).

id
string
required

run_…

object
string
required

Always pay_run.

Allowed value: "pay_run"
created_at
string<date-time>
required

RFC 3339, UTC.

Example:

"2026-10-27T08:41:00Z"

updated_at
string<date-time>
required

RFC 3339, UTC.

Example:

"2026-10-27T08:41:00Z"

period
string
required

Pay month.

Pattern: ^\d{4}-\d{2}$
name
string
required

"November 2026 pay run".

pay_date
string<date>
required

Calendar date, interpreted in Africa/Lagos.

Example:

"2026-11-07"

status
enum<string>
required

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.

Available options:
draft,
pending_approval,
scheduled,
processing,
completed,
failed,
rejected,
canceled,
reversed
pay_timing
enum<string>
required

pay_day: pays on pay_date once approved. now: pays as soon as it is fully approved.

Available options:
pay_day,
now
narration
string
required

Narration on every salary transfer ("Salary Nov 2026").

source_account
object
required

One of the business's own PanoFlow accounts (owned by the Accounts service).

totals
object
required

Totals over included lines. gross − deductions = net, always.

requires_second_approval
boolean
required

Net is above second_approval_threshold.

approve_by
string<date-time>

Approve by this time to pay on pay_date ("26 Nov, 4pm").

Example:

"2026-10-27T08:41:00Z"

status_reason
enum<string>

Sub-state.

Available options:
awaiting_second_approval,
awaiting_pay_day,
awaiting_execution,
changed_after_approval,
some_lines_failed,
rejected_by_approver
deductions_to_remit
object[]

Deduction totals by type, with where each goes. Stays in the source account; PanoFlow does not remit them.

funding
object

Whether the source account covers the run, worked out at read time. Absent once executing.

second_approval_threshold
object

An amount in minor units (kobo, cents) with its currency. Never a decimal.

approval
object

The pending or decided approval (kind is pay_run), when one was needed.

approved_by
object[]

Everyone who approved, in order ("Approved by Adaeze Okafor and Tolu Martins").

prepared_by
object

Who did something. Shown in activity, approvals and the audit log.

executed_at
string<date-time>

RFC 3339, UTC.

Example:

"2026-10-27T08:41:00Z"

completed_at
string<date-time>

RFC 3339, UTC.

Example:

"2026-10-27T08:41:00Z"

lines
object[]

One per person. Returned by getPayRun and run actions; omitted from lists.