Release Version 4.26.0 (December 24, 2024)
- Pre-deployment steps
- Post-deployment steps
- New functionality
- Improvements
- API changes
- Configuration changes
Pre-deployment steps
To be done before deployment
Verify configuration changes and define new variables if needed.
Verify API changes and implement the required updates to use the changed API.
Post-deployment steps
To be done after deployment
The implementation of the reporting module includes a migration step to add old data to the reporting database. This migration may fail if there is inconsistent data in MongoDB. In such a case, follow these steps to complete the deployment:
- 
Set reports.enabledtofalse.
- 
Perform the deployment. 
After the deployment (at any time):
- 
Check the migration errors. 
- 
Update the data in MongoDB to resolve inconsistencies. 
- 
Set reports.enabledtotrue.
- 
Redeploy the instance. 
New functionality
| Feature | Description | Benefits | 
| The ability for service users to send messages to the list of clients (broadcast message) | Service users can choose the required clients and send them in-system messages that will be visible on the mobile application. | It allows clients to receive important updates directly in the mobile application. | 
| Note: The ability for the service users to see chats in the Client profile on UI will be implemented in future versions. | ||
| To view communication with the Client the following APIs can be used (check API swagger description for more details): | ||
| POST /conversations/view | ||
| POST /conversations/{conversationId}/messages/view | ||
| The ability for service users to initiate a simple chat with a business user or a chat linked to a specific operation | This ability is implemented using API s | It improves communication by enabling direct messaging with clients within the system | 
| POST /conversations/create-system-broadcasts and | ||
| POST /tickets/transaction and will be added on UI in further versions | ||
| The ability for service users to initiate an investigation for the specified operation, view investigations and manage investigation status | This ability is implemented using APIs | It enables effective tracking and resolution of suspicious transactions, improving risk management and ensuring regulatory compliance. | 
| POST /investigation | ||
| POST /investigation/view | ||
| GET /investigation/{investigationId} | ||
| PATCH /investigation/{investigationId} | ||
| and will be added to UI in further versions | 
Improvements
| Feature | Description | 
| Deleted legacy sections from UI | Deleted the following legacy sections from UI: | 
| · Users | |
| · Currencies | |
| · Identification | |
| Ability to create new currency/change the existing currency or set trusted domain on UI can be enabled/disabled using configuration | Added two environment variables: | 
| VUE_APP_CREATE_OR_EDIT_CURRENCY_NOT_ALLOWED=true VUE_APP_CREATE_OR_EDIT_TRUSTED_DOMAINS_NOT_ALLOWED=true | |
| If the variables are not set or false, there are no restrictions on creating, editing, or deleting currencies and trusted domains. | |
| The old environment variable VUE_APP_CREATE_CURRENCY_NOT_ALLOWED was deleted. | |
| New technical_transit wallet at the gate_provider level is used for external operations accounting. | Adding the new technical_transit wallet at the gate_provider level improves performance, eliminates database locking, enhances system scalability and reliability, and optimizes resource utilization in high-load environments. | 
| Single valid OTP with timeout before resend and automatic invalidation on resend | The previously issued OTP is automatically invalidated if the user requests a resend. Additionally, a timeout is enforced before each subsequent resend request, preventing brute-force attacks and reducing system misuse. | 
| Timeout is set as 1 minute by default and can be changed in the configuration using variable: users.confirmation-code.resend-delay | 
API changes
| Updated | 
| POST /registration/resend-otp | 
| POST /authorization/resend-otp | 
| POST /merchant-payments/{identifier}/resend-otp | 
| POST /password/recovery/resend-otp | 
| POST /profiles/my/contact/resend-otp | 
| In case the OTP cannot be resent because the timeout period for resend has not yet expired, the following error is returned: | 
| The confirmation code is not yet available for the resend. Try again in N seconds | 
| Timeout is configured in the variable: users.confirmation-code.resend-delay | 
| POST /api/v1/cash-desks/view | 
| New optional properties were added to request body | 
| Request: | 
| { "coinSerial": "052622562174", "coordinate": { "latitude": "11.33839", "longitude": "18.876011" }, "filter": { "address": "City OM 13", "cashDeskName": " SDK" } } | 
| POST /conversations/view | 
| Added new filter by businessProcessId in the request | 
| Added new filter includeRelatedToTransactions (true, false) in the request | 
| Added new filters participantId and participantType | 
| Added businessProcessId in the response | 
| Request: | 
| { 
   "pageNumber": 0, 
   "pageSize": 1, 
   "filter": { 
     "includeRelatedToTransactions": true, 
     "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0", 
     "participantId": "61b065de-58ef-4959-ab5e-4a2d75ab6564", 
     "participantType": "ORGANIZATION" 
   }, 
   "sort": { 
     "createdAt": "desc" 
   } 
} | 
| Response: | 
| { 
   "pageNumber": 0, 
   "pageSize": 1, 
   "totalPages": 1, 
   "totalRecords": 1, 
   "records": [ 
      { 
        "id": "0193d98c-666d-74a4-9b8a-848afbaf813b", 
        "name": "Individual topup 9999", 
        "broadcast": false, 
        "unread": false, 
        "createdAt": "2024-12-18T11:34:37.149Z", 
        "lastMessageCreatedAt": "2024-12-18T11:40:49.272Z", 
        "initiator": { 
           "id": "0193d98c-666d-7940-8be7-47d4c0f31424", 
           "type": "USER", 
           "entityId": "55d7c0fe-2608-44e5-bd7f-3b0d2a47e1e3", 
           "name": "Admin Default", 
           "email": "administrator@sdkfinance.tech" 
       }, 
"participants": [ 
           { 
              "id": "0193d98c-666d-7715-8a6f-c9107356b3c7", 
              "type": "ORGANIZATION", 
              "entityId": "61b065de-58ef-4959-ab5e-4a2d75ab6564", 
              "name": "Alex Dot", 
              "phoneNumber": "380631111111", 
              "email": "individual@sdkfinance.tech", 
              "organizationType": "individual", 
              "tariffPlan": "base" 
          }, 
          { 
              "id": "0193d98c-666d-7940-8be7-47d4c0f31424", 
              "type": "USER", 
              "entityId": "55d7c0fe-2608-44e5-bd7f-3b0d2a47e1e3", 
              "name": "Admin Default", 
              "email": "administrator@sdkfinance.tech" 
           } 
           ], 
           "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0" 
        } 
     ] 
  } | 
| PUT /management/organization-settings/service-roles/{roleCode} | 
| added userManagementAllowed (true/false) | 
| Request: | 
| { 
   "permissions": [ 
     "string" 
   ], 
   "removePermissions": [ 
      "string" 
   ], 
   "supervisingRoles": [ 
     { 
     "roleCode": "CFO", 
     "managementOperation": [ 
        "CREATE" 
      ] 
    } 
  ], 
  "removeSupervisingRoles": [ 
    { 
      "roleCode": "CFO", 
      "managementOperation": [ 
        "CREATE" 
      ] 
    } 
  ], 
  "manageableRoles": [ 
    { 
      "roleCode": "CFO", 
      "managementOperation": [ 
       "CREATE" 
      ] 
    } 
  ], 
  "removeManageableRoles": [ 
   { 
     "roleCode": "CFO", 
     "managementOperation": [ 
     "CREATE" 
     ] 
   } 
  ], 
  "userManagementAllowed": true 
} | 
| Added | 
| GET /users/{userId} | 
| Permissions: USER_VIEWER, USER_MANAGER | 
| Response: | 
| { 
   "user": { 
      "id": "0193ce27-3c76-7055-b25f-cbc830fa0287", 
      "name": "Individual Default", 
      "createdAt": "2024-12-16T06:28:18.166Z", 
      "active": true, 
      "frozen": false, 
      "banned": false, 
      "defaultUser": true, 
      "contact": { 
          "phoneVerified": false,  
          "additionalPhoneVerified": false, 
          "email": "individual@sdkfinance.tech", 
          "emailVerified": true, 
          "countryCode": "UA" 
      }, 
      "members": [ 
          { 
              "id": "0193ce27-3c76-71dc-8cf3-c625ce9e6781", 
              "role": "individual", 
              "organization": { 
                   "id": "0193ce27-37ce-7ed8-a13c-7409482aaafc", 
                   "type": "individual", 
                   "name": "Individual Default", 
                   "organizationStatus": "approved", 
                   "contract_info": { 
                       "id": "0193ce27-2520-7c6d-a356-aef4a20e8f0d", 
                       "personType": "base", 
                       "name": "base contract for org individual" 
                   } 
               } 
          } 
     ], 
     "cohort": "0W", 
     "profileStatus": "active", 
     "lastLogin": "2024-12-16T06:30:02.505Z", 
     "lastTransaction": "2024-12-16T06:28:18.069Z", 
     "systemLanguage": "en" 
   } 
} | 
| POST: /api/v1/templates/withdrawal/operation/{{bankBusinessProcessId}} | 
| Permission: TEMPLATES_OWNER | 
| Request: | 
| { 
    "amount": 100.0, 
    "description": "string", 
    "name": "individual withdrawal template", 
    "reusable": true 
} | 
| Response: | 
| { 
    "id": "01936e64-1781-7947-b465-15082e7591b1", 
    "name": "individual withdrawal template", 
    "senderCoin": { 
        "serial": "306042148255", 
        "name": "TEST coin", 
        "amount": 100.0000, 
        "availableAmount": 100.0000, 
        "futureAmount": 0.0000, 
        "heldAmount": 0.0000, 
        "creditLimit": 0.0000, 
        "currency": { 
            "id": "01936e50-b9dd-7242-a9ba-451418dea893", 
            "sn": "ozi", 
            "code": "ozi", 
            "symbol": "ozi", 
            "type": "FIAT" 
         }, 
         "active": true, 
         "type": "client", 
         "main": true, 
         "accounting": false, 
         "smartCards": [] 
      }, 
     "amount": 100.0000, 
     "description": "string", 
     "bankDetails": { 
         "iban": "AT022050302101023600", 
         "recipientFullName": "Test", 
         "bankDto": { 
             "address": "Maidan Nezalezhnosti, 1", 
             "bankId": "01936e50-a58e-7dbe-b4d5-7fe2ed08b6a3", 
             "bic": "ABNACEE2RFA", 
             "city": "Toronto", 
             "countryCode": "DE", 
             "name": "Privatbank", 
             "swift": "ABNACEE2RFA", 
             "zipCode": "12345" 
          } 
     } 
} | 
| POST /tickets/transaction | 
| Permissions: TRANSACTION_TICKET_MANAGER, SYSTEM_BROADCAST_CREATION_EXECUTOR | 
| Request: | 
| { 
   "businessUserOrganizationId": "61b065de-58ef-4959-ab5e-4a2d75ab6564", 
   "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0", 
   "topic": "Individual topup 9999", 
   "message": "Discussion of the Individual topup 9999" 
} | 
| Response: | 
| { 
   "ticket": { 
      "id": "0193d98c-666d-752b-8b1f-c9d9cc3e6bd1", 
      "category": "PAYMENT", 
      "conversation": { 
          "id": "0193d98c-666d-74a4-9b8a-848afbaf813b", 
          "name": "Individual topup 9999", 
          "createdAt": "2024-12-18T11:34:37.149Z", 
          "initiator": { 
               "id": "0193d98c-666d-7940-8be7-47d4c0f31424", 
               "type": "USER", 
               "entityId": "55d7c0fe-2608-44e5-bd7f-3b0d2a47e1e3", 
               "name": "Admin Default", 
               "email": "administrator@sdkfinance.tech" 
           } 
       }, 
       "businessProcessId": "0193d98b-43f4-7f78-8a69-2a1dfa3f0cb0" 
   } 
} | 
| PATCH /v1/transactions/{transactionId} | 
| Permission: TRANSACTIONS_UPDATER | 
| Path parameters: | 
| - transactionId - transaction ID (business process ID) | 
| Request: | 
| { 
   "categoryId": "20930a95-26cf-4e61-911d-1c361f4d2f92", 
   "note": "my note" 
} | 
| POST /investigation | 
| Permission: INVESTIGATION_MANAGER | 
| Request: | 
| { 
   "transactions": [ 
      "string" 
    ], 
   "reason": "FRAUD" 
} | 
| Response: | 
| { 
   "id": "string", 
   "transactions": [ 
     { 
       "transactionId": "string", 
       "transactionAmount": 0, 
       "transactionCreatedAt": "2024-12-19T14:23:02.506Z" 
     } 
  ], 
  "investigatorId": "string", 
  "investigatorName": "string", 
  "notes": "string", 
  "investigationReason": "FRAUD", 
  "investigationConclusion": "FRAUD", 
  "investigationStatus": "COMPLETED", 
  "openedAt": "2024-12-19T14:23:02.506Z", 
  "completedAt": "2024-12-19T14:23:02.506Z", 
  "deadlineAt": "2024-12-19T14:23:02.506Z" 
} | 
| POST /investigation/view | 
| Permission: INVESTIGATION_MANAGER, INVESTIGATION_VIEWER | 
| Response: | 
| { 
   "id": "string", 
   "transactions": [ 
    { 
       "transactionId": "string", 
       "transactionAmount": 0, 
       "transactionCreatedAt": "2024-12-19T14:23:02.506Z" 
    } 
  ], 
  "investigatorId": "string", 
  "investigatorName": "string", 
  "notes": "string", 
  "investigationReason": "FRAUD", 
  "investigationConclusion": "FRAUD", 
  "investigationStatus": "COMPLETED", 
  "openedAt": "2024-12-19T14:23:02.506Z", 
  "completedAt": "2024-12-19T14:23:02.506Z", 
  "deadlineAt": "2024-12-19T14:23:02.506Z" 
}  | 
| GET /investigation/{investigationId} | 
| Permission: INVESTIGATION_MANAGER, INVESTIGATION_VIEWER | 
| Response: | 
| { 
   "id": "string", 
   "transactions": [ 
     { 
       "transactionId": "string", 
       "transactionAmount": 0, 
       "transactionCreatedAt": "2024-12-19T14:24:19.408Z" 
     } 
   ], 
   "investigatorId": "string", 
   "investigatorName": "string", 
   "notes": "string", 
   "investigationReason": "FRAUD", 
   "investigationConclusion": "FRAUD", 
   "investigationStatus": "COMPLETED", 
   "openedAt": "2024-12-19T14:24:19.408Z", 
   "completedAt": "2024-12-19T14:24:19.408Z", 
   "deadlineAt": "2024-12-19T14:24:19.408Z" 
} | 
| PATCH /investigation/{investigationId} | 
| Permission: INVESTIGATION_MANAGER | 
| Request: | 
| { 
   "updateReason": "COMPLETE", 
   "investigationConclusion": { 
      "conclusion": "FRAUD", 
      "notes": "string" 
    }, 
    "transactions": [ 
      "string" 
   ] 
} | 
| Response: | 
| { 
   "id": "string", 
   "transactions": [ 
      { 
        "transactionId": "string", 
        "transactionAmount": 0, 
        "transactionCreatedAt": "2024-12-19T14:24:36.796Z" 
      } 
    ], 
    "investigatorId": "string", 
    "investigatorName": "string", 
    "notes": "string", 
    "investigationReason": "FRAUD", 
    "investigationConclusion": "FRAUD", 
    "investigationStatus": "COMPLETED", 
    "openedAt": "2024-12-19T14:24:36.796Z", 
    "completedAt": "2024-12-19T14:24:36.796Z", 
    "deadlineAt": "2024-12-19T14:24:36.796Z" 
} | 
| DELETE /v1/templates/withdrawal/{id} | 
| Permission: TEMPLATES_OWNER | 
| Deprecated/Deleted | 
Configuration changes
Added two environment variables:
VUE_APP_CREATE_OR_EDIT_CURRENCY_NOT_ALLOWED=true
VUE_APP_CREATE_OR_EDIT_TRUSTED_DOMAINS_NOT_ALLOWED=trueThe old environment variable VUE_APP_CREATE_CURRENCY_NOT_ALLOWED was deleted.
Timeout before resending OTP is configurable through
users.confirmation-code.resend-delayInvestigation deadline configuration:
investigations:
  # deadline configuration. Value in days till the investigation must be completed
  deadline: 7Introduced a new configuration property, reports.enabled, with a boolean value (true/false) that provides enhanced flexibility for managing core report functionality. This property allows for the selective enabling or disabling of the initialization of key reporting components, including:
- 
Kafka-based transaction writing. 
- 
MongoDB-related report storage. 
- 
Migration processes for reporting data. 
Default value: true
