kycUserId as Avenia. Top-level status, brlaEnabled, and usdEnabled stay Avenia. Read readiness from ramps.unblockpay.
Your customer must already have extraRampProviders: ["unblockpay"]. Omitted rampProvider is always Avenia.
There are two client paths after PII submit. Pick one per user; both share the same UnblockPay customer.
There is no
POST .../check route. GET /api/v1/kyc/status is the verification trigger. Path B calls UnblockPay POST /v1/customers/{id}/check once when uploads are recorded and verification.pending is empty. Path A never calls /check.Prerequisites
- Avenia KYC on this
kycUserIdis alreadyapproved. - The API key’s customer is opted into UnblockPay.
- You will send
rampProvider: "unblockpay"on UnblockPay calls.
1. Submit PII (both paths)
POST /api/v1/kyc/sessions/:kycUserId/submit
UnblockPay submit is PII only. documents / liveness on this body return 422 VALIDATION_ERROR.
taxId + taxIdCountry, and taxIdCountry is required on every UnblockPay submit. Send the CPF digits as taxId with BRA for Pix, or the local taxpayer id with its own ISO-3 country for foreign USD (for example USA). The country is part of the stored identity, so the same digits under two jurisdictions are two different identities. Public Pix and public USD are separate identities.
The legacy
cpf field is still accepted as an alias for taxId with taxIdCountry: "BRA", so existing integrations keep working. New integrations send taxId; do not send both.status is still Avenia. Read:
ramps.unblockpay.statusramps.unblockpay.verificationLink(Path A)ramps.unblockpay.verification.pending(Path B checklist)
2A. Hosted Sumsub
- Open
ramps.unblockpay.verificationLinkfor the user. - Poll
GET /api/v1/kyc/status?kycUserId=…. - Ready when
ramps.unblockpay.status === "approved"and the needed capability istrue(BRLfor Pix,USDfor wire onramp).
/documents on this path. Status live-refreshes UnblockPay but does not start /check.
2B. Upload documents
Send one file per request. JPEG, PNG, or PDF,base64 xor url (same transport as external evidence), up to 8MB. Files are streamed to UnblockPay and never stored. PDF is useful for a PROOF_OF_ADDRESS that arrives as a utility bill or bank statement; identity captures are photos.
POST /api/v1/kyc/sessions/:kycUserId/documents
v1 does not require a selfie. Upload identity FRONT + BACK and POA, then poll status.
GET /kyc/status may still show SELFIE in verification.pending; that step does not block /check in this version.
Drive extra types from ramps.unblockpay.verification.pending only if you later opt into them — do not hardcode a selfie capture for v1.
Allowed nest statuses: pending, partially_rejected.
Omitted or
avenia rampProvider → 400 RAMP_PROVIDER_NOT_ELIGIBLE.
If verification.partiallyRejected has items, re-upload only those steps, then poll status again (/check may fire once more).
3. Poll status
GET /api/v1/kyc/status?kycUserId=…
When the UnblockPay nest exists and is not approved / rejected, Deframe live-refreshes UnblockPay (GET /customers/{id} + GET /verification-details). After Path B uploads, the first ready poll also calls UnblockPay /check once.
verificationLink is null once nest status is no longer pending or partially_rejected.
USD offramp still needs POST /api/v1/kyc/currency-unlock with rampProvider=unblockpay and the bank fields in ramps.unblockpay.unlock.requiredBodyFields. See Foreign USD KYC and ramps.