Cancel a transfer before it is processed
Only from pending_approval or scheduled (CONVENTIONS §8); anything else returns 409 invalid_state with
details.status. Once a transfer is processing it has gone to the bank and can’t be stopped. The hold on
the amount is released, a pending approval becomes canceled, and status_reason is canceled_by_user.
Canceling the next run of a scheduled payment is the same as POST /scheduled-payments/{id}/skip-next.
Batch rows are canceled with their batch (POST /batches/{id}/cancel), not one by one (409 invalid_state).
Error codes: invalid_api_key, parameter_invalid, parameter_missing, resource_not_found, scope_missing, csrf_token_invalid, idempotency_key_reused, invalid_state, rate_limited.
Authorizations
Server API key, scoped. pk_test_ keys hit the sandbox tenant.
Headers
Optional on non-money POSTs; honoured when sent.
1 - 255Optional 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
trf_…
^trf_[0-9A-HJKMNP-TV-Z]{26}$Body
Optional note kept in the audit log.
Why it was canceled.
500Response
Canceled.
Money leaving (or, for a reversal, coming back to) an account. Lifecycle is MovementStatus.
A payout always has one source account and, once sent, one NIP session id.
Carries the ISO 8583 outcome (ResponseOutcome, CONVENTIONS §7a). Batch rows and scheduled-payment runs are
transfers, so they carry it too:
Two-character ISO 8583 response code, using the NIBSS NIP meanings (CONVENTIONS §7a). 00 is success.
Carried on every error (mapped from error.code, see errors.yaml x-codes) and on every money-movement
object (the bank's final code, or our own while it is in flight). Clients must tolerate codes added later.
00, 01, 03, 05, 06, 07, 08, 09, 12, 13, 14, 15, 16, 17, 21, 25, 26, 30, 34, 35, 51, 57, 58, 61, 63, 65, 68, 91, 92, 94, 96, 97 ^[0-9A-Z]{2}$Standard meaning of the code (the x-codes text), not customer copy. Customer-safe wording is in status_reason / error.message.
"Approved or completed successfully"
trf_…
Always transfer.
"transfer"payout: to a bank account outside PanoFlow, over NIP.own_account: between two of this business's accounts in the same currency.reversal: created by PanoFlow to reverse a completed transfer; read-only for customers and linked byreversal_of.
payout, own_account, reversal Lifecycle shared by every money-moving resource (CONVENTIONS §8). UI labels: completed → "Settled", pending_approval → "Pending approval".
draft, pending_approval, scheduled, processing, completed, failed, rejected, canceled, reversed What the recipient receives.
Fee charged on top (zero for own_account). Refunded with the amount if the transfer fails.
Amount + fee taken from the source account.
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"
Sub-state of status (clients must tolerate new values):
awaiting_approval, awaiting_run_date, queued, sent_to_bank, awaiting_bank_confirmation, settled, rejected_by_receiving_bank, name_enquiry_failed, insufficient_balance, limit_exceeded, could_not_process, rejected_by_approver, canceled_by_user, approval_expired, schedule_skipped, schedule_canceled, batch_canceled, reversed Account the money left. Omitted on a reversal (the other side is not shown).
For own_account and reversal, this business's account that received the money.
rcp_… when paid to (or saved as) a recipient.
Who was paid, as the UI shows it ("Kano Freight Services", "Naira · Payroll").
For payouts, the account paid, with the name-enquiry account_name.
Shows on the recipient's bank statement.
Why it was made (shown to approvers; sent by agents).
NIP session id, present once the payout has been sent. Quote it to the receiving bank.
^\d{30}$txn_…, the line in the Transactions view and on the receipt.
Present when status is failed.
The approval, when this transfer needed one (not on batch rows; see the batch).
bat_… when this is a row of a batch.
The row's line number in the batch file.
x >= 1sch_… when this is a run of a scheduled payment.
Run date, for a scheduled transfer.
"2026-11-07"
agt_… when an agent created it.
On a reversal, the trf_… it reverses.
On a reversed transfer, the trf_… of the reversal.
doc_… files kept with the payment (invoice, receipt).
Expected arrival while processing.
"2026-10-27T08:41:00Z"
Tracking steps, oldest first. Returned on GET /transfers/{id}; omitted in lists.
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
Up to 20 string keys (≤ 40 chars) with string values (≤ 500 chars). Returned on the resource and its events.