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

# Hong Kong FPS

Payouts via FPS offer a fast and cost-effective way to disburse funds in Hong Kong using the Faster Payment System (FPS). FPS lets you send money to a beneficiary using the proxy identifier they registered with FPS: a mobile number, an email address or an FPS ID. You don't need to collect the beneficiary's bank account details.

This documentation will guide you through the technical and operational steps required to manage payouts via FPS in Hong Kong.

# Key Features

* Payouts are delivered in near real-time
* No cut-off times
* Supported currencies - HKD, CNY
* Minimum limit - 1 HKD / 1 CNY
* Maximum limit - 1,000,000 HKD / 1,000,000 CNY

# Building an integration

## Step 1: Initiate a payout request

Tazapay uses a `payout` object to represent your intent to initiate a payout. The payout object tracks state changes from when the payout is initiated to when the beneficiary receives the funds.

Create a payout on your server using Tazapay's [payout API](https://developer.tazapay.com/api-reference/tazapay-api/create-payout.md) with the following information:

* Payout Amount - The amount in HKD or CNY you want to transfer to the beneficiary
* Type of Payout - `local_payment_network`
* Beneficiary Details
  * Name - The beneficiary's name
  * Type - `business` or `individual`
  * Destination Details
    * Local payment network type - `fps_hkd` for HKD, `fps_cny` for CNY
    * Currency - `HKD` for `fps_hkd`, `CNY` for `fps_cny`
    * Proxy type (`deposit_key_type`)
    * Proxy value (`deposit_key`)
* [Reason for Payout](https://developer.tazapay.com/payouts/payout-network/purpose.md)
* Transaction Description - Additional Description for a payout

### Possible values for `deposit_key_type`

| Proxy type | `deposit_key_type` |
| :- | :- |
| Mobile number | `phone` |
| Email address | `email` |
| FPS ID | `fps_id` |

> [!NOTE]
>
> To pay a Hong Kong bank account over FPS instead of a proxy, create a local bank payout with `local.fund_transfer_network` set to `fps`. See [Create Payout](https://developer.tazapay.com/api-reference/tazapay-api/create-payout.md).

### Validations for proxy value

Ensure the following validations on your application for customer input for the proxy value. Proper error handling should be implemented for cases where validations fail.

| Proxy type | Description | Validation | Example | Rejected examples |
| :- | :- | :- | :- | :- |
| Mobile number | The Hong Kong mobile number registered with FPS | 8 digits, optionally preceded by the country code `852` or `+852`. Spaces, dashes and parentheses are allowed, so `6123 4567` and `+852 61234567` are both accepted. Non-Hong Kong numbers are rejected | +852-61234567 | `+86 13812345678` (not a Hong Kong number) `6123456` (7 digits) |
| Email address | The email address registered with FPS | Must be a valid email format: a name, an `@` symbol and a domain (e.g., example.com), with no spaces | [john.doe@example.com](mailto:john.doe@example.com) | `john.doe@example` (no domain extension) `john doe@example.com` (contains a space) |
| FPS ID | The FPS ID assigned to the beneficiary | 1–50 characters: letters, digits, `.`, `_` and `-` | 1234567 | `FPS 1234` (contains a space) An ID longer than 50 characters |

A payout or beneficiary with an invalid proxy value, or with a `deposit_key_type` other than `phone`, `email` or `fps_id`, is rejected with error code `20301` (Field is required and must be a valid deposit key).

### Sample Request cURL

```bash theme={null}
curl --request POST \
  --url https://service.tazapay.com/v3/payout \
  --header 'Idempotency-Key: ref_78211' \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --data '{
  "beneficiary_details": {
    "type": "individual",
    "name": "Chan Tai Man",
    "destination_details": {
      "type": "local_payment_network",
      "local_payment_network": {
        "type": "fps_hkd",
        "currency": "HKD",
        "deposit_key_type": "phone",
        "deposit_key": "+852-61234567"
      }
    }
  },
  "amount": 100000,
  "currency": "HKD",
  "holding_currency": "USD",
  "purpose": "PYR005",
  "transaction_description": "Invoice INV-1001",
  "type": "local_payment_network",
  "reference_id": "ref_78211"
}'
```

### Response

```json theme={null}
{
    "status": "success",
    "message": "",
    "data": {
        "amount": 100000,
        "balance_transaction": "btr_d4hk2v0ufu1c73b5fps0",
        "beneficiary": "bnf_d4hk2upufu1c73b5fpr0",
        "beneficiary_details": {
            "address": null,
            "destination": "lpn_d4hk2upufu1c73b5fprg",
            "destination_details": {
                "local_payment_network": {
                    "type": "fps_hkd",
                    "currency": "HKD",
                    "deposit_key_type": "phone",
                    "deposit_key": "+852-61234567"
                },
                "type": "local_payment_network"
            },
            "documents": [],
            "email": "",
            "name": "Chan Tai Man",
            "national_identification_number": "",
            "phone": null,
            "tax_id": "",
            "type": "individual"
        },
        "charge_type": "",
        "created_at": "2026-11-04T08:15:40.716489Z",
        "currency": "HKD",
        "documents": [],
        "holding_currency": "USD",
        "id": "pot_d4hk2v0ufu1c73b5fpsg",
        "logistics_tracking_details": [],
        "metadata": null,
        "mt103": "",
        "object": "payout",
        "payout_fx_transaction": {
            "exchange_rate": 7.78,
            "final": {
                "amount": 100000,
                "currency": "HKD"
            },
            "id": "fx_d4hk2v0ufu1c73b5fpt0",
            "initial": {
                "amount": 12854,
                "currency": "USD"
            },
            "object": "fx_transaction"
        },
        "purpose": "PYR005",
        "reference_id": "ref_78211",
        "statement_descriptor": "",
        "status": "processing",
        "status_description": "",
        "tracking_details": null,
        "transaction_description": "Invoice INV-1001",
        "type": "local_payment_network"
    }
}
```

> `id` is the unique identifier you can use to track the payout.

## Alternatively, Creating a beneficiary and then initiating a payout

To align with your workflow, you can also choose to split Step 1 into two steps

* Step 1A: Creating a beneficiary using the [Create Beneficiary endpoint](https://developer.tazapay.com/api-reference/tazapay-api/create-beneficiary.md)
* Step 1B: Initiating a payout using the [Create Payout endpoint](https://developer.tazapay.com/api-reference/tazapay-api/create-payout.md)

### Step 1A: Creating a beneficiary

Tazapay uses a `beneficiary` object to represent the receiver of funds of a payout. Pass the beneficiary name, type, the local payment network type and currency, the proxy type and the proxy value to the /v3/beneficiary endpoint. The proxy value is validated when the beneficiary is created.

The possible values for `deposit_key_type` and the validations for the proxy value are the same as in [Step 1](#possible-values-for-deposit_key_type).

### Sample Request cURL

```bash theme={null}
curl --request POST \
  --url https://service.tazapay.com/v3/beneficiary \
  --header 'accept: application/json' \
  --header 'authorization: Basic <base64 of api_key:api_secret>' \
  --header 'content-type: application/json' \
  --data '{
  "type": "individual",
  "name": "Chan Tai Man",
  "destination_details": {
    "type": "local_payment_network",
    "local_payment_network": {
      "type": "fps_hkd",
      "currency": "HKD",
      "deposit_key_type": "phone",
      "deposit_key": "+852-61234567"
    }
  }
}'
```

### Response

```json theme={null}
{
    "status": "success",
    "message": "",
    "data": {
        "address": null,
        "created_at": "2026-11-04T08:10:02.698196Z",
        "destination": "lpn_d4hk2upufu1c73b5fprg",
        "destination_details": {
            "local_payment_network": {
                "type": "fps_hkd",
                "currency": "HKD",
                "deposit_key_type": "phone",
                "deposit_key": "+852-61234567"
            },
            "type": "local_payment_network"
        },
        "documents": [],
        "email": "",
        "id": "bnf_d4hk2upufu1c73b5fpr0",
        "metadata": null,
        "name": "Chan Tai Man",
        "national_identification_number": "",
        "object": "beneficiary",
        "phone": null,
        "tax_id": "",
        "type": "individual"
    }
}
```

> `id` is the unique identifier for a beneficiary. Pass this in the Create Payout API to initiate a payout.

### Step 1B: Initiating a payout to the existing beneficiary

Create a payout on your server using Tazapay's [payout API](https://developer.tazapay.com/api-reference/tazapay-api/create-payout.md) with the following information:

* Payout Amount and Currency - The amount you want to transfer to the beneficiary
* Beneficiary ID
* Type of Payout - `local_payment_network`
* [Reason for Payout](https://developer.tazapay.com/payouts/payout-network/purpose.md)
* Transaction Description - Additional Description for a payout

### Sample cURL

```bash theme={null}
curl --request POST \
  --url https://service.tazapay.com/v3/payout \
  --header 'accept: application/json' \
  --header 'authorization: Basic <base64 of api_key:api_secret>' \
  --header 'content-type: application/json' \
  --data '{
  "beneficiary": "bnf_d4hk2upufu1c73b5fpr0",
  "amount": 100000,
  "currency": "HKD",
  "holding_currency": "USD",
  "purpose": "PYR005",
  "type": "local_payment_network",
  "reference_id": "ref_78211",
  "transaction_description": "Invoice INV-1001"
}'
```

### Response

The response is the same `payout` object as in [Step 1](#response).

> `id` is the unique identifier for a payout. You can use this to track the payout.

## Handle Payout Events

A payout is in the `processing` state after it is successfully initiated. The payout can move to one of the following three states from the processing state:

1. **requires\_action** - This is when the payout requires additional information. These additional information are typically required for reasons of regulatory compliance. Tazapay will reach out to your registered email address specifying the exact requirements and the next steps. After you have provided the necessary information, Tazapay will review and the payout can subsequently move to either `succeeded` or `failed`.
2. **succeeded** - The beneficiary has successfully received the funds. For a successful FPS payout, `tracking_details` carries the payment's UTR.
3. **failed** - This is the state when the payout fails. Any funds deducted for the payout will be credited back to your account. Tazapay specifies the reason for the failure in the field `status_description`

> Tazapay delivers [webhooks](https://developer.tazapay.com/api-reference/api-overview/webhooks.md) to your registered endpoint notifying you of any event of interest for the payout.


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