· API Docs

Manage Customers

A customer is the owner of the destination account you receive from / pay to. Each customer can
have multiple customer accounts (e.g. accounts at several different banks).

v1 vs v2

  • /v1/customers — search by email or phone_number
  • /v2/customers — use a customer key you define (recommended for new systems)
Your OrganizationCustomercustomer_key/email/phoneCustomer Account AKBANK 111-2-333Customer Account BSCB 123-4-567referenced inPOST /v2/payinscustomer_idreferenced inPOST /v1/payoutscustomer_account_id
Relationship: Customer has many Accounts and is referenced in both Payin/Payout

Create a customer (v2)

HTTP
POST /v2/customers
Content-Type: application/json

{
  "customer_key": "user_12345",
  "name": "John Doe",
  "note": "VIP customer"
}

Link an account to a customer

HTTP
POST /v1/customers/{id}/accounts
Content-Type: application/json

{
  "account_platform": "SCB",
  "account_identifier": "1234567890",
  "account_holder_name": "John Doe",
  "currency_code": "THB"
}

Update data

  • Update customer info: PATCH /v1/customers/{id}
  • Update customer account: PATCH /v1/customers/{id}/accounts/{account_id}
  • When a member changes bank account or bank: create a NEW customer account (POST
    /v1/customers/{id}/accounts) instead of editing the old one — keep the old account as history
    (accounts cannot be deleted; a customer can hold up to 100)

Important: one customer = one real person

Do not create a single "pool" customer and attach hundreds or thousands of unrelated accounts
under it for convenience. Compliance and our anti-fraud checks require a 1:1 mapping between a
customer record and a real person.

  • Max 100 accounts per customer. Any attempt to add more returns 422 Unprocessable.
  • account_holder_name on each customer account MUST match the customer name (same real
    person). At creation time only the account-number format is validated — use GET /v1/bank/verify (scope bank:verify) or the dashboard Verify account name button to pre-fill the holder name before you save. A mismatch at payout/payin time can
    still fail when the bank/provider runs the transaction.
  • Customer status has three values: normal / blacklist / suspended. Via PATCH /v1/customers/{id}
    you can set only normal or blacklist — suspended is set by the G2Wallet team. A blacklisted or
    suspended customer cannot create payins/payouts on ANY of its accounts (403 with code
    FORBIDDEN or PERMISSION_DENIED and an error stating the reason), while customer/account data can still
    be edited.
✓ Correct — one customer per personCustomerAlice S.CustomerBob T.CustomerCharlie P.AccountAlice S.KBANK 111-2-333AccountAlice S.SCB 123-4-567AccountBob T.KTB 456-7-890AccountCharlie P.KBANK 987-6-543✗ Anti-pattern — rejectedCustomer‘Merchant Pool’AccountAlice S.089-xxx-xxxxAccountBob T.081-yyy-yyyyAccountCharlie P.087-zzz-zzzz…hundreds ofother names
Left: correct — one customer per real person, accounts all share that person's name. Right: anti-pattern (rejected) — many people pooled under one customer.
Customerstatus: suspendedAccount 1✕ blockedAccount 2✕ blockedAccount 3✕ blockedPayin / Payout→ 403 RESOURCE_FORBIDDENPayin / Payout→ 403 RESOURCE_FORBIDDEN
Suspension cascades: suspend the customer and every account underneath is blocked automatically.