URL: /baas/api/integration/flows/individual-customer/registration --- title: 'Phase 1: Registration & Onboarding' description: 'Individual customer registration with categorization and validation' --- # Phase 1: Registration & Onboarding Registration is the entry point for all individual customers. This phase creates the customer record, user credentials, and default inactive wallet. ## What Gets Created | Component | Status | Description | |-----------|--------|-------------| | Customer Record | `PENDING_VERIFICATION` | Core customer entity | | User Credentials | Active | Login credentials (hashed) | | Wallet | `INACTIVE` | Default wallet (activated later) | | Categorization | Assigned | Feature-based category (if provided) | --- ## Step 1: Get Categorization Hierarchy Before registration, retrieve available categories and features for smart categorization. **Endpoint:** `GET /api/v2.1/customer/individual/categorization/hierarchy/{tenantId}` **Headers:** ```http Authorization: Bearer {admin-jwt-token} X-Tenant-ID: fh_api_finsei_ltd_7f957f77 ``` **Status:** `200 OK` ```json { "code": 200, "message": "Hierarchy retrieved successfully", "data": { "tenantId": "97e7ff29-15f3-49ef-9681-3bbfcce4f6cd", "tenantName": "Finsei Ltd", "complianceLevel": "ENHANCED", "categories": { "HIGH_RISK_INDIVIDUAL": { "databaseId": "550e8400-e29b-41d4-a716-446655440001", "categoryId": "HIGH_RISK_INDIVIDUAL", "categoryName": "High Risk Individual Customer", "description": "High-risk customers requiring enhanced monitoring", "availableFeatures": [ { "featureCode": "ENHANCED_AML_MONITORING", "featureName": "Enhanced AML Monitoring", "mandatoryKeys": [ "riskLevel", "riskScore", "pep", "sanctionsCheck", "monitoring", "edd" ], "allowedValues": { "riskLevel": ["LOW", "MEDIUM", "HIGH", "CRITICAL"], "riskScore": ["0-100"], "pep": ["true", "false"], "pepCategory": ["DOMESTIC_PEP", "FOREIGN_PEP", "RCA", "HIO"], "sanctionsCheck": ["STANDARD", "ENHANCED", "REAL_TIME"], "monitoring": ["WEEKLY", "DAILY", "REAL_TIME"], "edd": ["true", "false"] } } ] }, "STANDARD_INDIVIDUAL": { "databaseId": "550e8400-e29b-41d4-a716-446655440010", "categoryId": "STANDARD_INDIVIDUAL", "categoryName": "Standard Individual Customer" } } } } ``` --- ## Step 2: Register Individual Customer **Endpoint:** `POST /api/v2.1/customer/individual/registration` **Headers:** ```http X-Tenant-ID: fh_api_finsei_ltd_7f957f77 Authorization: Bearer {admin-jwt-token} Content-Type: application/json ``` **Request Body:** ```json { "tenantId": "97e7ff29-15f3-49ef-9681-3bbfcce4f6cd", "email": "john.doe@example.com", "password": "SecurePass123!@#", "matchingPassword": "SecurePass123!@#", "firstName": "John", "lastName": "Doe", "individualCustomer": { "tenantId": "97e7ff29-15f3-49ef-9681-3bbfcce4f6cd", "email": "john.doe@example.com", "firstName": "John", "lastName": "Doe", "middleName": "Robert", "dateOfBirth": "1990-05-15", "placeOfBirth": "New York", "nationality": "US", "phoneNumber": "+12125551234", "alternatePhoneNumber": "+12125559876", "address": { "street": "123 Main Street", "streetNumber": "123", "apartment": "Apt 4B", "city": "New York", "state": "NY", "postalCode": "10001", "country": "US", "addressType": "RESIDENTIAL" }, "occupation": "Software Engineer", "employerName": "Tech Corp Inc", "annualIncome": "150000", "sourceOfFunds": "SALARY", "categorization": { "id": "550e8400-e29b-41d4-a716-446655440001", "name": "HIGH_RISK_INDIVIDUAL", "isActive": true, "categoryFeatureRelations": [ { "feature": { "id": "660e8400-e29b-41d4-a716-446655440002", "code": "ENHANCED_AML_MONITORING" }, "enabled": true, "parametrization": [ { "name": "riskLevel", "value": "HIGH" }, { "name": "riskScore", "value": "85" }, { "name": "pep", "value": "true" }, { "name": "pepCategory", "value": "DOMESTIC_PEP" }, { "name": "sanctionsCheck", "value": "ENHANCED" }, { "name": "monitoring", "value": "DAILY" }, { "name": "edd", "value": "true" } ] }, { "feature": { "id": "770e8400-e29b-41d4-a716-446655440003", "code": "TRANSACTION_LIMITS" }, "enabled": true, "parametrization": [ { "name": "dailyLimit", "value": "5000" }, { "name": "monthlyLimit", "value": "50000" }, { "name": "singleTransactionLimit", "value": "2000" } ] } ] } } } ``` **Status:** `201 Created` ```json { "code": 201, "message": "Account created successfully", "data": { "id": "cust-550e8400-e29b-41d4-a716-446655440010", "userId": "user-660e8400-e29b-41d4-a716-446655440011", "email": "john.doe@example.com", "firstName": "John", "lastName": "Doe", "status": "PENDING_VERIFICATION", "categorization": { "id": "550e8400-e29b-41d4-a716-446655440001", "name": "HIGH_RISK_INDIVIDUAL", "categoryFeatureRelations": [...] }, "createdAt": "2026-01-13T10:30:00.000Z", "updatedAt": "2026-01-13T10:30:00.000Z" } } ``` **Key IDs to Store:** - `id` → Customer ID (for all subsequent calls) - `userId` → User ID (for session creation) **400 - Password Mismatch:** ```json { "code": 400, "message": "Request validation failed", "data": { "errors": [ { "field": "matchingPassword", "message": "Password and matching password must be identical" } ] } } ``` **400 - Invalid Categorization:** ```json { "code": 400, "message": "Categorization validation failed", "data": { "error": "Invalid categorization", "details": "Feature 'ENHANCED_AML_MONITORING' requires mandatory key 'riskLevel'", "missingKeys": ["riskLevel"], "invalidValues": { "monitoring": "HOURLY is not in allowed values: [WEEKLY, DAILY, REAL_TIME]" } } } ``` **403 - Tenant Access Denied:** ```json { "code": 403, "message": "Tenant access denied or categorization not available", "data": { "error": "Tenant access denied", "tenantId": "97e7ff29-15f3-49ef-9681-3bbfcce4f6cd" } } ``` --- ## Business Logic ### Tenant ID Resolution The system resolves tenant ID from the header: ``` 1. Extract X-Tenant-ID header (e.g., "fh_api_finsei_ltd_7f957f77") 2. Resolve to UUID (e.g., "97e7ff29-15f3-49ef-9681-3bbfcce4f6cd") 3. Override tenant ID in request body ``` ### Password Validation Rules | Rule | Requirement | |------|-------------| | Minimum Length | 8 characters | | Uppercase | At least 1 | | Lowercase | At least 1 | | Numbers | At least 1 | | Special Characters | At least 1 | | Must Match | `matchingPassword` field | | Cannot Contain | Username or email | ### Categorization Validation ``` 1. Check if categorization provided 2. Validate category exists in tenant hierarchy 3. For each feature: a. Validate feature exists for tenant b. Check all mandatory keys provided c. Validate values against allowedValues 4. Store validated categorization ``` ### Auto-Generated Components | Component | Format | |-----------|--------| | Customer ID | UUID v4 | | User ID | UUID v4 | | Wallet ID | UUID v4 (inactive) | | Email Verification Token | 64-char hex string | --- ## Smart Categorization Examples ### High-Risk Customer **Selection Criteria:** - PEP (Politically Exposed Person) - High transaction volume expected - High-risk occupation or industry - High-risk country **Configuration:** ```json { "riskLevel": "HIGH", "riskScore": "85", "pep": "true", "pepCategory": "DOMESTIC_PEP", "sanctionsCheck": "ENHANCED", "monitoring": "DAILY", "edd": "true", "transactionMonitoring": "REAL_TIME" } ``` ### Standard Customer **Configuration:** ```json { "riskLevel": "MEDIUM", "riskScore": "45", "pep": "false", "sanctionsCheck": "STANDARD", "monitoring": "WEEKLY", "edd": "false", "transactionMonitoring": "BATCH_DAILY" } ``` --- ## Next Step After successful registration, proceed to **Phase 2: Session Management** to authenticate the customer. Create customer session and obtain JWT token