Skip to main content
Know Your Customer (KYC) verification is required before a user can receive payments through Cadana. You submit identity documents and personal information via the API, and Cadana handles automated verification. This page covers the submission requirements, status tracking, and webhook events.

KYC Flow

StatusMeaningUser can transact?
not startedKYC has not been submittedNo
processingDocuments submitted, verification in progressNo
approvedVerification successfulYes
rejectedVerification failed — resubmission neededNo
Most verifications complete automatically within minutes. If automated checks can’t verify the user’s identity, a manual review may take 1-2 business days.

Submit KYC

Submit identity information and documents for a user. Upload document images first using the file upload flow, then pass the returned fileId values.
bash
curl -X POST 'https://api.cadanapay.com/v1/users/8ef9a712-cdae-4110-b1ea-9ba95abbee6e/kyc' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Returns 204 on success. The user’s KYC status moves to processing.

Personal Information

FieldAPI FieldRequiredRules
First namefirstNameYesMust match government-issued ID exactly
Last namelastNameYesMust match government-issued ID exactly
Date of birthdobYesFormat: YYYY-MM-DD
NationalitynationalityYes2-letter ISO country code (e.g., US, NG, KE)

Identity Document

FieldAPI FieldRequiredRules
Document typeidDetails.typeYesSee supported types below
Document numberidDetails.numberYesUnique identifier on the document
Issuing authorityidDetails.issuedByYesAuthority that issued the document
Issue dateidDetails.issuedDateYesFormat: YYYY-MM-DD
Expiration dateidDetails.expirationDateYesFormat: YYYY-MM-DD. Must not be expired
Issuing countryidDetails.issuedCountryCodeYes2-letter ISO country code
Front of IDidDetails.frontFileIdYesfileId from file upload
Back of IDidDetails.backFileIdNoRequired for driver’s licenses and some national IDs
SelfieidDetails.selfieFileIdYesPhoto of user holding the document
Supported document types:
DocumentAPI Value
Passportpassport
Driver’s licensedriver_license
National ID cardnational_id
ID cardid_card
Voter ID cardvoter_id_card
Images must be clear and readable with all text visible. Supported formats: JPEG, PNG.

Address (Optional)

If provided, all required address fields must be completed.
FieldAPI FieldRequired
Street addressaddress.line1Yes
Address line 2address.line2No
Cityaddress.cityYes
State / Provinceaddress.stateYes
Postal codeaddress.postalCodeYes
Countryaddress.countryCodeYes (2-letter ISO code)
An address proof document can be provided via addressProofFileId (utility bill, bank statement, or government document dated within the last 3 months).

Check KYC Status

Retrieve a user’s current KYC status.
bash
curl -X GET 'https://api.cadanapay.com/v1/users/8ef9a712-cdae-4110-b1ea-9ba95abbee6e/kyc' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Response:
{
  "userKyc": {
    "firstName": "John",
    "lastName": "Doe",
    "identity": "approved",
    "address": "not started",
    "idDetails": {
      "country": "US",
      "type": "Drivers license"
    }
  }
}
Identity and address verification are tracked separately. A user needs at minimum identity: "approved" to receive payments. If a verification is rejected, the identityStatusReason or addressStatusReason field explains why.

Webhook Events

user.kyc.updated

Fired on every KYC status change — processing, approved, or rejected. The type field indicates which verification component changed.
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "eventType": "user.kyc.updated",
  "version": "1.0",
  "timestamp": 1765359752,
  "data": {
    "userId": "8ef9a712-cdae-4110-b1ea-9ba95abbee6e",
    "status": "approved",
    "type": "identity",
    "tenantKey": "cad95193904"
  }
}
FieldDescription
userIdThe user whose KYC status changed
statusNew status: processing, approved, or rejected
typeVerification component: identity or address
For rejected verifications, fetch the user’s KYC details with GET /v1/users/{userId}/kyc to see the failure reason.

user.kyc.expiry

Fired when a user’s identity document is approaching expiry or has expired.
{
  "id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
  "eventType": "user.kyc.expiry",
  "version": "1.0",
  "timestamp": 1765359752,
  "data": {
    "userId": "8ef9a712-cdae-4110-b1ea-9ba95abbee6e",
    "stage": "about-to-expire",
    "documentType": "passport",
    "expiryDate": "2026-03-15",
    "tenantKey": "cad95193904"
  }
}
StageMeaning
about-to-expireDocument expires within 30 days
in-grace-periodExpired but within 60-day grace period — existing transactions continue, new ones may be restricted
expiredPast grace period — user must re-verify
See Events for all event types and payload details.

Handling Rejections

When KYC is rejected, the user needs to resubmit. Common rejection reasons:
ReasonUser action
Document expiredSubmit valid, non-expired document
Image unreadableRetake photo with good lighting
Document damagedSubmit undamaged document
Info mismatchVerify name and DOB match the document exactly
Unsupported documentSubmit an accepted document type
To resubmit, call POST /v1/users/{userId}/kyc again with corrected information. The status resets to processing.

Next Steps