The v2 PayIn API lets you collect payments from customers in multiple currencies using a single, consistent schema. You can accept bank transfers, e-wallets, QR payments, mobile money, and more — all through the same set of endpoints. This page documents every PayIn endpoint, including sandbox simulation for testing.
Before creating a payin, call Get PayIn Methods and Get Required Fields to discover which payment methods and customer fields are available for your configured currency.

Get PayIn Methods

GET /v2/payins/payin_methods Returns all payment methods available for your app-id. The methods returned depend on the country and currency configured in your Hello Clever Merchant Dashboard.

Response fields

records
object[]
Array of available payin methods.

Get PayIn Required Fields

GET /v2/payins/payin_method/params Returns the fields required (or optional) to create a payin for a specific payment method. Call this once per method to understand what customer data you need to collect.

Query parameters

payin_method_code
string
required
The payment method code returned from Get PayIn Methods.

Response fields

params
object[]
List of parameters for the payment method.

Create PayIn

POST /v2/payins Creates a new payin request. You must first call Get PayIn Methods and Get Required Fields to gather the correct method code and required fields.
For payin methods jp_bank_jpy, ar_bank_ars, and kr_bank_va_kyc_krw, payment credentials such as virtual account numbers are delivered asynchronously via webhook after the payin is created — not in the API response.

Body parameters

payin_method_name
string
required
The payment method code (e.g., my_bank_duitnow_myr).
amount
number
required
The payment amount in the currency’s base unit.
currency
string
required
ISO 4217 currency code (e.g., MYR, VND, AUD).
description
string
A description for this payment.
gst
boolean
Include GST in the transaction. Set to true only for AUD transactions by AU merchants.
expire_in
number
Time in seconds before the payin request expires.
sender_info
object
Customer details for the transaction.
webhook_notification
object
Webhook configuration for this payin. If omitted, your dashboard default is used.
redirect_url
object
Redirect URLs after payment completion.

Response fields

uuid
string
Unique identifier for this payin transaction.
status
string
Current status: pending, received, expired, return_received, or failed.
payment_url
string
URL for the customer to complete payment (if applicable for the method).
pay_code
string
The payment code or reference number the customer uses to pay (e.g., for bank transfers).
expired_at
string
ISO 8601 timestamp when the payin expires.
Webhooks are called on a best-effort basis. If your endpoint does not return HTTP 200, Hello Clever retries 3 times with 15-minute delays between attempts. Design your webhook handler to be idempotent.

Get PayIn Details

GET /v2/payins/detail Returns the full details of a specific payin request by UUID.

Query parameters

uuid
string
required
The unique identifier of the payin transaction.

Get PayIns in a Period

GET /v2/payins/all Returns a paginated list of payin transactions linked to your app-id, filtered by date range and optional status. Returns 20 records per page by default.

Query parameters

from_date
string
required
Start of the date range in ISO 8601 format (e.g., 2025-01-01T00:00:00Z).
to_date
string
required
End of the date range in ISO 8601 format.
status
string
Filter by payment status: pending, received, expired, return_received, failed.
page
number
default:"1"
Page number for pagination.
limit
number
default:"20"
Number of records per page.

Cancel PayIn

POST /v2/payins/cancel Cancels a pending payin transaction. The status transitions to expired. Check is_cancellable == true on the payin method before calling this endpoint.

Body parameters

uuid
string
required
The UUID of the pending payin to cancel.

Refund PayIn

POST /v2/payins/refund Initiates a refund on a completed (received) payin. Check is_refundable == true on the transaction before calling this endpoint.
If you initiate a refund immediately after a successful payin, the refund must be for the full amount. Partial refunds are only supported 30 minutes to 1 hour after the payin completes.

Body parameters

uuid
string
required
The UUID of the received payin to refund.
amount
number
The amount to refund. If omitted, the full amount is refunded. Partial refunds are only allowed 30–60 minutes after payin completion.

PayIn Simulation (sandbox only)

POST /v2/payins/simulate Simulates the completion of a pending payin in the sandbox environment. The payin must be in pending status. This endpoint is not available in production.

Body parameters

uuid
string
required
The UUID of the pending payin to simulate as completed.

Authorize OTP Transaction

POST /v2/payins/confirm_otp After creating a payin using a mobile money method (e.g., gh_mobile_money_ghs), if the response stage is authorize_otp, an OTP has been sent to the customer’s phone. Collect the OTP from the customer and submit it to this endpoint. On success, an STK push is sent to the customer’s phone to confirm the payment with their PIN.

Body parameters

uuid
string
required
The UUID of the payin awaiting OTP authorization.
otp
string
required
The OTP received on the customer’s phone.

Resend OTP

POST /v2/payins/resend_otp Resends the OTP for a mobile money payin when the original OTP has expired or was not received by the customer.

Body parameters

uuid
string
required
The UUID of the payin for which to resend the OTP.