> ## Documentation Index
> Fetch the complete documentation index at: https://docs.panoflow.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Payment statuses and ISO 8583 response codes

> The lifecycle every PanoFlow money movement follows, the status_reason sub-states for transfers, and the ISO 8583 response_code each state carries.

Every PanoFlow resource that moves money (transfers, batch rows, scheduled payment runs, inbound credits, pay-run lines and agent payments) follows one lifecycle in its `status` field, and carries a `response_code` and `response_message` that tell you the outcome in ISO 8583 terms.

## Lifecycle

```text theme={null}
draft → pending_approval → processing → completed
                      ↘ rejected     ↘ failed
completed → reversed   (only through a new linked reversal, never by editing)
scheduled → processing …
canceled               (from draft, pending_approval or scheduled only)
```

| `status` | Meaning | Label in the web app |
| - | - | - |
| `draft` | Not submitted yet. | |
| `pending_approval` | Waiting for a second person to approve it. See [Approvals](https://docs.panoflow.io/approvals.md). | Pending approval |
| `scheduled` | Waiting for its run date. | |
| `processing` | Accepted and being sent to the bank. | Processing |
| `completed` | Settled. | Settled |
| `failed` | Didn't go through. The transfer carries `failure`. | |
| `rejected` | An approver rejected it. | |
| `canceled` | Canceled before it was processed. | |
| `reversed` | A completed payment was reversed by a new, linked transfer. | |

Clients must tolerate status values added later.

## Sub-states

Transfers explain their status further in `status_reason`:

| `status` | `status_reason` values |
| - | - |
| `pending_approval` | `awaiting_approval` |
| `scheduled` | `awaiting_run_date` |
| `processing` | `queued` (checks done, not yet sent), `sent_to_bank`, `awaiting_bank_confirmation` (no answer from the bank yet; a status query is running and the payment will not be sent again until it answers) |
| `completed` | `settled` |
| `failed` | `rejected_by_receiving_bank`, `name_enquiry_failed`, `insufficient_balance`, `limit_exceeded`, `could_not_process` |
| `rejected` | `rejected_by_approver` |
| `canceled` | `canceled_by_user`, `approval_expired`, `schedule_skipped`, `schedule_canceled`, `batch_canceled` |
| `reversed` | `reversed` |

New `status_reason` values can be added; don't fail on one you don't recognise.

## Following a payment to the end

`POST /v1/transfers` returns `202` with `status: processing` for a payout, or `201` with `status: pending_approval` when it needs an approval. To learn the outcome, either:

* wait for the `payment.completed` or `payment.failed` [webhook](https://docs.panoflow.io/webhooks.md), or
* poll `GET /v1/transfers/{transfer_id}` until `status` is final.

## Response codes on money movements

| State | `response_code` |
| - | - |
| `processing`, `pending_approval` or `scheduled` | `09` request processing in progress |
| The bank's status couldn't be confirmed yet | `01` status unknown. The payment is never sent again until the status is resolved. |
| `completed` | `00` |
| `failed` or `rejected` | The bank's NIP code (for example `51`, `57`, `91`, `97`), or PanoFlow's own code from the [error mapping](https://docs.panoflow.io/errors.md#error-codes) when the payment never reached the bank |

`response_message` is the standard meaning of the code, not text for your customers. For customer-facing wording, use `status_reason` or `error.message`.

Successful responses that don't move money carry no `response_code`.

## Response code meanings

New codes can be added; treat an unknown code by its `status`.

| Code | Meaning |
| - | - |
| `00` | Approved or completed successfully |
| `01` | Status unknown, please wait for settlement report |
| `03` | Invalid sender |
| `05` | Do not honour |
| `06` | Dormant account |
| `07` | Invalid account |
| `08` | Account name mismatch |
| `09` | Request processing in progress |
| `12` | Invalid transaction |
| `13` | Invalid amount |
| `14` | Invalid batch number |
| `15` | Invalid session or record id |
| `16` | Unknown bank code |
| `17` | Invalid channel |
| `21` | No action taken |
| `25` | Unable to locate record |
| `26` | Duplicate record |
| `30` | Format error |
| `34` | Suspected fraud |
| `35` | Contact sending bank |
| `51` | No sufficient funds |
| `57` | Transaction not permitted to sender |
| `58` | Transaction not permitted on channel |
| `61` | Transfer limit exceeded |
| `63` | Security violation |
| `65` | Exceeds withdrawal frequency |
| `68` | Response received too late |
| `91` | Beneficiary bank not available |
| `92` | Routing error |
| `94` | Duplicate transaction |
| `96` | System malfunction |
| `97` | Timeout waiting for response from destination |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.