---
title: Collect a payment
description: Send a payment request to a customer's wallet. Needs the collect permission.
api: POST /payments/collect
---

Creates a `pending` collection and sends the customer a prompt to approve it. See [Collect payments](/docs/guides/collect-payments).

Retrying with the same `external_reference` returns the original transaction and never charges twice.

- **`external_reference`** · body · `string` · required

  Your unique reference for this payment, within the project.

- **`provider`** · body · `string` · required · default `momo`

  Provider to collect through. Must be enabled for the project.

- **`amount`** · body · `number` · required

  Amount in major units. Greater than 0.

- **`currency`** · body · `string` · required · default `SZL`

  ISO 4217 code of your provider environment.

- **`phone_number`** · body · `string` · required

  The payer's MoMo number: 8 digits starting with `76` or `78`, with or without `+268`.

- **`description`** · body · `string`

  Shown in both parties' transaction history. Up to 160 characters.

- **`preapproval_reference`** · body · `string`

  Charge under an approved [pre-approval](/docs/guides/recurring-payments), so the payer isn't prompted. It must belong to the same number and currency.

- **`metadata`** · body · `object`

  Your own data, returned unchanged on the transaction and in webhooks.

## Response

`200` with a [transaction](/docs/concepts/transactions#the-transaction-object) with `type: collection` and `status: pending`.

A retry with an existing `external_reference` also returns `200`, with the transaction in its current status. That may no longer be `pending`, so read `status` rather than relying on the response code.

Any other response means the payment wasn't started:

- **Rejected before it's created**, such as an invalid number: fix the request and retry with the same reference.
- **Refused by the provider:** the transaction is saved as `failed` and no webhook is sent. Retrying that reference returns the failed transaction with `200`, so try again with a **new** reference.

```json 200
{
  "success": true,
  "message": "payment initiated",
  "data": {
    "external_reference": "order-1001",
    "type": "collection",
    "direction": "in",
    "provider_id": "momo",
    "provider_ref": "6f0a2e1c-8b1d-4a8e-9a55-0c7d0e3b1f42",
    "amount": 30,
    "currency": "SZL",
    "status": "pending",
    "payer_phone": "26876123456",
    "description": "Order 1001",
    "metadata": {},
    "created_at": 1760774400,
    "updated_at": 1760774400
  }
}
```

```json 400
{
  "success": false,
  "message": "phone_number must be an Eswatini MoMo number — 8 digits starting with 76 or 78, with optional +268 country code (e.g. 76123456 or +26876123456)",
  "data": null
}
```
