Skip to main content

Get KYC Status

Poll the current KYC verification status for a ramp intent. The checkout widget calls this endpoint every 5 seconds while a customer is verifying — use the same endpoint if you embed verification yourself.

GEThttps://api.zenpayz.com/payment/api/v1/ramp-intents/:intentId/kyc-status
Bearer · API key

Request

Headers

HeaderDescription
x-request-id
OPTIONAL
Custom request ID for tracing
Public Endpoint

This endpoint does not require authentication headers. It is designed to be called from your frontend / checkout page.

Path Parameters

ParameterTypeDescription
intentId
REQUIRED
stringThe ramp intent ID (e.g. ri_1710345678000_a1b2c3d4e5f6g7h8)

Response

Success (200 OK)

{
"success": true,
"data": {
"verified": false,
"kycStatus": "in_review",
"intentStatus": "active",
"cancelReason": null
},
"message": "KYC status retrieved"
}

Response Fields

ParameterTypeDescription
verified
OPTIONAL
booleanConvenience flag — true when kycStatus === 'approved'.
kycStatus
OPTIONAL
stringpending, in_review, approved, declined, or expired.
intentStatus
OPTIONAL
stringCurrent ramp intent lifecycle state (created, active, completed, expired, cancelled).
cancelReason
OPTIONAL
string| nullSet when the intent moved to cancelled because of KYC. kyc_rejected for declines, kyc_expired for expiry.

Understanding KYC states

kycStatusWhat it meansWhat to do
pendingCustomer hasn't completed the Didit flow yetKeep polling. Optionally show a "verification in progress" UI.
in_reviewIdentity passed but AML or face-match was flagged for manual reviewKeep polling. Surface a friendly "under review" message — this can take a few minutes.
approvedKYC and AML both clearedProceed with the checkout. Stop polling.
declinedHard rejection (identity mismatch, document issue, AML rejected)Stop polling. intentStatus is now cancelled with cancelReason='kyc_rejected'. Show a terminal "verification could not be completed" message.
expiredVerification session expired before the customer finishedStop polling. Same handling as declined. Optionally offer to start a new intent.

Polling cadence

The checkout widget polls every 5 seconds with a hard ceiling of ~5 minutes (60 attempts) before showing a "still confirming your verification" message. If you implement your own polling, mirror that pattern so you don't leave customers on a spinner indefinitely.

Recommended pattern:

  1. Poll every 5 seconds.
  2. Stop on any of: kycStatus === 'approved', 'declined', or 'expired'.
  3. After ~60 attempts with no terminal state, surface a non-blocking "we're still confirming your verification" message with a manual refresh.

Error Responses

CodeHTTPMessage
NOT_FOUND404Intent with the given ID does not exist

Examples

curl https://api.zenpayz.com/payment/api/v1/ramp-intents/ri_1710345678000_a1b2c3d4e5f6g7h8/kyc-status

Next Steps