Reference

KYC

Verify a user's identity so they can withdraw INR, gift assets or take physical delivery. All capability `kyc`.

KYC is required before a user can withdraw, gift or take physical delivery. Buying, selling and *receiving* gifts do not require it.

KYC is global, not per-partner: a user verified anywhere on OroPocket is verified everywhere. See sub-wallets.

The flow

Four ordered stages. Always start by reading the status — it tells you the exact next step, so the flow is resumable if a user drops off.

StageWhat it means
email_verificationConfirm the user's email with a 6-digit code. Always first.
personal_detailsIdentity data — either instantly via PAN + Aadhaar, or manually.
document_uploadManual path only: PAN and Aadhaar images.
admin_reviewManual path only: a human reviews within 24–48h.

There are two routes through it. Instant KYC (PAN + Aadhaar OTP) auto-approves in seconds and is the recommended path when automatedKyc.enabled is true. Manual upload is the fallback.

Check status

GET/partner/users/:user_code/kyc/statuskyc
FieldTypeDescription
statusstringnot_started | under_review | approved | rejected.
nextStepstring | nullWhat to do next: email_verification, personal_details, document_upload, awaiting_review, resubmit_documents, or null when done. Drive your UI off this.
stepsobjectPer-stage {completed, label, order, pending}.
completionPercentagenumber0–100, for a progress bar.
verificationLevelstring"full" once approved.
emailVerifiedbooleanStage 1 done.
detailsSubmittedbooleanStage 2 done.
documentsUploadedbooleanStage 3 done (manual path).
rejectionReasonstring | nullWhy a rejection happened.
canResubmitbooleanTrue after a rejection — the user may try again.
automatedKyc.enabledbooleanWhether instant PAN + Aadhaar KYC is available.
curl https://api.oropocket.com/partner/users/usr_xxx/kyc/status \
  -H "Authorization: Bearer oro_live_xxx"

Stage 1 — email

POST/partner/users/:user_code/kyc/email/sendkyc
FieldTypeDescription
emailstringrequiredMust not already belong to another OroPocket account.
FieldTypeDescription
sentbooleanCode dispatched.
expires_in_secondsnumber600 (10 minutes).
POST/partner/users/:user_code/kyc/email/verifykyc
FieldTypeDescription
verification_codestringrequiredThe 6-digit code (alias: "code"). 123456 in sandbox.
FieldTypeDescription
verifiedbooleanSuccess.
nextStepstringThe following stage.

Stage 2a — instant KYC (recommended)

Two calls, and the user is approved — no documents, no human review.

POST/partner/users/:user_code/kyc/pan/verifykyc
FieldTypeDescription
panstringrequiredFormat AAAAA9999A.
dateOfBirthstringrequiredYYYY-MM-DD — must match the income-tax record for that PAN.
nameAsPerPanstringoptionalImproves the name match.
FieldTypeDescription
panVerifiedbooleanPAN matched.
autoApprovedbooleanStill false here — approval happens after Aadhaar.
nextStepstring"aadhaar_otp".

Errors: 403 FEATURE_DISABLED if instant KYC is off for your profile, 429 RATE_LIMITED, or 400 on a wrong PAN/DOB combination.

POST/partner/users/:user_code/kyc/aadhaar/otp/sendkyc
FieldTypeDescription
aadhaarNumberstringrequired12 digits.
FieldTypeDescription
aadhaarLast4stringFor display.
otpValidForSecondsnumber600.
resendAfterSecondsnumber45.
POST/partner/users/:user_code/kyc/aadhaar/otp/verifykyc
FieldTypeDescription
otpstringrequired6-digit Aadhaar OTP (1234 in sandbox).
FieldTypeDescription
aadhaarVerifiedbooleanAadhaar matched.
autoApprovedbooleanTrue when PAN and Aadhaar identities agree.
kycStatusstring"approved" on success.
verificationLevelstring"full".
profileobject{name, dateOfBirth, gender, address, aadhaarLast4} pulled from Aadhaar.
If the PAN and Aadhaar identities don't match, the user lands in under_review instead of being approved — handle that state.

Stage 2b — manual fallback

Use this when instant KYC is unavailable or the user's documents don't match.

POST/partner/users/:user_code/kyc/detailskyc
FieldTypeDescription
fullNamestringrequiredAs per documents.
aadharNumberstringrequired12 digits. Must be unique across OroPocket.
panNumberstringrequiredAAAAA9999A. Must be unique across OroPocket.
dateOfBirthstringrequiredYYYY-MM-DD.
addressLine1stringoptionalStreet address.
addressLine2stringoptional
citystringoptional
statestringoptional
pincodestringoptional6 digits.
POST/partner/users/:user_code/kyc/documentskyc

All three URLs are required and must be publicly fetchable. This moves the user to under_review.

FieldTypeDescription
panImageUrlstringrequiredPAN card image.
aadharFrontImageUrlstringrequiredAadhaar front.
aadharBackImageUrlstringrequiredAadhaar back.
FieldTypeDescription
statusstring"under_review" — a human reviews within 24–48h.

Testing it

Sandbox valueResult
PAN ABCDE1234FVerifies successfully.
PAN ZZZZZ9999ZRejected — use this to test your failure path.
Aadhaar OTP 1234Verifies.
Email code 123456Verifies.

No real documents are ever needed in sandbox — you can exercise both the approve and reject paths end to end.