Explore Release Notes

Release Version 4.25.0 (December, 2024)

05. 12. 2024

Pre-deployment steps

Review API Changes to check if there are any breakable changes in the consumed APIs.

Post-deployment steps

To be done after deployment

To change currencies type from default “FIAT” to “CRYPTO”, except those whose code is present in ISO 4217 alphabetic three-letter code of FIAT currencies, please execute Post-deployment migration SQL scripts

Check Configuration changes and define configuration parameters if required.

New functionality

Feature

Description

Benefits

Ability to initiate Refund for Purchase via provider operation was added

Service user with appropriate permission is able to initiate a Refund for the “Purchase via provider” operation manually, as a separate operation linked to the original one.
After the creation Refund is available in the transaction history, as a separate operation, for both the business and service users.

Refund means paying back to a customer unsatisfied with goods or services bought. This dispute operation can be initiated only when the bank day (operational day) of the original transaction is closed.

During refund operation system refunds the funds that were debited from the customer (Individual or Merchant) when the transaction “Purchase via provider” was performed. While refund processing in case the commission for Purchase operation was OUT, only the product price that was debited from the customer wallet must be credited back (REFUND AMOUNT DOES NOT INCLUDE COMMISSION AMOUNT)

Contact us to get more information about the Refund processing accounting model.

Allows team members to initiate a refund on purchase via provider operation and credited the price of the product to the customer’s wallet balance.

Ability for Administrator to set Monthly Fee for System Vendor

Administrators can now configure and manage monthly fees, specifying a fixed fee amount and currency, which is applied as a platform service charge to Business users. This fee setting feature is available exclusively for the platform owner (System Vendor). Administrators have control over fee setup, including editing and managing the status of monthly fees.

  1. The monthly fee is charged every month according to the contract, to which it was added

  2. From the accounting perspective, the monthly fee must be charged from the client’s wallet to a commission wallet. This charge transaction will be visible in the client transaction history as a new separate type of operation.

The day for the monthly fee charge can be configurable on the Vendor configuration level

To create monthly fees, the Administrator is allowed to specify the following parameters:

  • Monthly fee name – required – the name of the monthly fee (e.g. Merchants support fee, etc.)

  • Currency – required – currency, in which the monthly fees will be charged from the Client

  • Amount – required – fee amount

  • Key selling point (1, 2, 3) – only one required – three separate fields, key points included into the plan for this monthly cost

By default, Monthly fee should be created with status “Active“

Administrator is allowed to edit the following parameters of the Monthly Fees (on the Vendor level):

  • Monthly fee name – the name of the monthly fee (e.g. Merchants support fee, etc.)

  • Currency – currency, in which the monthly fees will be charged from the Client

  • Amount – fee amount

  • Status – active/inactive (enable/disable to charge this particular fee)

  • Key selling point (1, 2, 3)

Parameters to view Monthly Fees with filter and pagination:

  • Monthly fee name (with sorting)

  • Create date (with sorting)

  • Amount (with sorting)

  • Status (Active, Disabled) (with sorting)

  • Currency (with sorting)

  • Key selling point (1, 2, 3)

Parameters to filter by:

  • Period (create date)

  • Status (Active, Disabled)

  • Search by (for now only by fee name, “like“)

Ability to Retrieve Detailed Refund Information by Transaction ID, Including Original Transaction Details

Administrators can now retrieve detailed information for a specified refund by transaction ID, with additional contextual details from the original transaction. This includes key attributes such as the original transaction ID, creation date, transaction type, amount, currency, product ID, commission details, and relevant parties (e.g., sender or recipient). The front-end design supports these enhanced views, while backend updates ensure accurate data retrieval.

This feature enables administrators to access comprehensive refund and transaction details in one place. It reduces time spent navigating between transactions and improves operational efficiency by offering a unified view of related transactions and refunds.

Ability for service user to view and update Status for Assets rates.

This update introduces the ability for authorized service users to manage the status of asset rates, enabling them to set rates as “Active” or “Disabled” after initial creation. Initially, all asset rates will be automatically assigned a default status of “Created” upon setup, preventing use in exchange operations until manually activated. Additionally, a new status, “Unavailable,” is now available in the system, marking rates that are unsupported by specific rate sources (to be fully implemented in a future task).

Service users with appropriate permission will be able to see and update the status of the asset rate for certain asset pairs after the creation, so that they can set the status as “Disabled” and PROHIBIT exchange operation with such asset pair.

Service user is not allowed to specify rate status manually when they setup rate at the first time – all newly created asset rates should have the status “Created“ before the user will not update it.

This feature improves control and compliance over asset rate management, ensuring only valid rates are used for exchange operations.

Ability to view all asset pairs available for exchange with rates against the main asset, including filters and pagination.

This update introduces the ability for service users to view all asset pairs available for exchange and their rates against the main asset. The feature includes filter and pagination capabilities for efficient navigation and management. It applies to both manual and integration rate sources.

Key Features:

  1. View Asset Pairs:

    • Display all asset pairs with the following details:

      • Currency: The currency code of the paired asset.

      • Rate: The exchange rate against the main asset (if set; otherwise, empty).

      • Last Rate Update: Date-time of the last rate update for the asset pair (empty if no rate is set).

      • Disabled At: Date-time when the rate status was changed to “Disabled.”

      • Status: The current status of the rate (Active, Disabled, Created, Unavailable).

  2. Main Asset Configuration:

    • Service users configure the main asset by setting isMain=true and availableForExchange=true.

    • The main asset serves as the source currency for exchange operations.

  3. Filters and Pagination:

    • Available Filters (multi-choice):

      • Currency (currency code of the paired asset).

      • Status (Active, Disabled, Created, Unavailable).

    • Pagination support for efficient handling of large datasets.

  4. Manual and Integration Sources:

    • Behavior is consistent for both manual and integration-based rate sources.

  5. Conditions for Asset Pair Inclusion:

    • All assets with availableForExchange=true are shown against the main asset (isMain=true).

    • If a rate is not set for an asset pair, the pair is still displayed, but the rate parameter will be empty.

If the rate is missing for an asset pair, the API returns the pair with an empty rate parameter.

Affected Endpoint:

Changed API:
POST /exchange-rates/view (added filtering, pagination)

New API:
POST /assets/exchange-rates/view

This feature enhances visibility into asset pair rates and improves management efficiency for service users, ensuring streamlined exchange operations.

Ability for service users to configure exchange rates manually for multiple asset pairs at once

Users can now manage exchange rates efficiently, viewing all existing rates and updating them in bulk when the rate source is set to “manual”.

Key Features:

  1. Bulk Rate Configuration:

    • Users can pass multiple asset pairs and their corresponding rates in a single API request.

    • Each asset pair configuration includes:

      • Rate: Exchange rate value.

      • inCurrencyId: Source currency.

      • outCurrencyId: Target currency.

  2. Validation Rules:

    • If an asset pair is not found or either asset (inCurrencyId or outCurrencyId) does not have availableForExchange=true:

      • The system returns an error, and no rates are updated.

  3. Default Status for New Rates:

    • All newly created rates are assigned the status “Created” (status transition logic handled in a separate task).

  4. View Existing Rates:

    • A new API allows users to fetch all existing rates for available exchange asset pairs against the main asset.

    • Displays current rates and details to assist users in setting up new rates.

  5. Rate Update Tracking:

    • When a user updates rates, the system records the date-time of the “Last rate update” for each pair.

Error Handling:

  • If any validation fails for the provided asset pairs (e.g., missing pairs, availableForExchange=false), the system:

    • Rejects the entire request.

    • Returns an error response with details of the invalid asset pairs.

Affected Endpoints:

POST /exchange-rates/rate (changed request/response)

This enhancement streamlines the process of managing exchange rates, saving time for service users and improving operational efficiency.

Ability to Modify Rate for Specific Currency Pair

Service users with the appropriate permissions can now manually modify the rate for specific currency pairs, provided that the rate is set up manually (not through an integration source). Each rate modification automatically updates and displays the date of the last rate change. This ensures that users see the most current rates and the timing of the last modification in the system.

The system changes rate and saves the date every time when the value of the asset rate is changed (other parameters, e.g. rate status do not impact the date of the last rate update.

All new currency exchange operations created after rate update should use new rate for this asset pair.

Affected Endpoint:

POST /exchange-rates/view fields for filtering added:

statuses (array of rate statuses)

currencyCodes (array of currency codes)

This feature enhances operational flexibility by allowing service users to update asset rates on demand.

Cash Desk Creation and Management

This feature allows service users with appropriate permissions to create and manage cash desks, link cashiers, and update additional details. Cash desks represent physical locations where cashiers operate. Service users can also view a comprehensive list of cash desks with relevant parameters and apply filters for efficient management.

Cash Desk Creation:

  • Service users can create a cash desk by providing a cashier login (required) to link an existing user or create a new one.

  • The cashier must have the Cashier role and be linked to the Cash Desk organization type.

  • Newly created cash desks start with empty parameters except for the linked cashier.

Details Modification:

  • Service users can update cash desk details, including organization name, phone, email, and location (country, city, address, postal code).

Cash Desk List:

  • View all cash desks with details like contact info, location, organization, cashiers (name, contact, working days), pending requests, and working hour status (open/closed).

Filters and Search:

  • Filter by working hour status (open/closed).

  • Search by organization, address, cashier name, phone, or email (full/partial match).

New APIs were added to create and manage cash-desks.

This update enhances operational efficiency by streamlining the management of cash desks and ensuring that cashiers and their associated operations are seamlessly organized.

Enable registered but not logged-in users to create a request to change their registered phone number used for login.

This feature allows users who cannot access their current phone number to initiate a request to update it. The process generates a temporary token enabling users to proceed with the next steps, including identity verification, to complete the phone number change.

  1. User Flow:

    • Users initiate the phone number change request by providing a valid login.

    • If valid, the system:

      • Issues a temporary token with a 60-minute expiration.

      • Returns a success response.

    • If invalid or missing login:

      • Returns an error response with a relevant error message.

  2. Temporary Token Behavior:

    • Token allows users to proceed to the next step but does not grant access to other operations.

    • Token becomes invalid after the expiration time.

This feature enhances the user experience by providing a secure and streamlined process for updating phone numbers when the current number is inaccessible.

Enable registered but not logged-in users to upload a selfie and identification document for identity verification as part of the phone number change request process.

This feature allows users to securely upload a selfie and an identification document using a temporary token, enabling identity verification to proceed with a phone number change request.

Key Features:

  1. Request Parameters:

    • temporary_token (required): A valid token issued during the phone number change request.

    • selfie (required): A file containing the user’s selfie for identity verification.

    • document (required): A file containing the user’s identification document (e.g., passport or ID).

  2. Response Parameters:

    • status: Indicates the result of the upload (success or error).

    • error_message (optional): Provides details if the upload fails (e.g., “Invalid file type” or “File size too large”).

    • file information: Detailed metadata for each uploaded file, including:

      • File ID, owner ID, media type, name, URL, checksums (md5, sha1), size, usage status, creation and expiration timestamps, and associated tags.

This feature enhances security and usability by enabling users to complete identity verification seamlessly as part of the phone number change process.

Allow registered but not logged-in users to provide a new phone number for login and initiate OTP verification.

This feature enables users in the phone number change process to submit a new phone number and link it to their account. The system sends a one-time password (OTP) to verify the new phone number, ensuring secure account updates.

Request Parameters

  1. temporary_token: (required) – the temporary token issued in a previous step (request for phone number change) that allows the user to proceed with providing a new phone number.

  2. new_phone_number: (required) – the new phone number the user wants to use for login. The phone number should be specified without a “+” sign or additional symbols and should start with the country code.

  3. selfie_file_id: (required) – file ID of uploaded at the previous step selfie

  4. document_file_id: (required) – file ID of uploaded at the previous step identity document

Response parameters:

  • action: OTP_SENT
    Indicates whether the message with OTP was successfully sent to the new phone number.

  • status:
    The result of the request, either success or error.

  • error_message: (optional)
    Provides details on why the request failed, such as an invalid phone number format or an issue with sending the OTP.

This feature enhances the security and reliability of the phone number change process, ensuring only verified users can update their login credentials.

Phone Number Change Request – OTP Verification.

Added ability for not logged-in users to verify their new phone number and create a request to change the registered phone number used for login.

This update allows registered users who are not logged in to change their phone number used for login. After requesting a phone number change, users will receive an OTP on their new phone number, which they can use to verify the change. If the OTP is valid, a request to change the phone number is created.

Key Features:

  1. OTP Verification for Phone Number Change:

    • Users can now verify their new phone number by entering the OTP sent to it.

    • The verification is required to create a request for phone number change.

  2. Request Creation:

    • Once the OTP is successfully validated, a phone number change request is created. The request includes:

      • Old Phone Number (the phone number currently used for login)

      • New Phone Number (the phone number the user wishes to use for login)

      • Link to the Existing User Profile (for verification purposes)

      • Uploaded Selfie (for identity verification)

      • Uploaded Document (user identification document)

  3. Request Parameters:

    • Temporary Token: The temporary token generated during the first step of the phone number change process is required to proceed with the OTP verification and request creation.

    • OTP: The OTP sent to the new phone number for verification.

  4. Response Parameters:

    • request_id (optional): Unique identifier of the created request if the OTP is valid and the request is successfully created.

    • status: Indicates whether the request creation was successful or failed.

    • error_message (optional): Provides a detailed error message if the OTP validation or request creation fails (e.g., “Invalid OTP” or “Failed to create request”).

New API:

POST login-change/request

This feature ensures users who are unable to access their current registered phone number can securely change it and continue to use the system with their updated credentials.

This release introduces the Reports Module, which can now be included or excluded from the build based on your configuration needs. The module provides robust reporting functionality, integrating with Kafka for real-time data processing and consumption.

To be able to use the Reports module it should be configured.

  • Optional Inclusion in Build
    The Reports Module can now be included in the build or excluded based on your configuration needs.

  • General Properties
    The following general properties need to be configured:

    spring:
      kafka:
        bootstrap-servers: ${SPRING_KAFKA_BOOTSTRAPSERVERS}
        enabled: ${KAFKA_ENABLED}
        client-id:
        ssl-endpoint-identification-algorithm:
        sasl-mechanism: ${SPRING_KAFKA_PROPERTIES_SASL_MECHANISM}
        sasl-jaas-config: ${SPRING_KAFKA_PROPERTIES_SASL_JAAS_CONFIG}
        security-protocol: ${SPRING_KAFKA_PROPERTIES_SECURITY_PROTOCOL}
    
  • Module-Specific Properties
    The following properties are specific to the Reports Module:

    reports:
      kafka:
        topic: ${KAFKA_REPORTS_TOPIC:transaction-topic-dev}
        group-id: ${REPORTS_GROUP_ID:reports-kafka-consumer-group}
    

Notes:

  • The ssl-endpoint-identification-algorithm and reports.kafka.include properties are intentionally left without default values to allow for customization based on your environment.

  • Ensure all environment-specific variables are properly set for seamless integration.

Introduced new Reports API to manage reports:

POST /report
GET /report/{id}

This update enhances the reporting capabilities within the system by integrating it with Kafka for real-time processing, giving users the flexibility to customize configurations based on their specific envi

Ability for Business User to View Pool Bank Account Details for Manual Top-up

This release introduces the ability for a registered and logged-in business user to view pool bank account details when performing a manual bank transfer to top-up their wallet in FIAT currency. If no bank account is linked to the wallet, the system will display the necessary pool bank account details to allow the user to proceed with the top-up.

Key Features:

  • Manual Bank Transfer:

    • When a business user selects the Manual Bank Transfer option to add funds to their wallet in FIAT currency, the system will check if there is a linked bank account.

    • If no bank account is linked to the wallet, the system will display the pool bank account details needed for the transfer.

  • Pool Bank Account Details Displayed:

    • The following details will be shown to the user for completing the bank transfer:

      • Recipient Name

      • Recipient Currency

      • Wallet Number (to which the funds should be added)

      • IBAN

      • Bank Name

      • SWIFT/BIC

This enhancement improves the flexibility for users who need to manually top up their wallet but have not linked a bank account, ensuring seamless wallet funding through pool bank accounts.

Ability for Service Users to Manage Pool Bank Accounts

In this release, we have introduced the ability for service users with appropriate permissions to manage the list of POOL bank accounts in the system. These accounts can now be linked to in-system accounts and used for top-up operations. Service users with the appropriate permissions will be able to view, add, edit, and delete pool bank accounts.

Key Changes:

  1. Permissions for Managing Pool Bank Accounts:

    • New Permission: POOL_BANK_ACCOUNT_MANAGER
      A new permission has been added to manage POOL bank accounts. This permission allows users to:

      • View the list of pool bank accounts.

      • Add new pool bank accounts.

      • Edit existing pool bank accounts.

      • Delete pool bank accounts.

    • Roles Assigned to Permissions:

      • The Administrator and Accountant roles are granted all the permissions related to managing POOL bank accounts.

  2. Default Values for POOL Bank Accounts:

    • isDefault: Always set to false for new POOL bank accounts.

    • status: Always set to APPROVED for new POOL bank accounts.

    • bankAccountNumber and IBAN: These fields are now optional when creating a POOL bank account.

    • usedForTopUp: This field is set to false by default for POOL bank accounts. It is also present for PERSONAL bank accounts and can be used to specify whether a bank account can be used for top-up operations.

Added new API:

POST {{host}}/bank-accounts

Added new permission POOL_BANK_ACCOUNT_MANAGER to

POST {{host}}/bank-accounts/view
POST {{host}}/bank-accounts
PATCH {{host}}/bank-accounts/{bankAccountId}/with-bank
DELETE {{host}}/bank-accounts/{bankAccountId}

Ability for Service Users to Specify, View, and Manage Currency Type

In this release, we’ve introduced the ability for service users with appropriate permissions to specify, view, and manage the currency type during currency creation and editing. This update allows users to properly classify currencies based on their functional purpose within the system.

Key Changes:

  1. Currency Type Classification:

    • The following currency types are now available:

      • FIAT: For traditional currencies like USD, EUR, etc.

      • CRYPTO: For cryptocurrencies like Bitcoin, Ethereum, etc.

      • BONUS: For bonus points or other reward systems.

      • VIRTUAL: For system-specific entities like virtual goods or game points.

  2. Currency Creation:

    • When creating a new currency, users must select a currency type from the available options: FIAT, CRYPTO, BONUS, or VIRTUAL.

    • If no currency type is selected, FIAT will be set as the default type.

  3. Currency Editing:

    • Users can now modify the currency type of an existing currency during editing.

    • The currency type is visible in the edit form and can be changed as needed.

  4. Currency List Display:

    • The currency list now includes a “Currency Type” column, showing the currency type (FIAT, CRYPTO, BONUS, or VIRTUAL) for each currency.

    • Users can filter the list of currencies by their type, making it easier to manage and categorize different currencies.

Affected Endpoints:

POST: /v1/currencies/view POST: /v1/currencies PATCH: /v1/currencies/{currencyId} PATCH: /v1/currencies/{currencyId}/set-main GET: /v1/currencies

These changes enhance the flexibility of currency management, enabling service users to classify and organize currencies more effectively, making it easier to distinguish their functional roles within t

Ability to view account details for currency types other then FIAT (CRYPTO, BONUS, VIRTUAL)

In this release, we have introduced a new feature allowing registered and logged-in users to add money to their wallets for CRYPTO, BONUS, and VIRTUAL currencies. When users select a non-FIAT currency type (such as cryptocurrency, bonus points, or virtual goods) to add money, they will now be able to specify the amount to top-up, choose a different wallet if needed, and view detailed account information for the wallet they are topping up.

Key Changes:

  1. Currency Type Selection:

    • Users can now choose to add money to their wallet in CRYPTO, BONUS, or VIRTUAL currency types from the drop-down menu.

    • If the selected currency type is not FIAT, the user will see the option to top-up the wallet with that currency type.

  2. Amount and Wallet Selection:

    • Users can specify the amount they want to add to the wallet.

    • Users are given the option to choose another wallet to add money to, apart from their default wallet.

  3. Wallet Details Display:

    • Upon selecting a wallet for the top-up, the following wallet details will be displayed:

      • Recipient Name: The name specified in the user’s profile.

      • Currency: The type of currency selected for the top-up (CRYPTO, BONUS, or VIRTUAL).

      • Wallet Number: The number of the wallet to which the money will be added.

Affected Endpoints:

POST /v1/coins/view
GET /v1/organizations/system/coins
GET /v1/organizations/{organizationId}/coins
GET /v1/coins

Ability to get list of users in the system by the list of credentials (emails or phones)

This release introduces the ability for registered and logged-in users to search for contacts using a list of email addresses or phone numbers. This functionality enables users to view only the contacts that are registered in the system, making it easier to choose recipients for money transfers.

Key Changes:

  1. Recipient Search by Credentials:

    • New API: A new API has been added that accepts a list of email addresses or phone numbers.

    • The API will return only those credentials (emails or phone numbers) that correspond to registered users in the system, ensuring that the search results only show valid contacts who have an account.

  2. Search Results Handling:

    • The system will return results based on the provided list of emails or phone numbers, but will exclude those credentials that:

      • Are not associated with any registered user.

      • Are specified in the user profile as a contact phone or email address for the user.

  3. No Results Handling:

    • If no contacts match the provided email or phone credentials in the system, the system will return no results and only display the search parameters (email or phone) that were entered by the user.

Exchange Transfer Between Different User Wallets

Description: This release introduces the ability for registered and logged-in users to send money to another user’s wallet, even if the destination wallet uses a different currency from the source wallet. The system will automatically handle the currency conversion during the transfer, eliminating the need for users to perform a separate exchange operation before making the transfer.

Key Changes:

  • Users can now send funds to another user’s wallet, even if the destination wallet’s currency differs from their source wallet.

  • The system will automatically perform the currency exchange and complete the transfer seamlessly.

Ability for business user to create a template for Bank withdrawal

This release enables registered and logged-in business users to create templates for IBAN transfers by saving the parameters used in a performed transfer. The user can specify a name for the template, allowing them to easily reuse the details for future transactions.

Key Changes:

  • Users can now save their performed IBAN withdrawal requests as templates with a custom name.

  • The following transfer parameters will be stored behind the template:

    • Source wallet

    • Amount

    • IBAN

    • Recipient full name

    • Bank parameters (BIC, SWIFT, Bank Country, Bank City, Bank Address, Bank Zip Code)

    • Transfer description

New API was added:

POST: /v1/templates/withdrawal/operation/{id}

Ability for service user to unban another service user if it was banned after several attempts of specifying wrong password.

Option “Unban user” added for the team member in the Team member list, if they are banned and the current service user has permission to unban (USER_MANAGER).

Bank accounts menu is moved to the Clients section

Added default filters to the Transactions and Log history sections.

If there are no filters defined for these views, the current-day filter is applied by default starting from 00:00:00.0000 to 23:59:59.9999

Improvements

Feature

Description

Updated country data format for Kafka topic user-profile-data.

Affected Endpoint: POST /v1/profiles/{userId}

Description:
When user profile information is submitted via the

POST /v1/profiles/{userId} API, the country field in the user-profile-data Kafka topic is now formatted as follows:

 "country": {
    "alfa2": "UA",
    "alfa3": "UKR",
    "numeric": "804",
    "name": "Ukraine"
}

Configurable Option to Skip KYC Process

Feature: Introduced a system configuration to enable or skip the KYC process for business user creation.

Description:

This update allows administrators to configure the system to bypass the KYC process during the creation of business users. When enabled, the system will automatically assign the Approved KYC Identification Status to newly created users, streamlining the onboarding process for specific use cases.

Front-End Support for Managing Identification Reset Requests

Service users with appropriate permissions can now manage identification reset requests directly through the back-office UI. This feature streamlines the process of approving or declining requests, providing greater control and efficiency.

Key Features:

  1. Request Management UI:

    • Added a new section in the back-office UI to display and manage user identification reset requests.

    • Service users can:

      • View Requests using the API:

        • POST /v1/profiles/view-reset-identification-requests

      • Approve Requests using the API:

        • POST /v1/profiles/{userId}/reset-identification-requests/{reqId}/approve

      • Decline Requests using the API:

        • POST /v1/profiles/{userId}/reset-identification-requests/{reqId}/decline

  2. Request Details:

    • The UI displays the following information for each reset request:

      • User ID.

      • Request ID.

      • Request status.

      • Date of request.

  3. Streamlined Action Buttons:
    • Approve and Decline actions are accessible through intuitive buttons for each request.

  4. Permission-Controlled Access:

    • Only service users with the appropriate permissions can access and manage these requests.

Ability for business and service user to enable/disable email notifications related to business user profiles was added

Ability to enable/disable the following notifications was added for business user:

  • KYC identification status change

  • Profile update is required

  • Reset identification request approve

  • Account was blocked

  • Password recovery

If some of new optional settings for notifications were not provided, the following default values will be used for updating settings:

  • phone: true – if the phone is verified, otherwise false

  • email: true – if an email is verified, otherwise false

Addition of gate transaction (provider transaction) details to the transactions view API.

Provider transaction external ID added to the transaction details.

This update enhances the /transactions/view API by including details of gate transactions, providing visibility into all stages of gate business processes for service users with appropriate permissions. Gate transactions represent informational transactions sent to the provider (Gate) for processing, with the transaction amount reflecting the amount sent to the provider.

Key Features:

  1. Gate Transaction Details:

    • Added a new node to the /transactions/view API to display gate transaction details for the following business processes:

      • gate_redeem

      • gate_charge

      • gate_purchase

      • gate_issue_card

  2. Informational Transaction View:

    • Gate transactions reflect provider-level operations, offering transparency into the amount and details of transactions sent to the provider for processing.

  3. Access Control:

    • Only service users with appropriate permissions can view these details.

Affected Endpoint:

POST /transactions/view

Added externalProcessIdto the response

Allow business users to view and manage their email and phone notification settings directly in their profile.

Business users can now control whether they receive notifications for specific events via email or phone. This feature provides flexibility to enable or disable notifications based on individual preferences, ensuring users are informed only about events they find relevant.

  1. View and Manage Notification Settings:

    • Users can view their current email and phone notification preferences in their profile settings.

    • Notifications include:

      • KYC identification status changes.

      • Profile update required.

      • Reset identification request approved.

      • Account blocked.

      • Password recovery.

  2. Toggle Notifications:

    • Enable or disable notifications for each event:

      • Enabled: Notifications are sent when the corresponding event occurs.

      • Disabled: Notifications are not sent for the event.

  3. Default Notification Settings:

    • Existing Users:

      • If a verified email or phone is present, all listed notifications are enabled by default.

      • If no verified contact exists, notifications are disabled by default.

    • New Users:

      • Notifications are automatically enabled upon verifying email or phone for the first time.

  4. Special Notification Behavior:

    • transactionNotification and authorizationNotification remain disabled by default unless explicitly activated by the user.

If for some notificationEventType new settings will not be provided in the notificationSettings of request body, the following default values will be used for updating security settings:

phone: true – if phone is verified, otherwise false

email: true – if email is verified, otherwise false

will be applied for each of existing notificationEventType in case they are missing in the request

Affected Endpoints:

Patch /v1/profiles/my/security-settings

Patch /v1/profiles/{userId}/security-settings

Ability for business user to view comprehensive account details on the user dashboard for a full overview of all accounts.

This feature provides registered and logged-in users with a unified view of all their accounts, including key details such as balances, linked cards, status, and associated bank accounts. This allows users to have a holistic view of their financial information on one screen.

  • Account number (serial)

  • Account currency

  • Account balance

  • Account available balance

  • Account held balance

  • Account future balance (positive hold)

  • In-system cards linked to the account with all card parameters

  • Payment cards linked to the account with all card parameters

  • Account status

  • Date and reason of account closed for closed account

  • Date and reason of account deactivation for deactivated account

  • Bank accounts linked to the account with all parameters (IBAN, number, BIC, Bank name, etc)

New API was added: GET /v1/my/account-overview

Masked Phone Number in OTP Authorization Response

Added masked phone number in the response of the POST /authorization API when an OTP is sent to the user’s phone.

To improve security and user experience, the POST /authorization API response now includes a masked version of the user’s phone number when an OTP is sent for verification. This ensures that sensitive phone number details are obscured while still providing enough information for the user to verify the phone number being used.

Key Features:

  1. Masked Phone Number:

    • When an OTP is sent to the user’s phone for verification, the POST /authorization API response will include a new field called maskedPhoneNumber.

    • The phone number is masked using the following pattern:

      • Country Code and the last 2 digits are visible.

      • All other digits are replaced by asterisks (*).

  2. Example Masking Formats:

    • European (UK): +447*******23

    • US: +1********23

Affected Endpoint:

id=”POST-/authorization” data-renderer-start-pos=”36975″>POST /authorization
The new parameter “maskedPhoneNumber” was added to the response.

Ability for business user to create withdrawal via Bank request without specifying bank account ID

In this release, business users can now create a withdrawal request to transfer funds to an IBAN without the need to first create and link a bank account. Users will only need to specify the recipient account details, making the process simpler and faster.

Key Changes:

  • New process for creating bank withdrawal requests: Users no longer need to create and link a bank account to their wallet before initiating a withdrawal. Instead, users can create a request by simply providing the recipient’s IBAN and optional bank details.

  • Mandatory Fields:

    • IBAN (required)

    • Recipient name (required)

  • Optional Fields:

    • BIC/SWIFT (optional)

    • Recipient address (optional)

    • Custom information (optional)

    • Description (optional)

    • External process ID (optional)

Affected Endpoints:

POST bank-withdrawals/create-request

Ability to See Blocked Date for Blocked Accounts in Accounts List

As a registered and logged-in user, you can now view the blocked date for any blocked account in the Accounts list. This helps users quickly check when an account was blocked.

API Changes:

  • The GET /v1/coins API has been updated to include a new field: coins.deactivationDate, which shows the blocked date for accounts that are deactivated.

The list of country codes in the system was updated

The list of country codes in the system was updated according to the following:
https://assets.publishing.service.gov.uk/media/65fd8475f1d3a0001132adf4/FCDO_Geographical_Names_Index_March_2024.csv

Removed country codes

 (‘AQ’, ‘AN’, ‘TF’, ‘PS’, ‘HM’, ‘BV’)

The fields with country codes in tables

country in org_prof_address_def
nationality, tax_residence_country in org_prof_person_def
country in bank_def

Fixes

  • Improved Transaction Reconciliation Status Handling. The previous method of using the business process status to indicate whether a transaction was reconciled or not often caused issues, particularly with moving transactions to the “processed” status. To address this, a new field, reconciliationStatus, has been added to the API response for the endpoint /v1/transactions/{transactionId}.
  • Deleted roles are now properly removed from the supervisingRoles and manageableRoles associations, ensuring they no longer appear in responses or remain linked to other roles.
  • The HTTP status code when attempting to delete a non-existent or already deleted exchange rate has been updated from 204 No Content to 404 Not Found.

    Additionally, the error message will now return "code": "exception.rate.not_found" to accurately reflect the issue when trying to delete an exchange rate that doesn’t exist or has already been deleted.

  • Error exception.entity.ambiguity while user registration and top-up was fixed.

    The type of the requestIdentifier path parameter has been updated across several API endpoints. Previously, an integer identifier was used, but it has now been replaced with a string-based request ID.

    This update affects the following API endpoints:

    • POST /v1/bank-top-ups/{requestIdentifier}/accept

    • POST /v1/bank-top-ups/{requestIdentifier}/decline

    • POST /v1/bank-withdrawals/{requestIdentifier}/accept

    • POST /v1/bank-withdrawals/{requestIdentifier}/decline

    • POST /v1/bank-withdrawals/{requestIdentifier}/lift-limit

    • POST /v1/bank-withdrawals/{requestIdentifier}/reject

    • GET /v1/cash-desk-withdrawals/details/{requestIdentifier}

    • POST /v1/cash-desk-withdrawals/{requestIdentifier}/perform-withdrawal

    • POST /v1/cash-desk-withdrawals/{requestIdentifier}/approve

    • POST /v1/cash-desk-withdrawals/{requestIdentifier}/decline

    • GET /v1/collects/{requestIdentifier}

    • POST /v1/collects/{requestIdentifier}/accept

    • POST /v1/issue-card/cards/issue/{requestIdentifier}/accept

    • POST /v1/issue-card/cards/issue/{requestIdentifier}/decline

    • GET /v1/inputs/{requestIdentifier}

    • POST /v1/inputs/{requestIdentifier}/accept

    • GET /v1/investments/{requestIdentifier}

    • POST /v1/investments/{requestIdentifier}/accept

    • POST /v1/business-requests/{requestIdentifier}/approve

    • POST /v1/business-requests/{requestIdentifier}/decline

    • POST /v1/business-requests/{requestIdentifier}/repeat

    • POST /v1/business-requests/{requestIdentifier}/reject

    In addition, the type of the identifier field has been updated in the following components:

    • BusinessProcessDto

    • BusinessRequestFilterDto

    • TransactionFilterDto

    • BusinessRequestDto

  • Enable Notifications by Default for Users with Verified Contacts

    A bug has been fixed where notifications were disabled by default for newly created users with verified contacts.

    The system now ensures that notifications are enabled by default when a user has verified contact information. This update ensures proper notification settings for new users without requiring manual configuration after creation.

  • Display All Available Contracts in “Change Contract” Window
    A bug has been fixed where only the first 10 contracts were displayed in the “New contract” dropdown when editing contracts for a client. The system has been updated to ensure that all contracts are displayed in the dropdown, resolving the issue of incomplete contract visibility.
  • The API POST ​/v1​/assets​/exchange-rates​/view was fixed.

    API returned all currency rates, including deleted ones. Now API returns only actual currency rates and excludes deleted ones.

API changes v.4.25.0

Endpoint

Updated

POST /transactions/view

The refunding filtering fields and refundProcess node were added

POST /exchange-rates/view

New fields were added in response.

status
rateUpdatedAt
statusUpdatedAt

POST /exchange-rates/view

Added filtering and pagination

response request:
{
"pageNumber": 0,
"pageSize": 10,
"filter": {
"inCurrencyId": "B51d65c1-79cd-4e96-99f3-8db991194d76",
"outCurrencyId": "4a72ea60-f994-44bd-9d2b-64ec15e14d1d",
"ratePairs": [
{
"inCurrencyId": "B51d65c1-79cd-4e96-99f3-8db991194d76",
"outCurrencyId": "4a72ea60-f994-44bd-9d2b-64ec15e14d1d"
}
],
"statuses": [
"CREATED"
],
"currencyCodes": [
"string"
]
}
}

POST /exchange-rates/rate

API receives request of currency pairs with rate value.
If a rate exists for that pair it will update it, otherwise, it will create a new one.

Changed request body to accept list of exchange rates:
was:

{
"inCurrencyId": "someID",
"outCurrencyId": "someId",
"rate": 1.2
}

now:

{
"rates": [
{
"inCurrencyId": "someID",
"outCurrencyId": "someId",
"rate": 1.2
},
{
"inCurrencyId": "someAnotherID",
"outCurrencyId": "someAnotherId",
"rate": 0.2
}
]
}

in the response, a list of rates is returned instead of one rate:

{
"rates": [
{
"id": "string",
"inCurrency": {
"id": "string",
"sn": "string",
"code": "string",
"symbol": "string",
"type": "FIAT"
},
"outCurrency": {
"id": "string",
"sn": "string",
"code": "string",
"symbol": "string",
"type": "FIAT"
},
"rate": 0,
"exchanger": {
"id": "7cf1f309-09cd-4eda-8b2c-682bf64fd7cd",
"type": "individual",
"name": "Tony Stark",
"organizationStatus": "approved",
"contract_info": {
"id": "5bc369de-4fee-4d72-b5e5-73769adeec4e",
"personType": "standart",
"name": "standard contract for org individual"
}
},
"status": "CREATED",
"rateUpdatedAt": "2024-11-27T13:24:57.107Z",
"statusUpdatedAt": "2024-11-27T13:24:57.107Z"
}
]
}

POST /transactions/view

Added externalProcessId to request and response bodies.

PATCH /my/security-settings

PATCH /profiles/{userId}/security-settings

  • action settings is a list of NotificationDtos

New required field was introduced notificationEventType within NotificationDto.

NotificationEventType is an enum with such possible values:

  • TRANSACTION – switch on\off user transaction notification

  • AUTHENTICATION – switch on\off user authentication notification

  • KYC_IDENTIFICATION_STATUS_CHANGE – switch on\off user notification after update organization status

  • PROFILE_UPDATE_REQUIRED – switch on\off user notification for Reset identification of profile

  • RESET_IDENTIFICATION_REQUEST_APPROVED – switch on\off user notification after event received for approval
    of reset identification request

  • ACCOUNT_BLOCKED – switch on\off user notification after user was locked or blocked by aml

  • PASSWORD_RECOVERED – switch on\off user notification after password recovery was confirmed

For each NotificationEventType you can provide:

  • phone – true/false

  • email – true/false

in notificationSettings node to switch on/off the corresponding notification.

If for some notificationEventType new settings will not be provided in the notificationSettings of request body,
the following default values will be used for updating security settings:

  • phone: true – if phone is verified, otherwise false

  • email: true – if email is verified, otherwise false

will be applied for each of the existing notificationEventType in case they are missing in the request

request body:

{
"security": {
"twoFactorsAuthEnabled": false,
"notificationSettings": [
{
"phone": false,
"email": false,
"notificationEventType": "TRANSACTION"
},
{
"phone": false,
"email": false,
"notificationEventType": "AUTHENTICATION"
}
]
}
}

response body:

{
"profile": {
...
"security": {
"twoFactorsAuthEnabled": false,
"notificationSettings": [
{
"phone": false,
"email": false,
"notificationEventType": "TRANSACTION"
},
{
"phone": false,
"email": false,
"notificationEventType": "AUTHENTICATION"
},
{
"phone": true,
"email": true,
"notificationEventType": "KYC_IDENTIFICATION_STATUS_CHANGE"
},
{
"phone": true,
"email": true,
"notificationEventType": "PROFILE_UPDATE_REQUIRED"
},
{
"phone": true,
"email": true,
"notificationEventType": "RESET_IDENTIFICATION_REQUEST_APPROVED"
},
{
"phone": true,
"email": true,
"notificationEventType": "ACCOUNT_BLOCKED"
},
{
"phone": true,
"email": true,
"notificationEventType": "PASSWORD_RECOVERED"
}
]
}
},
...
}

  1. Profile management by the owner

GET /v1/profiles/my

PATCH /v1/profiles/my/additional

PATCH /v1/profiles/my/address

PATCH /v1/profiles/my/business

POST /v1/profiles/my/contact/confirm

PATCH /v1/profiles/my/person

  1. Profile – customer identification (KYC)

POST /v1/profiles/{userId}/approve

POST /v1/profiles/{userId}/decline

POST /v1/profiles/{userId}/reset

PATCH /v1/profiles/{userId}

  1. Profile management by service role

GET /v1/profiles/{userId}

PATCH /v1/profiles/{userId}/additional

PATCH /v1/profiles/{userId}/address

PATCH /v1/profiles/{userId}/integration

PATCH /v1/profiles/{userId}/business

PATCH /v1/profiles/{userId}/contact

PATCH /v1/profiles/{userId}/person

Fields were removed from the response:

  • authorizationNotification

  • transactionNotification

New required node was added to the response:

  • notificationSettings – notification settings is a list of NotificationDtos

response:

{
"profile": {
...
"security": {
"twoFactorsAuthEnabled": false,
"notificationSettings": [
{
"phone": false,
"email": false,
"notificationEventType": "TRANSACTION"
},
{
"phone": false,
"email": false,
"notificationEventType": "AUTHENTICATION"
},
{
"phone": true,
"email": true,
"notificationEventType": "KYC_IDENTIFICATION_STATUS_CHANGE"
},
{
"phone": true,
"email": true,
"notificationEventType": "PROFILE_UPDATE_REQUIRED"
},
{
"phone": true,
"email": true,
"notificationEventType": "RESET_IDENTIFICATION_REQUEST_APPROVED"
},
{
"phone": true,
"email": true,
"notificationEventType": "ACCOUNT_BLOCKED"
},
{
"phone": true,
"email": true,
"notificationEventType": "PASSWORD_RECOVERED"
}
]
}
},
...
}

POST /v1/authorization

The new parameter “maskedPhoneNumber” was added to the response.

POST /v1/my/bank-accounts/view

The logic for the API operation POST /my/bank-accounts/view has been updated to handle scenarios
where the user does not have any PERSONAL bank accounts linked. In such cases, the API will return POOL type
bank accounts instead. The API now supports different filtering behavior based on whether the user
has linked PERSONAL bank accounts to a specific coinSerial.

Key Changes:

  • Case 1: User has PERSONAL bank accounts

    • When no filters are specified, the response will contain all bank accounts with type PERSONAL.

    • Request:

      {
      "filter": {},
      "sort": {
      "status": "asc"
      }
      }

    • Response:
      The response will include all PERSONAL type bank accounts associated with the user.

  • Case 2: User has PERSONAL bank accounts linked to a specific coinSerial

    • When the coinSerial filter is specified, the response will include all PERSONAL bank accounts
      previously linked to the specified coinSerial.

    • Request:

      {
      "filter": {
      "coinSerial": "581051789526"
      },
      "sort": {
      "status": "asc"
      }
      }

    • Response:
      The response will contain all PERSONAL bank accounts linked to the specified coinSerial.

  • Case 3: User does not have PERSONAL bank accounts linked to the specified coinSerial

    • If the coinSerial filter is specified but no PERSONAL bank accounts are linked to it, the response
      will instead contain POOL type bank accounts.

    • Request:

      {
      "filter": {
      "coinSerial": "581051789526"
      },
      "sort": {
      "status": "asc"
      }
      }

    • Response:
      The response will contain POOL type bank accounts instead of PERSONAL bank accounts,
      as no PERSONAL accounts are linked to the specified coinSerial.

  • New Field: usedForTopUp

    • The response now includes a boolean field usedForTopUp
      which indicates whether the bank account can be used for top-up operations.

    • This field can be used by the frontend to filter bank accounts that are eligible for top-up.

POST /v1/bank-accounts/view

POST/v1/bank-accounts

PATCH /v1/bank-accounts/{bankAccountId}/with-bank DELETE /v1bank-accounts/{bankAccountId}

Added new permission POOL_BANK_ACCOUNT_MANAGER

POST /v1/currencies/view

New field “type” was added to the request body in node filter for the API to view currencies.

Request body example:

{
"filter": {
"type": "BONUS"
}
}

POST /v1/currencies

New field “type” was added to the request body for the API to create a currency

Request body example:

{
"code": "AAF",
"description": "desr",
"digitalCode": "781",
"name": "AAF",
"snPrefix": "AAF",
"symbol": "F",
"type": "VIRTUAL"
}

*if “type” is not provided in the body, default value “FIAT” will be used to create a new currency.

PATCH /v1/currencies/{currencyId}

New field “type” was added to the request body for the API to update a currency.

Request body example:

{
"description": "desrr",
"name": "AAG",
"type": "VIRTUAL"
}

*If the “type” is not included in the body, the existing value of the currency type will persist.

POST /v1/currencies/view

POST /v1/currencies

PATCH /v1/currencies/{currencyId}

PATCH /v1/currencies/{currencyId}/set-main

GET /v1/currencies

New field “type” was added to the response body for following APIs

  1. to view currencies POST: /v1/currencies/view

  2. to create a currency POST: /v1/currencies

  3. to update a currency PATCH: /v1/currencies/{currencyId}

  4. to set currency as main in the system PATCH: /v1/currencies/{currencyId}/set-main

  5. to get list of all currencies GET: /v1/currencies

Response body example:

{
"pageNumber": 0,
"pageSize": 10,
"totalPages": 1,
"totalRecords": 8,
"records": [
{
"id": "01924d75-e92e-7494-88a0-fd42cee76661",
"code": "EUR",
"digitalCode": "978",
"symbol": "€",
"name": "Euro",
"description": "desc",
"fraction": 100,
"scale": 2,
"snPrefix": "EUR",
"active": true,
"isMain": false,
"availableForExchange": false,
"type": "FIAT"
},
{
"id": "01924d75-e938-7e4a-a0ed-4b2124711f61",
"code": "GBP",
"digitalCode": "826",
"symbol": "£",
"name": "British Pound Sterling",
"description": "desc",
"fraction": 100,
"scale": 2,
"snPrefix": "GBP",
"active": true,
"isMain": false,
"availableForExchange": false,
"type": "FIAT"
},
{
"id": "01924d7b-9191-739b-aa6f-33aae69bbdfb",
"code": "AAA",
"digitalCode": "777",
"symbol": "!",
"name": "AAA",
"description": "desr",
"fraction": 100,
"scale": 2,
"snPrefix": "AAA",
"active": true,
"isMain": false,
"availableForExchange": false,
"type": "FIAT"
},
{
"id": "01924d7f-96ba-7a99-83fa-122744a37724",
"code": "AAb",
"digitalCode": "778",
"symbol": "@",
"name": "AAA",
"description": "desr",
"fraction": 100,
"scale": 2,
"snPrefix": "AAb",
"active": true,
"isMain": false,
"availableForExchange": false,
"type": "FIAT"
},
{
"id": "01924d75-e917-72f8-964e-3e919d1e977f",
"code": "USD",
"digitalCode": "840",
"symbol": "$",
"name": "US Dollar",
"description": "desc4",
"fraction": 100,
"scale": 2,
"snPrefix": "USD",
"active": true,
"isMain": true,
"availableForExchange": false,
"type": "BONUS"
},
{
"id": "01924d8d-1779-7c41-a633-85f3dbde9260",
"code": "AAZ",
"digitalCode": "789",
"symbol": "Z",
"name": "AAZ",
"description": "desr",
"fraction": 100,
"scale": 2,
"snPrefix": "AAZ",
"active": true,
"isMain": false,
"availableForExchange": false,
"type": "FIAT"
},
{
"id": "01925243-1717-7028-8f39-4ea0a2b257be",
"code": "AAF",
"digitalCode": "781",
"symbol": "F",
"name": "AAF",
"description": "desr",
"fraction": 100,
"scale": 2,
"snPrefix": "AAF",
"active": true,
"isMain": false,
"availableForExchange": false,
"type": "VIRTUAL"
},
{
"id": "01924d8c-6a48-72ea-badd-ca331a52626a",
"code": "AAc",
"digitalCode": "779",
"symbol": "S",
"name": "AAH",
"description": "desrr",
"fraction": 100,
"scale": 2,
"snPrefix": "AAc",
"active": true,
"isMain": false,
"availableForExchange": false,
"type": "VIRTUAL"
}
]
}

POST /v1/coins/view

GET /v1/organizations/system/coins

GET /v1/organizations/{organizationId}/coins

GET /v1/coins

The new field “coins.currency.type” was added to the response.

POST bank-withdrawals/create-request

The following API operation was changed

The new optional section “bankAccountData” was added to the request:

{
"bicOrSwift": "PBANUA2XK2D", // optional
"iban": "UA818127859626393378847328842", // required
"recipientFullName": "Test Recipient" // required
}

Implementation details

  • If the parameters bankAccountId and bankAccountData are not null then throw
    ConflictingParametersException.

  • If the parameter bankAccountId is not null then find a bank account by ID.

  • If the parameter bankAccountData is not null then use it for a withdrawal.

  • If the parameters bankAccountId and bankAccountData are null then use a default bank account linked to a coin.

  • If the parameter bankAccountData.bicOrSwift is not null and a bank isn’t found by BIC or SWIFT
    then throw BankNotFoundException.

  • If the parameter bankAccountData.iban has incorrect format then throw InvalidIbanException.

GET /v1/coins

The new field “coins.deactivationDate” was added to the response showing the deactivation date for the account.

GET /v1/transactions/{transactionId}

A new field, reconciliationStatus, has been added to the API response

Field Added:

  1. Field Name: reconciliationStatus

  2. Location: Inside the process object in the API response.

  3. Example Value: "reconciled_with_mismatch" | “reconciled" | "not_reconciled"

Sample API Response: Below is an example of the updated API response structure, including the new
reconciliationStatus field:

{
"process": {
"id": "019364b4-dcbf-7bcd-b526-baa1578e0758",
"createdAt": "2024-11-25T19:03:14.879Z",
"updatedAt": "2024-11-25T19:03:14.851Z",
"type": "gate_charge",
"status": "processed",
"reconciliationStatus": "reconciled_with_mismatch",
"transactions": [
{
"id": "019364b4-c794-79c0-8e63-f00ea93e8c82",
"type": "gate",
"amount": 14.0000,
"performedAt": "2024-11-25T19:03:09.460Z",
"currency": {
"code": "USD",
"symbol": "$"
}
}
],
"categoryCode": "1234",
"amount": 14.0000
}
}

Endpoint

Added

POST /v1/system-vendor/monthly-fees

A new API to create monthly fee for system vendor was added.

Required permissions: SYSTEM_VENDOR_MONTHLY_FEE_MANAGER

request body:
{
"name": "string",
"currencyId": "string",
"amount": 0,
"keySellingPoint1": "string",
"keySellingPoint2": "string",
"keySellingPoint3": "string"
}

response body:
"id": "string",
"vendor": {
"id": "string",
"name": "string",
"debtAllowed": true,
"active": true,
"gate": {
"id": "56dbc134-c0c1-4a07-8908-eef066a57153",
"name": "SDK.Finance Top up",
"custom": true,
"linkedVendors": [
"string"
]
}
},
"name": "string",
"currency": {
"id": "string",
"sn": "string",
"code": "string",
"symbol": "string",
"type": "FIAT"
},
"amount": 0,
"keySellingPoint1": "string",
"keySellingPoint2": "string",
"keySellingPoint3": "string",
"active": true,
"createdAt": "2024-11-26T16:49:49.024Z"
}

PATCH /v1/system-vendor/monthly-fees/{monthlyFeeId}

A new API to update system vendor monthly fee was added
Required permissions: SYSTEM_VENDOR_MONTHLY_FEE_MANAGER
Use the MonthlyFeeId to update the fee:

request body:
{
"name": "string",
"currencyId": "string",
"amount": 0,
"keySellingPoint1": "string",
"keySellingPoint2": "string",
"keySellingPoint3": "string",
"active": true
}

response body:
{
"id": "string",
"vendor": {
"id": "string",
"name": "string",
"debtAllowed": true,
"active": true,
"gate": {
"id": "56dbc134-c0c1-4a07-8908-eef066a57153",
"name": "SDK.Finance Top up",
"custom": true,
"linkedVendors": [
"string"
]
}
},
"name": "string",
"currency": {
"id": "string",
"sn": "string",
"code": "string",
"symbol": "string",
"type": "FIAT"
},
"amount": 0,
"keySellingPoint1": "string",
"keySellingPoint2": "string",
"keySellingPoint3": "string",
"active": true,
"createdAt": "2024-11-26T16:57:46.352Z"
}

DELETE /v1/system-vendor/monthly-fees/{monthlyFeeId}

A new API to delete system vendor monthly fee was added

Required permissions: SYSTEM_VENDOR_MONTHLY_FEE_MANAGER
Postman request: SDK5 develop/System vendor monthly fee/Delete system vendor monthly fee

POST /v1/system-vendor/monthly-fees/view

A new API to view system vendor monthly fees was added
Required permissions: SYSTEM_VENDOR_MONTHLY_FEE_MANAGER or SYSTEM_VENDOR_MONTHLY_FEE_VIEWER

request body:
{
"pageNumber": 0,
"pageSize": 10,
"filter": {
"searchParam": "string",
"active": true,
"createdAtFrom": "2024-11-26T17:04:15.724Z",
"createdAtTo": "2024-11-26T17:04:15.724Z"
},
"sort": {
"name": "asc",
"currencyCode": "asc",
"amount": "asc",
"active": "asc",
"createdAt": "asc"
}
}

response body:
{
"pageNumber": 0,
"pageSize": 10,
"totalPages": 1,
"totalRecords": 10,
"records": [
{
"id": "string",
"vendor": {
"id": "string",
"name": "string",
"debtAllowed": true,
"active": true,
"gate": {
"id": "56dbc134-c0c1-4a07-8908-eef066a57153",
"name": "SDK.Finance Top up",
"custom": true,
"linkedVendors": [
"string"
]
}
},
"name": "string",
"currency": {
"id": "string",
"sn": "string",
"code": "string",
"symbol": "string",
"type": "FIAT"
},
"amount": 0,
"keySellingPoint1": "string",
"keySellingPoint2": "string",
"keySellingPoint3": "string",
"active": true,
"createdAt": "2024-11-26T17:04:15.725Z"
}
]
}

POST /v1/gate/transactions/{tx}/refund

Added API to initiate the refund transaction:

Permission – GATE_REFUND_OPERATION_EXECUTOR

tx *required – Is an internal id of gate transaction.
It can be received from id in the response of the POST /gate/transactions/view or is returned as id
in the response from API for gate transaction creation POST /gate/transactions.

Example : d8617ed2-f152-4ba9-84ed-da05486f19e2

request body:
{
"fullRefund": true,
"refundAmount": 0,
"description": "string"
}

response body:
{
"transaction": {
"id": "string",
"orderId": 0,
"deviceId": "string",
"deviceOrderId": "string",
"type": "TOPUP",
"status": "PROCESSED",
"errorCode": "UNKNOWN",
"coin": {
"serial": "string",
"name": "string",
"amount": 0,
"availableAmount": 0,
"futureAmount": 0,
"heldAmount": 0,
"creditLimit": 0,
"currency": {
"id": "string",
"sn": "string",
"code": "string",
"symbol": "string",
"type": "FIAT"
},
"active": true,
"type": "client",
"main": true,
"accounting": true,
"smartCards": [
{
"id": "string",
"cardNumber": "string",
"expirationDate": "string",
"name": "string",
"expirationStatus": "ACTIVE",
"active": true
}
],
"deactivationDate": "2024-11-26T17:13:27.989Z",
"deactivationReason": "other",
"deactivationDescription": "string"
},
"paymentMethod": {
"gateProvider": {
"id": "string",
"name": "string",
"debtAllowed": true,
"active": true,
"gate": {
"id": "56dbc134-c0c1-4a07-8908-eef066a57153",
"name": "SDK.Finance Top up",
"custom": true,
"linkedVendors": [
"string"
]
}
},
"way": "EMONEY",
"icon": "string",
"services": [
{
"id": "string",
"type": "string",
"service": "string",
"serviceMethod": "string",
"active": true,
"enabled": true,
"currencyCode": "string",
"name": "string",
"logo": "string",
"icon": "string"
}
]
},
"sourceAmount": 0,
"amountToSend": 0,
"finalAmount": 0,
"refundAmount": 0,
"processId": "string",
"payerData": {
"key1": {},
"key2": {},
"key3": {}
},
"description": "string"
},
"form": {
"url": "string",
"method": "GET",
"parameters": {
"additionalProp1": {},
"additionalProp2": {},
"additionalProp3": {}
}
}
}

PATCH /exchange-rates/rate

Added a new API to update rate status

Permission required: EXCHANGE_RATE_STATUS_MANAGER

Use this API to update the status of currency exchange rates.
Pass the required status in status, internal IDs of currency rates rateIds in the request body.
API can be called only by the authorized user with the appropriate permissions.
Permission to call this API: EXCHANGE_RATE_STATUS_MANAGER
To check which role has this permission call API GET /role-groups/permissions.

request body:
{
"rateIds": [
"string"
],
"status": "CREATED"
}

response body:
{
"code": "string",
"mdcId": "string",
"parameters": [
{
"key": "string",
"value": "string"
}
]
}

POST /assets/exchange-rates/view

New API was added to view the currency exchange rates in a pair with main asset.
API can be called only by the authorized user with the appropriate permissions.
Permission to call this API: ASSET_EXCHANGE_VIEWER.
To check which role has this permission call API GET /role-groups/permissions.

request body:
{
"pageNumber": 0,
"pageSize": 10,
"filter": {
"statuses": [
"CREATED"
],
"currencyCodes": [
"string"
]
}
}

response body:
{
"pageNumber": 0,
"pageSize": 10,
"totalPages": 1,
"totalRecords": 10,
"records": [
{
"rateId": "string",
"rate": 0,
"rateStatus": "CREATED",
"lastRateUpdatedAt": "2024-11-27T12:05:11.869Z",
"lastStatusUpdatedAt": "2024-11-27T12:05:11.869Z",
"mainCurrencyId": "string",
"mainCurrencyCode": "string",
"currencyId": "string",
"currencyCode": "string"
}
]
}

PATCH /exchange/rate/provider/{id}

Use this API to update rate provider.

id * required
string
(path)
Internal id of Exchange rate provider.
Example : e5d2478c-f71b-4ef2-b353-0f605e521df4

request body:
{
"active": true,
"enabled": true,
"description": "string",
"ttl": "string"
}

response body:
{
"id": "string",
"name": "string",
"active": true,
"enabled": true,
"manual": true,
"description": "string",
"ttl": "string"
}

GET /exchange/rate/provider

Use this API to get all rate providers.

response body:
{
"records": [
{
"id": "string",
"name": "string",
"active": true,
"enabled": true,
"manual": true,
"description": "string",
"ttl": "string"
}
]
}

PATCH /v1/management/cash-desks/{cashDeskId}

A new API was added to allow modifying details of an existing cash desk. Users can update information
such as the organization name, contact information, and address details.

Request Headers:

  • Content-Type: application/json

  • Authorization: TOKEN <your-token>

Path Parameter

  • cashDeskId (string): The unique identifier of the cash desk to be modified.

Request Body:

The request body should be in JSON format and can include the following fields for updating the cash desk’s details:

  • organizationName (string): The name of the organization or the cash desk.

  • phone (string): The phone number associated with the cash desk.

  • email (string): The email address for the cash desk.

  • street (string): The street address of the cash desk.

  • country (string): The country code where the cash desk is located.

Example Request:

curl --location --request
PATCH 'https://local.sdk.finance/api/v1/management/cash-desks/01930de1-4d85-7851-a8f9-f4eb8919c2ca' \
--header 'Content-Type: application/json' \
--header 'Authorization: TOKEN eyJhbGciOiJI2FCP06XWiKqtXDuP4Z7vCg' \
--data-raw '{
"organizationName": "cash desk",
"phone": "0501722167",
"email": "cashdesk4@mailinator.com",
"street": "Kyrylivska",
"country": "AD"
}'

Permission: CASH_DESK_MANAGER

POST /v1/management/cash-desks/{cashDeskId}/cashiers

A new API was added to retrieve a paginated list of all cashiers associated with a specific cash desk,
providing details about each cashier such as name, contact information, and working days.

Request Headers

  • Content-Type: application/json

  • Authorization: TOKEN <your-token>

Path Parameter:

  • cashDeskId (string): The unique identifier of the cash desk.

Request Body:

The request body should be in JSON format and can be empty as no additional parameters are needed for this operation.

Example Request:

curl --location --request
POST '<https://local.sdk.finance/api/v1/management/cash-desks/01930de1-4d85-7851-a8f9-f4eb8919c2ca/cashiers'> \
--header 'Content-Type: application/json' \
--header 'Authorization: TOKEN eyJhbG'

Permission: CASHIERS_VIEWER

GET /v1/management/cash-desks/{cashDeskId}

API to view cash-desk data by identifier

Use cashDeskId as organisation ID of the Cashdesk.

Response body:
{
"organizationName": "string",
"phone": "string",
"email": "string",
"country": "SK",
"region": "string",
"city": "string",
"street": "string",
"houseNumber": "string",
"postalCode": "string"
}

Permission: CASH_DESK_VIEWER

POST login-change/authorization

The following API operation was added:

POST login-change/authorization

Use this API to get access token to authenticate APIs required to initiate login change.

Request body:
{
"login": "+380991111111" // old user login
}

Response example:

{
"authorizationToken": {
"expiresAt": "2024-11-25T22:55:05.599Z",
"token": "eyJhbGciOiJIUzUxMiJ9.eyJwcmluY2lwYWwiOiJ7XCJ1c2VySWRcIjpcIjAxOTM2NDFiLTRjYzYtNzYzMC1hYmRhLTYxNTJiZTJmZGRjY1wiLFwibWVtYmVySWRzXCI6W10sXCJ1c2VybmFtZVwiOlwibG9naW5fY2hhbmdlckBzZGtmaW5hbmNlLnRlY2hcIixcImVuYWJsZWRcIjp0cnVlLFwiYWNjb3VudE5vbkV4cGlyZWRcIjp0cnVlLFwiY3JlZGVudGlhbHNOb25FeHBpcmVkXCI6dHJ1ZSxcImFjY291bnROb25Mb2NrZWRcIjp0cnVlLFwiYXV0aG9yaXRpZXNcIjpbXCJDSEFOR0VfTE9HSU5fUkVRVUVTVF9JTklUSUFUT1JcIixcIkNIQU5HRV9MT0dJTl9QUk9GSUxFX0RPQ1VNRU5UX1VQTE9BREVSXCIsXCJDSEFOR0VfTE9HSU5fTUVESUFfRklMRV9VUExPQURFUlwiXSxcImN1cnJlbnRNZW1iZXJJZFwiOlwiMDE5MzY0MWItNGNjZi03MGFmLTg3YWMtMTdhZWM1MjM0MmZkXCIsXCJleHBpcmVkQXRcIjpcIjIwMjQtMTEtMjVUMjI6NTU6MDUuNTg4Njc4ODgzWlwiLFwib2xkVXNlckxvZ2luXCI6XCI1OTQwMDY2ODk5MVwifSIsInN1YiI6ImxvZ2luX2NoYW5nZXJAc2RrZmluYW5jZS50ZWNoIiwiZXhwIjoxNzMyNTc1MzA1LCJpYXQiOjE3MzI1NTczMDV9.I8yiN4AUht85zM9gbZGIbqIIt9b-1Gdc8CkR9dZOhu4ripufwKERUWxgaugOcPvLBWgOd11_ugyEBudqbfhOJQ"
}
}

GET login-change/profile-documents/view-document-types

The following API operations were added:

GET login-change/profile-documents/view-document-types

to get list of profile document types required for login change.

Response body:

{
"documentTypes": [
{
"type": "string",
"label": "string",
"optional": true,
"asPlainText": true
}
]
}

These API operations can be called only with temporary token generated by the API operation
POST login-change/authorization.
This token should be passed as HTTP header Authorization: TOKEN <temporary token>.

POST login-change/profile-documents

Mark uploaded media file as profile document for login change
Request body:
{
"fileId": "0193212c-6b64-7ece-b54f-5bb6080dc0d8", // media file ID
"type": "selfie_for_change_login" // document type
}

Response body:

{
"document": {
"id": "string",
"file": {
"id": "string",
"ownerId": "string",
"mediaType": "string",
"name": "string",
"url": "string",
"md5": "string",
"sha1": "string",
"size": 0,
"used": true,
"createdAt": "2024-11-27T16:00:37.960Z",
"expiresAt": "2024-11-27T16:00:37.960Z",
"tag": "string"
},
"documentIdentifier": "string",
"type": "string",
"label": "string",
"status": "PENDING",
"updatedAt": "2024-11-27T16:00:37.960Z"
}
}

These API operations can be called only with temporary token generated by the API operation
POST login-change/authorization.
This token should be passed as HTTP header Authorization: TOKEN <temporary token>.

POST login-change/new-login/send-otp

New API was added to Send OTP to new login

request body:
{
"newLogin": "+380992222222" // new user login
}

response body:
{
"action": "OTP_SENT"
}

These API operation can be called only with temporary token generated by the API operation
POST login-change/authorization.
This token should be passed as HTTP header Authorization: TOKEN <temporary token>.

GET /v1/my/account-overview

Added new API to get all account details (coins, cards, bank accounts) for current use

Allowed with permission COIN_OWNER

Response body:
{
"accountDetails": [
{
"coin": {
"serial": "string",
"name": "string",
"amount": 0,
"availableAmount": 0,
"futureAmount": 0,
"heldAmount": 0,
"creditLimit": 0,
"currency": {
"id": "string",
"sn": "string",
"code": "string",
"symbol": "string",
"type": "FIAT"
},
"active": true,
"type": "client",
"main": true,
"accounting": true,
"smartCards": [
{
"id": "string",
"cardNumber": "string",
"expirationDate": "string",
"name": "string",
"expirationStatus": "ACTIVE",
"active": true
}
],
"deactivationDate": "2024-11-27T16:31:40.672Z",
"deactivationReason": "other",
"deactivationDescription": "string"
},
"bankAccountsList": [
{
"createdAt": "2024-11-27T16:31:40.672Z",
"details": {
"fullName": "Tom Harrison",
"bankAccountNumber": "1234567890",
"iban": "UA730577753473920323685820538",
"bic": "PBANUA2XK2R",
"swift": "PBANUA2XK2D",
"name": "Private Bank",
"address": "Maidan Nezalezhnosti, 1",
"city": "Kyiv",
"countryCode": "UA",
"zipCode": "01001"
},
"id": "string",
"type": "PERSONAL",
"status": "PENDING",
"updatedAt": "2024-11-27T16:31:40.672Z",
"coinSerial": "string",
"isDefault": true,
"usedForTopUp": true
}
],
"cardDtoList": [
{
"createdTime": "2024-11-27T16:31:40.673Z",
"lastModifiedTime": "2024-11-27T16:31:40.673Z",
"token": "string",
"userToken": "string",
"cardProductToken": "string",
"lastFour": "string",
"pan": "string",
"expiration": "string",
"expirationTime": "2024-11-27T16:31:40.673Z",
"cvvNumber": "string",
"chipCvvNumber": "string",
"barcode": "string",
"pinIsSet": true,
"state": "ACTIVE",
"stateReason": "string",
"fulfillmentStatus": "ISSUED",
"reissuePanFromCardToken": "string",
"newPanFromCardToken": "string",
"fulfillment": {},
"bulkIssuanceToken": "string",
"translatePinFromCardToken": "string",
"activationActions": {
"terminateReissuedSourceCard": true,
"swapDigitalWalletTokensFromCardToken": "string"
},
"instrumentType": "PHYSICAL_MSR",
"expedite": true,
"metadata": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"contactlessExemptionCounter": 5,
"contactlessExemptionTotalAmount": 0
}
]
}
]
}

POST /report

To be able to use the report module it should be configured.

A new API to create a report if it doesn’t exist and return its ID

This can only be done by authorized user with permission REPORT_MANAGER

Request body:
{
"type": "string",
"statuses": [
"limited"
],
"dateFrom": "2024-11-19T13:31:58.779Z",
"dateTo": "2024-11-19T13:31:58.779Z",
"transactionNumbers": "string",
"walletSerial": "string",
"currencyCode": "string",
"fromAmount": 0,
"toAmount": 0,
"organizationIds": [
"string"
]
}

response body:
{
"report": {
"id": "string",
"reportFile": "string",
"status": "DONE"
}
}

GET /report/{id}

To be able to use the report module it should be configured.

This can only be done by authorized user with permission REPORT_MANAGER

Response body: 
{
  "id": "string",
  "reportFile": "string",
  "status": "DONE"
}

POST login-change/request

New API was added to create change login request

  Request body:

{
"otp": "string"
}

OTP will be sent to user’s new login.

These API operation can be called only with temporary token generated by the API operation
POST login-change/authorization.
This token should be passed as HTTP header Authorization: TOKEN <temporary token>

POST /bank-accounts

New API that can be used by users with service roles to add pool bank account to the system.

Request body:

{
"bankAccountNumber": "1987426351",
"iban": "SK68072000021987426351",
"bankId": "e41c5338-6a01-4bac-a50c-e8352157e300",
"fullName": "Tony Stark",
"isDefault": true,
"usedForTopUp": true
}

Response body:

{
"bankAccountNumber": "string",
"bankAccountId": "string",
"bankAccountType": "PERSONAL",
"bankInfo": {
"address": "48 Wall Street",
"bankId": "3a16cb2e-422d-4f30-8b46-ee4e89da3b3a",
"bic": "GIBASKBX",
"city": "Bratislava",
"country": "Slovakia",
"countryCode": "SK",
"name": "Deutsche Bank",
"swift": "GIBASKBX",
"zipCode": "83237"
},
"fullName": "string",
"iban": "string",
"isDefault": true,
"usedForTopUp": true
}

POST /v1/templates/withdrawal/operation/{id}

A new API to create withdrawal template by already executed withdrawal.

Permission: TEMPLATES_OWNER

Request example to create Transfer template by providing Bank process id:

POST: /api/v1/templates/withdrawal/operation/{{bankBusinessProcessId}}

{
"amount": 100.0,
"description": "string",
"name": "individual withdrawal template",
"reusable": true
}

Response example:

{
"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 /v1​/authorization

maskedPhoneNumber is returned in the response if OTP was sent to confirm authorisation

Endpoint

Deprecated/Deleted

Configuration changes

To enable the reporting module

  • Optional Inclusion in Build
    The Reports Module can now be included in the build or excluded based on the business needs.

  • General Properties
    The following general properties need to be configured:

    spring:
      kafka:
        bootstrap-servers: ${SPRING_KAFKA_BOOTSTRAPSERVERS}
        enabled: ${KAFKA_ENABLED}
        client-id: 
        ssl-endpoint-identification-algorithm:
        sasl-mechanism: ${SPRING_KAFKA_PROPERTIES_SASL_MECHANISM}
        sasl-jaas-config: ${SPRING_KAFKA_PROPERTIES_SASL_JAAS_CONFIG}
        security-protocol: ${SPRING_KAFKA_PROPERTIES_SECURITY_PROTOCOL}
    
  • Module-Specific Properties
    The following properties are specific to the Reports Module:

    reports:
      kafka:
        topic: ${KAFKA_REPORTS_TOPIC:transaction-topic-dev}
        group-id: ${REPORTS_GROUP_ID:reports-kafka-consumer-group}
    

Notes:

  • The ssl-endpoint-identification-algorithm and reports.kafka.include properties are intentionally left without default values to allow for customization based on the environment.

  • Ensure all environment-specific variables are properly set for seamless integration.

To configure currency exchange rates provider

Configuration structure changed from:

rate:
exchange-rates:
ttl: PT10H
# https://developer.currencycloud.com/
currency-cloud:
enabled: false
url: 'https://devapi.currencycloud.com/v2'
login-id: 'system_sdk5@sdk.finance'
api-key: 'some-hidden-key'
available-currencies:
- USD
- EUR
- GBP
- CHF

to

exchange-rates:
timer:
enabled: true
schedule-expression: '0 0/5 * ? * * *'
providers:
- name: 'Manual'
active: true
enabled: true
description: 'Manual currency exchange rates'
default-ttl: 'P0D'
- name: 'Currency-cloud'
active: false
enabled: true
description: 'Currency cloud exchange provider'
default-ttl: PT10H

currency-cloud:
identifier: 'Currency-cloud' # must be unique and the same with exchange-rates.providers[*].name
url: 'https://devapi.currencycloud.com/v2'
login-id: 'system_sdk5@sdk.finance'
api-key: 'some-hidden-key'
available-currencies:
- USD
- EUR
- GBP
- CHF

Post-deployment migration SQL scripts

UPDATE currency_def
SET "type" = 'CRYPTO'
WHERE id IN (
SELECT c.def_id 
FROM currency c 
WHERE c.code NOT IN ('ADP', 'AED', 'AFA', 'AFN', 'ALK', 'ALL', 'AMD', 'ANG', 'AOA', 'AOK', 'AON', 'AOR', 'ARA', 'ARP', 'ARS', 'ARY', 'ATS', 'AUD', 'AWG', 'AYM', 'AZM', 'AZN', 'BAD', 'BAM', 'BBD', 'BDT', 'BEC', 'BEF', 'BEL', 'BGJ', 'BGK', 'BGL', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOP', 'BOV', 'BRB', 'BRC', 'BRE', 'BRL', 'BRN', 'BRR', 'BSD', 'BTN', 'BUK', 'BWP', 'BYB', 'BYN', 'BYR', 'BZD', 'CAD', 'CDF', 'CHC', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU', 'CRC', 'CSD', 'CSJ', 'CSK', 'CUC', 'CUP', 'CVE', 'CYP', 'CZK', 'DDM', 'DEM', 'DJF', 'DKK', 'DOP', 'DZD', 'ECS', 'ECV', 'EEK', 'EGP', 'ERN', 'ESA', 'ESB', 'ESP', 'ETB', 'EUR', 'FIM', 'FJD', 'FKP', 'FRF', 'GBP', 'GEK', 'GEL', 'GHC', 'GHP', 'GHS', 'GIP', 'GMD', 'GNE', 'GNF', 'GNS', 'GQE', 'GRD', 'GTQ', 'GWE', 'GWP', 'GYD', 'HKD', 'HNL', 'HRD', 'HRK', 'HTG', 'HUF', 'IDR', 'IEP', 'ILP', 'ILR', 'ILS', 'INR', 'IQD', 'IRR', 'ISJ', 'ISK', 'ITL', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAJ', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LSM', 'LTL', 'LTT', 'LUC', 'LUF', 'LUL', 'LVL', 'LVR', 'LYD', 'MAD', 'MDL', 'MGA', 'MGF', 'MKD', 'MLF', 'MMK', 'MNT', 'MOP', 'MRO', 'MRU', 'MTL', 'MTP', 'MUR', 'MVQ', 'MVR', 'MWK', 'MXN', 'MXP', 'MXV', 'MYR', 'MZE', 'MZM', 'MZN', 'NAD', 'NGN', 'NIC', 'NIO', 'NLG', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEH', 'PEI', 'PEN', 'PES', 'PGK', 'PHP', 'PKR', 'PLN', 'PLZ', 'PTE', 'PYG', 'QAR', 'RHD', 'ROK', 'ROL', 'RON', 'RSD', 'RUB', 'RUR', 'RWF', 'SAR', 'SBD', 'SCR', 'SDD', 'SDG', 'SDP', 'SEK', 'SGD', 'SHP', 'SIT', 'SKK', 'SLL', 'SOS', 'SRD', 'SRG', 'SSP', 'STD', 'STN', 'SUR', 'SVC', 'SYP', 'SZL', 'THB', 'TJR', 'TJS', 'TMM', 'TMT', 'TND', 'TOP', 'TPE', 'TRL', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UAK', 'UGS', 'UGW', 'UGX', 'USD', 'USN', 'USS', 'UYI', 'UYN', 'UYP', 'UYU', 'UYW', 'UZS', 'VEB', 'VEF', 'VES', 'VNC', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB', 'XBC', 'XBD', 'XCD', 'XDR', 'XEU', 'XFO', 'XFU', 'XOF', 'XPD', 'XPF', 'XPT', 'XRE', 'XSU', 'XTS', 'XUA', 'XXX', 'YDD', 'YER', 'YUD', 'YUM', 'YUN', 'ZAL', 'ZAR', 'ZMK', 'ZMW', 'ZRN', 'ZRZ', 'ZWC', 'ZWD', 'ZWL', 'ZWN', 'ZWR')
);