> ## Documentation Index
> Fetch the complete documentation index at: https://vas-partner-api-docs.finpaytech.co/llms.txt
> Use this file to discover all available pages before exploring further.

# How Payers Pay

> M-Pesa, PesaLink, and RTGS Instructions for a Virtual Account

Use payment options to render checkout copy. Pass **one** context query so the account number matches the collection you intend.

## Fetch Instructions

```http theme={null}
GET https://vas.finpaytech.co/business-api/api/v1/merchants/me/payment-options
Authorization: Bearer <access-token>
```

Optional query (pick one):

| Param               | Resolves                                                           |
| ------------------- | ------------------------------------------------------------------ |
| `virtualAccountId`  | That account                                                       |
| `expectedPaymentId` | Invoice account for the bill                                       |
| `customerId`        | Subscriber account                                                 |
| `subMerchantId`     | Brand account for the shop, otherwise the primary merchant account |

## Response Fields

* `virtualAccountNumber` / `virtualAccountName`
* `mobileMoneyCustomerFacingCopy` — manual M-Pesa (My OneApp, USSD, SIM Toolkit)
* `stkPushCustomerFacingCopy` — STK Push only. Null when STK is off
* `pesalinkCustomerFacingCopy`
* `rtgsCustomerFacingCopy` / `rtgsNarrationHint`
* `options[]` — structured fields per channel

Display the `*CustomerFacingCopy` strings as-is, or build your own UI from `options`.

## Mobile Money (M-Pesa)

### Manual Paybill

The payer enters **three fields only**: paybill, account number (the virtual account), amount.

```text theme={null}
Pay with M-Pesa via My OneApp, USSD (*334#), or SIM Toolkit.

Lipa na M-Pesa > Pay Bill
Paybill: 559900
Account number: 7600000035
Amount: enter the amount you are paying
```

`options` for `MOBILE_MONEY` include `paybillNumber` (`559900`) and `paybillNumberName` (`UBA Kenya`).

There is no extra reference field on My OneApp/USSD/SIM Toolkit. Shop or invoice identity should use a **Brand** or **Invoice** virtual account so the number itself identifies the payment.

### STK Push

The payer does not type paybill or account number. You send a prompt to their phone.

```http theme={null}
POST https://vas.finpaytech.co/business-api/api/v1/merchants/me/stk/initiate
Authorization: Bearer <access-token>
Content-Type: application/json

{
  "phoneNumber": "254712345678",
  "amount": 2500.00,
  "expectedPaymentId": "<optional-bill-id>",
  "virtualAccountId": "<optional-va-id>",
  "customerId": "<optional-customer-id>"
}
```

Poll:

```http theme={null}
GET https://vas.finpaytech.co/business-api/api/v1/merchants/me/stk/{initiationId}
Authorization: Bearer <access-token>
```

`status` is `PENDING_CUSTOMER`, `SUCCESS`, `FAILED`, or `CANCELLED`. Settlement still appears as an inbound payment on the virtual account (see [Payments](/guides/payments)).

## PesaLink

Payers send to the **virtual account number** at UBA Kenya.

```text theme={null}
Send money by PesaLink to UBA Kenya, account number 7600000035.
You can pay from any participant bank in the PesaLink network.
```

`options` for `PESALINK` include `bankName` (`UBA Kenya`) and `accountNumber` (the virtual account).

## RTGS

Payers send an RTGS credit to the collection account below. Field `:70` must include the **virtual account number** (and your reference when you use one).

```text theme={null}
Make an RTGS transfer to:

Bank: UBA Kenya (Westlands)
SWIFT: UNAFKENA
Account name: FINPAYTECH LTD
Account number: 55010160025423

In field :70 (payment narration), enter exactly:
7600000035 INV-2026-1044
```

`rtgsNarrationHint` is the exact `:70` string. `options` for `RTGS` include bank, branch, SWIFT, account name, and account number.
