URL: /baas/api/reference/verification-compliance/verification-management --- title: 'Verification Management API' description: 'KYC/KYB verification workflows, document uploads, and approvals' --- # Verification Management API Complete verification workflows for KYC (Know Your Customer) and KYB (Know Your Business) compliance. **Base URL:** `https://sandbox.finhub.cloud/api/v2.1/verifications` **Supported Verification Types:** - Individual KYC (4 types available) - Organization KYB --- ## Verification Workflow Initiate verification request with type and level Submit required verification documents Admin reviews submissions and documents Admin makes final decision System updates customer verification level --- ## Create Verification Request Initiate a new verification process for a customer. ### Endpoint ``` POST /api/v2.1/verifications ``` ### Headers Tenant identifier Bearer token for authentication Must be `application/json` ### Request Body Customer UUID identifier to verify (included when verifying a specific customer) Example: `5887c98c-b5b1-4234-b819-a4987f54aa77` Tenant ID requesting the verification Example: `d1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f` Verification type **Valid Values:** - `IDENTITY_VERIFICATION` - Basic identity check - `DOCUMENT_VERIFICATION` - Document authenticity verification - `ENHANCED_DUE_DILIGENCE` - Enhanced KYC/KYB checks - `SANCTIONS_CHECK` - Sanctions and PEP screening - `CUSTOMER_DUE_DILIGENCE` - Standard CDD process - `BUSINESS_VERIFICATION` - Organization/business verification Target verification level **Valid Values:** - `TENANT_VERIFIED` - Tenant-level verification - `FINHUB_VERIFIED` - Platform-level verification User ID initiating the verification Example: `admin-user` Optional metadata for the verification Description of the verification request Priority level: `NORMAL`, `HIGH`, or `URGENT` ### Headers Tenant identifier Bearer token for authentication Must be `application/json` Source identifier for request origin tracking Client application identifier — required by the global request filter Client platform identifier (e.g., `web`). Also accepted as `sec-ch-ua-platform` Unique device identifier for session tracking. Also accepted as `X-Device-Id` or `device-id` User ID initiating the verification (used in B2B flows) Comma-separated list of user roles (used in B2B flows) ### Code Examples ```bash cURL - Identity Verification curl -X POST "https://sandbox.finhub.cloud/api/v2.1/verifications" \ -H "Content-Type: application/json" \ -H "X-Tenant-ID: 97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "X-Forwarded-From: e2e-test" \ -H "User-Agent: YourApp/1.0" \ -H "platform: web" \ -H "deviceId: 356938035643809" \ -d '{ "customerId": "5887c98c-b5b1-4234-b819-a4987f54aa77", "requestedByTenantId": "d1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f", "type": "IDENTITY_VERIFICATION", "requestedLevel": "TENANT_VERIFIED", "requestedByUserId": "admin-user", "additionalData": { "description": "New customer onboarding", "priority": "NORMAL" } }' ``` ```bash cURL - Business Verification curl -X POST "https://sandbox.finhub.cloud/api/v2.1/verifications" \ -H "Content-Type: application/json" \ -H "X-Tenant-ID: 97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "X-Forwarded-From: e2e-test" \ -H "User-Agent: YourApp/1.0" \ -H "platform: web" \ -H "deviceId: 356938035643809" \ -d '{ "customerId": "2f6ddd86-9ef1-45b6-a16d-058b3ccf29e4", "requestedByTenantId": "d1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f", "type": "BUSINESS_VERIFICATION", "requestedLevel": "TENANT_VERIFIED", "requestedByUserId": "admin-user", "additionalData": { "description": "KYB compliance check", "priority": "HIGH" } }' ``` ```javascript JavaScript const createVerification = async (customerId, type) => { const response = await fetch( 'https://sandbox.finhub.cloud/api/v2.1/verifications', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': '97e7ff29-15f3-49ef-9681-3bbfcce4f6cd', 'Authorization': `Bearer ${token}`, 'X-Forwarded-From': 'e2e-test', 'User-Agent': 'YourApp/1.0', 'platform': 'web', 'deviceId': '356938035643809' }, body: JSON.stringify({ customerId, requestedByTenantId: 'd1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f', type, requestedLevel: 'TENANT_VERIFIED', requestedByUserId: 'admin-user', additionalData: { description: `${type} check`, priority: 'NORMAL' } }) } ); return response.json(); }; ``` ```python Python def create_verification(customer_id, verification_type): url = 'https://sandbox.finhub.cloud/api/v2.1/verifications' payload = { 'customerId': customer_id, 'requestedByTenantId': 'd1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f', 'type': verification_type, 'requestedLevel': 'TENANT_VERIFIED', 'requestedByUserId': 'admin-user', 'additionalData': { 'description': f'{verification_type} compliance check', 'priority': 'NORMAL' } } response = requests.post( url, headers={ 'Content-Type': 'application/json', 'X-Tenant-ID': '97e7ff29-15f3-49ef-9681-3bbfcce4f6cd', 'Authorization': f'Bearer {token}', 'X-Forwarded-From': 'e2e-test', 'User-Agent': 'YourApp/1.0', 'platform': 'web', 'deviceId': '356938035643809' }, json=payload ) return response.json() ``` ### Response ```json 201 - Created { "success": true, "code": 200, "timestamp": "2026-01-12T19:22:00.469602400Z", "message": "Verification process started", "data": { "id": "42cf474d-0914-47f1-895f-54147443d203", "customerId": "5887c98c-b5b1-4234-b819-a4987f54aa77", "type": "IDENTITY_VERIFICATION", "status": "IN_PROGRESS", "performedBy": "TENANT", "performedById": "d1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f", "verificationLevel": "TENANT_VERIFIED", "appliesToSubtenants": false, "requiredDocuments": [ "GOVERNMENT_ID" ], "startedAt": "2026-01-12T19:22:00.436424200Z", "initiatedBy": "admin-user", "additionalData": { "description": "New customer onboarding", "priority": "NORMAL" }, "verified": false } } ``` --- ## Upload Verification Document Upload a document for an active verification process. ### Endpoint ``` POST /api/v2.1/verifications/{verificationId}/documents ``` ### Path Parameters Verification UUID from the create verification response Example: `42cf474d-0914-47f1-895f-54147443d203` ### Request Body Type of document being uploaded **Valid Document Types:** - `PASSPORT` - Passport document - `NATIONAL_ID` - National ID card - `DRIVERS_LICENSE` - Driver's license - `PROOF_OF_ADDRESS` - Address verification - `BANK_STATEMENT` - Bank statement - `SOURCE_OF_FUNDS` - Source of funds declaration - `BENEFICIAL_OWNERSHIP` - Beneficial ownership declaration - `PEP_DECLARATION` - PEP status declaration - `PROOF_OF_FUNDS` - Proof of funds - `INVOICE` - Invoice or business document - `CERTIFICATE_OF_INCORPORATION` - Company registration - `SHAREHOLDER_REGISTER` - Shareholder registry - `DIRECTOR_ID` - Director identification Original filename with extension Example: `passport.pdf` Base64-encoded file content **Supported Formats:** PDF, JPEG, PNG **Max Size:** 10MB MIME type of the file Examples: `application/pdf`, `image/jpeg`, `image/png` Optional description or notes about the document Customer ID (for payment verification documents) Account ID (for payment verification documents) Transaction amount (for payment verification) Currency code (for payment verification) Purpose of the document upload ### Code Example ```bash cURL curl -X POST "https://sandbox.finhub.cloud/api/v2.1/verifications/42cf474d-0914-47f1-895f-54147443d203/documents" \ -H "Content-Type: application/json" \ -H "X-Tenant-ID: 97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "X-Forwarded-From: e2e-test" \ -H "User-Agent: YourApp/1.0" \ -H "platform: web" \ -H "deviceId: 356938035643809" \ -d '{ "documentType": "PASSPORT", "fileName": "passport.pdf", "fileContent": "JVBERi0xLjQKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwo+PgplbmRvYmoKeHJlZgowIDAKdHJhaWxlcgo8PAovUm9vdCAxIDAgUgo+PgolJUVPRgo=", "mimeType": "application/pdf", "description": "Customer passport for identity verification" }' ``` ```javascript JavaScript const uploadDocument = async (verificationId, file) => { // Convert file to base64 const base64Content = await fileToBase64(file); const response = await fetch( `https://sandbox.finhub.cloud/api/v2.1/verifications/${verificationId}/documents`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': '97e7ff29-15f3-49ef-9681-3bbfcce4f6cd', 'Authorization': `Bearer ${token}`, 'X-Forwarded-From': 'e2e-test', 'User-Agent': 'YourApp/1.0', 'platform': 'web', 'deviceId': '356938035643809' }, body: JSON.stringify({ documentType: 'PASSPORT', fileName: file.name, fileContent: base64Content, mimeType: file.type, description: 'Customer passport for identity verification' }) } ); return response.json(); }; // Helper function const fileToBase64 = (file) => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result.split(',')[1]); reader.onerror = error => reject(error); }); }; ``` ### Response ```json 201 - Created { "code": 200, "message": "Verification document uploaded successfully", "data": "Document uploaded for verification 42cf474d-0914-47f1-895f-54147443d203: {\"id\":\"d7379b5e-f983-4a27-b074-9a5a58cdc9da\",\"tenantId\":\"d1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f\",\"customerId\":\"5887c98c-b5b1-4234-b819-a4987f54aa77\",\"fileName\":\"628dd82a-a698-4d8c-bcb2-a97e78d33397_passport.pdf\",\"fileType\":\"PASSPORT\",\"status\":\"UPLOADED\",\"contentType\":\"application/pdf\",\"contentUrl\":\".\\\\data\\\\documents\\\\d1e2f3a4-b5c6-47d8-9e0f-1a2b3c4d5e6f\\\\2026\\\\01\\\\12\\\\5887c98c-b5b1-4234-b819-a4987f54aa77\\\\628dd82a-a698-4d8c-bcb2-a97e78d33397_passport.pdf\",\"uploadDate\":1768245720542,\"uploadedBy\":\"system\",\"description\":\"Customer passport for identity verification\",\"verified\":false}" } ``` --- ## Approve Verification Approve a verification request after review. ### Endpoint ``` POST /api/v2.1/verifications/{verificationId}/approve ``` ### Path Parameters Verification UUID to approve ### Request Body Admin notes about the approval decision (used in implementation) User ID or name of the approver Example: `E2E_TEST_ADMIN` or admin user ID Alternative field for admin notes (legacy support) Reason for approval ### Code Example ```bash cURL curl -X POST "https://sandbox.finhub.cloud/api/v2.1/verifications/42cf474d-0914-47f1-895f-54147443d203/approve" \ -H "Accept: application/json, text/plain, */*" \ -H "X-Tenant-ID: 97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Forwarded-From: e2e-test" \ -H "platform: web" \ -H "deviceId: 356938035643809" \ -d '{ "adminNotes": "All documents verified and authentic", "approvedBy": "admin_user_123", "approvalReason": "All verification criteria met" }' ``` ```javascript JavaScript const approveVerification = async (verificationId) => { const response = await fetch( `https://sandbox.finhub.cloud/api/v2.1/verifications/${verificationId}/approve`, { method: 'POST', headers: { 'Accept': 'application/json, text/plain, */*', 'Content-Type': 'application/json', 'X-Tenant-ID': '97e7ff29-15f3-49ef-9681-3bbfcce4f6cd', 'Authorization': `Bearer ${token}`, 'X-Forwarded-From': 'e2e-test', 'platform': 'web', 'deviceId': '356938035643809' }, body: JSON.stringify({ adminNotes: 'All documents verified and authentic', approvedBy: 'admin_user_123', approvalReason: 'All verification criteria met' }) } ); return response.json(); }; ``` ### Response ```json 200 - Success { "code": 200, "message": "Verification approved successfully", "data": { "level": "TENANT_VERIFIED", "approvedBy": "admin-user", "approvedAt": "2026-01-12T19:22:00.658560500Z", "verificationId": "42cf474d-0914-47f1-895f-54147443d203", "status": "APPROVED" } } ``` --- ## Get Verification Status Retrieve the current status of a verification request. ### Endpoint ``` GET /api/v2.1/verifications/{verificationId} ``` ### Path Parameters Verification UUID ### Response ```json 200 - Success { "code": 200, "message": "Verification status retrieved successfully", "data": { "submittedDocuments": 0, "completedAt": "2026-01-12T19:22:04.780839500Z", "level": "FINHUB_VERIFIED", "startedAt": "2026-01-12T19:22:02.894983800Z", "type": "SANCTIONS_CHECK", "verificationId": "90fb384c-6404-453d-9001-d15c4e0966e5", "status": "APPROVED" } } ``` --- ## Verification Types Reference | Type | Purpose | Required Documents | Typical Use Case | |------|---------|-------------------|------------------| | `IDENTITY_VERIFICATION` | Basic identity check | Government ID | Individual onboarding | | `DOCUMENT_VERIFICATION` | Document authenticity | Proof of address, ID | Address verification | | `ENHANCED_DUE_DILIGENCE` | Enhanced KYC | Source of funds, beneficial ownership, PEP | High-risk customers | | `SANCTIONS_CHECK` | PEP & sanctions screening | PEP declaration, proof of address | Compliance requirements | | `CUSTOMER_DUE_DILIGENCE` | Standard CDD | Basic identification | Standard KYC | | `BUSINESS_VERIFICATION` | KYB for organizations | Incorporation docs, shareholder register | Organization onboarding | --- ## Document Type Requirements ### Individual Customers **IDENTITY_VERIFICATION:** - `PASSPORT` or `NATIONAL_ID` or `DRIVERS_LICENSE` **ENHANCED_DUE_DILIGENCE:** - `SOURCE_OF_FUNDS` - `BENEFICIAL_OWNERSHIP` (if applicable) - `PEP_DECLARATION` - `PROOF_OF_ADDRESS` **SANCTIONS_CHECK:** - `PROOF_OF_ADDRESS` - `SOURCE_OF_FUNDS` - `BENEFICIAL_OWNERSHIP` - `PEP_DECLARATION` ### Organization Customers **BUSINESS_VERIFICATION:** - `CERTIFICATE_OF_INCORPORATION` - `PROOF_OF_ADDRESS` - `DIRECTOR_ID` - `SHAREHOLDER_REGISTER` --- ## Verification Levels | Level | Description | Verification By | |-------|-------------|-----------------| | `TENANT_VERIFIED` | Verified by tenant | Tenant admin | | `FINHUB_VERIFIED` | Verified by platform | FinHub compliance team | --- ## Common Workflows ### Individual KYC Workflow ``` 1. Create IDENTITY_VERIFICATION ↓ 2. Upload PASSPORT document ↓ 3. Admin reviews and approves ↓ 4. Create DOCUMENT_VERIFICATION ↓ 5. Upload PROOF_OF_ADDRESS ↓ 6. Admin approves ↓ 7. (Optional) Create ENHANCED_DUE_DILIGENCE for high-risk ↓ 8. Customer status updated to VERIFIED ``` ### Organization KYB Workflow ``` 1. Create BUSINESS_VERIFICATION ↓ 2. Upload required documents: - CERTIFICATE_OF_INCORPORATION - DIRECTOR_ID - SHAREHOLDER_REGISTER - PROOF_OF_ADDRESS ↓ 3. Admin reviews all documents ↓ 4. Admin approves verification ↓ 5. Organization status updated to VERIFIED ``` --- ## Best Practices **Verification Checklist:** 1. ✅ Create verification request first 2. ✅ Upload all required documents 3. ✅ Wait for admin review (don't auto-approve) 4. ✅ Check verification status before allowing operations 5. ✅ Re-verify periodically (annual review recommended) ### Document Quality Guidelines - **Resolution:** Minimum 300 DPI for scanned documents - **Format:** PDF preferred, JPEG/PNG acceptable - **Size:** Maximum 10MB per file - **Clarity:** All text must be clearly readable - **Completeness:** Full document visible, no cropping --- ## Related Endpoints Activate customer after verification Add directors/shareholders for KYB Required consents for verified customers Standard data structures --- ## Changelog | Version | Date | Changes | |---------|------|---------| | v2.1 | 2026-01-13 | Initial release |