# Instant EFT (/docs/payment-orchestration/instant-eft)

Instant EFT lets a customer pay from their bank account through a provider's
hosted page, rather than with a card. Precium supports two providers.

| Provider | `payment_method_whitelist` value |
|---|---|
| Ozow | `ozow` |
| OneGate | `onegate_eft_redirect` |

**The flow is identical.** OneGate is an alternative to Ozow, not a different
integration. Choosing between them is a single string.

## The flow [#the-flow]

Three steps, the same for both providers.


### 1. Create the client [step] [#1-create-the-client-step]

```bash
POST https://gate.reviopay.com/api/v1/clients/
{
  "email": "customer@example.com",
  "full_name": "A Customer",
  "phone": "+27761234567"
}
```

### 2. Create the purchase [step] [#2-create-the-purchase-step]

Set `payment_method_whitelist` to the provider you want. Restricting it to one
method sends the customer straight to that provider instead of a method picker.

```bash
POST https://gate.reviopay.com/api/v1/purchases/
{
  "client_id": "{client_id}",
  "brand_id":  "{brand_id}",
  "purchase": {
    "currency": "ZAR",
    "language": "en",
    "products": [ { "name": "Order 1234", "price": 10000 } ]
  },
  "payment_method_whitelist": ["onegate_eft_redirect"],
  "success_redirect": "https://www.example.com/success",
  "failure_redirect": "https://www.example.com/failure",
  "cancel_redirect":  "https://www.example.com/cancel"
}
```

Swap `onegate_eft_redirect` for `ozow` to route the same purchase to Ozow.

Amounts are in **cents**: `10000` is ZAR 100.00.

### 3. Send the customer to the provider [step] [#3-send-the-customer-to-the-provider-step]

Direct the customer's browser to the purchase's checkout URL. The provider
hosts the bank selection and authorisation, then returns the customer to the
redirect you supplied.

Confirm the outcome from the webhook rather than from the redirect. A customer
can close the browser after paying, and the redirect will not fire.


## The one difference [#the-one-difference]

<Callout>
**OneGate does not require a mobile number.** If you send `phone` on the client,
OneGate ignores it. Ozow uses it.

Send it anyway if you have it. The same client record works for both providers,
and you will not have to branch on which one a merchant is configured for.
</Callout>

## Which methods a brand actually has [#which-methods-a-brand-actually-has]

Rather than hard-coding either identifier, ask:

```bash
GET https://gate.reviopay.com/api/v1/payment_methods/?brand_id={brand_id}&currency=ZAR
```

Send that with the same key you will create the purchase with, because the key
decides whether the lookup runs against test or live configuration. A brand that
is not enabled for a provider will not return it, and whitelisting a method a
brand does not have will fail the purchase.
