Skip to content

Getting Started

Environment Setup

Before you begin, make sure you have completed the Set Up Test Environment step.

Testhttps://p-gate-uat.checus.com/aggregate-pay/api/gateway/<PATH>
Productionhttps://pay-gate-hk-prod.checus.com/aggregate-pay/api/gateway/<PATH>

Interaction Flow

Key APIs

InteractionDirectionAPI / Method
Create payout requestMerchantChecus/paymentOrderPay
Payout result webhookChecusMerchant/disbursementResultNotifyUrl
Query payoutMerchantChecus/paymentOrderQry

Integration Steps

Before you start

  • Download the payout application template and collect the user's payout details in your app or website.
  • Construct request parameters according to the “Filling Rules” table in the Payout Application Template (fields with pink background are required).
  • Payout requests are irreversible once submitted.

1. Create a payout session

Call Apply for Payout/paymentOrderPay API with POST to create a payout.

Each order you submit must pass idempotency checks. Include a unique orderId in the request.

If Checus detects a duplicate orderId, it returns code=ORDER_REPEAT together with the current order status.

2. Obtain payout results

Method 1. Result notification

After processing, Checus calls your Payout Result Notification/disbursementResultNotifyUrl API. It may retry multiple times until you return a successful response.

Callbacks usually occur when the transaction reaches a terminal state (e.g., Success, Failed, Bounceback); if the Processing state requires merchant/user awareness, a prior notification may be sent.

How to configure the callback URL:

  • Pass via API: provide notifyUrl in /paymentOrderPay, effective for the current order only;
  • Platform setting: configure a global callback URL in the Merchant Portal, applied to all orders.

Upon receiving the notification, you should return a processing result. If there is no response or a failure is returned, Checus retries at the following intervals: 0s / 30s / 300s / 600s / 3600s / 43200s, up to 6 retries.

Method 2. Proactively query the result

If no notification is received or the order status is unclear, call Payout Query/paymentOrderQry API to obtain the result.

Use the response code to judge whether the query itself succeeded, and use data.status to determine the payout status.

Payout status list

2.1 Main status enum

StatusDescriptionGuidance
SUCCESSPayout succeeded-
PENDINGPayout processing1. After submission the order enters PENDING until a terminal state (SUCCESS / FAILED / BOUNCEBACK).
2. Multiple situations may occur under PENDING; see sub-status section.
FAILEDPayout failedRefer to Error Codes for causes
BOUNCEBACKFunds returnedIn some countries, financial systems may return funds after initially returning success due to reasons such as:
– Invalid/frozen beneficiary account
– Bank or clearing network issues
The order status changes from SUCCESS to BOUNCEBACK, and funds are returned to the merchant account.

2.2 Sub-status (for PENDING)

Main StatusSub-statusDescriptionMerchant guidance
PENDINGPEND_RFI_MATERIALMaterials requiredFinancial system triggered review; submit supplementary materials. Check email/portal notifications and upload required files.
PENDINGREVIEWUnder reviewMaterials submitted; Checus reviewing, feedback expected in 0–3 business days. No action needed.
PENDINGTRANSMITProcessingTransaction in progress; wait for the final result.

Error Codes

  • Error codes are grouped by scenario:

    CategoryDescription
    Server request limitsReturned when frequency/IP rules trigger protection
    Merchant configurationSignature keys, contract activation, and other onboarding checks
    Order submissionParameter format, duplicate orders, system errors during submission
    Order validationAmount limits, beneficiary info checks, risk control restrictions
    Order queryErrors related to the query API
  • Error examples Synchronous response example (e.g., error when creating payout):

    json
    {
      "msg": "Invalid account or not active",
      "code": "INVALID_ACCOUNT"
    }

    Asynchronous callback example (e.g., transaction failed):

    json
    {
      "appId": "4701b0a908a14312b3c8452b448256dw",
      "code": "APPLY_SUCCESS",
      "data": {
        "transactionUtcTime": "2024-08-29T12:50:38 +0000",
        "status": "FAILD",
        "responseCode": "INVALID_ACCOUNT",
        "responseMsg": "Invalid account or not active"
        // other fields omitted
      },
      "msg": "Success.",
      "notifyType": "PAYOUT"
    }
  • Server request limit error codes

    CodeDescriptionNotes
    REQ_TIME_OVER_TIMErequestTime effective in two minutesRequest time differs from server by >2m
    ILLEGAL_IP_REQUESTillegal ip requestRequest IP not in allowlist; contact Checus
    TOO_MANY_REQUESTExceed request limitation, please retry laterRate limited; retry later
  • Merchant configuration error codes

    SubcategoryCodeDescriptionNotes
    Signature/keysMERCHANT_APP_INVALIDSignature key is not configured.Key not configured
    Signature/keysSIGN_VERIFY_FAILEDThe signature verify failed.Signature failed
    Contract/merchantCONTRACT_INVALIDMerchant has not signed the contract or payment methods.Not contracted or methods not enabled
    Contract/merchantMERCHANT_INVALIDThe merchant has been offline.Merchant status issue
  • Order submission error codes

    SubcategoryCodeDescriptionNotes
    Request validationPARAMS_INVALIDThe {field} is incorrect.Field format invalid
    Request validationORDER_REPEATThe order number repeat.Duplicate order
    System errorSYSTEM_ERRORSystem is busy, Please try again later.Try again later
  • Order validation error codes

    SubcategoryCodeDescriptionNotes
    Payment method and amount limitsPAYMENT_METHOD_NOT_AVAILABLEThe payment method is not available.Payment method unavailable
    AMOUNT_LIMIT_UNMATCHEDThe amount does not meet the limit requirementsAmount does not meet limits
    AMOUNT_NOT_ENOUGHInsufficient balanceInsufficient balance
    Beneficiary account/info validationINVALID_ACCOUNTInvalid account or not activeInvalid or inactive beneficiary
    ACCOUNT_BLOCKEDAccount blocked or frozenAccount frozen
    INVALID_EMAILEmail address is incorrect.Invalid email format
    MISMATCHED_NAMEPayee name does not match the accountName/account mismatch
    Sub-merchant info issuesSUBMERCHANT_NOT_REGISTEREDThe subMerchantNo is not registeredSub-merchant not filed or incorrect
    SUBMERCHANT_REGISTRATION_FAILEDThe subMerchantNo registration failedSub-merchant registration failed
    Risk control and othersRFI_BLACKLISTRejected due to failure of beneficiary to submit request informationCompliance materials not submitted
    DECLINED_BY_RISKBeneficiary bank rejected creditDeclined by risk control
    PAYMENT_FAILEDPayment failedPayment failed
  • Order query error codes

    CodeDescriptionNotes
    ORDER_NOT_EXISTThe order does not exist.Order does not exist or is processing

Released under the MIT License.