Skip to main content

eKYC onboarding

Designed, not built

Nothing on this page exists in the API today. There is no vendor integration, no capture session, no liveness check and no decision callback. Vendor selection has not started.

It is published because every serious integrator asks how "activate my wallet" will work, and months before they build it. Saying nothing invites you to design against a guess. Do not begin integration against this page; confirm the contract with us first, and expect field names to move.

What exists today

Identity verification is manual. You submit evidence with PUT /users/{id}/kyc; a GoHubPay reviewer looks at it and adjudicates offline. That is the whole mechanism — see Signup, which documents what is real.

One consequence worth planning around: the KYC record holds no verified name today, so there is no automated name match between the identity on file and the bank account a user withdraws to. The name returned by the bank enquiry is stored on the destination, and nothing compares the two. That matching is part of the work below.

Where it is going

The obligation stays ours, so the check runs through us. You will never hold a vendor credential, never sign a vendor contract, and never need to know which vendor we chose — if we change vendors, you change nothing.

The intended flow:

  1. Register the subject and verify their contacts — the same calls you make today.
  2. Your backend asks us to start an identity check; we return a capture URL.
  3. Your app opens that URL. The user photographs their MyKad and completes a liveness check.
  4. They return to you by deep link. The return carries no verdict — a redirect can be forged.
  5. The decision reaches you asynchronously; you poll or receive it, and render the outcome.

Four ways the capture can open, agreed per tenant: the system browser (no change to your app, our expected default), our SDK wrapping the vendor's, an embedded webview, or a contracted file-upload exception. The webview is conditional — some vendors will not warrant liveness inside a host app's process, which weakens the assurance we can offer a regulator.

Design for these now

Two states people treat as edge cases and should not:

Pending can last minutes. Most decisions land in seconds; some go to human review. Let the user leave the screen and come back. Do not trap them in a modal spinner.

Rejection is often not final. A blurry photo deserves "try again in better light", not "you have been rejected". Distinguish retryable from terminal.

Questions we get

Can we run eKYC ourselves and send you the result? No. We are the issuer, so the evidence has to be ours. If you already run eKYC we can pre-fill from it to save your user retyping, but the check still runs through us.

Can a wallet open before eKYC? Money out always requires verified identity. Whether money can go in beforehand is a limits question we are confirming with the regulator.

What if the same person signs up with two of your tenants? They get separate wallets and neither tenant learns of the other. We deduplicate internally for anti-fraud and regulatory reporting only.