> For the complete documentation index, see [llms.txt](https://docs.fonbnk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.fonbnk.com/server-to-server/integration-guide/transfer-types-explanation.md).

# Transfer types explanation

In our system, after a user creates an order, he must pay funds to the specified recipient. We support several types of fund transfer types:

* <mark style="color:yellow;">**manual**</mark> – user manually makes a transfer with provided instructions
* <mark style="color:yellow;">**redirect**</mark> – user is redirected to a third-party payment page to complete payment
* <mark style="color:yellow;">**stk\_push**</mark> – user receives a push on their phone to approve the payment. If user didn't receive the push notification, you can [Trigger order intermediate action](/server-to-server/api-endpoints/trigger-order-intermediate-action.md)  to retry it.
* <mark style="color:yellow;">**otp\_stk\_push**</mark> – same as <mark style="color:yellow;">**stk\_push**</mark> but before initiating a push user must verify their phone number by providing the otp code received via SMS or WhatsApp to the [Trigger order intermediate action](/server-to-server/api-endpoints/trigger-order-intermediate-action.md) endpoint. If user didn't receive the push notification, you can [Trigger order intermediate action](/server-to-server/api-endpoints/trigger-order-intermediate-action.md)  again to retry it.

Different transfer types contain different data:

* <mark style="color:yellow;">**manual**</mark> – includes transferDetails for making the transfer
* <mark style="color:yellow;">**redirect**</mark> – includes paymentUrl to redirect the user
* <mark style="color:yellow;">**stk\_push**</mark> – includes intermediate action metadata:
  * intermediateActionMaxAttempts
  * intermediateActionAttempts
  * intermediateActionNextAttemptAvailableAt
  * intermediateActionTimeoutMs
* <mark style="color:yellow;">**otp\_stk\_push**</mark> – same as stk\_push plus fieldsForIntermediateAction (e.g., otpCode)

### Example of the manual transfer

Let's imagine you've created a fiat (bank) -> crypto order using the [create order](/server-to-server/api-endpoints/create-order.md) endpoint.

The <mark style="color:yellow;">order.deposit.transferInstructions</mark> could be like the next:

{% code overflow="wrap" %}

```json
{
  "type": "manual",
  "instructionsText": "Transfer the NGN to the agent's bank account.",
  "warningText": "Important: Only transfer funds from a bank account you specified previously. Send the exact NGN amount. Use the displayed account for this transaction only.",
  "transferDetails": [
    {
      "id": "recipientBankName",
      "label": "Bank name",
      "value": "PROVIDUS BANK"
    },
    {
      "id": "recipientBankAccountNumber",
      "label": "Bank account number",
      "value": "9670555843"
    },
    {
      "id": "recipientBankAccountName",
      "label": "Bank account name",
      "value": "Start Button Limited(Checkout)"
    },
    {
      "id": "bankTransferNarration",
      "label": "Bank transfer narration",
      "description": "TRANSFER WITHOUT NARRATION WILL BE IGNORED BY THE SYSTEM.",
      "value": "shc-pshr4upg8s"
    },
    {
      "id": "amountToSend",
      "label": "Amount to send",
      "value": "14800"
    }
  ],
  "fieldsToConfirmOrder": []
}
```

{% endcode %}

The above data says the following:

* The transfer type is <mark style="color:yellow;">manual</mark>, so the user must initiate and complete the fund transfer independently.
* The user must pay ”<mark style="color:yellow;">14800</mark>” of his local currency to the “9670555843” bank account number and set “<mark style="color:yellow;">shc-pshr4upg8s</mark>” as a transfer narration.

### Example of the stk\_push transfer

Let's imagine you've created an fiat (mobile money) -> crypto order using the [create order](/server-to-server/api-endpoints/create-order.md) endpoint.

The <mark style="color:yellow;">order.deposit.transferInstructions</mark> could be like the next:

```json
{
  "type": "stk_push",
  "instructionsText": "You’ll be prompted with a USSD dialog to proceed the transfer. If the transfer is unsuccessful or you don’t receive the USSD dialog, please retry the transfer",
  "warningText": "",
  "intermediateActionButtonText": "Retry USSD prompt initialization",
  "intermediateActionMaxAttempts": 3,
  "intermediateActionAttempts": 1,
  "intermediateActionNextAttemptAvailableAt": "2025-12-01T11:54:49.260Z",
  "intermediateActionTimeoutMs": 60000,
  "isIntermediateActionAvailable": true,
  "transferDetails": [
    {
      "id": "amountToSend",
      "label": "Amount to send",
      "value": "635"
    }
  ],
  "fieldsToConfirmOrder": []
}
```

The above data says the following:

* The transfer type is <mark style="color:yellow;">stk\_push</mark>, so the user should receive the push notification to send their funds.
* If the user didn't receive the push notification, you can initiate a new one after "<mark style="color:yellow;">2025-12-01T11:54:49.260Z</mark>". There are 3 attempts to initiate intermediate action, and you can do 2 more. You must call [Trigger order intermediate action](/server-to-server/api-endpoints/trigger-order-intermediate-action.md)  to retry it.

### Example of the otp\_stk\_push transfer

Let's imagine you've created an fiat (mobile money) -> crypto order using the [create order](/server-to-server/api-endpoints/create-order.md) endpoint.

The <mark style="color:yellow;">order.deposit.transferInstructions</mark> could be like the next:

{% code overflow="wrap" %}

```json
{
  "type": "otp_stk_push",
  "instructionsText": "Enter the OTP code received via WhatsApp to initiate the transaction and you’ll be prompted with a USSD dialog to proceed the transfer. If the transfer is unsuccessful or you don’t receive the USSD dialog, please retry the transfer",
  "warningText": "",
  "intermediateActionButtonText": "Verify OTP code",
  "intermediateActionMaxAttempts": 3,
  "intermediateActionAttempts": 1,
  "intermediateActionNextAttemptAvailableAt": "1970-01-01T00:00:00.000Z",
  "intermediateActionTimeoutMs": 30000,
  "isIntermediateActionAvailable": true,
  "transferDetails": [
    {
      "id": "amountToSend",
      "label": "Amount to send",
      "value": "310000"
    }
  ],
  "fieldsToConfirmOrder": [],
  "fieldsForIntermediateAction": [
    {
      "key": "otpCode",
      "label": "OTP code",
      "type": "number",
      "required": true
    }
  ],
  "intermediateActionRequired": true,
  "intermediateActionExecuted": false,
  "otpChannel": "whatsapp"
}
```

{% endcode %}

The above data says the following:

* The transfer type is <mark style="color:yellow;">otp\_stk\_push</mark>, so the user should confirm their phone number via OTP and thereafter, they'll receive the push notification to pay for the order.
* System sent the OTP code to user using "<mark style="color:yellow;">whatsapp</mark>" and the [Trigger order intermediate action](/server-to-server/api-endpoints/trigger-order-intermediate-action.md) must be called with "<mark style="color:yellow;">otpCode</mark>" field to initiate the transfer.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.fonbnk.com/server-to-server/integration-guide/transfer-types-explanation.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
