Explore the interface basics, create your first wallet, and set up essential protection Explore the interface basics, create your first wallet, and set up essential protection Dive deeper in the product Web UI, features, and business logic behind it Dive deeper in the product Web UI, features, and business logic behind it Follow the step-by-step tutorials illustrating solutions to the most common tasks Follow the step-by-step tutorials illustrating solutions to the most common tasks Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses Get acquainted with key terms and catalogs of values which are found here and there Get acquainted with key terms and catalogs of values which are found here and there Identify and address common issues quickly and effectively with our guides Identify and address common issues quickly and effectively with our guides ## July 31, 2026 [#july-31-2026] ### New features [#new-features] #### Admin UI [#admin-ui] ##### Fee level selection for AML withdrawals [#fee-level-selection-for-aml-withdrawals] When withdrawing funds from a blocked transfer (**Transfer → Blocked → AML Withdrawal**), you now choose the blockchain fee level — **Recommended**, **Low**, or **Custom** — and see the fee amount with its fiat equivalent before confirming. Previously, only the withdrawal address could be set, and refunds sent with a low fee were sometimes rejected by the network. *** ### Improvements [#improvements] #### Admin UI [#admin-ui-1] ##### Safer forms and smoother sign-in [#safer-forms-and-smoother-sign-in] The Admin UI adopts several usability behaviors from the client interface. After signing in, you return to the page you originally tried to open instead of the home page. Create and edit forms — including wallets, deposits, notifications, transfers, refunds, and user creation — now warn about unsaved changes before you leave the page, and the cursor is placed in the first field automatically. *** ### Resolved issues [#resolved-issues] #### Client UI [#client-ui] * Fixed the read-only **Secret** field in callback settings accepting pasted text; the control for viewing the secret now keeps a stable size instead of expanding with scrollbars. ## July 29, 2026 [#july-29-2026] ### Improvements [#improvements-1] #### Admin UI [#admin-ui-2] ##### Faster commissions page [#faster-commissions-page] The default commissions page now loads faster and no longer creates noticeable database load on every visit. #### Client UI [#client-ui-1] ##### Toncoin becomes Gram [#toncoin-becomes-gram] Following the rebranding of The Open Network's native coin, **Toncoin (TON)** is renamed **Gram (GRAM)**, and the network's tokens follow the same pattern — for example, **USDT-TON** becomes **USDT-GRAM**. Only the currency names and tickers change — balances, wallets, and transfers are not affected. *** ### Resolved issues [#resolved-issues-1] #### Admin UI [#admin-ui-3] * Fixed the **Company**, **Wallet**, **Currency**, and **Blockchain wallet** filters on the finance transfers page showing *Error* for administrators with the **Finance read only** role. #### Client UI [#client-ui-2] * Fixed **Approve** and **Cancel** actions in **Events** staying available for payout approval requests whose auto-cancellation time had already passed. * Fixed expired payout approval requests being reactivated when the auto-cancellation timeout was increased — the deadline is now set when the request is created. * Fixed *Request Rejection* callbacks being sent with the *Unknown* type. * Fixed the email search in **Wallets → Thresholds** returning unfiltered results and breaking words across lines in the suggestion list. ## July 24, 2026 [#july-24-2026] ### New features [#new-features-1] #### Client UI [#client-ui-3] ##### Commissions tab with your full fee schedule [#commissions-tab-with-your-full-fee-schedule] Account owners now have a **Commissions** tab showing the commission ladder at a glance — your current turnover, commission tier, and rate — along with the full list of tiers, minimum blockchain fees for each network, and bank fees for deposits and payouts. *** ### Improvements [#improvements-2] #### Admin UI [#admin-ui-4] ##### Faster transfer lists [#faster-transfer-lists] Opening a client's list of transfers now takes under a second instead of tens of seconds, and pending AML compliance checks no longer create noticeable background load. ##### Neutral messages for unexpected server errors [#neutral-messages-for-unexpected-server-errors] When an unexpected server error occurs, the system returns a neutral message with a short error ID instead of internal technical details. Share this ID with support to have the issue traced quickly. *** ### Resolved issues [#resolved-issues-2] #### Admin UI [#admin-ui-5] * Fixed spurious *Can not lock transfer in node* incidents raised when a small deposit was canceled on networks without transfer-locking support — Solana, EVM-based networks, Tron, and Algorand. * Fixed Solana multi-address collections being rejected as a whole batch with an *InvalidPayoutParameters* error when the number of addresses exceeded node limits — addresses are now split automatically to fit. * Fixed transportation transfers getting stuck indefinitely when an address received more funds than expected during collection — extra incoming funds no longer block confirming transfers already completed on the blockchain. ## July 17, 2026 [#july-17-2026] ### New features [#new-features-2] #### Admin UI [#admin-ui-6] ##### Changed User and Legal Entity columns in Action Requests [#changed-user-and-legal-entity-columns-in-action-requests] The **Action Requests** list now shows a **Changed User** column — the account a request applies changes to — and a **Legal Entity Name** column, each with its own filter. The legal entity name also appears as a separate line in the request details, and the list can now be exported. #### Client UI [#client-ui-4] ##### Reworked approval flow for withdrawals [#reworked-approval-flow-for-withdrawals] Withdrawal approval requests for Enterprise and Merchant transfers in the same currency no longer expire after 15 minutes — the request stays valid until it is approved or rejected. For conversion payouts, the request now shows a countdown timer to automatic cancellation, visible both in the client interface and in the Admin UI. ##### Automatic callback on Callback URL changes [#automatic-callback-on-callback-url-changes] When you set or change the **Callback URL** of a deposit or withdrawal, a callback with the operation's current status is now sent automatically — no need to contact support to have it re-sent. Support staff can also update a deposit's **Callback URL** on your behalf. ##### Smoother sign-up, 2FA setup, and wallet access [#smoother-sign-up-2fa-setup-and-wallet-access] This release bundles several usability refinements. **One-time password entry at sign-up.** During registration, you now set your password once, after confirming your email address, instead of entering it several times. **Clear 2FA names.** Two-factor authentication entries in your authenticator app are now clearly named — *B2BinPay Auth 2FA* and *B2BinPay Ops 2FA* — and include your email address, so entries for different accounts are easy to tell apart. **Clearer error messages.** Messages now state exactly what to do — for example, *B2BinPay Ops 2FA must be enabled to process payouts* or *Accesses to wallets cannot be granted until user is activated*. **Wallet access for API users right after activation.** An API user can now be added to wallets as soon as it is activated, without having to sign in first. **Tidier lists.** The **Regular Withdrawal** column is hidden when bank withdrawals are not available, and identifiers now use a unified format — for example, *Wallet #888*. *** ### Improvements [#improvements-3] #### Admin UI [#admin-ui-7] ##### Faster lists and dashboard statistics [#faster-lists-and-dashboard-statistics] Heavily used list pages — blockchain wallets, addresses, deposits, and transfers — now load faster, and so do the deposits and payouts statistics on the dashboard. *** ### Resolved issues [#resolved-issues-3] #### Admin UI [#admin-ui-8] * Fixed a false *Collected amount mismatch* error: unrelated incoming funds on an address are now included in the expected collection amount, so transportation transfers no longer get stuck in *Need review*. * Fixed an AML check failure for withdrawals linked to transfers without an associated wallet, which prevented such withdrawals from being processed. * Fixed an issue where conversion payouts could expire automatically regardless of their status. ## July 10, 2026 [#july-10-2026] ### New features [#new-features-3] #### Admin UI [#admin-ui-9] ##### Invited by search matches legal entity names [#invited-by-search-matches-legal-entity-names] The **Invited by** search in the **Partner Program** now also matches legal entity names, so legal entities no longer drop out of the search results. ##### Role-aware data in lists and detail pages [#role-aware-data-in-lists-and-detail-pages] Lists and detail pages across the Admin UI now show data according to your role and permissions, so each administrator sees exactly what their access level allows. #### Client UI [#client-ui-5] ##### Sign-in opens the production environment [#sign-in-opens-the-production-environment] After you pass **KYB** verification, an interactive sign-in always opens the production environment instead of Sandbox. If you sign out from Sandbox and have several legal entities, the one you last opened is selected. ##### Inactive API users hidden from wallet access [#inactive-api-users-hidden-from-wallet-access] Wallet access rights now show only active **API users**. For a user whose API access is not yet activated, the **API access → Wallets** tab shows an empty list. ##### Refreshed interface visuals and 2FA setup [#refreshed-interface-visuals-and-2fa-setup] The interface gets a refreshed look aligned with the latest design system: dialog overlays are lighter in the dark theme, connecting **Google Authenticator** for two-factor authentication follows a new flow with the confirmation code entered directly in the dialog, and the **How it works** screens in **Staking** and **Wallets** feature refreshed, theme-aware illustrations. *** ### Improvements [#improvements-4] #### Client UI [#client-ui-6] ##### Smoother actions in the Events list [#smoother-actions-in-the-events-list] The **Actions** column in **Events** now keeps a stable width, so buttons no longer shift as you work. While an action is in progress, a spinner replaces the button, and repeated or conflicting actions are blocked; if an action fails, the row returns to its previous state. *** ### Resolved issues [#resolved-issues-4] #### Admin UI [#admin-ui-10] * Fixed transportation transfers being confirmed without verifying the collected amount against the deposits actually received on the node — a mismatch now raises an incident instead of silently overstating the **Locked in node** balance and causing false *insufficient funds* errors later. #### Client UI [#client-ui-7] * Fixed the **Apply** button in the date and time picker not appearing disabled when it was inactive. ## July 2, 2026 [#july-2-2026] ### New features [#new-features-4] #### Admin UI [#admin-ui-11] ##### Read-only admin pages for orders, payouts, and wallets [#read-only-admin-pages-for-orders-payouts-and-wallets] The Admin UI gains new read-only pages: **Orders** and **Payouts** under **Operations**, and **Blockchain Wallets**, **Global Wallets Balance History**, and **Global Wallets Staking** under **Wallets**. The **Payouts** and **Swap Wallets** sections are now available in read-only mode too — fuller visibility into operations and balances without changing any data. ##### USD volumes for transfers in Dealing [#usd-volumes-for-transfers-in-dealing] In **Trading → Orders**, transfers now carry the same USD-normalized base and quote volumes already shown for swaps, removing the manual rate calculations previously needed for some Merchant wallets. #### Client UI [#client-ui-8] ##### Initial deposit link for duplicated blockchain deposits [#initial-deposit-link-for-duplicated-blockchain-deposits] When a deposit sent on the wrong network is automatically re-created on the correct network, the resulting **Duplicated Blockchain deposit** event now links directly to the original deposit. Instead of tracing callback or tracking IDs by hand, open the event and follow the **Initial deposit** reference to the deposit details. Deposit details also gain **copy buttons** for the **Tracking ID** and **Callback URL** under **Advanced options**. *** ### Improvements [#improvements-5] #### Admin UI [#admin-ui-12] ##### Transfers list filters, columns, and links [#transfers-list-filters-columns-and-links] The Admin UI **Transfers** list gains a **Wallet Type** column, a filter by internal transfer type, and a filter by client or blockchain wallet ID. Global and blockchain wallets now have distinct labels, and each links through to its own page. ##### Audit log filtering by event type [#audit-log-filtering-by-event-type] Audit log tables now filter on the **Reason** column, so you can show only one event type — for example *Password changed* or *Payouts blocked* — across the brand, group, user, and legal-entity logs. ##### Localized operation log comments [#localized-operation-log-comments] Log **Comment** entries are now built from translatable parts (field name, reason, old and new values) instead of a fixed English string, so they display in the selected language across the Client Management and Wallets logs. ##### Multi-select currency filters [#multi-select-currency-filters] Currency filters now use the same multi-select control as the client interface, and long currency lists load in pages as you scroll instead of all at once — removing the brief freeze when opening the dropdown. Matches are ordered with exact matches first, then names starting with your query, then the rest. ##### Owner ID and Legal Entity columns in reports [#owner-id-and-legal-entity-columns-in-reports] The **Transfers** and **Wallets** reports now include **Owner ID** and, where applicable, **Legal Entity Name** columns in the exported files. *** ### Resolved issues [#resolved-issues-5] #### Admin UI [#admin-ui-13] * Fixed a duplicate **Label** column shown in the Admin UI Deposits list and its column configurator. * Fixed the wallet balance-at-date finance report failing to generate, which could leave an export hanging. ## June 26, 2026 [#june-26-2026] ### New features [#new-features-5] ##### Low balance notifications [#low-balance-notifications] You can now set a **balance threshold** for each wallet and be notified automatically when the wallet balance falls below it. Each wallet has its own threshold field, with the value denominated in the wallet currency. When the available balance drops below the configured value, a notification is sent so you can top up in time — helping you avoid situations where end-user withdrawals fail because of insufficient funds on the wallet. ##### Unconfirmed transaction callbacks [#unconfirmed-transaction-callbacks] The system now sends a callback as soon as an incoming transaction is detected on the blockchain, before it has gathered the number of confirmations required to become *Confirmed*. This lets you notify your end users that their payment has already been seen by the system and is simply awaiting confirmations, rather than lost or stuck on the network. The result is fewer support enquiries and a smoother payment experience. *** ### Improvements [#improvements-6] ##### Multi-select currency filters [#multi-select-currency-filters-1] The **Currency** filter has been upgraded from a single-select to a multi-select control, so you can now filter a list by several currencies at once instead of one at a time. The multi-select filter is available on the **Wallets**, **Deposits**, **Payouts**, and **Transfers** pages, as well as in the **Access list**, **Bank details**, **Custody**, and **Swaps** sections. ##### Wallet list card view refinements [#wallet-list-card-view-refinements] Following the card view introduced for transaction wallets in the previous release, the wallets list has been refined with a **sort selector** and an improved **Table / Cards** view toggle, so you can order and display your wallets exactly the way that works best for you. ##### Operation ID filter for Callbacks [#operation-id-filter-for-callbacks] The **Callbacks** list now includes an **Operation ID** filter. This makes it easier to track down a specific callback during investigations — including callbacks that have no associated transfer, such as the *Request rejection* and *No transfer* types. *** ### Resolved issues [#resolved-issues-6] * Fixed a false *insufficient fee* error (code 4009) that could appear when withdrawing certain tokens, such as USDT-TRX and USDT-BSC. * Fixed an issue where creating a custom token incorrectly required the **Balance shift amount** field to be filled in. * Fixed an issue where the daily *transfer growing total* report was not delivered to Report Subscriptions. ## May 23, 2026 [#may-23-2026] ### New features [#new-features-6] ##### Column-based table filters [#column-based-table-filters] Table filtering across the Web UI has been redesigned to match the standard data-handling experience you know from Excel and Google Sheets. Filters are now embedded directly into table columns instead of being grouped in the side panel. The side panel remains available only for filters that cannot be represented within a column (for example, complex multi-parameter filters). An always-active **Reset all filters** button has been added to clear all applied filters in one click, and the column configurator now uses an updated icon for clearer visual hierarchy. This change brings filtering closer to the tools you already use day-to-day, reduces the number of clicks needed to refine large lists, and provides a single consistent way to work with tables across the entire platform. ##### Repeat Payout for failed withdrawals [#repeat-payout-for-failed-withdrawals] A new **Repeat payout** button has been added for payouts that have failed and contain no successful transfers. Previously, a failed withdrawal could not be retried — you had to recreate it manually from scratch or contact support. The button appears on the payout details page when the payout has at least one failed transfer and no successful ones, and takes you to the payout creation form so you can submit a fresh attempt without re-entering all the details by hand. ##### Card layout for transaction wallets [#card-layout-for-transaction-wallets] The transaction wallets list now supports two display modes — the existing **Table view** and a new **Card view** that presents each wallet as a standalone card with all its key data: currency, label, ID, wallet type, balance, pending amount, and status. You can switch between views at any time using the toggle above the wallets list, choosing whichever layout works best for your current task. In addition, action buttons for **Deposit** and **Payout** are now available directly on each wallet entry — in both table and card views — allowing you to start the corresponding operation in one click without opening wallet details first. *** #### Improvements [#improvements-7] ##### IP whitelist enhancements [#ip-whitelist-enhancements] The IP whitelist functionality has been expanded to better support corporate clients and reduce accidental lockouts. **CIDR subnet support.** You can now whitelist entire IP ranges using CIDR notation (for example, `10.0.0.0/24`) instead of adding addresses one by one. Both IPv4 and IPv6 are supported, and you can freely combine single addresses, IPv4 subnets, and IPv6 subnets within a single whitelist. All existing whitelists continue to work without changes. When access is denied because of an IP restriction, the error message now includes the IP address you're connecting from, so you can quickly identify the issue and contact your administrator with the right information. **Self-lockout protection.** When you save a whitelist that does not include your current IP address, the system will now show a warning dialog with your current IP and ask you to confirm before applying the change. This helps prevent the most common cause of support requests — accidentally locking yourself out of the account. Your current IP address is also shown directly in the whitelist editor for reference. ##### Memo / Destination Tag emphasis on the Payment Page [#memo--destination-tag-emphasis-on-the-payment-page] For blockchains that require an additional parameter alongside the deposit address — **Ripple (XRP)**, **Stellar (XLM)**, and **The Open Network (TON)** — the Payment Page layout has been redesigned to make this requirement visually prominent for end users. This reduces the risk of payers submitting deposits without the required Memo / Destination Tag / Comment value, which previously led to unattributed deposits and additional load on Customer Support. ##### Additional columns in Events and Transfers tabs [#additional-columns-in-events-and-transfers-tabs] To make day-to-day account oversight faster and more accurate, two tabs have received new columns: * On the **Events** tab — **Amount** and **Tracking ID** columns. When reviewing payout requests submitted by users with the *Withdrawals with approval* role, you can now see the payout amount and Tracking ID directly in the events list and make approval or decline decisions without opening each request individually. * On the **Transfers** tab — a **Tracking ID** column, consistent with the same column already available on the Deposits and Payouts pages. This makes it easier to follow all transfers associated with a particular Tracking ID end-to-end. ##### Client UI unification [#client-ui-unification] A set of small but practical refinements has been applied across the Web UI to improve consistency and search ergonomics: * **Currency search** now matches both by alpha code and by full currency name, in every dropdown across the platform. * **Wallet search** now matches by ID, alpha code, currency name, and label. * The **Tag** input is now automatically disabled when an *x-address* is entered for Payouts, Custody Withdrawals, and Swap Withdrawals, preventing invalid combinations. * A **Commission is included** toggle has been added to Custody wallet withdrawals, matching the behavior already available for Enterprise wallets. * **Funds** and **Settings** controls in Swap wallets are now displayed as dedicated square buttons, in line with the rest of the wallet types. ## January 20, 2026 [#january-20-2026] ### New features [#new-features-7] #### Partner program [#partner-program] You can now launch a **Partner program** for your legal entity and earn from clients who join B2BINPAY through your referral link. For each invited client who signs up with your link, passes KYB, and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions. The new **Partner program** section in the left menu provides a dedicated dashboard to manage referrals and rewards. It shows your current percentage, total bonus, bonus for the previous month, and a detailed **Invited partners** list with registration dates, KYB status, and per‑client bonuses. Partner rewards are credited once per month based on B2BINPAY commissions from eligible transactions of referred clients. A new **Partner program** report is available in the **Reports** section. You can generate CSV or XLSX reports with bonuses per partner and for all referrals over a selected month or historical period, using the same data that powers the partner dashboard. #### Legal documents and contract management [#legal-documents-and-contract-management] A new **Legal documents** item has been added to the account menu. From this page, you can access and check the current version of your Terms & Conditions, as well as previous contract versions associated with your legal entity and jurisdiction. For new KYB requests, Terms & Conditions are now accepted as an offer agreement during the KYB initiation step instead of requiring a separate bilateral contract. #### Android app download [#android-app-download] The B2BINPAY Android app is now available directly from the Web UI. A new **Download Android app** section has been added to the account menu, redirecting you to the latest APK download location managed by the Android APK registry. *** ### Improvements [#improvements-8] #### Stronger password policy [#stronger-password-policy] Password rules have been tightened to improve account security. New passwords must contain at least twelve characters, including at least one uppercase letter, one lowercase letter, one digit, and one symbol, and must not contain spaces. You can no longer reuse your previous passwords when changing credentials. #### Withdrawal thresholds enhancements [#withdrawal-thresholds-enhancements] Withdrawal thresholds now give you more control over who approves payouts and how many approvals are required. For any Merchant or Enterprise wallet, you can set the number of required approvals and choose which roles or specific users act as *Approvers*. Approver status is shown in wallet access lists, and approvers can review and confirm payout requests on the **Events** page. This flexible setup can be used as a governance control layer for high‑value transactions when your policies require it. ## October 1, 2025 [#october-1-2025] ### New features [#new-features-8] #### Multi-authentication and social login support [#multi-authentication-and-social-login-support] **Google ID** and **Apple ID** can now be used for system authentication alongside the existing email login option, providing users with more convenient and secure access methods. #### Multi-entity user management [#multi-entity-user-management] The platform now supports advanced user management capabilities where a single user can be associated with multiple legal entities, each with distinct roles and permissions. Additionally, users can create their own sandboxes, automatically becoming *Owners* with the ability to initiate KYB processes for their businesses. #### BTC Testnet faucet [#btc-testnet-faucet] You can now utilize the Testnet faucet functionality to deposit test funds to your Sandbox wallets. Currently, the **BTC testnet faucet** is supported. #### Bank details management [#bank-details-management] A new **Bank details** section is now available in the **Profile menu**, allowing to store and manage multiple bank accounts (IBAN, SWIFT, IFSC, A/C No.) for fiat withdrawals. Each newly added bank record automatically triggers a Compliance review, and its status is clearly tracked as *Pending*, *Approved*, or *Declined*, ensuring only verified bank details are used for [bank withdrawals](references/key-terms#bank-withdrawal). #### New callback type [#new-callback-type] A new **Request rejection** callback type has been implemented that automatically handles failed payout approvals. This callback triggers when payouts requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — fail to receive confirmation within the specified timeframe or was manually cancelled by a user with proper rights. Your external system will now receive automatic notifications for these scenarios, eliminating the need for manual payout cancellation due to failed requests. #### Blockchain deposit recovery [#blockchain-deposit-recovery] For Ethereum-like blockchains, a common pool of addresses has been established. Now, when a deposit address is created on any ETH-like blockchain, the system instantly tracks activity associated with that address across all ETH-like blockchains. This feature eliminates the risk of missed transactions. #### New currency support [#new-currency-support] The platform now supports four additional cryptocurrencies: * RLUSD-ETH * USD1-BSC * SAFE-ETH * TRX-SOL *** ### Improvements [#improvements-9] #### Advanced swap operation controls [#advanced-swap-operation-controls] Two new swap operation settings have been introduced to provide greater control over trading execution. The **No slippage** setting implements an RFQ (Request for Quote) model with price updates every 5 seconds, executing swap requests only when price thresholds remain stable. The **Clients' slippage** setting allows users to specify acceptable price deviation percentages, executing trades at the latest price unless the configured slippage threshold is exceeded. Mode selection is available when creating a new swap operation. #### Staff access to Swap wallets [#staff-access-to-swap-wallets] Administrative staff can now be granted access to Swap wallets with full fund control capabilities without requiring specific user role assignments, streamlining operational management and providing greater flexibility in wallet administration. #### Streamlined legal entity selection [#streamlined-legal-entity-selection] The **Jurisdiction** dropdown has been replaced with a more intuitive **Legal entity** dropdown, significantly improving user experience when managing multiple legal entities within the same jurisdiction and providing clearer organizational structure. #### Enhanced pricing accuracy [#enhanced-pricing-accuracy] Deposit calculations now utilize VWAP (Volume Weighted Average Price) instead of Top-of-the-Book prices, providing more accurate and representative pricing that reflects actual market conditions and trading volumes. #### Centralized security management [#centralized-security-management] IP whitelist management has been restructured so that only *Owners* can configure and manage IP restrictions for all users within their organization, creating a more centralized and secure approach to access control. #### Optimized SOL transaction processing [#optimized-sol-transaction-processing] The SOL smart contract has been enhanced to support multiple transaction collections, allowing a single collection transaction to gather funds from up to 10 deposit addresses simultaneously. This optimization significantly reduces operational costs and improves transaction efficiency. #### Comprehensive localization enhancement [#comprehensive-localization-enhancement] The platform's internationalization capabilities have been substantially improved through integration with the [B2TRANSLATE](https://docs.b2translate.b2broker.com/) platform, providing support for additional languages while enhancing translation quality and consistency across the entire user interface. #### Currency naming clarification [#currency-naming-clarification] To prevent confusion with Binance's discontinued BUSD token, BUSD-T-BSC has been renamed to USDT-BSC throughout the interface, ensuring clear identification and reducing potential user errors in currency selection. ## August 1, 2025 [#august-1-2025] ### New features [#new-features-9] #### KYB verification system [#kyb-verification-system] We're excited to introduce **Know Your Business (KYB) verification**, a comprehensive business verification system that enables secure access to Coinsbuy production environment. This major enhancement transforms how businesses onboard and maintain compliance on our platform, providing a seamless path from testing to live operations. **Key features** * **Jurisdictions** The platform automatically detects jurisdictional requirements based on your country of incorporation, ensuring compliance with local regulations. To maintain ongoing compliance, the system implements periodic re-verification schedules that are clearly displayed in your dashboard. * **Streamlined verification process** We've partnered with [Sumsub](https://sumsub.com/), a leading verification provider, to deliver a secure and efficient KYB process. The system guides you through each verification step with clear instructions and contextual help. If additional documents are required, you can easily upload them through our secure interface. The process is designed to be flexible — you can exit at any point and resume where you left off, with all progress automatically saved. * **Status tracking & notifications** Real-time status updates keep you informed throughout the verification journey, from initial submission through final approval. Visual indicators appear throughout the platform when your attention is needed. You'll also receive email notifications for important status changes and document requests, ensuring you never miss critical updates. **Access & security** The KYB section is restricted to users with the Owner role, providing an additional layer of security for sensitive business verification processes. All document handling occurs through encrypted channels, and our compliance-first approach ensures we meet international regulatory standards. Production environment access is exclusively gated behind successful KYB approval, while the Sandbox environment remains freely available during the verification process. This clear separation ensures you can continue testing and integrating while completing your business verification. **How it works** You can initiate the KYB process any time after account creation, when you gain instant access to our Sandbox environment for testing and integration. When you're ready for production access, simply navigate to the KYB section and add your legal entity by providing basic business information. The system then guides you through verification with our Sumsub integration, which may include identity verification, document submission, and business legitimacy checks. If our verification partner requests additional information or documents, you'll see clear indicators and instructions for what's needed. Once your verification is approved, you immediately gain access to the production environment with full platform capabilities. #### Dual 2FA system [#dual-2fa-system] A new dual 2FA system with separate codes for authentication and operations has been implemented to strengthen account security. The system now uses two distinct 2FA codes: the **Authentication 2FA** that's mandatory for all users and required at every login, and the **Authorization 2FA for operations** that can be enabled in Profile Settings for sensitive actions like IP whitelist setup, API credentials generation, callback secret generation, and payout confirmation. This layered security approach provides enhanced protection by separating routine access from system operations, ensuring that even if one authentication method is compromised, your most sensitive account functions remain secure. #### API v3 [#api-v3] The new API v3 is designed to comply with the latest platform updates. Explore our new [API guide](api-guide/api-overview) and update your integrations accordingly, before the deprecated API v2 will be shut down on **December 1, 2025**. *** ### Improvements [#improvements-10] #### Payout enhancements [#payout-enhancements] Enterprise wallet withdrawals now feature a **Commission is included** toggle that's automatically enabled when selecting 100% of available funds, clearly indicating that the platform fees will be deducted from the payout amount. The payout confirmation window has been enhanced to display the **To be sent** amount, providing users with precise information about what the recipient will actually receive. #### Address whitelisting for Ripple-like blockchains [#address-whitelisting-for-ripple-like-blockchains] Ripple-like blockchains use an additional address tag to identify the recipient of a transaction. When whitelisting addresses on such blockchains, you can now specify the Address tag value along with the regular address. ## January 21, 2025 [#january-21-2025] ### New features [#new-features-10] #### Custody services [#custody-services] With this release, we're excited to introduce our new Custody services, designed to provide secure and efficient storage and management of funds. **Key features**: * **Secure storage**: Custody wallets ensure secure storage and are available only to users with the *Owner* role, requiring video verification for every withdrawal. * **Top ups**: Custody wallets can be topped up from your Merchant and Enterprise wallets. The transaction currency must match the currency of the Custody wallet. * **Withdrawals**: Withdrawals from Custody wallets can be made to Merchant and Enterprise wallets (without currency conversion), as well as to external addresses. * **Fees**: Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged monthly and with every withdrawal from the Custody wallet. Contact your manager to sign an additional agreement and enable the new **Custody** section in the main menu. #### Callbacks [#callbacks] All [callbacks](references/key-terms#callback) sent by the system can now be easily accessed and resent via the Web UI. Find the new **Callback** section under the **Wallet management** menu item. #### Internal transfers [#internal-transfers] A new payout type **Internal transfer** has been added, allowing you to transfer funds between Merchant wallets if they share the same currency and *Owner*. These transfers don't incur any fees since they're executed off-chain. You can find the new **Internal transfer** option on the **Wallet management** > **Payouts** page under the **Add new** menu. #### Custom AML check [#custom-aml-check] From now on, you can configure your own AML check, in addition to built-in verification provided by B2BINPAY. It can be useful if you need to carry out its own set of compliance procedures. The new **AML check** section has been added to the **Settings** page in your profile menu. #### Duplicated blockchain deposit event [#duplicated-blockchain-deposit-event] This newly added event type is triggered when a deposit is made in one currency but subsequently paid in another, resulting in its duplication on another blockchain. The duplicated deposit doesn't inherit the Tracking ID and Callback URL of the original deposit. With this event, you can manage these parameters to ensure proper tracking of duplicated deposits, eliminating the risk of their loss. #### New blockchain integrations [#new-blockchain-integrations] With this release, **The Open Network (TON)** blockchain has been integrated. Also, several new coins and stablecoins have been added: * ISO 1029 **TON** (The Open Network) * ISO 2032 **USDT-TON** (The Open Network) * ISO 2033 **NOT-TON** (The Open Network) * ISO 2034 **DOGS-TON** (The Open Network) * ISO 2035 **HMSTR-TON** (The Open Network) * ISO 2036 **FDUSD-ETH** (Ethereum) * ISO 2037 **FDUSD-BSC** (BNB Smart Chain) * ISO 2038 **CATI-TON** (The Open Network) * ISO 2039 **POL-ETH** (Ethereum) * ISO 2315 **BTCB-BSC** (BNB Smart Chain) *** ### Improvements [#improvements-11] * When creating a Bank withdrawal, you can now specify the **Amount to be withdrawn**, and the total amount including the commission will be calculated automatically. * The **Side collecting funds** transfers now always display the ID of the original deposit. * For security purposes, API credentials are now displayed only once when regenerated and will no longer be emailed to the *Owner*. * When logging in, users who haven't yet enabled IP whitelists will now see a popup reminding them to do so. Remember: IP whitelisting is effective in protecting your accounts and funds. Make sure you and your team members have it enabled. * An information icon has been added to the **Resources** tab in the wallet details, informing users of the 32 active unstaking transaction limit. When attempting to exceed this limit, a notification will appear. * The links to API docs and Release notes have been added to the Web interface. Access them at any time from your profile menu. *** ## Past releases [#past-releases] ### September, 2024 [#september-2024] #### New features [#new-features-11] ##### Enhanced security [#enhanced-security] With this release, several major updates have been made to improve security, among which are the following: * **Withdrawal thresholds** This new feature enables you to specify withdrawal thresholds that, when exceeded, will require *Owner*’s approval to make a payout. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to Approval request, but the approver must enter a 2FA code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Options can be used individually or in combination. Each option can be configured for individual users or user roles. Therefore, when limits are exceeded, approval requests will be triggered for payouts made by any user, not just those with the *Withdrawals with approval* role. All this gives you maximum flexibility in controlling your funds. Thresholds settings can be accessed on the new **Thresholds** tab in the wallet details. **Mind that** you need to have 2FA enabled to set thresholds. * **Address whitelists** This new option enables you to create and manage address whitelists. Payouts sent to whitelisted addresses will bypass restrictions related to thresholds or user roles. However, such payouts are still subject to our standard AML & KYC procedures. There are two options provided: * **Wallet-level whitelists**, considering payouts made from a specific wallet. * **Blockchain-level whitelists**, considering payouts made from any wallet in a specific blockchain. Click your profile icon in the upper-right page corner to access a newly added **Address whitelists** section. The section is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the newly added **Address whitelist** tab in the wallet details. **Mind that** you need to have 2FA enabled to whitelist addresses. * **Access list** The UI has been improved to easier manage access to your wallets. The API access in the profile menu has been replaced with a new Access list section, containing two tabs: * **Staff**: Here you can add new users to the system, assign roles, and grant or restrict access to specific wallets. * **API**: Here you can manage IP whitelists, API keys, and bulk grant or restrict access to their wallets. Other security improvements include: * **Login notifications**: Clients now receive an email notification upon logging in. * **Payout approval**: When approving a withdrawal, the Owner now sees an additional confirmation popup to prevent accidental approvals by mistake. * **2FA reminder**: Upon login, users who haven’t yet enabled 2FA will now see a popup urging them to complete the 2FA procedure. Remember: 2FA is essential for protecting your accounts and funds. Additionally, many new system features now require 2FA. Always ensure that you and your team members have it enabled. ##### New blockchain integrations [#new-blockchain-integrations-1] With this release, two new blockchains have been integrated: * Algorand * Solana Also, several new coins and stablecoins have been added: * ISO 1022 **ALGO** (Algorand) * ISO 2016 **USDC-ALGO** (Algorand) * ISO 2017 **USDT-ALGO** (Algorand) * ISO 1028 **SOL** (Solana) * ISO 2030 **USDT-SOL** (Solana) * ISO 2031 **USDC-SOL** (Solana) ##### Zendesk integration [#zendesk-integration] A new Helpdesk solution, **Zendesk**, has been integrated, providing AI support and knowledge base. Integration with SupportPal remains active in read-only mode, for ticket history. #### Improvements [#improvements-12] * The main enhancement in the current release is an **updated Enterprise commission model**, now focused on outbound transactions.This change better aligns with our clients’ business models and significantly reduces commissions. B2BINPAY now charges commissions on outgoing transactions from Enterprise wallets, rather than incoming ones. * The activation of Enterprise wallets denominated in ETH, TRX, BNB, XRP, or XLM has become user-managed. When creating such a wallet, you can now specify an Enterprise or Merchant wallet from which the activation fee should be charged. * A new **Target commission** field, displaying the commission amount converted to the wallet currency, has been added to the **Transfers** page and transfer details, as well as to the **Transactions** tab of the deposit details. * When creating a new deposit, you can now add a link that will be displayed as a button on the **Payment page**. You can specify a URL and a custom name for the button. *** ### May, 2024 [#may-2024] #### New features [#new-features-12] ##### TRX staking [#trx-staking] With this release, B2BINPAY introduces a new **TRX Staking** feature. This allows you to stake your Tron tokens to gain bandwidth or energy to save on blockchain fees. Along with the resources, for each staked TRX, you receive one vote. The votes you can distribute among SRs (Super Representatives) and further gain rewards from them. A new **Staking** > **TRX staking** item has been added to the main menu. On this page, you can overview the staking terms and monitor your rewards. The **Wallet details** page of your TRX wallets has been updated with the following two tabs: * **Resources**: Here you can overview available resources and perform staking-related operations: stake, unstable, and withdraw funds. * **Staking**: Here you can overview your total and available votes and give them to SRs, as well as monitor rounds and key performance indicators of the SRs. #### Improvements [#improvements-13] * Several more icons for currencies and tokens have been added. Icon sizes in QR codes on payment pages have been adjusted. * On the Sign up page, country flags have been added for all phone codes. * Internal logic of the procedure of enabling 2FA with Google Authenticator has been improved, to avoid situations when the 2FA code expires before the password is entered. * It has become possible to customize displayed rows in the mobile version. * Three new blockchains have been integrated: * Base (BASE) * Arbitrum (ARB) * Optimism (OP) * Several new stablecoins have been added: * USDT-OP * USDC-OP * USDCE-OP * USDT-ARB * USDC-ARB * USDCE-ARB * USDC-BASE * Several new tokens have been added: * ARB-ETH * OPTIMISM-OP *** ### February, 2024 [#february-2024] #### New features [#new-features-13] ##### Swaps [#swaps] With this release, B2BINPAY implements a new **Swap** functionality for the clients. This is a replacement for exchanges, but swaps are faster, more flexible and accurate thanks to VWAP. You can now perform currency exchange operations between your Swap wallets. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your Enterprise or Merchant wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. Swap operations are always off-chain. You can exchange all available currencies, including fiat, coins, and tokens. #### Improvements [#improvements-14] * Two new blockchains have been integrated: * Avalanche (AVAX) * Polygon (MATIC) * Several new tokens have been added: * PYUSD-ETH * USDC-AVAX * USDT-AVAX * USDC-MATIC * USDT-MATIC * The TerraUSD (ISO 2150, 2166) token has been renamed to TerraClassicUSD. * New options for wallet duplication have been added: AVAX and MATIC. In total, B2BINPAY now supports wallet duplication in 4 blockchains: * BNB-BSC (Binance Coin) * ETH (Ethereum) * AVAX (Avalanche) * MATIC (Polygon) * Charging of B2BINPAY commission is now displayed as a separate **Commission** transfer type, for more clarity. ### November 13, 2023 [#november-13-2023] #### New features [#new-features-14] ##### Unified Merchant and Enterprise users [#unified-merchant-and-enterprise-users] The Merchant and Enterprise users are no longer separated in B2BINPAY, meaning that a user can now create wallets of both types under the same user profile. ##### A new UI [#a-new-ui] A new B2BINPAY user interface is introduced with this release. The UI has been redesigned to create a more engaging and user-friendly experience. The key changes include the following: * the main menu is now displayed on the left * a new Wallet Management item has been added to the main menu, enabling you to create and manage both Merchant and Enterprise wallets * updated table layouts and icons * amended light and dark themes #### Improvements [#improvements-15] * The blockchain name is now displayed on the Payment page, enabling you to ensure that you send your funds to the correct blockchain for processing and preventing you from funds loss. * The length of phone numbers entered on the Sign up page is now validated, preventing extra or missing digits in phone numbers specified during registration. * The HelpDesk tickets for which there are unread messages in the chart are now marked with a red dot. * The HelpDesk work schedule has become available in the HelpDesk section. * The exchange rates marked as favorites on the Rates page are now available on all user devices. #### Resolved issues [#resolved-issues-7] * For payments in Binance Coin, it’s now possible to select the BNB Chain (BNB-DEX) blockchain that wasn’t previously displayed as an option on the Payment page. * Email addresses specified in Wallet Details are now validated to include only allowed characters. The entered email can be saved only after it’s validated. *** ### September 7, 2023 [#september-7-2023] #### New features [#new-features-15] ##### New currencies [#new-currencies] * Two new stablecoins have been added to the list of currencies in which Merchant wallets can be denominated: **TUSD** (ERC20, BEP20, TRC20) and **EUROC** (ERC20). * Two new stablecoins are now supported for Merchant transactions: **LUSD** (ERC20) and **FRAX** (ERC20, BEP20). * 79 new currencies (113 new tokens in different blockchains) have become available for Enterprise wallets. See the full list of available currencies [here](references/currency-codes). ##### Onboarding [#onboarding] More tours to guide you on using the app are now accessible by clicking your profile information. ##### Favourites [#favourites] On the **Rates** page, it is now possible to filter the results by your favourite pairs and sort them by coin, fiat, or token. #### Improvements [#improvements-16] * When creating a payout, the commission amount is now additionally displayed in the default currency (USD). You can enter a custom commission amount in the default or payout currency. * The 7-day expiration limit for merchant invoices has been removed. When creating or editing an invoice, you can now set any value in the **Expired at** field without any restrictions. * A new button has been added for deleting wallets with zero balances and no transactions. * For large reports, a new notification is now displayed, informing the client that the report will be sent to their email once generated. * The parent wallet is now visible when creating a new payout for tokens. * The QR code generator now supports double-image icons for tokens. * Enterprise clients can now sort the **Wallets** list by ID and currency. * For **Currency** dropdowns, grouping by currency type and filtering by group have been added. * For **Wallet** dropdowns, grouping by active state has been added. * The IP-whitelist management has been changed — now each IP address is added or removed separately. Popups are now displayed for entering passwords required to confirm adding or removing an IP address. * The counter has been added on the **Helpdesk** icon, showing the number of unread messages in tickets. A message is counted as “new“ if a user receives it while the app is open. After the page is reloaded, the counter resets. In the **Helpdesk** section, the tickets with unread messages are marked with a red marker. * Sorting by first letter in dropdowns has been fixed. *** ### May 30, 2023 [#may-30-2023] #### New features [#new-features-16] ##### Reports on wallet balances [#reports-on-wallet-balances] A new **Reports** feature has been implemented to provide you with the possibility to generate reports on your wallet balances for the custom time range. The feature is available for both Enterprise and Merchant users. ##### A notification counter for events [#a-notification-counter-for-events] A notification counter has been added near the **Events** tab displaying the number of new events in the main menu near the **Events** tab. #### Improvements [#improvements-17] * It has become possible to transfer funds within the same blockchain wallet. This option is available for both Enterprise and Merchant users in BTC, BCH, BSC, ADA, DASH, DOGE, ETH, LTC, OMNI, TRX, and ZCASH wallets. * It has become possible to add IP addresses in both IPv4 and IPv6 formats to the API whitelist in the **API access** section. * The number of tickets displayed in the HelpDesk ticket list has been increased up to 30. * The **Target currency** column has been added to the Transfer list for Merchant users. * The **Balance** and the **Pending** tabs have been added to the **Wallet info** tab both for Enterprise and Merchant users. * A limit has been added on the number of tickets created in the HelpDesk. Now you can create only 3 tickets within 5 minutes; when trying to create more than 3 tickets within the specified time, a message about reaching the ticket number limit is displayed.. * The **Registration number** and the **Company address** fields have been added to the sign up form. *** ### March 21, 2023 [#march-21-2023] #### Improvements [#improvements-18] * The design of the payment page has been renewed to offer a more user-friendly experience. * The calculation of balances has been improved. * The response speed of the API has been increased. ### December 28, 2022 [#december-28-2022] #### Improvements [#improvements-19] * The B2BINPAY operation speed has been increased for all operations. * The B2BINPAY interface as well as the mobile version of B2BINPAY have been redesigned and improved for a better user experience. * The Merchant model has been updated to support two types of Merchant users: * Merchant Crypto Settlement: users that can have only crypto wallets and pay reduced commissions for crypto processing. * Merchant Fiat Settlement: users that can have both crypto and fiat wallets and are able to send funds to their bank accounts. * Around 100 new tokens have been added to B2BINPAY. For a list of supported tokens, refer to [Currency codes](references/currency-codes). * The API response speed has been increased. *** ### November 16, 2022 [#november-16-2022] #### Improvements [#improvements-20] * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * It has become possible for Merchant users to set time limits to specify the expiration time for invoices as well as payment limits to hedge possible payment amount variations due to rate changes. * New **Cardano** blockchain has been added to the system. *** ### July 22, 2022 [#july-22-2022] #### New features [#new-features-17] ##### Customized field arrangement for Enterprise and Merchant users [#customized-field-arrangement-for-enterprise-and-merchant-users] A new tool has been implemented to help you arrange fields displayed on a page. With this tool, you can select the fields that you want to display and arrange them in a desired order on the Wallets, Transfers, Deposits, Invoices and Payouts pages. ##### HelpDesk implementation [#helpdesk-implementation] A HelpDesk option has been implemented. Using HelpDesk, you can create a ticket with a description of an issue you encountered with your B2BINPAY account and send it to our Support Team. #### Improvements [#improvements-21] * The display of Bank details for Merchant users has been improved: when creating a bank withdrawal, you can now see all the information related to bank details, not only their title. * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * In addition to the monthly payment for a custom token processing, one more option has been implemented: it has become possible to pay a specified percentage from the credited custom token amount. #### Resolved issues [#resolved-issues-8] * Fixed an issue that caused multiple wallet report downloads upon opening several tabs. * Fixed an issue due to which the transfer type was not displayed on the Transfers page. * Fixed an issue due to which a dialog window did not appear when trying to save updated information in the Wallet details. * Fixed an issue due to which the language in the table on the payment page was not changing. * Fixed an issue due to which incorrect values were displayed in the Currency filter on the Transfer page. * Fixed an issue due to which extraneous pagination options were displayed on the Rates page. * Fixed an issue due to which it was impossible to save an address to the address book when creating a new payout. * Fixed an issue due to which a warning that should be displayed when the sum of a payout exceeds the wallet balance did not appear. * Fixed an issue due to which fiat currencies were unavailable to Merchant users in the Currency filter on the Transfer page. * Fixed an issue due to which tips were not displayed on some pages. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-18] ##### A new Field name field in Logs [#a-new-field-name-field-in-logs] A new field, **Field Name**, has been added to the **Log** for all pages, both for Merchant and Enterprise users. It displays the name of the field whose value has been changed. ##### Currency filter for Merchant users [#currency-filter-for-merchant-users] With a new **Currency** filter on the **Wallet** page, it has become possible for Merchant users to filter their wallets list by currency. ##### Refund button for Merchant users [#refund-button-for-merchant-users] A new **Refund** button has been added to the **Invoice details** page for Merchant users. This button can be used to return funds to the payer. ##### List of support emails for Merchant users [#list-of-support-emails-for-merchant-users] A new **Custom support emails** field has been added to the **Create wallet** and **Edit wallet** pages of the Merchant user accounts. This is a list of email addresses to which requests from payers will be sent. ##### New dialog window for the Create new bank withdrawal window [#new-dialog-window-for-the-create-new-bank-withdrawal-window] A new dialog window has been implemented. It appears upon clicking the **Create new bank withdrawal** button after deleting a regular withdrawal or editing its data. ##### New AML provider integration [#new-aml-provider-integration] A new AML provider, **Chainanalysis KYT**, has been integrated. #### Improvements [#improvements-22] * The AML system logic has been improved: * Repeated checks in case of delay on a provider’s side are now performed with a short delay. * In case of a failure on a provider’s side to perform the final check, no additional checks are attempted. An email notification is sent to Compliance. * A long delay (up to 1 hour) is not used anymore. * A commission for the bank withdrawal for Merchant users is now calculated as follows: a fixed percentage of the withdrawal + a fixed amount in the withdrawal currency (but not less than the minimum commission amount). For example: 2.00% + 30 USD (the minimum commission is 100 USD). The percentage, fixed amount and minimum commission values are configured via the B2BINPAY Back Office. Additionally, the commission amount is now displayed under the Amount field on the withdrawal creation form. * The **Payment page** for Merchant users has been improved for a better user experience. Among other improvements, tags have been added to all currencies, while token icons and the search field have been updated, and cryptocurrencies have been divided into the following categories: Coins, Stablecoins, Others. #### Resolved issues [#resolved-issues-9] * Fixed an issue that caused incorrect filtration in the Amount to field on the Exchange page. * Fixed an issue that caused an incorrect display of the commission currency on the Create exchange page. * Fixed an issue due to which the language in the calendar widget did not change. ### December 28, 2021 [#december-28-2021] #### New features [#new-features-19] ##### Replace by Fee option [#replace-by-fee-option] A new **Replace by Fee** option has become available for Enterprise users. You can speed up the execution of your payout that has stuck due to the low fee by clicking the **Replace** button and selecting a higher fee on the Transfer Details page. ##### Freeze funds on Tron blockchain [#freeze-funds-on-tron-blockchain] For Enterprise users, it has become possible to freeze a certain amount of TRX currency in order to restore Tron blockchain resources such as bandwidth points and energy. In 72 hours, you can unfreeze the frozen amount and it will be returned to your wallet in full. #### Improvements [#improvements-23] * A new **System** initiator that represents the doer of the action in the system has been added to the Log subsection of the Wallets, Deposits and Payout sections both for Enterprise and Merchant users. * The **All** checkbox has been changed to the **All sum** switch in the **Create payout** form both for Enterprise and Merchant users. Now it is possible to select the whole wallet amount, the fee will be automatically included in the payout amount. #### Resolved issues [#resolved-issues-10] * Fixed an issue due to which blocked transaction was displayed as a confirmed one on the payment page. * Fixed an issue due to which changes in the wallet details of the Merchant users were not displayed in logs. * Fixed an issue due to which the icons for some currencies were missed on the invoice payment page. * Fixed an issue due to which the payout amount in tokens was incorrectly calculated for Merchant users. * Fixed an issue due to which the link in the TXID field for XMR currencies of the Transfers page led to the incorrect page. * Fixed an issue due to which the Minimal transfer amount field was not filled automatically. * Fixed an issue due to which values in the Old value and Actual value fields on the Payout details page for Merchant uses were absent. * Fixed an issue due to which the rates were not updated when creating payouts for Merchant users. * Fixed an issue due to which the links in the TXID field of the Deposits and Transfers pages were absent. * Fixed an issue due to which after the payout creation the commissions section was not displayed. * Fixed an issue that caused the amount discrepancy on the Create Exchange page and in the modal window. * Fixed an issue that caused an error when restoring the password. * Fixed an issue that caused an infinite loader to appear in the Add wallet to API window in the Access list section. * Fixed an issue that caused an eternal loader to appear when adding white list API in the API Access section. * Fixed an issue due to which the ID link on the deposit payment page led to the incorrect page. * Fixed an issue that restricted the number of adding wallets to 10 in the Access List. * Fixed an issue that caused troubles with verification when registering in the system. * Fixed an issue due to which it was impossible to get access to the API Access menu for Merchant users. * Fixed an issue due to which the From address book button was not available on the payout creation form. *** ### November 16, 2021 [#november-16-2021] #### New features [#new-features-20] * New currencies are added. The currencies are available for Enterprise users only. * New Monero XMR currency is added. It is available both for Enterprise and Merchant users. #### Improvements [#improvements-24] * The limitation for number of requests without prior authentication to the endpoint is now limited to 70 requests per 1 minute. *** ### October 21, 2021 [#october-21-2021] #### New features [#new-features-21] ##### Risk status [#risk-status] A new **Risk status** tag is added to the Transfer details page. This field indicates the status of the AML verification of the transfer: * the tag is orange if the AML is successful * blue if AML is pending * red if AML failed * grey if AML is unavailable Tags are displayed now for token wallets on the Wallets, Deposits, Payouts and Exchanges pages. #### Improvements [#improvements-25] * Merchant users can now specify Tag and Tag type fields when creating a payout with XLM and XRP currencies. * When clicking on the Exchange button on the Wallets list page, you are redirected to the Creating Exchange page with the selected wallet already filled in the From field. * The payment page for tokens now has 2 links: one link for the payment address and the other link for the contract. #### Resolved issues [#resolved-issues-11] * Fixed an issue which caused redirecting to the Wallet Details instead of Log when clicking on the Log button at the Access List section. * Fixed an issue that enabled funds withdrawal from a fiat wallet to a crypto wallet for Merchant users. * Fixed an issue due to which the link to the explorer was absent on the Deposit payment page. * Fixed an issue due to which on the Transfers page an Unknown type transfers were displayed when selecting the Side collecting funds in the Type filter. * Fixed an issue due to which the payment currencies and “No currencies available” message were displayed simultaneously on the Payment page. * Fixed an issue due to which the Payouts commission was not recalculated in the payout currency. * Fixed an issue due to which it was possible to create a token payout when there was not enough funds on the parent wallet. * Fixed an issue that caused multiple notifications for one operation on a wallet. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-22] * Integration with Tron blockchain is added, as well as new currencies such as Tron, USDT-TRX, USDC-TRX. * New Merchant User role is added. * New Bank Withdrawal feature is added to the Payout tab, which allows withdrawing fiat funds immediately or creating a conditional schedule. Bank Withdrawal is available for fiat wallets and for Merchant users only. * New ETH and BSC tokens are added. #### Improvements [#improvements-26] * New risk status field is added to the Transfer Object, so that clients can check transfer AML status. * DASH integration is updated. Latest version of DASH allows you to create multiple wallets per node. * Unverified users now can log in to a private area and pass verification later. #### Resolved issues [#resolved-issues-12] * Fixed an issue which caused wrong error code for API when obtaining token more than 15 times within 1 minute. * Fixed an issue which caused an error when navigating to the Payouts and Deposits tabs. * Fixed an issue which caused a false check of fee and payout amount when validating token payouts. * Fixed an issue due to which it was impossible to create a token payout with the sufficient amount of funds. * Fixed an issue which caused troubles with changing password or enabling 2FA. * Fixed an issue due to which it was impossible to create a deposit with a number of confirmation blocks from 13 to 20. * Fixed an issue which caused multiple callback notifications in the Event section when creating a payout with callback. *** ### August 04, 2021 [#august-04-2021] #### Improvements [#improvements-27] * Reworked the logic of the Exchange process. Now rates are recalculated if the transaction takes more than 15 minutes, and the final amount is updated according to the current quote. Also the notification about the rate change is sent. * Lowered minimal activation amount for BSC to 0.025 BNB. #### Resolved issues [#resolved-issues-13] * Fixed an issue due to which it was possible to set the amount less than the Minimal transfer amount when creating an exchange. * Fixed an issue due to which BEP20 was not displayed in the list of token types. * Fixed an issue due to which the Export button worked incorrectly. *** ### July 07, 2021 [#july-07-2021] #### New features [#new-features-23] ##### User verification by phone number [#user-verification-by-phone-number] Added a new verification step — verification of the user's phone number, which follows the email verification step and is mandatory. #### Improvements [#improvements-28] * Added filter by tokens. To filter by currency, a user can now select the tokens and custom tokens on the Wallets, Transfers, Deposits, and Payouts pages. * Reworked the logic of the Exchange page. Now wallets with 0 balance are displayed at the end of the list. * Updated Select all funds switch on the Exchange page. #### Resolved issues [#resolved-issues-14] * Fixed an issue due to which when exchanging, the transfer amount was not validated and could be indicated less than the available funds on the wallet. * Fixed an issue due to which the exchange became unavailable after rates update. * Fixed an issue due to which it was possible to create a custom token with alpha code of the existing currency. * Fixed an issue which caused 500 error when filtering deposits and payouts. *** ### June 22, 2021 [#june-22-2021] #### New features [#new-features-24] ##### Binance smart chain support\*\* [#binance-smart-chain-support] Now it is possible to create wallets in BSC. ##### Duplicating wallets [#duplicating-wallets] It is now possible to generate the same addresses in two different currencies. This may be useful when the payer is sending money on the wrong blockchain. For example, instead of paying 10 ETH to the A1 address, 10 BSC were sent to the A1 address. The option is available for wallets that support duplication in the Wallet Settings section. ##### Duplicating deposits [#duplicating-deposits] After duplicating a wallet when creating a deposit on one wallet, it becomes possible to clone it to a second wallet, if that second wallet is a clone of the first one. The option is available on the Create a Deposit page, when choosing duplicate in the address type and selecting the required deposit ID from the list. ##### New transfer type [#new-transfer-type] Side collecting funds on wallet is the amount of deposit that was previously canceled because of a small amount and then debited to your wallet along with another valid transfer. ##### New stablecoins support [#new-stablecoins-support] New stablecoins were added: PAX, DAI, TUSD, BUSD. #### Improvements [#improvements-29] * For BNB-BSC wallets, a notification has been added about the need to top-up the balance to activate the wallet. * Invoice updates. For all tokens, the link is now generated not by the token currency, but by the parent currency. #### Updating nodes [#updating-nodes] * DASH node was updated to version 16.1.1. #### Resolved issues [#resolved-issues-15] * Fixed an issue that caused incorrect login when saving credentials in the browser. * Fixed an issue due to which the Stellar icon did not change when switching theme from dark to light. *** ### April 19, 2021 [#april-19-2021] * **Integration with Ethereum and ERC-20 tokens has been made**. Now you can exchange and create wallets, deposits, withdrawals using new currency. The system collects tokens from deposit addresses in one place via smart contract. That significantly reduces the costs of token processing for the client. Integration with Ethereum also includes the possibility of replacing a payout by fee from the personal area in case it's stuck due to low blockchain fee. * **Working with ERC-20 tokens is available to all enterprises**. Through the client's office, you can add your token, pay processing fee from any of your wallets and start accepting tokens after confirmation of payment on the blockchain. The owner can specify any alpha code for custom token so that it is displayed on the payment pages. From your personal account at any time you can change the payment wallet or refuse to pay next month. * **The registration form is now unified for all types of clients** and contains fields where the user needs to enter information about himself in full. This will help our sales team and account managers to get in touch with the client faster and prepare everything to start working with the payment system. Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/api-overview) for updated descriptions. ## General information [#general-information] The B2BINPAY API is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. All methods are private. All requests except for [Obtain token](authentication#obtain-token) and [Refresh token](authentication#refresh-token) should contain HTTP header: `Authorization: Bearer `. According to [JSON API Specification](https://jsonapi.org/format/), all requests should contain HTTP header: `Content-Type: application/vnd.api+json`. ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/authentication) for updated descriptions. ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token` #### Request example [#request-example] ```sh curl --request POST \ --url [base]/token/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "login": "", "password": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'login': '', 'password': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'login' => '', 'password' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } }, "meta": { "time": "2020-12-29T05:27:11.925654Z", "sign": "bcd6519ce27fed2ce9efe49cd09b387f050c0122c96..." } } ``` #### Response codes [#response-codes] *** ## Refresh token [#refresh-token] Once you receive a new key pair using your refresh token, the previous refresh token can no longer be used. A refresh token that is found to be invalid while not being expired must be rendered suspicious. ### Request [#request-1] `POST` `[base]/token/refresh/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/token/refresh/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "refresh": "" } } }' ``` ```python import requests url = '[base]/token/refresh/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'refresh': '', }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/refresh/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'refresh' => 'Your refresh token', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] The response body is the same as for [Obtain token](authentication#obtain-token) request, but without `meta` fields. #### Response body example [#response-body-example] ```json { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } } ``` #### Response codes [#response-codes-1] *** ## Auth verification [#auth-verification] Refer to the example below for a sign verification instance. ```javascript // "crypto-js": "4.0.0" is installed as a dependency const SHA256 = require("crypto-js/sha256"); const hmacSHA256 = require('crypto-js/hmac-sha256'); // set API user login and password const login = 'Your API key'; const password = 'Your API secret'; // parse /api/token/ response payload const authResponse = JSON.parse("{\n" + " \"data\": {\n" + " \"type\": \"auth-token\",\n" + " \"id\": \"0\",\n" + " \"attributes\": {\n" + " \"refresh\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUz\",\n" + " \"access\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI\",\n" + " \"access_expired_at\": \"2020-08-24T13:50:12.192479+03:00\",\n" + " \"refresh_expired_at\": \"2020-08-24T19:33:33.192479+03:00\",\n" + " \"is_2fa_confirmed\": false\n" + " }\n" + " },\n" + " \"meta\": {\n" + " \"time\": \"2020-08-24T10:33:33.192479Z\",\n" + " \"sign\": \"e70adec551e26b560049e42aa0993ae42cac4e03fbbb300320d8be\"\n" + " }\n" + "}"); // prepare data for hash check const message = authResponse['meta']['time'] + authResponse['data']['attributes']['refresh']; const responseSign = authResponse['meta']['sign']; const secret = SHA256(login + password); const calculatedSign = hmacSHA256(message, secret).toString(); // print result if (responseSign === calculatedSign) { console.log('Verified'); } else { console.log('Invalid sign'); } ``` ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/deposit-methods) for updated descriptions. ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2147483647 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/payout-methods) for updated descriptions. ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-2] `POST` `[base]/payout/calculate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-2] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-2] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-3] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-3] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-3] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-3] #### Response body example [#response-body-example-1] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## Main menu [#main-menu] Use the main menu displayed on the left to navigate across platform pages and access the Helpdesk. Use the **Collapse**/**Expand** button to adjust the main menu display. Main menu ## Topbar options [#topbar-options] In the upper part of the page, you can see a topbar that provides access to the following functions: * the **Legal entity** dropdown — to switch between Sandbox and Production environments as well as different legal entities where you hold membership. Access permissions vary across legal entities based on your assigned user roles within each organization. Through this dropdown, users can also create new Sandbox environments to initiate KYB processes for their own businesses. * the **Dark/Light theme** switch — to adjust the B2BINPAY Web UI to your preferences. * the **Language** dropdown — to select a preferred language for the B2BINPAY Web UI. * the **Notifications** page — to view and manage system notifications. * the **User profile** icon — to access the **Profile menu** (see below). Topbar ## Profile menu [#profile-menu] ### Custom tokens [#custom-tokens] On this page, you can view a list of your [custom tokens](../references/key-terms#custom-token) and their settings. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. ### Testnet faucet [#testnet-faucet] On this page, you can deposit test funds to your Sandbox wallets for testing purposes. See [Set up integrations](quick-start-guide#step-5-set-up-integrations) for more details on using Sandbox. ### Logins and sessions [#logins-and-sessions] On this page, you can find a log of user sessions, which includes the user email and location, along with the device fingerprint data and exact date and time of each login. The *Owner* sees all sessions of all users. ### Access list [#access-list] Only users with the *Owner* role can access this section. On this page, you can manage user access to your wallets, API credentials, and IP whitelists. The page is divided into two tabs: On this tab, you can add new users to your legal entity, assign roles, and grant or restrict access to specific wallets. See the following guides for step-by-step instructions: * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) In the wallet details, you can find the **Access rights** tab featuring a list of users who have access to this particular wallet. On this tab, you can manage API access, as well as bulk grant or restrict API access to your wallets. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-api-credentials) *Available on Production environments only.* On this tab, you can manage IP whitelists for your legal entity to allow access it from trusted IPs only. This setting will apply to all users under this particular legal entity, including the *Owner*. See the following guides for step-by-step instructions: * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) On this tab, you can generate the Callback secret for callback verification. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) ### Address whitelist [#address-whitelist] On this page, you can create and manage address whitelists for blockchains and wallets. The page is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the **Address whitelist** tab in the wallet details. See [How to whitelist a payout address](../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for step-by-step instructions. ### Bank details [#bank-details] On this page, you can add and manage your bank details saved for [bank withdrawals](../references/key-terms#bank-withdrawal). The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. ### Reports [#reports] On this page, you can generate and download wallet reports. See [How to generate a report on wallet balances](../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) for step-by-step instructions. ### Settings [#settings] On this page, you can configure your profile and system access. See the following guides for step-by-step instructions: * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [How to enable additional AML check](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) ### Legal documents [#legal-documents] On this page, you can view and manage legal documents such as policies and contract agreements. When contract terms and conditions change, the *Owner* of the legal entity sees a notification on their next sign‑in. A modal window opens and requires them to read and accept the new terms. The *Owner* can also initiate unilateral contract termination by clicking **Terminate** next to the latest contract version. After initiation, your account remains available for withdrawals until the termination is processed by the B2BINPAY Compliance team. ## Configuring columns [#configuring-columns] Information on most pages and tabs is presented in tables and you can configure columns to display. If a display setting is available for a given page, you may see the **Configure columns** button above the table. Click it to display the column list: * Mark or unmark column checkboxes to display or hide them; the column checkboxes highlighted in grey can’t be disabled. * Drag and drop the columns to adjust their order in the table. Configuring columns ## Quick search [#quick-search] On some pages, you can perform a **quick search** by a certain parameter, such as wallet label or currency. To perform the quick search, start typing a desired value in the quick search field displayed above the table. Only the records containing the entered value are displayed on the page. ## Sorting [#sorting] Information in tables can be sorted by certain parameters. By default, page data is sorted by creation date in descending order. You can sort the page data by other fields. To find out whether you can sort table data by a particular field, hover over a corresponding column header. If sorting by this field is supported, you will see an arrow next to it indicating the available sorting options: * Arrow inactive — sorting by this field is disabled. * Up arrow (active) — descending sorting by this field is enabled (you can click the arrow to enable ascending sorting). * Down arrow (active) — ascending sorting by this field is enabled (you can click the arrow to enable descending sorting). You can sort table data only by a single field at a time. Sorting ## Filters [#filters] The **funnel icon** displayed on some pages indicates that you can specify custom **search filters**. You can click this icon to open a filter popup and enter desired values. The set of available filtering parameters varies for different pages. The displayed input corresponds to a parameter type: it can be text, number, date, selector, and so on. Typically, two values are required for filtering by a time interval: the start date and the end date. You can enter these values manually or select them using the calendar tool. To enable filtering, click the **Apply** button. To disable filtering, click **Reset**. On some pages, you can choose among predefined **quick filters** to filter data by a specific parameter, such as a wallet or currency type. To enable these filters, use the corresponding buttons displayed above data tables. Filtering ## Pagination [#pagination] Most of the pages support **pagination** and display data on multiple pages. You can instantly **Jump to** a specific page or use the left and right arrows to switch to the previous or next page. You can also specify the number of rows displayed on each page. Pagination ## Copying values [#copying-values] On some pages, the option to copy certain values to the clipboard is provided. Copying values ## Export data [#export-data] On some pages, the data export option is provided. You can download the page data in the CSV or XLSX format. The exported file matches the filtering and sorting settings applied to the page. Exporting data ## Step 1: Understand the wallet types [#step-1-understand-the-wallet-types] B2BINPAY offers two distinct wallet types: **Enterprise** and **Merchant**. Both can be created under a single account. Understanding these wallet types is essential, as their differences determine the functionality, workflow and the fees involved. Watch our video to explore our Enterprise (Wallet as a Service) and Merchant (Crypto Payment Processing) solutions and discover which solution best fits your needs. **References:** * [B2BINPAY Pricing](https://b2binpay.com/en/fees-crypto-payment-processing) *** ## Step 2: Sign up and pass KYB verification [#step-2-sign-up-and-pass-kyb-verification] To start using B2BINPAY, you need to create an account and complete the Know Your Business (KYB) verification process. ## Create your account [#create-your-account] 1. **Fill out the registration form** with your: * Full name * Email address * Phone number 2. **Create a secure password** that meets our security requirements. 3. **Set up 2FA** to receive *Authentication 2FA codes*: follow instruction on the screen. 4. **Verify your email address** by either: * Clicking the verification link sent to your email, or * Entering the verification code from the email. You now have access to our **Sandbox environment** — a secure testing environment where you can safely integrate B2BINPAY with your systems without any financial risk. Never send real money to Sandbox deposit addresses. This will result in **permanent and irreversible loss** of your funds. ## Submit your KYB request [#submit-your-kyb-request] 1. Navigate to **KYB** in the main menu. 2. Click **Add new legal entity**. 3. Fill out the required information: * **Legal entity name** — Your company's official registered name. * **Country of incorporation** — Where your business is legally registered. * **Business type** — Select the category that best describes your business. * **UBO residency** — Country where the Ultimate Beneficial Owner resides. 4. Review and accept the **Terms and conditions**. 5. Click **Create** to submit your request. Once submitted, you'll be directed to begin the KYB verification process. ## Complete the verification process [#complete-the-verification-process] Follow the on-screen instructions provided by our KYB verification provider. Once finished, the status of your request will change to *Pending*. You can safely exit and return to complete the verification later. Your progress will be automatically saved, the status of your request will change to *In progress*. ## Submit additional documents (if required) [#submit-additional-documents-if-required] Some applications may require additional supporting documents. **If documents are needed:** * A red notification badge will appear on the **KYB** menu item. * Your application status will change to *Action required*. Once your KYB request changes the status to *Approved*, you can begin using B2BINPAY production environment: switch to it using the dropdown in the topbar. **Next steps:** 1. Update your integration to use production base URLs. 2. Replace Sandbox API credentials with your production credentials. 3. Start processing real transactions. **Remember:** Never use Sandbox addresses for live transactions. *** ## Step 3: Start using your B2BINPAY [#step-3-start-using-your-b2binpay] Once your account is activated, you can begin working with B2BINPAY. Setting up your account involves the following steps: 1. **Configure essential security**: Ensure your account is secure. 2. **Create your first wallet**: Set up your initial wallet to start receiving payments. 3. **Enable API access**: Allow integration with other systems. 4. **Share wallet access**: Provide access to team members as needed. For a detailed walkthrough, watch our setup video. **References:** * [Enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [Whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) * [Create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) * [Access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [Grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [Manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) *** ## Step 4: Ensure security [#step-4-ensure-security] B2BINPAY readily supports KYC and AML procedures, enabling you to verify the identity of your clients and ensure compliance with anti-money laundering regulations. Other security features include 2FA, whitelists, thresholds, robust notifications, and logging systems. Keep in mind that the security of your accounts is your own responsibility. Watch our video to learn about B2BINPAY security features. ### Follow best practices to protect your finances [#follow-best-practices-to-protect-your-finances] Follow the guidelines below to better protect your account. #### Use strong passwords and 2FA [#use-strong-passwords-and-2fa] Make sure that you and all of your team members: * Use strong passwords that include uppercase and lowercase letters, numbers, and special symbols. * Use password managers for storing passwords. * Never share passwords with anyone. * Have IP whitelists enabled. **References:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) #### Enable notifications [#enable-notifications] Add your email as a notification address in the settings of all your wallets to make sure that you will be notified about any transactions. This way, you are able to detect suspicious transactions and intervene as quickly as possible. **References:** * [How to create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) #### Take special care when managing access permissions [#take-special-care-when-managing-access-permissions] Make sure that your users are granted only those permissions that are necessary for completing their tasks. Such permissions include access to wallets and availability of various kinds of transactions. In particular, you can assign the *Withdrawals with approval* role to all users, so that no funds withdrawal can be made unless it’s explicitly approved by you. **References:** * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) #### Enable withdrawal thresholds [#enable-withdrawal-thresholds] Specify thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require the approval of the *Owner*, regardless of the role of the user who created such payout. **References:** * [How to set withdrawal thresholds](../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) #### Generate new API credentials after integration is complete [#generate-new-api-credentials-after-integration-is-complete] When sharing your API keys with developers, generate new keys and reset IP access to API after the setup is complete. **References:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Take immediate actions if you account security has been compromised [#take-immediate-actions-if-you-account-security-has-been-compromised] Do the following if you come to suspect that someone has obtained access to your account. ### Change your password as soon as possible [#change-your-password-as-soon-as-possible] Please note that changing the system password may take time. Note that you must enter a 2FA code to confirm the password change. **References:** * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) ### Reset access permissions and IP whitelists [#reset-access-permissions-and-ip-whitelists] Revoke all accesses to your wallets or at least temporarily assign the *Read only* or *Withdrawals with approval* role to all users. In this case, any further transactions on these wallets can be made only after your approval. In addition, restrict access to the B2BINPAY API by removing non-trusted IPs from the whitelists. **References:** * [How to restrict access to your wallet](../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Immediately inform your account manager [#immediately-inform-your-account-manager] And follow the provided instructions. *** ## Step 5: Set up integrations [#step-5-set-up-integrations] B2BINPAY is designed to integrate seamlessly into various external systems to streamline and automate payment processes, such as creating deposit addresses, fetching exchange rates, processing withdrawals, and so on. To ensure a secure and comprehensive testing experience, B2BINPAY provides a Sandbox environment. This allows you to experiment with the platform features safely, understand the system logic, test interactions, set up integrations without any risk, and tailor them to your specific scenarios. You get access to Sandbox immediately after signing up to the system. B2BINPAY provides you with the Testnet faucet: using it, you can receive test funds to your Sandbox wallet to test system functions — payouts, deposits, transfers, and other features. Currently, the **BTC** testnet faucet is supported. To receive test funds: Create a BTC wallet in the Sandbox environment. Access the wallet details and copy the wallet address. Click your **profile icon** in the upper right page corner and select **Testnet faucet**. In the **Address** field, paste your wallet address. In the **Amount** field, enter the amount to deposit. Amount limits are specified under the field. Click **Send deposit**. Simulate transaction confirmations by clicking the **Generate blocks** button several times. Now, as your wallet is topped up, you can proceed with testing the financial operations in B2BINPAY and configuring integrations with external systems. Never use Sandbox deposit addresses on Production environments. This will result in **irreversible loss** of funds. **See also:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) *** ## Step 6: Use Helpdesk to get assistance [#step-6-use-helpdesk-to-get-assistance] Click **Helpdesk** in the main menu to access our Support Team platform where you can get quick help from the online chat bot or report any issues related to the B2BINPAY operation. We provide multi-lingual support, you can find the working hours of corresponding teams in the right part of the **Helpdesk** page. Check our [Troubleshooting articles](../troubleshooting/no-active-account) where you can find solutions for most common issues. *** ## Step 7: Learn about other B2BINPAY features [#step-7-learn-about-other-b2binpay-features] Watch our video to learn about other B2BINPAY features that you can use. ## Important announcement [#important-announcement] We announce the release of the new API version **v3** on June 1, 2025. This version introduces the following significant changes: * New [base URLs](#base-urls) * New [Authentication](authentication) procedure * New [Callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) and modifications in the callback verification method for [deposits](deposit-methods#callback-verification) and [payouts](payout-methods#callback-verification) **Action required:** We strongly encourage you to review the changes and update your integrations **before December 1, 2025**, as the old API version will be shut down after this date. Please ensure all updates are completed before the deadline to avoid any service disruptions. **Deprecated API notice:** The previous version of the API guide has been moved to a [separate section](../api-guide-v2-deprecated/api-overview) and is now marked as deprecated. Before you start working with the B2BINPAY API, you need to enable API access to the system. Refer to [How to access the API](../how-tos/manage-your-profile-and-system/how-to-access-api) for step-by-step instructions. ## General information [#general-information] The B2BINPAY API v3 is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. Except for [Authentication](authentication), all requests must contain the following HTTP headers: * `Authorization: Bearer {YOUR_ACCESS_TOKEN}`: Used to authenticate your request. * `Content-Type: application/vnd.api+json`: Required according to [JSON API Specification](https://jsonapi.org/format/). ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token/` #### Request example [#request-example] ```sh curl --location '{base_url}/token/' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "client_id": "", "client_secret": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'client_id': '', 'client_secret': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'client_id' => '', 'client_secret' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "access": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjMy...", "expires_in": 3599, "token_type": "Bearer" } } } ``` #### Response codes [#response-codes] ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message`. The `message` composition depends on whether the callback includes a transfer: * **With a transfer** — concatenate `transfer.status`, `transfer.amount`, `deposit.tracking_id`, and `meta.time`. * **Without a transfer** (deposit status change only) — concatenate `deposit.status`, `deposit.tracking_id` (if non-empty), and `meta.time`. Refer to the examples below for callback verification examples. ```php ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2592000 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Validate payout [#validate-payout] Validates a payout request without creating it. The endpoint runs the same validation pipeline as [Create payout](payout-methods#create-payout), checking the address, currency, fee, balance, commissions, `tracking_id` uniqueness, wallet activity, and target wallet or deposit resolution. On success, the response contains the resulting `total_amount` that would be debited from the source wallet. The endpoint has no side effects and doesn't require the `Idempotency-Key` header. ### Request [#request-2] `POST` `[base]/payout/validate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url [base]/payout/validate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/validate/" payload = json.dumps({ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": False, "is_commission_included": False, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $body = '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/validate/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains the total amount that would be debited from the source wallet if the payout was created. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-validation", "id": "0", "attributes": { "total_amount": "0.05000550" } } } ``` #### Response codes [#response-codes-2] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-3] `POST` `[base]/payout/calculate/` #### Request example [#request-example-3] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-3] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example-1] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-3] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message` (the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields). Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the payout itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this payout. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-4] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-4] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-4] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-4] #### Response body example [#response-body-example-2] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## 2FA [#2fa] The Two-Factor Authentication is an additional method of authentication that adds one more layer of security to your account. It assumes that, when signing in, in addition to your credentials, you also enter a unique one-time and time-limited confirmation code. B2BINPAY supports 2FA with the **Google Authenticator** app (it's free). B2BINPAY requires two different 2FA codes: * **Authentication 2FA**: This one is mandatory for all users upon registration. It must be entered each time you log in. * **Authorization 2FA for operations**: This one is enabled in the **Profile menu** > **Settings** section. It's required for the following sensitive system actions: * IP whitelist setup * API credentials generation * Callback secret generation * Payout confirmation *** ## Activation fee [#activation-fee] This is a deposit that you have to make to your wallets denominated in specific currencies in order to activate them. After the wallet that require confirmation is created, you'll receive a message on the **Notifications** page indicating the required deposit amount. Once deposited, the fee amount is frozen on the wallet and the wallet is assigned the *Active* status. You can use your Merchant wallets to deposit the required amount of funds. Refer also to [Blockchain fee](#blockchain-fee) and [Commission](#commission) to learn about other commission types. *** ## AML [#aml] Anti-Money Laundering is certain regulations and laws that prevent illegal movement and laundering of funds. ### Default AML check [#default-aml-check] B2BINPAY provides a built-in obligatory AML check for all incoming transfers. The check is performed on the side of a connected AML provider. During AML verification, the incoming transfer amount is displayed in the wallet as *Pending* and can't be used for financial operations. If the check is successful, the incoming transfer amount is enrolled to the wallet balance. If a transaction is considered suspicious, it's assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. ### Additional AML check [#additional-aml-check] You can add your personal account of the AML provider as an additional level of verification. Find the step-by-step instruction [here](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check). If enabled, after successfully passing the default AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). *** ## Bank withdrawal [#bank-withdrawal] This is a withdrawal of fiat funds from your [Merchant wallet](#merchant-wallet) denominated in the same fiat currency to your bank account. B2BINPAY provides three types of bank withdrawals: * **One-time withdrawal**: A single withdrawal of a fixed amount. * **Regular withdrawal with a fixed amount**: A withdrawal that is triggered every time when the wallet balance reaches the specified amount plus the commission amount. * **Regular withdrawal with a changing amount**: A withdrawal where you additionally specify the minimum amount that should be left on your wallet after the withdrawal. This withdrawal is triggered every time when the wallet balance reaches the amount calculated as *Withdrawal amount* + *Leftover amount* + *B2BINPAY commission amount*. To enable bank withdrawals, submit your banking details in advance on the **Bank details** page available under your **Profile menu**. The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. *** ## Blockchain fee [#blockchain-fee] This is a blockchain commission for [on-chain transactions](#on-chain-transaction). These fees are essential for the network's operation, as they compensate miners or validators who secure and maintain the blockchain. Each network dictates its own fee structure, which can vary based on network traffic. During peak times, fees may rise due to increased demand for transaction processing. When sending funds, you can select from possible blockchain fee levels: low, medium, high, or custom. A higher fee typically results in faster processing. These values are pre-calculated by B2BINPAY at the moment of payout creation based on the current blockchain fee records. Refer also to [Commission](#commission) and [Activation fee](#activation-fee) to learn about other commission types that can be charged. *** ## Callback [#callback] This is an asynchronous notification about changing statuses of deposits and payouts, sent by B2BINPAY to your server. You can use callbacks to make changes in your system and notify your payers, or just track the transactions. To handle incoming `POST`-requests from a callback URL in your application: * Define a route, such as `/payment/callback`. * Create an endpoint to process incoming data, such as validating transactions and updating your database accordingly. To receive callbacks, specify the **Callback URL** when creating a new [deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) or [payout](../how-tos/manage-your-assets/how-to-create-a-payout) via the Web interface, or when sending the [Create deposit](../api-guide/deposit-methods#create-deposit) or [Create payout](../api-guide/payout-methods#create-payout) requests via the API. *** ### Callback types [#callback-types] The following callbacks can be sent for transactions: **Confirmation** The transfer has received a required number of [block confirmations](#confirmation-block). This number is determined in the currency settings in the B2BINPAY Back Office. For example, the required number of confirmations for a currency is set to `3`. It means that this callback will be sent after receiving three confirmations. You can use the [Get currency](../api-guide/currency-methods#get-currency) method to receive the required number of confirmations configured for a currency. **Fail** The transfer failed. **No transfer** The deposit has expired or the payout wasn't approved, no transfer was created. **Request rejection** The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. **Block** The deposit was blocked by an AML provider, the transfer was canceled. **Cancel** The payout was blocked by an AML provider, the transfer was canceled. **User confirmation** The transfer has received a number of block confirmations specified by a client. See [Additional callback](#additional-callback) below. **Manual** The callback is resent manually. See [Resending callbacks](#resending-callbacks) below. ### Additional callback [#additional-callback] By default, a callback is sent after a transaction achieves a specified number of block confirmations on the blockchain. This number is determined in the currency settings in the B2BINPAY Back Office. To trigger an additional callback, you can set a different number of confirmations when creating a deposit or payout via the Web UI or API. For example: * Default confirmation requirement: 3 blocks * Specified for a particular deposit or payout: 1 block In this case, the callback will be sent twice: after 1 confirmation and again after 3 confirmations. ### Callback processing [#callback-processing] The callback is sent to your server if the deposit/payout includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. The callback body depends on the callback type. For additional callback structure examples, see [Deposit callback](../api-guide/deposit-methods#callback-body-example) and [Payout callback](../api-guide/payout-methods#callback-body-example). You can check that the callback was sent by B2BINPAY. Refer to [Deposit callback verification](../api-guide/deposit-methods#callback-verification) and [Payout callback verification](../api-guide/payout-methods#callback-verification) for details. After processing the payload, your server should respond with the HTTP `200` response code without a body. ### Resending callbacks [#resending-callbacks] If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Events** page in the Web UI. *** ## Coin [#coin] This is a cryptocurrency that operates independently in its own blockchain. Coins act as native currencies within their specific financial systems and can only be transferred between participants in their respective networks. **Key points**: * Operate on their own independent blockchain. * Can be mined or earned through validation activities like staking or proof-of-work. * Serve as native currencies within their blockchain ecosystem. * Used primarily for transactions, payments, and storing value. **Example**: * **TRX**: The Tron coin operating on the Tron blockchain that can be transferred between participants within the Tron network. *** ## Commission [#commission] This is a commission charged by B2BINPAY for its services. Detailed descriptions of each commission type are provided below. Refer also to [Activation fee](#activation-fee) and [Blockchain fee](#blockchain-fee) to learn about other commission types that can be charged. ### Commissions for transaction processing [#commissions-for-transaction-processing] These are fees charged for handling transfers: deposits and payouts. Their amount depends on: * **Wallet type**: Generally, B2BINPAY charges commissions for incoming transactions for [Merchant wallets](#merchant-wallet), and for outgoing transactions for [Enterprise wallets](#enterprise-wallet). This approach is determined by the internal logic of the wallets and the B2BINPAY services involved in providing these wallets. * **Transaction currency**: Different cryptocurrencies have different commission rates applied. * **Overall transaction volume**: Generally, higher transaction volumes are rewarded with lower commission rates. Once you reach a designated threshold, the applicable commission rate is fixed for the rest of the month. **Note** that previously charged commissions aren't recalculated. Visit [our website](https://b2binpay.com/en/fees-crypto-payment-processing) to view applicable commission rates. ### Commissions for custom token processing [#commissions-for-custom-token-processing] These are fees for maintaining of [custom tokens](#custom-token). They're charged on a monthly basis from the parent wallet. ### Commissions for Custody services [#commissions-for-custody-services] These are fees for storing funds on [Custody wallets](#custody-wallet). The accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and with each withdrawal from the Custody wallet. *** ## Confirmation block [#confirmation-block] This is a process of transaction confirmation on the blockchain. A transaction is being verified on the blockchain and the blocks are added to the transaction thus confirming it. Until the required amount of blocks is received, the corresponding transfer in B2BINPAY is assigned the *Unconfirmed* status. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). *** ## Custody wallet [#custody-wallet] This is an account designed for secure storage, available only to users with the *Owner* role and requiring video verification for withdrawal of funds. Custody wallets can be topped up from your [Merchant](#merchant-wallet) and [Enterprise](#enterprise-wallet) wallets. Enterprise wallets must match the currency of the Custody wallet. Withdrawals form Custody wallets can be made to Merchant and Enterprise wallets denominated in the same currency, as well as to external addresses. B2BINPAY charges commissions for storing funds on Custody wallets, their amount is calculated based on the tier percentage of stored funds. You can find information about applied tiers on the **Custody** > **Wallets** page. The accumulated commission is calculated daily for each Custody wallet. The commission is charged monthly and with every withdrawal from the Custody wallet. *** ## Custom token [#custom-token] This is a token created by a B2BINPAY user on the Ethereum, Binance Smart Chain, or Tron blockchains. B2BINPAY charges a fixed commission for custom token processing, which is applied on a monthly basis. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. *** ## Deposit [#deposit] This is an invoice that you create in B2BINPAY to receive payments from other people. Deposits can be made to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the deposits to Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The deposits to Merchant wallets can be made in any currency, including the option when payers select the payment currency themselves. Payments from other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For the deposits to Merchant wallets, you can also specify various time and amount limits. You can enable [callback](#callback) sending for any deposit to be notified about new deposit-related transactions. Deposits shouldn't be confused with [direct deposits](#direct-deposit). *** ## Destination tag [#destination-tag] This is a special identifier used for transactions in XRP. It's used to indicate the recipient of the payment. The absence of the destination tag or incorrect destination tag results in payment rejection or irreversible loss of funds. The destination tag for Stellar-based currencies (*memo*) can be applied both to deposits and withdrawals. You can indicate the following memo types: * `MEMO_TEXT`: A string encoded using either ASCII or UTF-8; maximum length is 28 bytes. * `MEMO_ID`: A 64-bit unsigned integer. *** ## Direct deposit [#direct-deposit] This is a crediting of funds to your own wallet. Direct deposits should not be confused with [deposits](#deposit). *** ## Enterprise wallet [#enterprise-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds in cryptocurrencies. Enterprise wallets support transactions in the same currencies in which they're denominated. All transactions involving Enterprise wallets are [on-chain](#on-chain-transaction). *** ## KYC [#kyc] The Know Your Customer or Know Your Client are standards for financial institutions obliging them to verify a client's identity before carrying out financial transactions. The aim of KYC is to better understand the clientele, monitor financial transactions, reduce client risks, and prevent bribery and corruption. B2BINPAY provides a built-in obligatory KYC check of all new clients. After signing up for B2BINPAY, you'll be asked to provide certain information and documents verifying your identity to complete the KYC procedure. *** ## Merchant wallet [#merchant-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds either in fiat or in cryptocurrencies. Merchant wallets support transactions in various currencies that may differ from the currency in which the wallet is denominated. Transactions between B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). *** ## Minimum transfer amount [#minimum-transfer-amount] This is a threshold set for incoming transfers to a wallet, that is, the minimum deposit amount that can be made to your wallet. Payments below this minimum are automatically rejected to ensure economic viability, particularly when [blockchain fee](#blockchain-fee) might exceed the transaction amount. You can find information about minimum allowed deposits [here](https://b2binpay.com/en/available-currencies). For Enterprise wallets, the **Minimum transfer amount** can be customized; for Merchant wallets, it's defined in the system settings. *** ## Off-chain transaction [#off-chain-transaction] This is a transaction between [Merchant wallets](#merchant-wallet) within B2BINPAY. Such transactions aren't recorded on the blockchain, don't require [blockchain confirmations](#confirmation-block), and therefore, don't incur [blockchain fees](#blockchain-fee). This method offers a cost-effective and rapid solution to transfer funds within the ecosystem. However, for payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## On-chain transaction [#on-chain-transaction] This is a transaction processed on the blockchain. Such transactions are recorded on the blockchain, require [blockchain confirmations](#confirmation-block), and therefore, incur [blockchain fees](#blockchain-fee). All transactions involving [Enterprise wallets](#enterprise-wallet) are always on-chain. For payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## Parent wallet [#parent-wallet] This is an [Enterprise wallet](#enterprise-wallet) to which a wallet denominated in [tokens](#token) is linked. The parent wallet must be created in the same blockchain as the token. Each parent wallet can serve as the parent for a single token wallet, it's not possible to link two token wallets to the same parent wallet. The B2BINPAY commission for token processing is charged from the parent wallet. Therefore it's important to maintain the minimum required amount of funds on the wallet to process transactions. The required amounts are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) *** ## Payout [#payout] This is a payment, withdrawal, or transfer made from your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the payouts from Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The payouts from Merchant wallets can be made in any currency, payments to other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For Merchant wallets denominated in fiat currencies, B2BINPAY also supports [bank withdrawals](#bank-withdrawal). *** ## Stablecoin [#stablecoin] This is a cryptocurrency, the market value of which is pegged to a reference asset, such as fiat currency, precious metal, and so on. Stablecoins combine the efficiency and security of blockchain technology with the stability of traditional finance, making them attractive for trading, savings, or payments. **Key points**: * Bridge digital assets with the traditional financial ecosystem. * While aren't guaranteed to maintain complete stability, they tend to be less volatile than popular cryptocurrencies. * Based on the "underlying" asset, can be categorized into various types, such as fiat-collateralized, crypto-collateralized, commodity-collateralized, algorithmic. **Example**: * **USDT**: The Tether stablecoin backed by the U.S. dollar at 1:1 ratio. *** ## Staking [#staking] Staking is a process of locking up crypto assets for a certain period of time to support the operation of the blockchain. In exchange for staking your crypto, you earn more crypto and/or save on commissions. At the moment, B2BINPAY supports **TRX staking**. You can stake TRX in exchange for resources: **bandwidth** or **energy**. The resources allow you to save on the blockchain fee. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are replenished throughout the day. Along with the resources, you also receive 1 vote for each TRX staked. You can distribute the votes among [SRs](#sr) and gain additional profit in return: the process is split into rounds, during which SRs generate profit that they can further distribute as rewards among their voters. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. Once in 24 hours the accumulated reward can be claimed and withdrawn to your TRX wallet, with a 10% commission is deducted from the reward. You can re-distribute your votes at any time, this will take effect from the next round. The resources and votes are available immediately after staking. You can unstake your funds anytime, but remember that the unstaking process takes 14 days on the blockchain. So you'll be able to withdraw TRX to your wallet after 14 days, until then they remain locked. You can cancel the unstaking request anytime during this period. When unstaking, all distributed votes are automatically canceled, the resources are no longer available. *** ## SR [#sr] In [TRX staking](#staking), this is a Super Representative to whom you may give your votes. They serve as blockchain "partners", supporting its operation and generating profit, which they can further distribute as rewards among their voters. When deciding on which SR to vote for, you can rely on the following key performance indicators displayed by B2BINPAY for each SR: * **Current votes**: The total number of votes cast for the SR. * **Reward distribution**: The proportion of rewards distributed to voters to all rewards gained by the SR. * **Productivity**: The percentage of successfully validated blocks. * **Expected APR**: The expected annual percentage rate. The APR may change at any time and the estimated profit may differ from the actual profit received. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. The process is divided into rounds. You can gain profit for each round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-distribute your votes to SRs at any time, this will take effect from the next round. The list of 27 SRs available for voting is provided by the Tron blockchain and is valid for a certain period of time. After that, a redistribution of positions in the list may occur. Keep in mind that if an SR is no longer ranked in the top 27, they can no longer generate and distribute rewards. The votes given to such SRs aren't automatically canceled, if you want to recall your votes, you have to do it manually. *** ## Swap [#swap] This is a currency exchange operation between your [Swap wallets](#swap-wallet). Swap operations are always [off-chain](#off-chain-transaction). You can exchange all available currencies, including fiat, coins, and tokens. *** ## Swap wallet [#swap-wallet] This is a B2BINPAY account enabling you to [swap](#swap) currencies. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. *** ## Token [#token] This is a digital asset that operates on an existing blockchain. Unlike [coins](#coin), which have their own blockchains, tokens are issued on established third-party blockchains, such as Ethereum, Tron, or BNB Smart Chain. Companies often issue tokens during Initial Coin Offerings (ICOs) or other token sale events. Tokens can represent assets, utilities, or even voting rights within a specific project. **Key points**: * Issued on top of existing blockchains. * Non-mineable and created through smart contracts. * Represent assets, utilities, or rights within a particular project. * Offer a wider range of functionalities compared to coins. **Example**: * **USDT-TRX**: The Tether (USDT) token issued on the Tron blockchain that can be used within the Tron network. *** ## Tracking ID [#tracking-id] This is a unique identifier that you can assign to your deposits and payouts. Its primary purpose is to help identify specific transactions in B2BINPAY and external systems. This identifier can be composed of any combination of numbers and letters, chosen by you for ease of reference. For each payout, the **Tracking ID** must be unique within the wallet, whereas you can reuse the same identifier across multiple deposits. The **Tracking ID** can be specified when creating deposits and payouts via both the Web UI and API, and can be utilized in callbacks sent by the system. It helps both businesses and customers track transactions and quickly locate and address issues in case of any discrepancies. *** ## Transfer [#transfer] This is any crediting or debiting of funds registered on the wallet. For more information on operation types, refer to [Transfer types](transfer-types). *** ## TXID [#txid] This is a transaction identifier, or transaction hash, which is a unique identifier assigned to each blockchain transaction. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. The example of a TXID: `f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e1`. B2BINPAY logs TXIDs for all transactions registered in the system. You can find them on the **Transfers** page and in **Transactions** tabs of deposit and payout details. Each TXID links to a blockchain explorer — a public tool for tracking transactions. In this documentation, you can also find a list of [block explorers](block-explorer-list). *** ## User role [#user-role] This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. For more information, refer to [User roles](user-roles). *** ## Wallet [#wallet] This is an account of a B2BINPAY user. B2BINPAY supports four wallet types for various purposes: * [Enterprise wallet](#enterprise-wallet) * [Merchant wallet](#merchant-wallet) * [Swap wallet](#swap-wallet) * [Custody wallet](#custody-wallet) In the **Operation type** column, you can find codes corresponding to the `op_type` field value of the [Transfer object](../api-guide/transfer-methods#transfer-object). The **In/Out** column indicates whether the transfer is incoming or outgoing. The **Fiat/Crypto** column indicates which types of currency are supported for the transfer: crypto, fiat, or both. ## UUID tools [#uuid-tools] Here you can find a list of UUID tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/uuid](https://www.npmjs.com/package/uuid) * **PHP**: [https://packagist.org/packages/ramsey/uuid](https://packagist.org/packages/ramsey/uuid) * **Java**: [https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html](https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html) * **Ruby**: [https://www.rubydoc.info/gems/uuid/2.3.8/UUID](https://www.rubydoc.info/gems/uuid/2.3.8/UUID) * **Python**: [https://docs.python.org/3/library/uuid.html](https://docs.python.org/3/library/uuid.html) * **C#**: [https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid](https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid) ## HMAC tools [#hmac-tools] Here you can find a list of HMAC tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/crypto-js](https://www.npmjs.com/package/crypto-js) * **PHP**: [https://www.php.net/manual/ru/function.hash-hmac.php](https://www.php.net/manual/ru/function.hash-hmac.php) * **Python**: [https://docs.python.org/3/library/hmac.html](https://docs.python.org/3/library/hmac.html) ## Reference information [#reference-information] * [JSON API Specification](https://jsonapi.org/format/) * [FIAT currency codes](https://en.wikipedia.org/wiki/ISO_4217) * [Bitcoin Wiki](https://en.bitcoinwiki.org/wiki/Main_Page) * [HMAC algorithm description](https://wikipedia.org/wiki/HMAC) User access to B2BINPAY is restricted according to user roles. The default roles include: * **Owner**: A a user with this role has the maximum permissions and can’t be assigned any other roles. This user has Web UI and API access. Only one user can be assigned this role. * **Admin**: A user has access to the API. * **Withdrawals with approval**: A user has access to the Web UI, can make deposits and payouts, but the payouts require confirmation from the *Owner*. * **Read only**: A user has access to the Web UI and can view information on wallets and transactions, but can’t perform any actions such as creating new deposits or payouts. The first user registered in B2BINPAY is automatically assigned the *Owner* and *Admin* roles. Users with these roles can invite other users to B2BINPAY and manage their access permissions. After registration, the *Owner* also receives the API keys to the email. ## Security [#security] ## Enterprise and Merchant wallets [#enterprise-and-merchant-wallets] ## Transfers [#transfers] ## Deposits [#deposits] ## Payouts [#payouts] ## Callbacks [#callbacks] ## Custody wallets [#custody-wallets] ## Staking [#staking] ## Swaps [#swaps] ## Helpdesk [#helpdesk] ## API [#api] [^1]: This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. ## Problem [#problem] * The incoming transfer is assigned the *Canceled* status. * I need to collect funds from the canceled transfer. * I encountered the *Transfer amount is less than required minimum* event. ## Possible reasons [#possible-reasons] This issue may occur if the amount of the incoming transfer is less than the [Minimum transfer amount](../references/key-terms#minimum-transfer-amount) set for your wallet. In this case, the transfer is automatically assigned the *Canceled* status. The funds stay on the deposit address and can't be used until further action is taken. ## Solution [#solution] When you detect a canceled transfer, it can be resolved through the **Side collecting funds** process. Here are the possible ways to do it. ### Initiate another transfer exceeding the minimum amount [#initiate-another-transfer-exceeding-the-minimum-amount] Request your payer to make another deposit to the same wallet address. Ensure this deposit amount is equal to or exceeds the wallet's **Minimum transfer amount**. Upon receiving the new transfer, the system will automatically recover the previously canceled deposit through the **Side collecting funds** process: * The status of the canceled transfer will update to *Failed*. * A new transfer of the **Side collecting funds on wallet** type will be created, which includes the ID of the original canceled deposit. * The funds of both deposits will then be credited to your wallet. ## Understand Smart Contract logic [#understand-smart-contract-logic] The underlying smart contract includes programmed instructions that only permit the collection of transfers meeting or exceeding the specified minimum amount. If the new transfer doesn't meet this requirement, it will also remain stuck in the *Canceled* status, even if the total of incoming transfers surpasses the minimum transfer amount. ## Important consideration [#important-consideration] Note that while the first deposit failed, it still will be credited to your wallet along with the next successful transfer. Therefore, as a merchant, you are responsible for manually refunding any differences to the payer. Instead of requesting a new transfer from your payer, you can wait until a larger transfer arrives to your wallet address. When this happens, the system will automatically process the previously canceled deposit just as described above. ### For Enterprise wallets only: Manually accept the canceled transfer [#for-enterprise-wallets-only-manually-accept-the-canceled-transfer] If a deposit to your Enterprise wallet is less than the **Minimum transfer amount** set for the wallet, you have an additional option to accept it manually. 1. Locate the deposit on the **Wallet management** > **Events** page. You can filter it by the *Transfer amount is less than required minimum* event type. 2. Click **Confirm anyway** to accept the deposit. Be cautious when accepting deposits below the required minimum amount. Confirming each deposit incurs [blockchain fees](../references/key-terms#blockchain-fee) charged from your wallet. If the deposit amount is less than these costs, accepting it may not be economically reasonable. Once confirmed, the system will automatically process the previously canceled deposit using the **Side collecting funds** process described above. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Events](../user-guide/wallet-management/events) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) ## Problem [#problem] I can't pass 2FA because I encounter the **Wrong 2FA code** error. ## Possible reasons [#possible-reasons] This issue may occur due to time discrepancies between your device and Google Authenticator, or browser-related problems. ## Solution [#solution] Here are several steps that can help you resolve most common 2FA issues. ### Verify the 2FA code [#verify-the-2fa-code] **Multiple accounts**: If you manage multiple accounts, ensure you're using the correct 6-digit code associated with this specific account. ### Synchronize device time settings [#synchronize-device-time-settings] By ensuring your device's time is accurately synchronized, you can reduce the likelihood of encountering the error during the 2FA process. **For Windows**: 1. Right-click the time display in the taskbar and select **Adjust date/time**. 2. Ensure that **Set time automatically** is enabled. 3. Click **Sync now** under **Synchronize your clock**. **For macOS**: 1. Go to **System settings** > **General** and select **Date & Time**. 2. Ensure that **Set date and time automatically** is checked. 3. If adjustments are needed, click the **lock icon** to make changes. **For Android**: 1. Go to **Settings**. 2. Scroll to **System** and select **Date & Time**. 3. Ensure that **Set time automatically** and **Set time zone automatically** are enabled. **For iPhone**: 1. Go to **Settings**. 2. Go to **General** and select **Date & Time**. 3. Enable the **Set automatically** toggle. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the 2FA process. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Delete browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Use Incognito/Private browsing mode [#use-incognitoprivate-browsing-mode] This mode disables extensions and uses default settings, which can help identify browser-related issues. **For Google Chrome**: * Press `Ctrl + Shift + N` to open an incognito window. **For Mozilla Firefox**: * Press `Ctrl + Shift + P` to open a private browsing window. ### Check the Internet connection [#check-the-internet-connection] A stable internet connection is important for 2FA processes. 1. Ensure you're connected to a reliable network. 2. Avoid using VPNs or proxies during the authentication process, as they can cause synchronization issues. ### Remove and re-add the account in Google Authenticator [#remove-and-re-add-the-account-in-google-authenticator] If none of the above worked, try deleting and re-adding your account in Google Authenticator. 1. **If you can access your profile settings in B2BINPAY**, disable the 2FA temporarily. 2. Open Google Authenticator and delete the existing 2FA entry for your account. 3. Re-enable 2FA on your account and scan the new QR code to add it back to Google Authenticator. 4. Test logging in with the new code. If the problem persists, contact the Support Team for further assistance. **See also:** * [Profile menu](../get-started/explore-the-web-interface#profile-menu) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) ## Problem [#problem] I can't login to the system because I encounter the **You IP is not whitelisted** error. ## Possible reasons [#possible-reasons] This issue may occur due to the IP address from which you're trying to access the system not being whitelisted. ## Solution [#solution] Here are several steps that can help you resolve most common IP-related issues. ### Check IP configuration [#check-ip-configuration] Verify if your current IP address is included in the list of whitelisted IPs. To identify your IP address, use resources like [http://ifconfig.net/](http://ifconfig.net/). ### Update the whitelist [#update-the-whitelist] If your IP is not on the list and **if you can access your profile settings**, add your IP address to the list. ### Use a VPN [#use-a-vpn] If accessing a whitelist isn't possible, consider using a VPN or proxy server that routes traffic through a whitelisted IP address. Make sure the VPN service is secure and trustworthy. ### Dynamic IP consideration [#dynamic-ip-consideration] If your Internet provider assigns dynamic IP addresses, your public IP might change frequently. Ensure your current IP address is granted access. Mind that the system doesn't support whitelisting of dynamic IP addresses. ### Firewall and security software [#firewall-and-security-software] Check any firewalls or security software that might be affecting network settings and ensure they aren't blocking your access. If the problem persists, contact the Support Team for further assistance. **See also:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) ## Problem [#problem] * The payer sent me funds, but I didn't receive the payment. * I can't find the incoming transaction in the external systems. ## Possible reasons [#possible-reasons] These issues may occur due to: * The transaction still being processed on the blockchain. * Wrong deposit address. * Missing callback details. ## Solution [#solution] Here are several ways that can help you verify the transaction. ### Check for transfers [#check-for-transfers] Go to the **Wallet management** > **Transfers** page and filter transfers by [TXID](../references/key-terms#txid). Double check the TXID was accurately obtained or provided. * If the transfer is found and assigned the *Confirmed* status, it means that it has been successfully processed and credited to your wallet. * If the transfer is found but assigned the *Unconfirmed* status, it means that the transaction hasn't yet received enough block confirmations on the blockchain, please wait. Once the required number of confirmation blocks received, the transfer status in B2BINPAY will change to *Confirmed*, and the deposit amount will be credited to your wallet. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](../references/block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If the transaction is confirmed on the blockchain, but in B2BINPAY the transfer remains unconfirmed for an extended period, there might be a technical issue. Contact the Support Team for further assistance: provide the TXID and transfer ID. ### Check the deposit address [#check-the-deposit-address] If no transfer is found, verify if the deposit address is associated with the system. Go to the **Wallet management** > **Deposits** page and filter deposits by the address. * If the deposit is located but no transfers were credited, contact the Support Team for further assistance. Provide the TXID, address, and deposit ID. * If no deposit is located, it indicates that the address is not within the system, and such deposits can't be credited. ### Check for callback issues [#check-for-callback-issues] Even if the transfer is found and confirmed in B2BINPAY, it still can be missing in the external systems due to [callback](../references/key-terms#callback) issues. 1. Go to the **Wallet management** > **Deposits** page, find the required deposit and click its **ID** to access the details. In the **Advanced options** on the **Settings** tab, verify that the **Tracking ID** and **Callback URL** are correctly specified. Adjust them if needed. Missing these details can cause callback issues, leading to unrecorded transactions in the external system. 2. Ensure the server handling callbacks is correctly configured and functioning. 3. Go to the **Wallet management** > **Callbacks** page, locate the corresponding callback, and click the **Resend** button. * **Unsupported blockchains**: Transactions can only be credited if the blockchain is supported by the system. Transactions on unsupported networks can't be recovered. * **Unsupported tokens**: Funds can be reversed, contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Deposits](../user-guide/wallet-management/deposits) * [Callbacks](../user-guide/wallet-management/callbacks) ## Problem [#problem] I can't log in to my account because I encounter the **No active account found with the given credentials** error. ## Possible reasons [#possible-reasons] This issue may occur due to entering incorrect credentials when trying to log in. ## Solution [#solution] Here are several steps that can help you resolve most common login issues. ### Check the credentials [#check-the-credentials] Make sure that you enter the correct credentials. ### Check the keyboard layout [#check-the-keyboard-layout] Ensure your keyboard layout matches your usual settings, especially if special characters are involved. ### Check CapsLock [#check-capslock] Check if the CapsLock key is active, as it may alter the input. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the login process. Clear your browser's cache and cookies and try again. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Clear browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Account lockout [#account-lockout] After multiple failed login attempts, your account may be locked. Wait for about a minute to be able to try again. ### Reset password [#reset-password] If none of the above worked, click the **Forgot password** link to reset it. If the problem persists, contact the Support Team for further assistance. ## Problem [#problem] * The outgoing transfer is stuck in the *Unconfirmed* status. * I encountered the *Insufficient funds on parent wallet* event. ## Possible reasons [#possible-reasons] These issues may occur due to: * The fee amount being to low (for payouts). * The [parent wallet](../references/key-terms#parent-wallet) lacks funds for accepting payment in tokens (for deposits). ## Solution [#solution] ### Stuck payouts [#stuck-payouts] The confirmation time for a transaction varies depending on the blockchain used, paid fees, and network load. For example, Bitcoin transactions typically take around 10 minutes to confirm, while Ethereum transactions are confirmed in about 12 seconds. You can find the required numbers of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If a transaction remains at zero confirmations for a long time, it may indicate the transaction fee was too low. In such cases, you can either wait for network fees to decrease, or resubmit the transaction with a higher fee to accelerate processing. For details, refer to [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee). ### Insufficient funds on parent wallet [#insufficient-funds-on-parent-wallet] When receiving payments to your token wallet, commissions are deducted from the linked parent wallet. If the parent wallet lacks sufficient funds to cover these commissions, the payment will not be processed until it's replenished. Here are several steps that can help you handle it. ### Identify the parent wallet [#identify-the-parent-wallet] 1. Locate the transfer on the **Wallet management** > **Events** page. You can filter events by the **Insufficient funds on parent wallet** type to identify all unconfirmed transfers. 2. Click the deposit ID in the **Operation ID** column to access the deposit details. 3. In the deposit details, find the information about your token wallet to which the deposit was made and click its **ID** to access the wallet details. 4. In the token wallet details, find the link to its parent wallet and click it to access the details. ### Check the minimum required balance [#check-the-minimum-required-balance] Compare the parent wallet current balance against the required minimum amounts for transaction processing. The necessary amounts for various blockchains are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) ### Top up the parent wallet [#top-up-the-parent-wallet] 1. In the wallet details of the parent wallet, find the **Wallet address** and copy it. 2. Make a direct deposit to the parent wallet. Make sure your deposit amount is enough to cover the minimum required amount. ### Retry the transfer [#retry-the-transfer] 1. Check the deposit status on the **Wallet management** > **Transfers** page. You can identify it by filtering transfers by the **Direct deposit to wallet address** type. The status should update to *Confirmed*. 2. Once the deposit is successfully credited to your parent wallet, go back to the **Wallet management** > **Events page**. 3. Click the **Retry** button for the corresponding event to process the transaction. If after successful replenishing of the parent wallet the **Retry** button is unavailable (grayed out), contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/deposits) * [Events](../user-guide/wallet-management/events) * [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) ## Problem [#problem] * My deposit is assigned the *Unresolved* status. * I need to collect funds from the unresolved deposit. * I encountered the *Overpaid deposit* or *Transfer to expired deposit* events. ## Possible reasons [#possible-reasons] This issue may occur with the deposits that have set limits (amount or expiration date) due to: * **Overpaid deposit**: The amount of an incoming transfer exceeds the specified deposit amount. * **Overdue deposit**: The incoming transfer is received after the specified expiration date. ## Solution [#solution] Here are several steps that can help you handle the unresolved deposit. ### Find out why the deposit is unresolved [#find-out-why-the-deposit-is-unresolved] Check if the deposit is unresolved because it's overpaid or overdue. 1. Locate the deposit in the list on the **Deposits** page. You can filter it by the *Unresolved* status. 2. Click the deposit **ID** to access deposit details. 3. In the **Limits** section on the **Settings** tab, check the specified **Requested amount** and **Expired at**. 4. On the **Transactions** tab, locate the related transfer. Check its amount and creation time against the set limits. ### Adjust the deposit limits [#adjust-the-deposit-limits] **For overpaid deposits**: Adjust the **Delta** to match the overpaid amount. For example, if the requested amount is 10 USDT and the payer sent 15 USDT, set the Delta to 5 USDT. **For overdue deposits**: Change the **Expired at** to match the time of the transaction. You can also extend the time limit to give payers another chance to send a payment within the new timeframe. An overdue deposit's status changes to *Canceled* and payers won't be able to see the address on the Payment page. ### Manually change the deposit status [#manually-change-the-deposit-status] Once all the requirements are met, change the deposit status from *Unresolved* to **Paid** if you want to collect funds and "close" the deposit, or to **Invoice** if you want to extend the deposit's lifetime. In the latter case, the Payment page remains active and can be used for sending funds. The above information is only applicable to deposits with set limits made to Merchant wallets. Deposits without limits or made to Enterprise wallets are always assigned the *Invoice* status, manual status changing is unavailable. The status can't be changed to *Paid* if the limit requirements are unmet. Attempting this may result in errors such as *Change of deposit status is prohibited*. **See also:** * [Deposits](../user-guide/wallet-management/deposits) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit#deposits-to-merchant-wallets) **Know Your Business (KYB)** is a verification process that confirms the authenticity and legitimacy of your business entity. This process verifies that your company is: * Legally registered and operating. * Compliant with regulatory requirements. * Protected against corporate fraud and illegal activities. **KYB verification is mandatory** to access B2BINPAY production environment and begin processing real transactions. B2BINPAY uses [Sumsub](https://sumsub.com/) as our trusted KYB verification provider to ensure secure and compliant business verification. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Until KYB verification is completed, you can only use the Sandbox environment. * Verification must be renewed periodically to maintain compliance. * You'll see a red notification badge on the KYB menu item when: * KYB verification hasn't been initiated yet. * Additional documents are requested by the verification provider. ## Legal entity list [#legal-entity-list] On this page, you can view a list of all your legal entities registered in the system and their statuses. The following information is provided about each entity: **Legal entity name** The official business name, as specified during KYB. *** **Country of incorporation** The country where your business is legally registered and incorporated, as specified during KYB. *** **Jurisdiction** Automatically determined based on your country of incorporation. This affects which regulatory requirements apply to your business. *** **Status** The current status of your KYB verification request. Possible values: * **In progress**: You've started but haven't completed the KYB verification process. * **Pending**: Your application is being reviewed by our verification provider. * **Approved**: Verification successful — you can access production features. * **Declined**: Verification was rejected — you may submit a new application with a different entity. * **Cancelled by client**: You cancelled the verification process. * **Action required**: Additional documents or information needed — **respond promptly to avoid delays**. *** **KYB start date** The date and time when the KYB process was initiated for this entity. *** **Next KYB date** *For approved entities only.* The date and time when your next periodic re-verification is due to maintain compliance. *** **Available actions** Depending on your entity's current status, the following options are available: * **Cancel**: *(Available for: In progress status)* * Stop the current verification process. * **Check**: *(Available for: In progress, Pending, Action required status)* * View verification progress. * Continue incomplete verification. * Submit additional required documents. The **partner program** is a referral program that lets you earn additional revenue when new clients sign up to B2BINPAY through your unique referral link. For each invited client who passes KYB and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions for a limited period defined in the partner program settings. Rewards are credited once per month and credited to the wallet you selected for receiving partner rewards. On this page, you can manage your referral link and monitor the rewards you earn from invited clients. ### Key points [#key-points] * The partner program issues a unique referral URL for each legal entity, to share with potential clients. * Rewards are calculated as a percentage of B2BINPAY commissions on eligible transactions of referred clients. * Rewards are credited once per month for the previous period. * Partner rewards are limited by the partner program settings, including the percentage and program lifetime. ## Access the Partner program page [#access-the-partner-program-page] To open the partner dashboard: * In the left menu, go to **Partner Program**. The page shows three main blocks: * **Unique referral URL** — your personal referral link and copy action. * **How it works** — a short explanation of the referral flow and terms. * **Overview** — your current percentage, invited and active partners, and accumulated rewards. Below these blocks, you see the **Invited partners** table with detailed information about each referral. ## Unique referral URL [#unique-referral-url] This is the unique referral identifier assigned to your legal entity. Share this link with partners who want to sign up for B2BINPAY. When a new client completes onboarding using your link and passes KYC and KYB checks, their commissions may start generating rewards for you, depending on the partner program configuration. To get your referral link, first select or create a Merchant wallet in USD, to which you will receive your partner rewards. ## Overview panel [#overview-panel] This block summarizes the key partner metrics for your legal entity: **Invited/Active partners** Displays how many clients you have invited in total and how many of them are currently active and generating rewards. *** **Current percentage** Displays the percentage of B2BINPAY commissions that you receive from eligible transactions of your active referred clients. *** **Total bonus** Displays the total amount of partner program rewards accumulated for all referred clients over the entire program lifetime. *** **Reward for previous month** Displays the amount of rewards calculated for the previous reporting month. ## Terms and conditions [#terms-and-conditions] You can find the settings of the partner program by clicking the **Terms and conditions** link in the **How it works** block. ## Invited partners list [#invited-partners-list] The following information is provided about each client who registered using your referral link: **ID** The internal identifier of the referred client. *** **Partner** The email address of the referred client and, when KYB is approved, the legal entity name. *** **Registered date** The date when the referred client’s legal entity was registered in the production environment. This date is also used to calculate the referral program validity period together with the configured time limit. *** **Status** The current status of the referred client. Possible values: * **In progress**: The client has started onboarding but has not yet passed KYB. * **Active**: The client has passed KYB and currently generates rewards according to the partner program rules. * **Inactive**: The referral no longer generates rewards as the program time limit expires, or the referred client's KYB fails. *** **Bonus for previous month** The amount of partner program reward calculated for this referred client for the previous month. *** **Total bonus** The total accumulated reward amount for this referred client over the lifetime of the partner program. *** **Expired at** The date when the referral stops generating partner rewards. After this date, new commissions paid by this client no longer increase your partner bonus. **See also:** * [How to launch a partner program](../how-tos/manage-your-profile-and-system/how-to-launch-a-partner-program) **Rates** are the current exchange rates for currency conversion used for different financial operations. On this page, you can find a list of all currency pairs available in B2BINPAY. By default, B2BINPAY obtains prices from [B2CONNECT Liquidity Hub](https://b2broker.com/products/b2connect/) (if you haven’t connected another liquidity provider when setting up the system). The rates are updated every 20 seconds. If the price cell is highlighted in green, the value has increased since the previous update; in red — decreased. No highlighting means that the value hasn’t changed. Above the table, you can see **quick filters**: * **Favorites**: To display currency pairs added to *Favorites*. To add a currency pair to *Favorites*, click the **star icon** near it. * **All** (default): To display all available currency pairs. * **Fiat**: To display currency pairs where one or both currencies are fiat. * **Tokens**: To display currency pairs where one or both currencies are tokens. * **Coins**: To display currency pairs where one or both currencies are coins. Next to quick filters, you can see the **Decimal places** option. Use it to adjust the number of digits after a decimal separator in prices to be displayed (by default, 8). Available values are in the range from 0 to 18, but the actual number of digits is limited by the number specified in currency settings, refer to [Currency codes](../references/currency-codes). The **B2BINPAY DeFi API** allows you to integrate B2BINPAY DeFi app features into your own systems. You can manage accounts, create invoices, monitor transactions, and inspect callbacks using a unified REST interface. Before you start working with the B2BINPAY DeFi API, you need to generate API keys required for request authentication. Refer to [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for step-by-step instructions. B2BINPAY DeFi charges credits for using API: access the **Credits** page to view the detailed pricing. Refer to [View credit balance and pricing](../user-guide/credits#view-credit-balance-and-pricing) and [Top up the credit balance](../user-guide/credits#top-up-the-credit-balance) for step-by-step instructions. ## General information [#general-information] * **Base URL**: `https://api.defi.b2binpay.com/api/v1`. * **Format**: All endpoints use JSON for requests and responses. ## Required headers [#required-headers] * `x-api-key: {Your API key}` — required for all endpoints. * `Accept: application/json` — required for all endpoints. * `Content-Type: application/json` — required for requests with a body. ## HTTP response codes [#http-response-codes] * `2xx` — success (`200 OK`, `201 Created`). * `400` — validation error (`Invalid input`). * `401` — `Invalid or missing token` or `Invalid or expired token`. * `403` — permission issues (for example, *You are not a member of this account or deployment*). * `404` — resource not found (transaction, invoice, account, etc.). * `409` — conflicts (for example, invoice with the same tracking ID already exists). * `503` — service unavailable (for example, failing health check). ## Deployment ID [#deployment-id] To obtain the `deploymentId` parameter value which is used in many API calls, use the `GET [base]/api/v1/accounts/{accountId}` method. Refer to [Account methods](account) for details. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. A **callback** is an outbound HTTP webhook that B2BINPAY DeFi sends to your system when an invoice- or payout-related event occurs. When such an event happens, the app sends a `POST` request with a JSON body to the callback URL you configured, so you can react to payments and operations in real time. To inspect delivered callbacks or resend a failed one, open the **Callbacks** tab of the relevant invoice or payout in the app. Callback inspection and resending are not part of the API key surface. ## Callback payload [#callback-payload] Every callback body uses the same top-level structure: **`id`** `string · UUID` The unique callback identifier, in the UUID format. **`type`** `string` The callback type. Invoice-related types: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. Payout-related types: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **`operation_id`** `string · UUID` The identifier of the original operation: `invoiceId` for invoice-related callback types, `payoutId` for payout-related callback types. **`operation_type`** `string` The original operation type: `invoice` or `payout`. **`timestamp`** `string` The date and time the callback was generated, in ISO 8601 format (UTC). Updated with each callback resend attempt. **`data`** `object` The callback-specific payload. Always includes the original operation object (`invoice` or `payout`). May include transactions, claims, and other associated objects. Below you can find examples of payloads for different callback types. ```json { "id": "f7f2a2f4-2a8a-48cb-9c7a-6b5f2c1b1a33", "type": "INVOICE_CREATED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:00:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "dd08d1b9-0a1e-4e0b-9c8e-7a6f5e4d3c2b", "type": "INVOICE_DEPOSIT_RECEIVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:05:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "PENDING", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345670, "confirmations": 0, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:05:00Z", "isClaimed": false } } } ``` ```json { "id": "3f5a2a2b-4c1d-49d2-8e8a-9f3b0b0a1a22", "type": "INVOICE_DEPOSIT_CONFIRMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:10:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "EXECUTED", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345678, "blockchainFee": "0.001", "confirmations": 12, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:10:00Z", "confirmedAt": "2025-08-22T10:10:00Z", "isClaimed": false } } } ``` ```json { "id": "d2a5ee9c-6d9a-4f6a-a6a7-6efaf0a5b6f7", "type": "INVOICE_PAID", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:12:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "150.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "a8a4c8b7-3a4b-4f74-9e3d-bb3b0f9d0c9a", "type": "INVOICE_UNRESOLVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:15:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "160.00", "status": "UNRESOLVED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "b1f2c3d4-e5f6-47a8-9123-4567890abcde", "type": "INVOICE_CLAIMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:20:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "claim": { "id": "123e4567-e89b-12d3-a456-426614174000", "status": "PENDING", "chainId": 1, "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "300.00", "fromAddress": "0x1234567890123456789012345678901234567890", "toAddress": "0x9876543210987654321098765432109876543210", "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "linkedTransfers": [ "001e4567-e89b-12d3-a456-426614174000", "002e4567-e89b-12d3-a456-426614174000" ], "createdAt": "2024-01-01T00:00:00.000Z", "ethAmount": 0.5, "tokenAmount": 100 } } } ``` ```json { "id": "0c9d8e7f-6a5b-4c3d-9e0f-1a2b3c4d5e6f", "type": "PAYOUT_CREATED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:30:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CREATED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ```json { "id": "92f13f4b-5c7d-4f3a-912a-37b7e6a23f90", "type": "PAYOUT_SENT", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:33:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "SENT", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "e7a89cde-1f23-45ab-9876-12c34d5678ef", "direction": "OUT", "chainId": 1, "txHash": "0xaaaabbbbccccddddeeeeffff1111222233334444555566667777888899990000", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "PENDING", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": null, "confirmations": 0, "createdAt": "2025-08-22T10:33:00Z" } } } ``` ```json { "id": "2e4f6a8c-0b1d-4f2a-93c7-3d2e1f0a9b8c", "type": "PAYOUT_EXECUTED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:37:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "EXECUTED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "def56789-1234-4abc-5678-901234567890", "direction": "OUT", "chainId": 1, "txHash": "0xaaaa...bbbb", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "EXECUTED", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": 23456789, "confirmations": 15, "createdAt": "2025-08-22T10:35:00Z", "confirmedAt": "2025-08-22T10:37:00Z" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_FAILED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "FAILED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "error": { "code": "INSUFFICIENT_FUNDS", "message": "Account balance at execution time was insufficient" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_CANCELLED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CANCELLED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ## Callback verification [#callback-verification] Each callback request is signed to confirm that it was sent by the B2BINPAY DeFi API and was not modified in transit. The signature is provided in the `X-CALLBACK-SIGNATURE` HTTP header, that contains an HMAC-SHA256 hash of the raw JSON payload and your [callback secret](../get-started/key-terms#callback-secret). ### Verification steps [#verification-steps] ### Read the raw request body [#read-the-raw-request-body] Capture the exact HTTP body bytes as received: * Do not re-serialize the JSON before verification. * Use `JSON.stringify(payload)` **without custom replacers/spacing** (no pretty print). * Ensure numbers and booleans stay as JSON primitives (do not stringify them). * Timestamps must be in the UTC ISO 8601 format, for example: `2025-08-22T10:10:00Z`. ### Read the signature header [#read-the-signature-header] Get the value of the `X-CALLBACK-SIGNATURE` header. → If the header is missing, reject the request (HTTP code `400`). ### Compute the expected signature [#compute-the-expected-signature] Use HMAC with SHA-256: * Key: `callback_secret` (UTF-8) * Message: raw request body bytes (UTF-8) * Output: hex string ### Compare signatures [#compare-signatures] Compare the received signature with the computed one using a constant-time comparison. ### Accept or reject [#accept-or-reject] * If signatures match → process the callback (HTTP code `200`). * If they do not match → reject the request (HTTP code `401`). ```js // Express.js handler example import crypto from 'node:crypto'; import express from 'express'; const app = express(); // Capture the raw HTTP request body. // This preserves the exact byte sequence used to generate the HMAC signature. app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } })); // Computes an HMAC-SHA256 signature (hex) over the raw request body. function computeHmacHex(rawBodyBuffer, secret) { return crypto .createHmac('sha256', Buffer.from(secret, 'utf8')) .update(rawBodyBuffer) // IMPORTANT: use the raw body bytes, not a re-stringified JSON object. .digest('hex'); } app.post('/webhook/invoice', (req, res) => { // Read the signature provided by the sender. const provided = req.get('X-CALLBACK-SIGNATURE'); if (!provided) { return res.status(400).send('Missing X-CALLBACK-SIGNATURE'); } // Shared callback secret (account-specific). const secret = process.env.CALLBACK_SECRET; // Recompute the expected signature from the raw request body. const expected = computeHmacHex(req.rawBody, secret); // Compare signatures using a constant-time algorithm to prevent timing attacks. const ok = crypto.timingSafeEqual( Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8') ); if (!ok) { return res.status(401).send('Invalid signature'); } // (Optional) Apply replay protection here: // - Reject callbacks with duplicate IDs. // - Reject callbacks with stale timestamps. // At this point, the callback is verified and can be safely processed. const { type, operation_type, operation_id, data, timestamp } = req.body; // ... Your business logic ... // Acknowledge receipt so the sender does not retry. return res.sendStatus(200); }); app.listen(3000, () => { console.log('Callback receiver listening on port 3000'); }); ``` The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. This section groups endpoints that do not belong to a specific resource area. ## Smart contract versions [#smart-contract-versions] Use this endpoint to retrieve metadata for a given smart contract version, such as the version string and supported features. The `versionId` value is returned by account-related endpoints as part of the deployment information. Use these methods to list, inspect, and manage queue operations for a deployment, including multisig configuration changes, rejects, and signatures. *** ## Sign a queue operation with a private key (EIP-712) [#sign-a-queue-operation-with-a-private-key-eip-712] Queue operations are signed using EIP‑712 typed data. The signature is created off‑chain with a raw private key, without a wallet UI, and authorizes execution of a multisig operation on‑chain. ### What is signed [#what-is-signed] Only the following data is signed: ```solidity Execute { Call[] calls; uint256 nonce; } ``` No other fields from the queue operation are included in the signature. ### Input data sources [#input-data-sources] #### From queue operation (API) [#from-queue-operation-api] To build the signed payload, load the queue operation from the API: * `GET /api/v1/deployments/{deploymentId}/operations` * `GET /api/v1/deployments/{deploymentId}/operations/{operationId}` From the queue operation object, use only: ```json { "nonce": "1", "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ] } ``` When building the typed data: * Treat `nonce` as `uint256`. * Treat `value` as `uint256`. * Treat `data` as a hex‑encoded `bytes` value (the literal `"0x"` is valid for empty data). #### From deployment and network [#from-deployment-and-network] The EIP‑712 domain uses deployment and network data: * `name` — always `MultiSigWallet`. * `version` — current smart contract version. * `chainId` — blockchain chain ID of the deployment. * `verifyingContract` — address of the multisig contract. You can obtain `verifyingContract` from the account: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` Use the value from the `account.contract` field for the multisig contract address. ### EIP-712 typed data structure [#eip-712-typed-data-structure] The exact typed data that is signed has the following structure: ```json { "domain": { "name": "MultiSigWallet", "version": "1.0.0", "chainId": "11155111", "verifyingContract": "0x71db8821df07d95f35d7c3bef22987397a965060" }, "primaryType": "Execute", "types": { "EIP712Domain": [ { "name": "name", "type": "string" }, { "name": "version", "type": "string" }, { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ], "Execute": [ { "name": "calls", "type": "Call[]" }, { "name": "nonce", "type": "uint256" } ], "Call": [ { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" }, { "name": "data", "type": "bytes" } ] }, "message": { "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ], "nonce": "1" } } ``` Use this structure as a template. Do not change field names, types, or their order when building the typed data object. ### Signing algorithm [#signing-algorithm] #### Step 1. Build EIP-712 typed data [#step-1-build-eip-712-typed-data] * Use the structure shown above with `domain`, `types`, `primaryType`, and `message`. * Encode all numeric values (`chainId`, `nonce`, `value`) as `uint256`. #### Step 2. Compute the EIP-712 digest [#step-2-compute-the-eip-712-digest] The digest is computed as: ```text keccak256( "\x19\x01" || hashDomain(domain) || hashStruct(Execute(message)) ) ``` Standard EIP‑712 libraries perform this step automatically when you sign typed data. #### Step 3. Sign the digest with a private key [#step-3-sign-the-digest-with-a-private-key] Sign the digest using ECDSA over `secp256k1`: ```text signature = sign(digest, privateKey) ``` The resulting signature has the format: ```text 0x{r}{s}{v} ``` Where: * `r` — 32 bytes. * `s` — 32 bytes. * `v` — 1 byte. ### Example signature [#example-signature] Example of a valid signature value: ```text 0xf8d5a66ed464b5d39bf2b3f6c45932c901467b84bdfc4d534a24dcc532569bf3\ 27b3f19289912d223f69aceeab7a61edbffb1fc26d755e1db53f68263cbe03491b ``` ### Submit the signature to the API [#submit-the-signature-to-the-api] After computing the signature, submit it using the `Sign operation` endpoint: ```http POST /api/v1/deployments/{deploymentId}/operations/{operationId}/sign x-api-key: {your-api-key} Content-Type: application/json Accept: application/json { "signature": "0x..." } ``` On success, the API returns the updated signature status for the operation. If the same signer submits another signature for the same operation, the API returns a conflict error. ### Common errors when signing [#common-errors-when-signing] Common issues when building or submitting signatures include: * `Invalid signature` — incorrect domain (`chainId` or `verifyingContract` do not match the deployment). * `Invalid signature` — wrong data types in the message (for example, `nonce` passed as a string instead of `uint256` in the typed data). * `Invalid signature` — `calls` array order does not match the operation in the queue. * `You have already signed this operation` — the same address already submitted a signature. * `canSign = false` in the operation — the signer address is not an approver or is not allowed to sign. ### Summary [#summary] * Extract `calls[]` and `nonce` from the queue operation. * Build the EIP‑712 `Execute` typed data (`domain`, `types`, `message`). * Sign the EIP‑712 digest with a private key. * Submit the resulting signature to the B2BINPAY DeFi API. ## Execute a READY queue operation with a private key [#execute-a-ready-queue-operation-with-a-private-key] When a queue operation reaches the `READY` status and `canExecute = true`, you execute it by sending a regular Ethereum transaction to the deployed `MultiSigWallet` contract and calling: ```solidity function execute(Operation[] operations) external returns (bytes[][] results); struct Operation { Call[] calls; bytes signatures; // packed signatures bytes32 id; } struct Call { address to; uint256 value; bytes data; } ``` ### Preconditions [#preconditions] The queue operation must satisfy all of the following: * `status = "READY"`. * `canExecute = true`. * `signaturesCollected >= signaturesRequired`. * The `signatures` array in the API response contains at least the threshold number of signatures. ### Required inputs [#required-inputs] #### From API (queue operation) [#from-api-queue-operation] * `executeOperationId` — used as `Operation.id`. * `calls[]` — used as `Operation.calls`. * `signatures[]` — used to build packed bytes for `Operation.signatures`. #### From deployment and network [#from-deployment-and-network-1] * `verifyingContract` — multisig contract address for the deployment: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` * use `account.contract`. * `chainId` — chain ID of the network where the multisig is deployed. * `rpcUrl` — RPC endpoint for sending the transaction. * `executorPrivateKey` — private key of the externally owned account (EOA) that sends the transaction. ### Build Operation.calls [#build-operationcalls] Convert each API call object into the Solidity `Call` struct: * `to` → `Call.to`. * `value` (decimal string) → `Call.value` (`uint256`). * `data` (hex string) → `Call.data` (`bytes`). Keep the order of `calls` exactly the same as in the queue operation and in the EIP‑712 signing step. ### Build Operation.signatures (packed bytes) [#build-operationsignatures-packed-bytes] In the API response, signatures are returned as separate entries: ```json "signatures": [ { "user": "0x...", "sign": "0x<65 bytes>" } ] ``` The contract expects a single `bytes` value: ```solidity bytes signatures; // NOT bytes[] ``` #### Signature format [#signature-format] Each signature is a standard 65‑byte ECDSA signature: ```text r (32 bytes) || s (32 bytes) || v (1 byte) ``` For example: ```text 0xf8d5...3491b ``` #### Packing rule [#packing-rule] Build `Operation.signatures` as: ```text packedSignatures = sig1 || sig2 || ... || sigN ``` Sort signatures by signer address in ascending alphabetical order before concatenation. ### Build the operations array [#build-the-operations-array] Even if you execute a single queue operation, you must pass an array with one element: ```solidity operations = [ Operation({ calls: [...], signatures: packedSignatures, id: executeOperationId }) ]; ``` ### ABI-encode execute(operations) [#abi-encode-executeoperations] Encode the function call data for: ```solidity execute((Call[] calls, bytes signatures, bytes32 id)[] operations) ``` This produces the transaction `data` field that you send to the multisig contract. ### Build, sign, and broadcast the Ethereum transaction [#build-sign-and-broadcast-the-ethereum-transaction] #### Transaction fields [#transaction-fields] Set the transaction fields as follows: * `to` — multisig contract address (`verifyingContract`). * `data` — ABI‑encoded `execute(operations)` call. * `value` — `0`. * `chainId` — correct chain ID (for example, Sepolia `11155111`). * Gas parameters — EIP‑1559 fields (`maxFeePerGas`, `maxPriorityFeePerGas`) appropriate for the network. * `nonce` — EOA nonce of the executor account (this is not the multisig queue nonce). #### Sign [#sign] Sign the transaction with `executorPrivateKey` using ECDSA (`secp256k1`). #### Broadcast [#broadcast] Send the raw signed transaction through the RPC endpoint, for example using `eth_sendRawTransaction`. The result is a `txHash`. ### Expected on-chain result [#expected-on-chain-result] If the transaction succeeds: * The contract verifies the packed signatures internally (for example, via `checkSignatures(hash, signatures)`). * All `calls` are executed in order. * An `ExecuteSuccess(nonce, digest, id)` event is emitted. * The function returns operation and call‑level results as `bytes[][] results`. The backend then updates the queue operation: * `status` changes to `EXECUTED`. * `txHash` is populated with the resulting on‑chain transaction hash. ### Common reverts and errors [#common-reverts-and-errors] Common revert classes when executing operations include: * `InsufficientSignatures(signatures, threshold)` — packed signatures contain fewer signatures than the required threshold. * `InvalidSignature(owner)` — signature bytes, signed digest, or ordering are incorrect for at least one signer. * `DuplicateSignature(owner)` — the same signer appears more than once in the packed signatures. * `FailedCall` — one of the internal calls reverted. * `InsufficientBalance(balance, needed)` — the multisig contract lacks enough ETH for the `value` transfers. * `ReentrancyGuardReentrantCall` — a reentrancy attempt was detected during execution. ## Main menu [#main-menu] Use the main menu on the left to navigate across platform pages. At the bottom of the menu, you can access: * **Helpdesk**: Open the support portal in a new tab. * **Collapse/Expand**: Hide or show the main menu labels to save horizontal space. Main menu Eligible accounts (for example, accounts that have topped up credits) also see a floating **support chat** launcher. Click it to start a live conversation with the B2BINPAY support team directly from the app, without leaving the page. ## Header options [#header-options] At the top of each page, the header provides access to the following global controls: * (1) **Account selector**: Shows the current account's name and address. Use the dropdown to switch between accounts or create a new one. * (2) **Wallet selector**: Displays the connected wallet. The dropdown provides access to profile‑level options: * **Profile settings**: Here you can select and manage the base currency for your account. * **Log out**: To disconnect the wallet. * (3) **Network selector**: Shows the active blockchain network. Use the dropdown to switch to another supported network. * (4) **Theme switch**: Toggles between light and dark themes of the interface. * (5) **Language selector**: Use the dropdown to select a preferred language for the Web UI. * **dApp connection**: Opens the WalletConnect side panel for connecting external dApps. The button shows a green dot when at least one dApp session is active. Visible only for accounts with smart contract version 1.1.0 or later. See [dApps](../user-guide/dapps). Header ## Column configuration [#column-configuration] On pages that show tables, you can configure which columns are visible and in what order. If column configuration is available, a **Configure columns** control is shown above the table: * Mark or unmark checkboxes to show or hide specific columns. Columns highlighted in grey are always visible and can't be hidden. * Drag and drop column names to change their order in the table. Column configuration ## Table header controls [#table-header-controls] Most tables in the B2BINPAY DeFi share the same header controls for searching, sorting, and filtering data. ### Quick search [#quick-search] Some columns provide a quick search field: click the **magnifying glass** icon and start typing a value to filter records that contain the entered text in that column. Quick search ### Sorting [#sorting] Columns that support sorting display the arrow icons next to the header: * **Arrows inactive**: Sorting by this column is currently disabled. * **Up arrow active**: Data is sorted in ascending order (smallest values first). * **Down arrow active**: Data is sorted in descending order (largest values first). Only one column can be used for sorting at a time. Sorting ### Filters and date ranges [#filters-and-date-ranges] The (1) **funnel** icon displayed next to the column header indicates that filters are available: click the icon to open a filter panel and specify filtering parameters. To apply filters, click **Apply**. To clear them, click **Reset**. The (2) **calendar** icon opens the date picker with predefined values (for example: *Today*, *Yesterday*, *Last 7 days*, and so on) and possibility to select a custom date or date range. Filters ## Pagination [#pagination] Most pages support pagination to split data into multiple pages and help you work efficiently with long lists. At the bottom of the page, you can: * Navigate between pages using the **previous/next** arrows or the numbered page selector. * Use **Jump to** to quickly move to a specific page. * Choose how many rows are displayed per page. Pagination ## Copying values [#copying-values] Certain fields feature the **copy** icon that copies the underlying value to your clipboard. Click the icon next to the value you need; a short confirmation appears when the value is copied. Copying values ## Account [#account] An **account** is a shared multi‑signature wallet. Technically, it's a smart contract deployed for a specific account and network. Each account is managed collectively by a group of users. Each operation on such account requires certain independent [signatures](#signature) to approve the operation before it's executed. In the B2BINPAY DeFi app, each account has: * A list of [Signers](#signer). * A [Required signatures](#required-signatures) threshold. Refer also to [Queue](#queue). *** ## Address [#address] An **address** is a unique blockchain identifier used for deposits, payouts, or transaction execution.\ Depending on context, an address can represent: * An **invoice address** (deposit address) created by the smart contracts. * A **wallet address** belonging to a signer or payout receiver. Refer also to [Deposit address](#deposit-address), [Invoice](#invoice), and [Payout](#payout). *** ## Address book [#address-book] The **address book** is a list of saved receiver addresses and labels. Saved entries can be reused when creating payouts or other operations, which reduces manual input and the risk of sending funds to an incorrect address. Refer also to [Payout](#payout). *** ## API key [#api-key] An **API key** is a credential used to access B2BINPAY DeFi API app programmatically.\ Each key is associated with a specific account. API keys are managed on the **Settings** tab of the **Account** page. Refer also to [API service](#api-service) and [Callback secret](#callback-secret). *** ## API service [#api-service] The **API service** exposes B2BINPAY DeFi REST APIs for working with entities such as invoices, payouts, and so on. Refer also to [API guide](../api-guide/api-overview). *** ## Base currency [#base-currency] The **base currency** is the currency used for presenting balances, totals, and some reports in the B2BINPAY DeFi app.\ It doesn't change the underlying blockchain currency of deposits and payouts; it only affects how values are displayed and settled in the UI. The base currency is selected on the **Profile settings** page. *** ## Balance [#balance] The **balance** of an account or asset is the aggregated value of all relevant transactions.\ Primary balance types include: * **Total balance**: Reflects all executed transactions for the account across assets, converted to the base currency. * **Uncollected balance**: Reflects deposits received on invoice addresses but not yet claimed to the account wallet. * **Balance by asset**: Shows per‑token and per‑network balances for the account. Refer also to [Deposit](#deposit), [Claim](#claim), and [Base currency](#base-currency). *** ## Batch claim [#batch-claim] A **batch claim** is an operation that collects funds from multiple invoice deposit addresses in a single claim transaction for a given currency.\ Batch claims reduce on‑chain fees by aggregating several claims into one transaction, where supported by smart contracts. Batch claims are initiated from the **Claims** page when more than one uncollected claim exists for the selected currency. Refer also to [Claim](#claim) and [Invoice](#invoice). *** ## Batch execution [#batch-execution] **Batch execution** is the process of executing several fully signed queue operations in a single on‑chain transaction.\ Batch execution is available only when: * The selected operations are fully signed. * Their nonce values form a continuous sequence (for example, `5`, `6`, `7`). Batch execution is initiated from the **Queue** page with the **Execute batch** action. Refer also to [Queue](#queue), [Nonce](#nonce), and [Payout](#payout). *** ## Blockchain [#blockchain] A **blockchain** is a specific network environment. Each network is identified by its `chainId` and has its own set of assets, contracts, and block explorers. The selected network in the app header determines which balances, queue operations, and transactions are shown. *** ## Callback [#callback] A **callback** is an HTTP notification that the B2BINPAY DeFi app sends to a client system when an invoice- or payout-related event occurs. **Invoice-related callback types:** * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. **Payout-related callback types:** * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **Retry policy:** If a callback delivery fails, the system retries it a limited number of times (by default, up to three attempts) at short, regular intervals. If every attempt fails, the callback is marked as failed and can be resent manually. For details, payload examples, and callback verification, see [Callbacks](../api-guide/callbacks). Refer also to [Callback secret](#callback-secret), [Invoice](#invoice), and [Payout](#payout). *** ## Callback secret [#callback-secret] The **callback secret** is a value used to sign callbacks so that the receiving system can verify their authenticity.\ Rotating the callback secret invalidates the previous value and is recommended when credentials are updated or exposed. The callback secret is managed on the **Settings** tab of the **Account** page. See [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for more details. Refer also to [Callback](#callback) and [API key](#api-key). *** ## Claim (collection) [#claim-collection] A **claim** (or **collection**) is an operation that transfers funds from an invoice deposit address to the account wallet. When withdrawing a token from an invoice address, the native currency is always withdrawn as well. Claims can be created for a single invoice and currency or grouped into [Batch claims](#batch-claim). * On the **Invoices** page, claims are initiated from the **Claims** tab of a specific invoice. * On the **Claims** page, claims are initiated from aggregated entries that represent uncollected funds for an invoice and currency. Refer also to [Deposit](#deposit), [Invoice](#invoice), and [Transfer](#transfer). *** ## Currency [#currency] A **currency** is a cryptocurrency (coin, stablecoin, or token) supported by the system. Refer also to [Blockchain](#blockchain) and [Balance](#balance). *** ## dApp [#dapp] A **dApp** (decentralized application) is an external application that connects to a B2BINPAY DeFi account through the [WalletConnect](#walletconnect) protocol. Connected dApps can request transactions and message signatures, which are routed to the account [queue](#queue) for multisig approval. dApps are available for [EVM-compatible](#blockchain) accounts with smart contract version 1.1.0 or later. Refer also to [WalletConnect](#walletconnect) and [Queue](#queue). *** ## Deposit [#deposit] A **deposit** is an incoming transaction to an invoice or directly to an account. Deposits increase the uncollected balance of an invoice or account until a [Claim](#claim) or payout moves the funds. Refer also to [Deposit address](#deposit-address) and [Transfer](#transfer). *** ## Deposit address [#deposit-address] A **deposit address** is a blockchain address generated by the smart contracts for receiving payments.\ Each deposit address is bound to the wallet (public address): * Funds can be collected only to the owner’s wallet or account. * The smart contract can't direct funds to arbitrary third‑party addresses. In invoices, the deposit address is represented by a smart contract and managed by the [multisig](#multisig) wallet. Deposit addresses are typically created through [Invoices](#invoice). *** ## Invoice [#invoice] An **invoice** is a request for cryptocurrency payment that generates a unique deposit address for receiving funds. The invoice address is represented by a smart contract and managed by the [multisig](#multisig) wallet.\ Invoice activity is tracked across the **Settings**, **Transfers**, **Claims**, and **Callbacks** tabs on the invoice details page. Refer also to [Deposit address](#deposit-address), [Claim](#claim), and [Transfer](#transfer).\ For detailed workflows, see [Invoices](../user-guide/invoices). *** ## Multisig [#multisig] **Multisig** (multi‑signature) is the security model behind every account. Instead of a single private key, an account is controlled by a group of [signers](#signer), and sensitive actions require approval from a minimum number of them before they can run on‑chain. In the B2BINPAY DeFi app, the multisig model defines: * Who can approve operations — the list of [signers](#signer). * How many approvals each operation needs — the [required signatures](#required-signatures) threshold. This means no single person can move funds or change account settings alone, which keeps control distributed across your team. Refer also to [Account](#account), [Signer](#signer), [Required signatures](#required-signatures), and [Threshold](#threshold). *** ## Network [#network] The **network** is the blockchain environment on which an account operates. Switching the network in the app header changes: * Which balances are shown. * Which queue operations, invoices, and transfers are visible. Refer also to [Blockchain](#blockchain). *** ## Nonce [#nonce] A **nonce** is the sequential identifier that defines the order of operations executed by a smart contract. In the B2BINPAY DeFi app: * Each queue operation (for example, a payout or configuration change) has a nonce. * Operations must be executed in nonce order; the item with the smallest nonce is processed first. * Creating a payout with a nonce that matches an existing one creates a conflicting or replacement operation. Nonce values are visible in the **Queue** and can be adjusted when creating certain operations such as payouts. Refer also to [Queue](#queue), [Batch execution](#batch-execution), and [Operation](#operation). *** ## Operation [#operation] An **operation** is an action that requires multisig approval before execution.\ Examples include: * Account configuration changes (for example, signers and thresholds). * Payouts and other asset transfers. Each operation has a [nonce](#nonce) and requires one or more [operation signatures](#operation-signature). Refer also to [Queue](#queue) and [Payout](#payout). *** ## Operation signature [#operation-signature] An **operation signature** is a digital signature added by a signer to authorize a specific operation.\ Multiple signatures can be attached to the same operation until the [threshold](#threshold) is met and the operation becomes executable. Refer also to [Signature](#signature), [Signer](#signer), and [Operation](#operation). *** ## Payout [#payout] A **payout** is an outgoing on‑chain transfer from the account to an external receiver address.\ Payouts: * Are created in the **Payouts** section by specifying a receiver address, currency, amount, and optional callback settings. * Enter the [Queue](#queue) and must be signed by the required number of signers. For details, see [Payouts](../user-guide/payouts). *** ## Queue [#queue] The **queue** is an ordered list of operations waiting for signatures or execution.\ Typical queue items include: * Payouts. * Configuration changes (for example, confirmation rules). * Reject (if you need to cancel an operation in the middle of a queue). Queue items are processed in the [nonce](#nonce) order. The **Queue** page exposes: * Pending operations that need signatures or execution. * History of executed or failed operations. * Tools for signing, executing, rejecting, or replacing operations. For detailed workflows, see [Queue](../user-guide/queue). *** ## Read‑only access [#readonly-access] **Read‑only access** is a restricted mode in which an account or user can view data but can't perform sensitive actions. Read‑only users cannot: * Create, sign, or execute operations. * Add or disconnect accounts. * Change required signatures or other critical settings. Read‑only states may apply to accounts that were removed from configuration on a given network but still exist elsewhere. *** ## Required signatures [#required-signatures] The **required signatures** value defines how many signers must approve an operation before it can be executed, expressed as `X/Y`, where: * `Y` is the total number of signers. * `X` is the minimum number required to execute an operation. The setting is configured on the **Members** tab of the **Account** page. Refer also to [Multisig](#multisig), [Signer](#signer), and [Threshold](#threshold). *** ## Signature [#signature] A **signature** is a cryptographic proof generated when a user signs a message or transaction with their private key.\ In B2BINPAY DeFi it's used for: * Authentication and login flows (for example, SIWE and EIP‑712 signatures). * Approving multisig operations and transactions. Refer also to [Operation signature](#operation-signature) and [Wallet authentication](#wallet-authentication). *** ## Signer [#signer] A **signer** is an account that has permission to approve and execute operations for an account. Signers can: * Create operations (such as payouts or configuration changes). * Sign queue items. * Execute fully signed operations. The list of signers for an account is managed on the **Members** tab of the **Account** page. Refer also to [Required signatures](#required-signatures) and [Multisig](#multisig). *** ## Threshold [#threshold] The **threshold** is another name for the number of [Required signatures](#required-signatures) needed to execute a multisig operation.\ It's defined when the account is created and can later be updated through configuration operations. Refer also to [Multisig](#multisig). *** ## Transaction [#transaction] A **transaction** is a blockchain record representing the execution of a call on a network. Each blockchain transaction is assigned a unique **TXID** which is a transaction identifier, or transaction hash. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. Each TXID links to a blockchain explorer — a public tool for tracking transactions. *** ## Transfer [#transfer] A **transfer** is a record of an on‑chain transaction tracked by the B2BINPAY DeFi app.\ Transfers can represent: * Incoming deposits to invoices. * Claims collecting funds from deposit addresses to the account. * Payouts and other outgoing operations. For details, see [Transfers](../user-guide/transfers). *** ## User [#user] A **user** represents a wallet address interacting with the B2BINPAY DeFi app. Users authenticate by signing messages and may belong to one or more [accounts](#account) as signers or viewers. Refer also to [Wallet authentication](#wallet-authentication) and [Signer](#signer). *** ## Wallet authentication [#wallet-authentication] **Wallet authentication** is the login mechanism based on external wallets. Instead of passwords, the B2BINPAY DeFi app: * Generates a message. * Asks the user to sign it. * Verifies the signature to confirm wallet ownership. Refer also to [Signature](#signature) and [User](#user). *** ## WalletConnect [#walletconnect] **WalletConnect** is an open protocol for linking external [dApps](#dapp) to a wallet session. In the B2BINPAY DeFi app, users paste a WalletConnect URI from a dApp to establish a session; subsequent dApp transaction and signature requests are delivered to the account [queue](#queue) for multisig approval. Refer also to [dApp](#dapp). The **B2BINPAY DeFi app** connects your non‑custodial wallet to smart‑contract infrastructure on EVM‑ and TVM-compatible networks. ## How it works [#how-it-works] * **Generate invoices**: Create deposit addresses for supported assets and track incoming payments in real time. * **Collect funds**: Move funds from invoice (deposit) addresses to your account smart‑contract address when you are ready. * **Approve payouts**: Create payout operations, collect signatures from account signers, and execute transactions on‑chain once the required threshold is reached. * **Manage access and rules**: Add or remove signers and adjust confirmation thresholds through multisig operations, with all changes recorded on‑chain. ## Key features [#key-features] * **Multisig accounts** Collaborate safely by managing funds through smart‑contract accounts that require multiple signatures for sensitive actions. Configure signer lists and signature thresholds per account to match your internal approval policies. * **Invoice generation** Accept crypto payments via automatically generated deposit addresses, with support for both single‑currency and multi‑currency invoices. Track each invoice in real time from creation to payment and collection. * **Fund collection** Pull funds from invoice (deposit) addresses to your main account address, either per invoice or in batches, helping you optimize network fees while keeping deposit flows and main balances clearly separated. * **Approval queue** Have all important actions — payouts, account configuration changes, signer updates — added to an operations queue where they can be reviewed, signed, and executed only after the required approvals are collected. * **API access** Use the same capabilities programmatically via the B2BINPAY DeFi API: create invoices, monitor deposits, trigger fund collections, manage payouts, and track transaction and operation statuses from your backend systems. * **Security and transparency** Benefit from a non‑custodial design where B2BINPAY DeFi never stores private keys, all transactions are signed in your wallet, and smart contracts provide on‑chain logging of operations. Multisig approvals and per‑network deployments keep control distributed across your accounts and networks. ## Set up your account [#set-up-your-account] ### Connect your wallet [#connect-your-wallet] 1. Open the B2BINPAY DeFi login page. 2. From the **Network** select in the topbar, select your network. 3. Click **Connect wallet** and follow the instructions. 4. In your wallet, select the account you want to use and approve the connection. 5. Review the signature request that the app sends to your wallet, then sign it. The app verifies the signature to confirm that you control the selected address. If the signature verification fails, reconnect the correct wallet or repeat the signature request and sign again. ### Create an account [#create-an-account] 1. Click **Create**. 2. In the **Create new account** form: 1. Enter the account name. 2. Add one or more signers or do it later. 3. Select the number of signatures required for operation confirmation (based on the number of added signers). 4. Click **Create account** and confirm the action. You'll be redirected to the **Account** page. ### Activate your account [#activate-your-account] If you see the *Your account is not activated yet* message: 1. Click **Activate** and confirm the action. 2. Confirm the transaction in your wallet. Once the account is successfully activated, in the upper part of the **Account** page, you'll see your account balances and information. ### Select a base currency for the account [#select-a-base-currency-for-the-account] The base currency is used to display account balances, including conversions from other currencies/tokens. You can manage and change your base currency at any time in your profile settings. 1. Click the **wallet selector** in the topbar and select **Profile settings**. 2. From the **Select base currency** dropdown, select the base currency for your account. The new base currency will be applied across the account. ### Make a direct deposit to the account address (optional) [#make-a-direct-deposit-to-the-account-address-optional] Fund the account directly from an external wallet. 1. Go to **Account** in the main menu. 2. In the upper part of the page, locate the **Account address** field and click the **copy** icon to copy the account address to your clipboard. 3. In your external wallet, paste the copied address as the receiver and select the token and network that match your account configuration. 4. Send a test transfer with a small amount first. After the transaction is confirmed on‑chain, the **Transfers** page shows the new incoming transfer with the *Direct deposit* type and the balances are updated accordingly on the **Account** page. ### Add account users and configure confirmation rules [#add-account-users-and-configure-confirmation-rules] Invite additional users and adjust how many signatures are required for transaction confirmation. 1. Go to **Account** in the main menu and switch to the **Members** tab. 2. In the **Confirmation rules** section, click **Edit**. 3. To add a new user to the account, enter their public address in the **Add signer** field. The app validates the address format and network: 1. If the address format or network is invalid, an error explains that the address is invalid. 2. If the address is already added as a signer, a message explains that the address is already in the list. 4. Adjust **Required signatures** to define how many signers must approve each transaction. Consider adding more than one signer for production environments so that payouts and configuration changes require multiple approvals. 5. Click **Save** and sign the corresponding configuration transaction in your wallet if prompted. The updated list of signers and required signatures appears in the **Confirmation rules** section. ## Next steps [#next-steps] Now, as you're all set up, you can: * Create invoices to generate deposit addresses and accept payments. * Use the **Queue** page to track pending multisig actions. * Configure callbacks and API keys to integrate B2BINPAY DeFi API app with your systems. ## July 1, 2026 [#july-1-2026] ### Cross-chain transfers, TRX staking, and in-app support [#cross-chain-transfers-trx-staking-and-in-app-support] **Cross-chain transfers** * Added **Cross-chain transfers**: move funds from your account on one network to a recipient on another network without leaving the interface. Transfers use a live quote that shows the amount received, bridge fee, route, and estimated delivery time, and run through the account queue for multisig approval. Track delivery progress and open the cross-chain explorer from the operation details. See [Cross-chain transfers](../user-guide/cross-chain-transfers). **TRX staking** * Added **TRX staking** for TRON accounts: freeze TRX to obtain Energy or Bandwidth, unstake and withdraw matured TRX, vote for Super Representatives, and delegate resources to other addresses. All staking operations run through the account queue. The account balance now shows the spendable amount, excluding staked, unstaking, and pending-withdrawal TRX. See [Staking](../user-guide/staking). **Support** * Added an in-app **support chat**. Eligible accounts (for example, accounts that have topped up credits) get a live chat launcher that connects you with the B2BINPAY support team directly from the app, tied to your connected account. The launcher appears without a reload right after you become eligible. **Smart contracts** * Released smart contract version **1.2.1** for TRON, adding staking support. ## June 1, 2026 [#june-1-2026] ### Overview dashboard and integrated apps [#overview-dashboard-and-integrated-apps] **Overview** * Added the **Overview** dashboard, the landing page you see after signing in. It summarizes your total balance and uncollected funds, invoice and payout activity, asset allocation, finance volume, pending queue operations, credit balance, and per-network status. Use the period selector to switch between the last week, month, and quarter. See [Overview](../user-guide/overview). **Apps** * Added the **Apps** page, a catalog of integrated applications that work directly through your multisig account. See [Apps](../user-guide/apps). * Added **CoW Swap**: MEV-protected token swaps for EVM-compatible accounts. Each swap runs through the account queue for multisig approval, the same way as payouts. See [Apps](../user-guide/apps). **Smart contracts** * Released smart contract version **1.2.0**. On accounts using this version, only account signers can claim funds from invoice deposit addresses. Addresses that are not signers can no longer perform claims, which adds an extra layer of protection for deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. See [Claims](../user-guide/claims). ## April 17, 2026 [#april-17-2026] ### dApp integration, API enhancements, and Tron support [#dapp-integration-api-enhancements-and-tron-support] **dApps** * Added support for connecting external dApps through the **WalletConnect** protocol. Use the new **dApp** control in the header to connect dApps, review incoming transaction and message requests, and track active sessions. See [dApps](../user-guide/dapps). * Queue operations initiated by connected dApps now show the dApp name and icon in the queue list and details. See [Queue](../user-guide/queue). * The header displays a live indicator when at least one dApp session is active and a badge when pending dApp requests require approval. **Smart contracts** * Released smart contract version **1.1.0** with **ERC-1271** support. The multisig account can now validate signatures on-chain, which lets it sign messages requested by connected dApps. dApp features are available for accounts on this version or later. See [dApps](../user-guide/dapps). **API** * Added callback resending: retry a previously failed callback from the **Callbacks** tab of an invoice or payout. See [Callbacks](../api-guide/callbacks). * Added the **Get account balances** endpoint that returns balances for all assets of the account in a single call. See [Account](../api-guide/account). * Added the **Get smart contract version** endpoint. See [Other](../api-guide/other). **SDK** * The TypeScript SDK now supports **Tron** networks (Mainnet and Shasta) in addition to EVM chains. Invoices, payouts, and claims flows work with a unified API surface across EVM and TVM deployments. ## February 3, 2026 [#february-3-2026] ### Initial release [#initial-release] An **account** represents a shared multisig wallet managed by a group of users. ## Account details [#account-details] To access account details, go to **Account** in the main menu. In the upper part of the page, you can find essential information about the account: **Total balance** The total value of all assets held by the account, converted to the base currency. This value reflects both collected and uncollected funds. *** **Uncollected balance** The total amount of funds that were received but not yet collected to the account base address, converted to the base currency. *** **Uncollected invoices** The number of invoices that currently have payments that haven't yet been collected. *** **Current nonce** The latest transaction nonce used by the account smart contract. This value shows how many transactions were already processed and helps avoid transaction conflicts. *** **Account address** The smart contract address representing the account on the selected blockchain network. This address is used as the main destination for incoming funds and can't be modified. *** **Account name** The label for the account that helps distinguish it from other accounts. This value can be modified anytime. The information below is divided into tabs. On this tab, you can view a list of all assets held on the account, including their balances and value in the base currency. The following information is provided about each asset: **Currency** The asset alphabetical code, logo, and full name. *** **Balance** The amount of the asset held on the account, in the asset units. *** **Balance in base currency** The value of the asset converted to the account base currency. On this tab, you can view and manage the members and signing policy of the account. ### Member cards [#member-cards] The upper part of the tab shows a set of member cards that represent wallets associated with the account. Each card provides the label assigned to the member and the underlying blockchain address. Members marked with the **eye icon** have read-only access to the account. ### Confirmation rules [#confirmation-rules] The lower part of the tab contains the **Confirmation rules** section, which defines who can approve transactions and how many approvals are required. **Signers** The list of addresses and names that have full control over the account. Signers can create, sign, execute, and decline transactions. Each row shows the signer label (if available) and the wallet address. *** **Required signatures** The number of signer approvals that must be collected before a transaction can be executed. The ratio, such as `1/3`, shows how many signatures are required out of the total number of signers. Transactions remain pending until the required number of signatures is collected. View [Manage signers and required signatures](#manage-signers-and-required-signatures) for step-by-step instructions. On this tab, you can manage integration and security settings for the account, including the callback secret and API keys. ### Callback secret [#callback-secret] The **Your callback secret** section provides the **Regenerate** action that issues a new secret. Regeneration invalidates the previous secret and updates the value used for verifying callbacks. ### API key management [#api-key-management] The **API key management** section lists API keys used to access the account through integrations. The table includes the following columns: **Name** The label assigned to the key.\ This value helps identify where the key is used. *** **Key** The shortened representation of the API key, for example `094j8...9h34a`.\ The full value is shown only when the key is created.\ For security reasons, it is not possible to restore the full key from this page. *** **Created at** The date and time when the key was created. *** **Revoked at** The date and time when the key was revoked.\ For active keys, the value is shown as `—`. View [Configure callback secret and API keys](#configure-callback-secret-and-api-keys) for step-by-step instructions. ## Common use cases [#common-use-cases] The **Account** page helps with daily monitoring and administration of the account. This section describes common scenarios step by step. ### Rename the account [#rename-the-account] You can modify the account name anytime. Go to **Account** in the main menu and select the required account in the header. Click the **pencil icon** next to the account name and enter a new value. In the **Edit account name** popup, enter the new account name, up to 32 characters long. Click **Save** to confirm changes. The changes are applied immediately. The smart contract address, confirmation rules, and accesses remain unchanged. ### Manage signers and required signatures [#manage-signers-and-required-signatures] Add new signers and adjust account settings that affect confirmation rules. Go to **Account** in the main menu and switch to the **Members** tab. Click **Edit** in the **Confirmation rules** section. **To add a new signer:** Click **Add signer** and enter a new signer address in the corresponding field. The system validates the address format and network before allowing you to proceed: * If the entered address has an invalid format or doesn't belong to the expected network, the `Invalid address format` error appears and the changes aren't saved. * If the entered address is already in the signer list, the `Address is already added` notification appears and the address isn't duplicated. **To remove a signer:** Click the **bin icon** in the corresponding signer row. Adjust the **Required signatures** value to set how many signatures are needed to execute transactions: * If there is only one signer, confirm that **Required signatures** is set to `1/1` by default and that editing is disabled. * If the account has more than one signer, click **Edit**, then adjust the **Required signatures** value in the `X/Y` format, where `Y` is the number of signers and `X` is less than or equal to `Y`. If you set `X` equal to `Y`, review the warning that explains the risk of losing funds if any single account becomes unavailable, then save the changes only if this configuration is acceptable. When signers are added or removed, the `Y` value in `Required signatures` updates to match the current signer list, and the editing control reflects the updated limits immediately. Click **Save**. The **Sign transaction** popup appears with the note that the action requires collecting a certain number of signatures before it can be completed. Review the changes and click **Sign**. The changes are processed according to the current confirmation rules. New rules will be applied once the transaction is properly confirmed. ### Configure a callback secret and API keys [#configure-a-callback-secret-and-api-keys] Set up technical integration with external systems through [callbacks](../get-started/key-terms#callback) and API access. Go to **Account** in the main menu and switch to the **Settings** tab. In the **Your callback secret** section, click **Regenerate** to issue a new callback secret, then update this value in your external systems. In the **API key management** section, click **Generate API key**. In the **Generate API key** popup, enter the name for the API key and click **Generate**. The newly generated key will be displayed in the **API key is generated** popup: make sure to copy it and store it securely, as it only reveals once in this popup. The new API key entry is added to the list where you can revoke it anytime. ### Create a new account [#create-a-new-account] Create a new multisig account and define its initial configuration. In the topbar, expand the **account select**. Select **Create new account**. In the **Create account** popup, click **Create**. If a popup appears with the text “Creating new account will discard all unsaved changes,” decide whether to continue and click **Proceed** to move on or **Cancel** to keep working with the current account. In the **Create new account** popup: * Enter the account name. * Add one or more members. * Specify the number of signatures required for transaction confirmation. Then click **Create account**. In the **Confirm new account** popup, verify the summary of **Account name**, **Members**, **Required signatures**, and then click **Confirm**. The changes are processed according to the configured confirmation rules. ### Disconnect the wallet [#disconnect-the-wallet] Log out from the current account and return to the login screen. In the topbar, click the **account select**. Select **Logout**. In the **Logout confirmation** modal, confirm the action. You'll be redirected to the login page with account selection. The **address book** is a list of saved receiver addresses that you can reuse across payouts and other operations.\ Saving addresses reduces the risk of copying incorrect addresses and speeds up everyday workflows. ## Address list [#address-list] On this page, you can view a list of all saved addresses for the account. The following information is provided about each address: **Name** The label assigned to the address. *** **Address** The full blockchain address saved in the address book. Icons next to the value let you copy the address or open it in the block explorer. *** **Actions** The available actions for each saved address: * **Edit**: Opens the edit modal where you can update the address and its name. * **Delete**: Removes the entry from the address book after confirmation. ## Common use cases [#common-use-cases] The **Address book** page helps you keep a curated list of trusted receivers.\ This section describes common scenarios step by step. ### Add a new address [#add-a-new-address] Save a frequently used receiver address. Go to **Address book** in the main menu. If no addresses exist, click **Add address** in the center of the page. If the table already contains entries, click **Add address** in the upper right corner. In the **Add address to address book** popup: 1. Enter the receiver **Address**. 2. In the **Address name** field, enter a clear label for the address. It can be any combination of letters and numbers convenient for you. Click **Save** to add the address to the address book. The newly added address appears in the table and becomes available when you select receivers for payouts. ### Edit an existing address [#edit-an-existing-address] Update an address or rename it. Go to **Address book** in the main menu. In the table, locate the address you want to change and click the **pencil icon**. In the **Edit address** popup, update the **Address** and/or **Address name** values. Click **Save** to apply the changes. The updated name and address appear in the address list and are used wherever the address book is referenced. ### Delete an address [#delete-an-address] Remove an address that is no longer needed. Go to **Address book** in the main menu. In the table, locate the entry you want to remove and click the **bin icon**. In the **Delete address from address book?** confirmation popup, review the message and click **Delete** to confirm or **Cancel** to keep the address. After deletion, the address no longer appears in the list and is not offered as a saved receiver. The **Apps** page is a catalog of integrated third-party applications that work directly with your account. Unlike external dApps that you connect through [WalletConnect](dapps), integrated apps run inside the B2BINPAY DeFi interface and route their on-chain actions through your account [queue](queue) for multisig approval. To open the catalog, go to **Apps** in the main menu. ## Availability [#availability] Each app card shows the app name, a short description, and tags that describe its category. An app is available only when both conditions are met: * The active network is **EVM-compatible**. On a TVM (TRON) account, EVM-only apps are disabled with the message *TVM network doesn't support this app. Switch to EVM account*. * The account is **deployed** on the selected network. If it isn't, the app is disabled with the message *To use the app, deploy the account on the selected network first*. When an app is unavailable, its card is greyed out and a tooltip explains why. To enable it, switch to a supported network or activate the account on the current network. ## CoW Swap [#cow-swap] **CoW Swap** is a decentralized exchange aggregator that provides MEV-protected token swaps through batch auctions. It is available for EVM-compatible accounts. Because every swap is performed by your multisig account, the swap and any required token approval don't execute immediately. Instead, they enter the [Queue](queue) as operations that the required number of signers must approve, the same way payouts and configuration changes do. ### Make a swap [#make-a-swap] ### Open CoW Swap [#open-cow-swap] On the **Apps** page, click the **CoW Swap** card. The CoW Swap widget opens inside the interface. ### Build the swap [#build-the-swap] In the widget, select the token to sell, the token to buy, and the amount. Review the quoted price, fees, and expiry, then confirm the swap. ### Approve in the queue [#approve-in-the-queue] The swap (and a token approval, if one is needed) is added to the account [queue](queue) as an operation. Go to the **Queue** page, collect the required signatures, and execute the operation. Once executed, CoW Swap settles the order on-chain and the resulting balances appear on your **Account** and **Transfers** pages. A swap depends on funds held by the account. Make sure the account holds enough of the token you want to sell, plus the network's native currency to cover execution fees. ## Cross-chain transfer [#cross-chain-transfer] **Cross-chain transfer** moves funds from your account on one network to a recipient on another network. Like a swap, it runs through the account [queue](queue) for multisig approval and shows a live quote before you confirm. Open the **Cross-chain transfer** card to start. For the full flow, see [Cross-chain transfers](cross-chain-transfers). A **claim** is an operation that collects funds from invoice deposit addresses and transfers them to your account.\ Claims can be executed for a single invoice or grouped into batch claims. On accounts using smart contract version 1.2.0 or later, only account signers can claim funds. Addresses that are not signers can no longer perform claims, which protects deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. ## Claim list [#claim-list] On this page, you can view all uncollected funds that are available for claiming, grouped by invoice and currency. The following information is provided about each claim: **ID** The unique system identifier of a claimable position (invoice and currency combination).\ This value is generated automatically and can't be modified. *** **Received at** The date and time when funds were first received to the invoice deposit address in this currency. *** **Last received at** The date and time when the most recent payment was received for this invoice and currency. *** **Currency** The currency currently held on the invoice deposit address. *** **Amount** The total uncollected amount for this invoice and currency.\ If multiple transfers with the same currency were received to the invoice, they are aggregated into a single amount. *** **Transactions** The number of uncollected transactions in this currency for the invoice. This is a link that opens the list of underlying transfers associated with this claim. *** **Invoice ID** The identifier of the invoice for which funds are to be claimed.\ This is a link to invoice details. *** **Claim** Executes a [single claim](#execute-a-single-claim) for this invoice and currency. ## Common use cases [#common-use-cases] The **Claims** page provides a consolidated view of uncollected funds and helps you control when claims are executed.\ This section describes common scenarios step by step. ### Execute a single claim [#execute-a-single-claim] Collect funds for a specific invoice and currency directly from the **Claims** page. Go to **Claims** in the main menu. Locate the row corresponding to the invoice and currency you want to collect and click **Claim**. In the **Sign claim** popup, review the details, and click **Sign**. After the claim is completed, it will disappear from the list. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. ### Create a batch claim [#create-a-batch-claim] Collect funds from several invoices at once. Go to **Claims** in the main menu. Click **Create batch claim** in the upper right corner. The button is active only when more than one claim that can be collected together is available. In the **Create batch claim** popup, select a currency, then click **Next step**. Mark the checkboxes of the claims you want to include in the batch, then click **Batch claim**. In the **Sign batch claim** modal, review the account address and the total amount being claimed, then click **Save**. In the **Sign claim** popup, review the details, and click **Sign**. After the batch claim is completed, all related claims will disappear from the list. On the **Transfers** page, a corresponding number of new transfers with the *Claim* type will appear, providing full transaction information. Once the transfers are assigned the *Executed* status, funds will be credited to the account address. The **Credits** page helps you track your balance and usage, understand pricing, and fund your account with crypto. The upper section contains the key balance and pricing information: **Credits balance** The current number of credits available on your account. This value updates after each top-up and whenever credits are spent. *** **Top up** The **+ Top up** action that opens the funding flow. *** **Credit price** The fixed credit-to-crypto rate shown on the page. *** **Credits used** The number of credits already spent within the selected time range. *** **What we charging for?** A link that opens the pricing rules and explains how credits are charged per operation. Below the balance section, the page is divided into two panels: **History of credits** The chart shows how your credit balance changes during the selected period. Use the date selector above the chart to switch the range. *** **Top-ups** A list of completed top-ups with their details. ## Common use cases [#common-use-cases] ### View credit balance and pricing [#view-credit-balance-and-pricing] Check your current credit balance, plan, and request pricing. Go to **Credits** in the main menu. On the **Credits** page: * View your **credit balance** and **used credits** in the upper part of the page. * View your **top-up history** in the lower part of the page. Click **What we charging for** in the upper part of the page to see how many credits are charged per each operation and how pricing is applied to your plan. ### Top up the credit balance [#top-up-the-credit-balance] Add more credits to your balance using cryptocurrency. Go to **Credits** in the main menu. Click **+ Top up** in the balance section (upper part of the page). In the **Top up credits** popup, select the payment currency and enter the amount you want to add. Review the auto-calculated number of credits, then confirm the payment, and follow the instructions on the payment page to send funds from your wallet. A **cross-chain transfer** moves funds from your account on one network to a recipient on another network, without leaving the B2BINPAY DeFi interface. Transfers are routed through the account [queue](queue) for multisig approval, the same way as payouts. You reach the feature from the [Apps](apps) catalog: open the **Cross-chain transfer** card on the **Apps** page. ## Availability [#availability] Cross-chain transfers are available only when the provider is enabled for your account and the current network has bridgeable assets. When the service is unavailable, the app card is disabled and a tooltip explains why. ## Make a cross-chain transfer [#make-a-cross-chain-transfer] ### Open the form [#open-the-form] On the **Apps** page, click the **Cross-chain transfer** card. ### Choose source and destination [#choose-source-and-destination] Select the currency to send from your account, the destination network, and the currency to receive on that network. Only assets and network pairs that can be bridged are offered. ### Enter the amount and recipient [#enter-the-amount-and-recipient] Enter the amount to send and the recipient address on the destination network. A quote is fetched automatically and refreshed as you type. It shows the amount that will arrive, the bridge fee, the route, and the estimated delivery time. Each quote has a countdown and refreshes automatically when it expires. ### Confirm [#confirm] Review the confirmation summary — source and destination networks, the next queue **Nonce**, recipient address, amounts, fee, and route — then confirm. Confirming does not send funds immediately. It creates an operation in the account [queue](queue) and assigns it the next nonce. ### Collect signatures [#collect-signatures] Go to the [Queue](queue) page and open the cross-chain transfer operation. The required number of account signers must sign it before it can run. See [Sign transactions](queue#sign-transactions). ### Execute [#execute] Once all required signatures are collected and the operation has the smallest nonce in the queue, execute it to send the transfer on-chain. See [Execute transactions](queue#execute-transactions). The bridge fee is paid in the network's native coin and is debited from the account balance in addition to the transfer amount. Make sure the account holds enough of both the currency you send and the native coin to cover the fee. ## Track a transfer [#track-a-transfer] After execution, the transfer is delivered across chains by the bridge. Open the operation details to follow its progress through the delivery states — from *Awaiting confirmation* and *Transfer initiated* to *Cross-chain delivery in progress*, and finally *Delivered* or *Delivery failed*. The details view also provides a link to the cross-chain explorer and the destination transaction hash once the funds arrive. The **dApps** feature lets you connect external decentralized applications to your B2BINPAY DeFi account through the **WalletConnect** protocol. Connected dApps can request transactions and message signatures, which are routed to the account queue for multisig approval. The **dApp connection** control is only visible when both conditions are met: * The current account is on an **EVM-compatible network** (the feature is not available for TVM networks such as Tron). * The account's smart contract version is **1.1.0 or later**. For earlier contract versions, upgrade the account to use dApps. ## Access the dApp panel [#access-the-dapp-panel] The dApp connection control is located in the header, next to the wallet selector. The button indicates the current state: * **No badge, no dot**: No active sessions and no pending messages. * **Green dot**: At least one active dApp session. * **Red badge**: Pending messages or transactions from connected dApps await approval in the queue. The badge shows the number of pending items. Click the button to open the **dApp** side panel, which contains the URI input field and the list of active sessions. ## Common use cases [#common-use-cases] ### Connect a dApp [#connect-a-dapp] Connect a new dApp to the current account using a WalletConnect URI. In the external dApp, choose **WalletConnect** as the connection method and copy the connection URI (for example, `wc:...`). In the B2BINPAY DeFi app, click the **dApp connection** button in the header. Paste the URI into the **WalletConnect URI** input and click **Connect**. In the **Session approval** popup, review: * The dApp **name**, **icon**, and **URL**. * The **verification status** — `VERIFIED`, `UNKNOWN`, or a warning if the dApp is flagged as malicious. * The list of **networks** the dApp requests access to. * The **connected account address**. Then click **Approve** to establish the session or **Reject** to cancel the request. The **Approve** button is disabled if the dApp requests unsupported WalletConnect methods or is flagged as malicious. In those cases, only **Reject** is available. ### Approve a dApp transaction request [#approve-a-dapp-transaction-request] When a connected dApp requests a transaction, a modal appears for your review. In the **Transaction approval** popup, review: * The **dApp** name and icon. * The **From** and **To** addresses. * The transaction **Value**. * The raw **Data** (hex calldata) — use the **Copy** icon to copy it. * The **Decoded data** section, when available — shows the function signature and parameter values. Click **Approve** to send the request to the queue as a dApp transaction, or **Reject** to decline. Open the **Queue** page to collect required signatures and execute the operation. See [Queue](queue) for details. ### Approve a dApp message signature request [#approve-a-dapp-message-signature-request] When a dApp requests a personal or typed-data signature, a separate modal appears. In the **Message signature** popup, review: * The **dApp** name and icon. * The **Message** contents. * The **Required signatures** count for the current account. * The **Address** and raw **Hex** under the collapsible details section. Click **Sign** to add the message to the queue for multisig signing, or **Reject** to decline. ### View and disconnect active sessions [#view-and-disconnect-active-sessions] Click the **dApp connection** button in the header to open the side panel. Under the URI input, review the list of active sessions with dApp names, icons, and session details. Click the **Disconnect** action next to a session to terminate it and confirm the action in the popup. Disconnecting does not cancel pending dApp transactions already in the queue — handle them on the **Queue** page. ## dApp-initiated transactions in the queue [#dapp-initiated-transactions-in-the-queue] Transactions created from a dApp request appear in the **Queue** list with the following characteristics: * The **Operation** column shows the **dApp name and icon** instead of a generic type label. * Clicking the dApp name link opens the dApp's URL in a new tab. * Canceling or deleting the operation from the queue sends a cancellation event back to the dApp. For the full queue workflow, see [Queue](queue). An **invoice** is a request for cryptocurrency payments that generates a unique deposit address for receiving funds. Funds received to this address must be [claimed](#claim-funds) to the account address (smart contract). ## Invoice list [#invoice-list] On this page, you can view a list of all invoices created for your accounts. The following information is provided about each invoice: **ID** The unique system identifier of an invoice.\ This is a link to invoice details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the invoice was created. *** **Updated at** The date and time of the most recent status change or payment receipt. *** **Currency** The payment currency or asset list. * If a single currency was selected, this field shows the asset symbol and name. * If more than one currencies were selected, this field shows the number of selected assets. * If no currency was specified, this field displays `—` and payers can pay the invoice in any supported currency. *** **Requested amount** The amount to be paid in the selected currency. * If a single payment currency was specified, this field shows the requested amount. * If no currency or more than one currencies were specified, this field displays `—`. The value can be specified when creating an invoice and can be modified later. *** **Paid amount** The total amount paid so far, in the payment currency. * If more than one currencies were specified, this field displays the amount converted to the account base currency. * If no payments were received, this field displays `—`. *** **Status** The current invoice status. Possible values: * **Created**: The invoice was created and is awaiting payments. * **Paid**: The invoice with the indicated amount was paid in full (for invoices with indicated amount). * **Unresolved**: The amount of an incoming transfer is greater than the invoice amount (for invoices with indicated amount). *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. This value can be specified when creating an invoice and can be modified anytime. ## Invoice details [#invoice-details] To access invoice details, click an invoice **ID** in the invoice list. In the upper part of the page, you can find essential information about the invoice — click the **chevron** icon to expand it: * The invoice identifier and current status. * The payment currency (if defined). * The requested amount (if specified). * The paid amount. * The created and updated timestamps. * The invoice address. * The link to the payment page. The information below is divided into tabs. On this tab, you can access and change invoice settings and advanced options. If the currency was selected for the invoice, the following fields are available: **Currency** The payment currency associated with the invoice. *** **Status** The current invoice status. *** **Requested amount** The invoice amount, in the payment currency. *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other invoice events. Can be changed anytime. *** **Payment page URL** The link that is displayed as a button on the payment page. Can be changed anytime. *** **Payment page button name** The custom name of a button displayed on the payment page. Can be changed anytime. On this tab, you can find a list of transfers associated with the invoice. **ID** The unique system identifier of a transfer.\ This is a link to transfer details. *** **Created at** The date and time when a transfer was received by B2BINPAY. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain transaction identifier, the same as the transaction hash.\ This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The transaction amount, in the payment currency. *** **Blockchain fee** The blockchain fee charged for this transfer, in the payment currency.\ The total fee reflects all claim attempts, including failed ones. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Operation ID** For invoices and payouts: The unique operation identifier in the system. This is a link to operation details. On this tab, you can view claim operations related to the invoice and trigger new claims. At the top of the tab, a set of cards may show uncollected balances per network or currency, including: * **Uncollected tx**: The number of transactions that were deposited but not yet claimed. * **Uncollected balance**: The total amount available to claim for this currency. Each card contains a **Claim** button that starts a [claim flow](#claim-funds) for that asset. On this tab, you can view a list of callbacks sent for the invoice. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. ## Common use cases [#common-use-cases] The **Invoices** page helps create payment requests, monitor their status, and claim collected funds.\ This section describes common scenarios step by step. ### Create a new invoice [#create-a-new-invoice] Create a new invoice and generate a payment page for your customers. Go to **Invoices** in the main menu. Click **Create invoice** in the upper‑right corner. Fill in the **Main details**: * From the **Payment currency** dropdown, select the asset you want to receive or leave the field empty if the payer should be able to pay in any supported currency. * In the **Amount** field, optionally enter the amount to be paid in the selected currency. If you leave this field empty, the invoice will not enforce a specific amount. Fill in the **Advanced options**: * In the **Tracking ID** field, optionally enter an invoice identifier to track the invoice-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about invoice events. * In the **Payment page URL** field, provide the link that should be displayed as a button on the payment page. * In the **Payment page button name**, specify the custom name of a button displayed on the payment page. Click **Create**. The newly created invoice will appear in the list. You can access and manage its settings anytime by clicking the invoice **ID**. ### View invoice details [#view-invoice-details] Track invoice-related transfers, callbacks, and claims. Go to **Invoices** in the main menu. In the invoice list, locate the required invoice and click its **ID** to open details. Switch to the **Transfers** tab to see all payments associated with the invoice, including **Status**. Switch to the **Claims** tab to review claim operations and their statuses or to see uncollected balances per currency. Switch to the **Callbacks** tab to review callback history. ### Claim funds [#claim-funds] Claim funds that were deposited to the invoice address but not yet collected to the account. Go to **Invoices** in the main menu and click the required invoice **ID**. Switch to the **Claims** tab and locate cards with uncollected transactions and a non‑zero uncollected balance. Click **Claim** on the card. In the **Sign claim** popup, review the details, and click **Sign**. Repeat for other claims. After the claim is completed, it will disappear from the **Claims** tab. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. You can also claim funds from the [Claims](claims) page, including batch claiming of several transactions at a time. The **Overview** page is the dashboard you see right after you sign in and select an account. It summarizes your account activity in one place and gives you quick shortcuts to the most common actions. To open it, go to **Overview** in the main menu. ## Select a time period [#select-a-time-period] A period selector at the top of the page controls the time range used for the activity cards and charts. You can choose: * **Last week** * **Last month** * **Last quarter** The totals, inflow and outflow figures, and the finance volume chart update to reflect the selected period. Balances and pending operations always show the current state, regardless of the period. ## Summary cards [#summary-cards] The upper part of the page shows three summary cards with the headline numbers for your account. * **Total balance**: The total value of your account across all assets, converted to your [base currency](../get-started/key-terms#base-currency), along with the **Uncollected funds** that are still waiting to be claimed from invoice addresses. Use the **Claim** action to collect those funds. * **Total invoices**: The number of invoices created in the selected period and the **Inflow** they generated. Use the **Invoice** action to create a new invoice. * **Total payouts**: The number of payouts in the selected period and the **Outflow** they represent. Use the **Payout** action to create a new payout. All amounts are shown in your base currency. ## Asset allocation and finance volume [#asset-allocation-and-finance-volume] The middle section gives you a more detailed view of where your funds are and how they move over time. * **Asset allocation**: A breakdown of your account balance by asset, showing each currency and its share of the total. If you have no assets yet, the card explains that assets appear automatically after you claim an invoice or receive a payment. * **Finance volume**: A chart of inflow and outflow over the selected period. You can switch between a bar chart and a line chart. The chart stays empty until you create your first invoice or payout. ## Status cards [#status-cards] The lower section helps you keep track of operations, credits, and network health. * **Network status**: The synchronization state of each supported network — **Synced**, **Syncing**, or **Unavailable** — together with the **Last block** processed for the network. Use this card to confirm that the app is up to date with the blockchain before you act on balances or operations. * **Operations in queue**: The number of multisig operations **Ready to execute** and the number **Waiting for sign**. Use the **Check** action to open the [Queue](queue) and sign or execute pending operations. * **Credit balance**: Your current **Credit balance**, the amount **Burnt** in the selected period, and the **Forecast expenses** per month. Use the **Top Up** action to add credits. For details, see [Credits](credits). The Overview reflects the network selected in the app header. Switch the network to see balances, activity, and pending operations for a different blockchain. A **payout** is an outgoing on‑chain transfer from your account.\ Payouts are created in the app and added to the queue with a specific nonce, signed by account members, and executed once the required signatures are collected. ## Payout list [#payout-list] On this page, you can view a list of all payouts created for the selected account and network. The following information is provided about each payout: **Payout ID** The unique system identifier of a payout.\ This is a link to payout details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the payout was created. *** **Updated at** The date and time of the most recent status change for the payout. *** **Amount** The payout amount, in the payment currency. *** **Currency** The payout currency. *** **Created by** The account name and address of the user who created the payout. *** **Receiver** The receiver’s address or saved contact name, shown in a short format. *** **Status** The current payout status. Possible values: * **Created**: The payout has been initialized in the system but has not yet been signed. * **Signed**: The transaction has received the required number of signatures. * **Sent**: The signed transaction has been sent to the blockchain and is awaiting confirmation. * **Executed**: The transaction has been successfully confirmed on the blockchain and the payout is considered complete. * **Failed**: The transaction failed during signing, sending, or blockchain confirmation. * **Canceled**: The transaction was replaced, rejected, or deleted by a user. *** **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. This value can be specified when creating a payout and can be modified anytime. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron** icon to expand it: * The payout identifier and current status. * The address and name of the user who created the payout. * The payout currency. * The payout amount in the payment currency. * The created and updated timestamps. * The receiver name and address in short format. * The number of collected and required signatures, for example `3/3`. The information below is divided into tabs. On this tab, you can view a list of account members that signed the payout. On this tab, you can view a list of callbacks sent for the payout. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. On this tab, you can access and change payout settings. **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other payout events. Can be changed anytime. ## Common use cases [#common-use-cases] The **Payouts** page helps create on‑chain withdrawals, coordinate signatures, and monitor payout callbacks.\ This section describes common scenarios step by step. ### Create a new payout [#create-a-new-payout] Create a new payout. Go to **Payouts** in the main menu. Click **Create payout** in the upper‑right corner. Fill in the **Receiver** info: * In the **Receiver address** field, enter the address where funds will be sent. You can select a receiver from the [Address book](address-book) (if added). Fill in the **Payment details**: * From the **Payment currency** dropdown, select an asset to be withdrawn. * In the **Amount** field, enter the payout amount in the selected currency. Fill in the **Advanced options**: * In the **Nonce** field, specify the transaction nonce number used in the queue for this payout.\ By default, the field is prefilled with the next number in the queue. - If you leave the value as is, the payout is added as the last transaction in the [queue](queue). - If you set a value higher than the latest nonce in the queue, the payout is added as a new transaction that will be executed after existing ones. - If you set the nonce to match an existing transaction, a replacement transaction is created and both transactions are treated as [conflicting](queue#handle-conflicting-transactions) in the queue. - If you try to set a nonce lower than the first transaction in the queue, the *Nonce cannot be lower than first transaction in the queue* error appears and the payout can't be created. * In the **Tracking ID** field, optionally enter a payout identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about payout events. Click **Create** and confirm the payout details. The newly created payout appears in the list with the *Created* status and is added to the [Queue](queue) with the specified nonce. ### View payout details [#view-payout-details] View full payout information, including signers and callbacks. Go to **Payouts** in the main menu. In the payout list, locate the required payout and click its **ID** to open details. In the upper part of the page, review the payout status, the number of collected and required signatures, and other details. On the **Signed by**, view the list of members who have already signed the payout. Switch to the **Callbacks** tab to review callback history. Switch to the **Settings** tab to view or adjust **Tracking ID** and **Callback URL**. The **Queue** is a list of multisig operations that were created for the account but are not yet fully executed. The number of new operations requiring your attention is displayed on the counter near the **Queue** menu item. Each operation uses a **nonce** and requires a certain number of signatures from account members.\ Transactions must be processed in order: an operation with a smaller nonce needs to be executed before any operation with a larger nonce. ## Queue list [#queue-list] The information on this page is divided into tabs. On this tab, you can view a list of operations that are still waiting for signatures or execution. The first block on the tab highlights the transaction that needs to be executed first.\ This block corresponds to the operation with the smallest **Nonce** in the queue. The following information is provided about each pending operation: **Nonce** The sequential number used by the smart contract to keep transactions in the correct order. The queue is sorted from the smallest nonce to the largest. *** **Created at** The time when the operation was added to the queue. The value is shown as relative time (for example, *5 minutes ago*) and can be viewed as a date and time in the details. *** **Operation** The type of the pending operation. Possible values: * **Payout** * **Multisig config change** * **Reject** * **Cross-chain transfer**: A transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **dApp transaction**: For operations initiated by an external dApp connected via WalletConnect, the column shows the dApp name and icon instead of the generic label. See [dApps](dapps). *** **Amount** For operations that change balances: the amount of the transaction. Amounts that reduce the balance are shown with a minus sign and include the currency, for example `-1,056.06 ETH`. For configuration operations, the value displays `—`. *** **Signatures** The number of collected signatures versus the required number, in the `X/Y` format (for example, `2/5` or `5/5`). *** **Action** The set of actions available for the current user and operation state. Possible values: * **Sign**: Available if the current user has not yet signed the operation and is allowed to sign it. * **Execute**: Available when all required signatures are collected and the operation has the smallest nonce in the queue. When an action is not available, the corresponding button is disabled or hidden. ### Operation details [#operation-details] Click the **chevron icon** to expand the operation details: **Created at** The date and time when an operation was created. *** **Created by** The account name and address of the user who created the operation. *** **Signed by** The list of accounts that already signed the operation, shown with names and addresses in the expanded view. *** **Action** Additional actions available for the current user and operation state. Possible values: * **Copy link**: Copy a direct link to the operation. The link can be shared with other signers to speed up collaboration. * **Reject**: Available when the operation can be replaced or canceled. On this tab, you can view a list of executed and failed operations. The table structure is similar to the **Pending** tab and additionally displays the **Status** column: all operations here are assigned a final status — *Success* or *Failed*. The history view helps trace which actions were executed, by whom, and with which result. ## Common use cases [#common-use-cases] The **Queue** page helps coordinate multisig actions between several accounts.\ This section describes common scenarios step by step. ### View the operation queue [#view-the-operation-queue] Review pending operations and see which transaction needs to be executed first. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. In the **This transaction needs to be executed first** block, review the first transaction with the smallest **Nonce**. Scroll down to the **Pending transactions** section to see all remaining operations in the queue, ordered by nonce from smallest to largest. If the queue is empty for the selected network, the *There are no transactions yet* message appears instead of the table. ### Sign transactions [#sign-transactions] Sign a pending operation so that it can eventually be executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation that requires your signature and verify that: * Not all required signatures are collected. * The **Sign** action is available, which confirms that you haven't yet signed it and you're authorized to. Then click **Sign**. In the **Sign transaction** popup, review and verify operation details before signing, and then click **Sign**. The **Sign** action for the corresponding operation will gray out signaling that you've already signed the operation. If your signature is the last required one, both **Sign** and **Execute** actions may be available, allowing you to sign and immediately [execute](#execute-transactions) the operation when conditions are met. ### Execute transactions [#execute-transactions] Execute a fully signed operation and send it to the blockchain. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to execute and verify that: * The required number of signatures is collected. * There are no other pending operations with a smaller **Nonce**. * The **Execute** action is available. Then click **Execute**. In the **Confirm transaction** popup, review the operation details and estimated fee, and then click **Execute**. The operation will display the *Executing* status for some time, and then will be moved from the *Pending* tab to the *History* tab. If your wallet lacks enough funds to cover the fee, the *Your connected wallet does not have enough funds to execute this transaction* error appears and the **Execute** button becomes disabled. ### Reject or replace transactions [#reject-or-replace-transactions] Reject or replace a queued transaction before it's executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to reject, expand the transaction row and click **Reject** if the option is available. Choose one of the available options in the popup: * **Replace with another transaction**: Propose a new transaction with the same nonce. Follow the creation flow in the opened transaction form or reuse an existing transaction from the queue; both the original and replacement transactions then appear as [conflicting](#handle-conflicting-transactions). * **Reject transaction**: Create an on‑chain cancellation transaction with the same nonce. Confirm the action in the **Reject transaction?** popup. After signing, a separate rejection transaction appears in the queue as [conflicting](#handle-conflicting-transactions) and can be executed instead of the original transaction. * **Delete from queue**: Remove the transaction locally (available when only one transaction with this nonce exists). Confirm your choice in the **Delete transaction?** popup. A new, empty transaction slot with the same nonce becomes available. ### Handle conflicting transactions [#handle-conflicting-transactions] Handle several transactions with the same nonce and execute only one of them. Go to **Queue** in the main menu. Identify groups of transactions marked as conflicting, indicated by a message *Conflicting transactions. Executing one will automatically replace the others.* Review the details of each conflicting transaction to decide which one should be executed. Execute the chosen transaction following the steps in [Execute transaction](#execute-transactions). After the chosen transaction is executed, check that **Execute** becomes unavailable for other conflicting transactions and that they disappear from the queue. ### Batch execution [#batch-execution] Execute several fully signed and sequential transactions in a single blockchain transaction. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Verify that: * There are multiple transactions in the queue. * All of them are fully signed. * Their nonces form a continuous sequence (for example: `5`, `6`, `7`). * The **Execute batch** button above the table is available. Then click **Execute batch**. In the **Batch execution** popup, review a list of transactions to be executed and their details and then click **Execute**. The executed transactions will be displayed on the *History* tab. ### View the queue history [#view-the-queue-history] Review the history of previously signed and executed operations. Go to **Queue** in the main menu. Switch to the **History** tab. Review the list of past operations. If needed, open the details for a specific operation to see its parameters and the list of signers. Use filters or sorting (where available) to focus on a particular period, operation type, or status, such as *Failed* operations that may require attention. **Staking** lets a TRON account freeze TRX to obtain **Energy** or **Bandwidth**, take part in TRON governance by voting for Super Representatives, and delegate resources to other addresses. Like every account action, staking operations are performed by your multisig account: each one enters the [Queue](queue) and must collect the required number of signatures before it executes. Energy and Bandwidth are renewable resources: TRON regenerates them over time. Use them to pay for your account's transactions without burning TRX, so processing on TRON costs you nothing while enough resource is available. ## Availability [#availability] Staking is available only when both conditions are met: * The active network is a **TVM (TRON)** network. * The account is **deployed** on that network and its smart contract version supports staking (version **1.2.1** or later). When staking is available, a **TRX Staking** group with the **Staking**, **Voting**, and **Delegation** items appears in the main menu. If the account isn't deployed on the selected network, a *No deployment in this network* placeholder is shown instead. The account balance shown on the **Account** and **Payouts** pages is the *spendable* amount. TRX that is staked, pending unstake, or waiting to be withdrawn is excluded, so it can't be spent by mistake. ## Staking [#staking] To open the page, go to **Staking** in the main menu. The upper part of the page shows four summary cards, each with its own action: * **Available**: The amount of TRX that can be staked. Use the **Stake** action to freeze TRX for Energy or Bandwidth. * **Staked**: The amount currently frozen. Use the **Unstake** action to begin releasing it. * **Pending unstake**: The amount that is unstaking and maturing before it can be withdrawn. Use **Cancel unstaking** to return it to the staked balance. * **To be withdrawn**: The matured amount ready to return to the account. Use the **Withdraw** action to collect it. Below the cards, a table lists staking operations with their status. Click a row to open the operation details. ### Stake TRX [#stake-trx] Freeze TRX to obtain Energy or Bandwidth. Go to **Staking** in the main menu and click **Stake** on the **Available** card. In the **Stake** popup, choose the resource to obtain — **Energy** or **Bandwidth**. Enter the amount of TRX to stake. The minimum is **1 TRX**. A preview shows the approximate amount of the resource you will receive at current network rates. Click **Stake**. The operation is added to the [Queue](queue), where the required number of signers must approve and execute it. ### Unstake TRX [#unstake-trx] Begin releasing staked TRX back to the account. Go to **Staking** in the main menu and click **Unstake** on the **Staked** card. Select the resource to release and enter the amount, at least **1 TRX**. The popup explains that unstaked TRX matures for a fixed number of days before it can be withdrawn. Click **Unstake** and approve the operation in the queue. The amount moves to the **Pending unstake** card. When it matures, it moves to **To be withdrawn**. While an amount is pending unstake, you can use **Cancel unstaking** to return it to the staked balance without waiting for the maturation period. ### Withdraw TRX [#withdraw-trx] Collect matured TRX back to the account balance. Go to **Staking** in the main menu and click **Withdraw** on the **To be withdrawn** card. Review the amount and click **Withdraw**, then approve the operation in the queue. Once executed, the withdrawn TRX is added back to the spendable account balance. ## Voting [#voting] The **Voting** page lets the account use its staking power to vote for TRON **Super Representatives** and claim voting rewards. To open it, go to **Voting** under **TRX Staking** in the main menu. The page shows three summary cards: * **Total** voting power and the amount **Available** to allocate, with the **Vote** action. * **Allocated** voting power, with the **Get Vote** action to obtain more voting power by staking. * **Claimable rewards**, with the **Claim** action. Below the cards, a table lists Super Representatives with your current votes. You can search and sort the list to find a specific representative. ### Vote for Super Representatives [#vote-for-super-representatives] Go to **Voting** in the main menu and click **Vote**. Allocate your available voting power across one or more Super Representatives. Confirm and approve the operation in the [Queue](queue). Voting power comes from staked TRX. If you don't have enough, use **Get Vote** to stake more TRX first. ## Delegation [#delegation] The **Delegation** page lets the account delegate its Energy or Bandwidth to another address and reclaim it later. To open it, go to **Delegation** under **TRX Staking** in the main menu. The page shows a delegation summary and a table of active delegations, each with the recipient address, amount, resource, and lock state. Use **Reclaim** in a row to return delegated resources to the account; the action is unavailable while a delegation is still locked. ### Delegate resources [#delegate-resources] Go to **Delegation** in the main menu and click **Delegate**. Enter the recipient address, the amount, and the resource to delegate — **Energy** or **Bandwidth**. The minimum is **1 TRX** of staked value. Confirm and approve the operation in the queue. **Transfers** are incoming or outgoing transactions made to or from your account. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your account. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically and can’t be modified. *** **Created at** The date and time when a transfer was created. *** **Operation** The transfer type. Possible values: * **Invoice**: The incoming payment associated with an invoice. * **Direct deposit**: The direct crediting of funds to an account address. * **Set account config**: The changing of an account configuration, such as adding/removing signers or modification of confirmation rules. * **Claim**: The claiming of funds from a deposit address to the account address. * **Payout**: The withdrawal of funds from an account. * **Cross-chain transfer**: The transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **Reject**: The operation rejection. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain identifier of a transaction, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The amount of a transfer, in the payment currency. For invoices, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. ## Transfer details [#transfer-details] To access transfer details, click a transfer **ID** in the transfer list. In the upper part of the page, you can find the essential information about the transfer — click the **chevron icon** to expand it: * The transfer identifier and current status. * The account address and name of a user who created the operation. * The payment currency. * The payment amount. * The date and time the transfer was created. * The TXID. This a link to the explorer. * The identifier of a related operation. This is a link to an invoice or payout. * The number of confirmations the transaction received on the blockchain. * The blockchain fee charged for transaction processing, in the payment currency. Below you can see a list of callbacks sent: **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values depend on the operation type (invoice or payout). *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. Bank withdrawals in fiat currencies are only available from Merchant wallets denominated in fiat currencies. To withdraw funds, you have to provide your bank details in advance. Consult your B2BINPAY manager about the procedure. Only users with the *Owner* role can create bank withdrawals. You can create a one-time withdrawal or regular withdrawal which is triggered every time when the wallet balance reaches a specific value. ## One-time withdrawals [#one-time-withdrawals] Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **One-time withdrawal** option and click **Proceed**. Select the bank details. In the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. Click **Submit** to create the withdrawal. After the withdrawal is created, it’s sent to the B2BINPAY Finance department for confirmation. Once confirmed and processed, the corresponding transfer will be assigned the *Confirmed* status. ## Regular withdrawals [#regular-withdrawals] Only one regular withdrawal can be connected to one wallet. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **Regular withdrawal when the amount is reached** option and click **Proceed**. Select the bank details. Select the withdrawal option: * **Fixed amount**: To withdraw funds immediately after the required amount is reached on the wallet. * **Changing amount**: To additionally specify the minimum amount that should be left on the wallet after the withdrawal. For fixed amount, in the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. For changing amount, specify the minimum non-reducible amount and minimum withdrawal amount. Click **Proceed** to create the withdrawal. After the withdrawal is created, you can see the **Regular withdrawal connected** tag near the corresponding wallet on the **Wallet management** > **Wallets** page. You can delete the regular withdrawal in the wallet settings. ## Deposits to Enterprise wallets [#deposits-to-enterprise-wallets] To create a deposit to your Enterprise wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited and click **Proceed**. Only Enterprise wallets are displayed in the list. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Address type** — for deposits to wallets denominated in BTC: an address format. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * the **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. ## Deposits to Merchant wallets [#deposits-to-merchant-wallets] To create a deposit to your Merchant wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited. Only Merchant wallets are displayed in the list. After you specified the wallet, a list of available payment currencies are displayed. Select the payment currency or activate the **Payer will choose currency by himself** toggle to allow your payers to select the payment currency. In this case, you’ll see a list of currencies available for payments. All payments will be credited in your wallet currency. If you specify the payment currency, below the currency list you’ll see the current exchange rate. Select the required option and click **Proceed**. If you select the payment currency, you can’t change this value after creating the deposit. If you don’t specify the payment currency, you can change this value later, until a payer selects the currency. 6\. If needed, specify the **Limits**. You can set: * the deposit amount in your wallet currency. You can change this value later. If you specify this value and the payment currency, the requested amount in the payment currency will be calculated automatically, according to the exchange rate displayed below. * the delta in your wallet currency. This value is only applicable if the requested amount is specified. You can change this value later. * the requested amount in the payment currency (only if you specified the payment currency). You can change this value later. If you specify this value, the requested amount in the wallet currency will be calculated automatically, according to the exchange rate displayed below. * the date and time when your deposit expires. You can change this value later anytime before the expiration time. You can change these values anytime. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Payout**. Select the type of a wallet: mark the **Enterprise wallet** or **Merchant wallet**, and then click **Proceed**. In the dropdown, select a wallet from which the payment amount will be debited. Only wallets of the selected type are available. For payouts from Merchant wallets, select the payment currency. If the payment currency differs from the wallet currency, the exchange rate is displayed. Enter the payment amount: * For Enterprise wallets, in the wallet currency. * For Merchant wallets, in the wallet or payment currency. Alternatively, you can select a percentage of your wallet balance to automatically calculate the payout amount. Possible options: 25%, 50%, 75%, or 100%. If needed, activate the toggles: * **Fee is included**: To deduct the blockchain fee from the payment amount, the remaining part will be credited to the receiver’s wallet. * **Commission is included**: To deduct the platform commission from the payment amount, the remaining part will be credited to the receiver’s wallet. If the toggles are inactive, the blockchain fee and platform commission are additionally debited from your wallet. If you selected **100%** in the previous step, the toggles are activated by default. The amount to be credited to the receiver’s wallet is calculated as *Available wallet balance* – (*Blockchain fee* + *Commission*). In the payout confirmation window, you'll see the **To be sent** amount which is the precise sum that will be credited to the receiver’s wallet. After making the payout, your wallet will have zero balance. For ETH, BSC, and TRX blockchains, the resulting balance may be positive due to the floating blockchain fee value. In the **Address** field, enter the destination address. You can save the entered address to your address book by activating the **Save to address book** toggle. Next time you can just pick it from the list by clicking **From address book**. For XRP and XLM, you can’t transfer funds within the same blockchain wallet. Choose the blockchain fee mode and click **Proceed**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. If needed, specify the **Advanced options** and click proceed. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. Click **Proceed** to create the payout. The newly created payout is now available in the payout list where you can monitor its status. Click the payout **ID** to access the details. If your payout got stuck on the blockchain due to low fee paid, refer to [How to speed up your payout by changing the blockchain fee](how-to-speed-up-your-payout-by-changing-the-blockchain-fee) to learn how to fix it. Internal transfers can be made between Merchant wallets denominated in the same currency and belonging to the same *Owner*. Such transfers are executed [off-chain](../../references/key-terms#off-chain-transaction) and aren't subject to any fees. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Internal transfer**. From the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets are available for selection. From the next dropdown, select a wallet to which funds should be transferred. Only Merchant wallets denominated in the same currency as the source wallet are available for selection. Enter the transfer amount. Alternatively, you can select a percentage of the source wallet balance to automatically calculate the transfer amount. Possible options: 25%, 50%, 75%, or 100%. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. The speed of the transaction processing depends on the blockchain fee selected when creating a payout: the lower the fee, the longer the transaction processing time. The following fee modes are available: * **Low**: The economy mode when speed doesn’t matter. * **Medium**: The optimal processing speed for a reasonable blockchain fee. * **High**: The priority transaction processing via high blockchain fees. * **Custom**: The customized fee value: you can specify your own blockchain fee value. Mind that your custom value can’t be two times lower than the *Low* value and three times higher than the *High* value. The blockchain fee can vary, therefore we suggest that you refer to the links containing blockchain gas[^1] fees in the table below for more precise information about blockchain fee values. | Blockchain | Links for reference | | --------------- | ------------------------------------------------------------------ | | BNB Smart Chain | [https://bscscan.com/gastracker](https://bscscan.com/gastracker) | | Ethereum | [https://etherscan.io/gastracker](https://etherscan.io/gastracker) | [^1]: Commission charged for processing token transactions in the Ethereum blockchain. If your payout got stuck on the blockchain due to low fee paid, it’s possible to speed up its processing using the **Replace by fee** option. Go to **Transfers**. Select the transfer you need to speed up: filter transfers by the *Payout* type and *Unconfirmed* status. Click the transfer **ID** to go to payout details. Click the **Replace by fee** button. If a payout can’t be replaced, the button isn’t displayed. Select the new blockchain fee value and click **OK**. The updated fee level should align with the blockchain's fees. The existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. ## Create Swap wallets [#create-swap-wallets] To swap currencies, you need to have Swap wallets denominated in these currencies. For example, if you want to swap USDT for EUR between your Merchant wallets, you need to create two Swap wallets: one denominated in USDT and another denominated in EUR. Refer to [Create a Swap wallet](../manage-your-wallets/how-to-create-a-wallet#swap-wallets) for step-by-step-instructions. ## Top up the source Swap wallet [#top-up-the-source-swap-wallet] Transfer the funds you want to exchange to the created Swap wallet. 1. Go to **Swaps** > **Wallets**. 2. Select the required wallet and click the **wallet icon (Funds)**. 3. In the **Top up** section, select an Enterprise or Merchant wallet from which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Create a swap operation [#create-a-swap-operation] Next, create a swap operation to exchange funds between your Swap wallets. 1. Go to **Swaps** > **Swap**. 2. Select a tab for the desired swap mode: * **No slippage**: No slippage will be applied, the swap will be processed at the shown price unless it changes significantly. * **Client's slippage**: Your specified slippage will be applied, the swap will be processed at the latest price unless the set **Slippage tolerance** is exceeded. 3. In the **From** section, select a source Swap wallet from which you want to swap funds. 4. In the **To** section, select a target Swap wallet to which you want to swap funds. 5. Enter a swap amount, in either the source (**From**) or target (**To**) currency. The equivalent amount in the other currency is calculated automatically and along with the actual exchange rate is displayed below. 6. If you selected the **Client's slippage** mode, in the **Slippage tolerance** field, specify the acceptable price deviation threshold, in percents, or select from the predefined options. 7. Click **Preview swap** and check operation details. 8. Click **Confirm** to create a swap. The newly created swap operation is now available on the **Swaps** > **History** page where you can monitor its status and related payments. ## Withdraw funds from your Swap wallet [#withdraw-funds-from-your-swap-wallet] Finally, withdraw the exchanged funds from your Swap wallet to your Merchant or Enterprise wallet denominated in the same currency. 1. Go to **Swaps** > **Wallets**. 2. Select a wallet from which you want to withdraw funds and click the **wallet icon (Funds)**. 3. In the **Withdraw** section, select an Enterprise or Merchant wallet to which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds to an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers to Enterprise wallets are credited after receiving enough confirmations on the blockchain. Only users with the *Owner* role can access Custody wallets. ## Top up your Custody wallet [#top-up-your-custody-wallet] To top up a wallet: Go to **Custody** > **Wallets**. Select a wallet that you want to top up and click the **Funds** button. Select **Top up funds** and click **Proceed**. From the dropdown, select a wallet from which funds should be transferred. You can select: * Any Merchant wallet. * An Enterprise wallet denominated in the same currency as the target Custody wallet. Enter the amount of transfer. The amount must be greater than or equal to the minimum transfer amount set for the target Custody wallet. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Custody** > **History** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Withdraw funds from your Custody wallet [#withdraw-funds-from-your-custody-wallet] Mind that to withdraw funds from your Custody wallet, you have to pass video verification. The Accumulated commission will be charged from the Custody wallet along with a withdrawal. To withdraw funds: Go to **Custody** > **Wallets**. Select a wallet from which you want to transfer funds and click the **Funds** button. Select **Withdraw funds** and click **Proceed**. To withdraw funds **to an Enterprise or Merchant wallet**: 1. Select the **Wallet** destination. 2. From the dropdown, select a wallet to which funds should be transferred. The target wallet must be denominated in the same currency as the source Custody wallet. To withdraw funds **to an external address**: 1. Select the **External address** destination. 2. From the dropdown, select a network. 3. Enter the destination address. Enter the amount of transfer. When transferring funds to **an Enterprise or Merchant wallet**, choose the blockchain fee mode. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. Activate the **Fee is included** toggle to deduct the blockchain fee from the transfer amount, the remaining part will be credited to the target wallet. For example, if the amount is 100 and the fee is 20, then 80 will be credited (*100 – 20*). If the toggle is inactive, the blockchain fee is additionally debited from the source wallet. Click **Proceed**. Optionally, specify the **Advanced options**. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the withdrawal-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Click **Proceed**. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. In the popup, check the withdrawal details and click **Confirm**. To process a withdrawal, you have to pass video verification. Click **Complete verification** to proceed. You can do it later on the **Custody** > **Requests** page. The newly created withdrawal is now available on the **Custody** > **Requests** page where you can monitor its status. Mind that the withdrawal may take up to 48 hours to complete after submitting and passing video verification. You can add an address to the whitelist, so that payouts made to such an address will not require approval, regardless of their amount or the role of the user who made such a payout. You can create a whitelist either for a specific wallet or for the entire blockchain. In the latter case, the whitelist will apply to all your wallets on that blockchain. The wallet-level whitelists have priority over the blockchain-level whitelists. Only users with the *Owner* role can whitelist payout addresses. To whitelist addresses, you must have 2FA enabled. ## Whitelist an address for a blockchain [#whitelist-an-address-for-a-blockchain] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To blockchain** tab, select a blockchain from the **Blockchain** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Blockchains** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. ## Whitelist an address for a wallet [#whitelist-an-address-for-a-wallet] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To wallet** tab, select a wallet from the **Wallet** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Wallets** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. You can also manage whitelisted addresses on the **Address whitelist** tab in the wallet details. Only users with the *Owner* role can create wallets. ## Enterprise wallets [#enterprise-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Enterprise wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If you select a token as the wallet currency, you’ll be additionally asked to select a [parent wallet](#user-content-fn-1)[^1]. For wallets denominated in ETH, TRX, BNB, XRP, or XLM, select a wallet from which the [Activation fee](#user-content-fn-2)[^2] will be deposited, or enable the **Activate wallet later** toggle. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Minimum transfer amount** — the minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount will be automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more comma-separated email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. Wallets denominated in ETH, TRX, BNB, XRP, or XLM require the [Activation fee](#user-content-fn-2)[^2]. If you enabled the **Activate wallet later** toggle while creating such a wallet, it will remain in the *In progress* status. Deposit the required amount of funds to the wallet to activate it. You can find the deposit address in the wallet details. ## Merchant wallets [#merchant-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Merchant wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Site URL** — a link to your landing page or any other resources. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. ## Swap wallets [#swap-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Swaps** > **Wallets**. Click **Add swap wallet**. Select a wallet currency and click **Confirm**. Swap wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. The newly created wallet is now available on the **Swaps** > **Wallets** page and can be topped up and used for swap operations. ## Custody wallets [#custody-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Custody** > **Wallets**. Click **Add custody wallet**. Select a wallet currency. Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. Click **Proceed**. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. Click **Confirm** to create the wallet. The newly created wallet is now available on the **Custody** > **Wallets** page and can be topped up. [^1]: Enterprise wallet to which a token wallet is linked. [^2]: A deposit to activate your wallet. For more details: [#activation-fee](../../references/key-terms#activation-fee "mention") You can generate a report on wallet balances and transactions for a specific time period, and download it as a CSV file. The report contains information about all your Enterprise and Merchant wallets existing in the system during the specified time period. A report on wallet balances contains information about wallet transactions and balances for the custom time period. To create a report: Click your user icon in the upper right corner of the page and select **Reports**. Click **Download report**. Click the **calendar icon** to pick up start and end dates of the reporting period. Click **Download** to start creating the report. Mind that the report generating may take some time. Once generated, it’ll be automatically downloaded to your computer as a zip-archive containing the report file in the CSV format. In the downloaded report, for each wallet all possible transfer types are listed, regardless of the actual amount of funds. Refer to [Transfer types](../../references/transfer-types) for more details about operations. You can grant access to your Enterprise and Merchant wallets to other members of your team. Only users with the *Owner* role can grant access to wallets. To grant access, you need to add a new user and assign them a user role. Access can be managed either centrally from your profile menu, where you can see a list of all users and the wallets they have access to, or from the wallet details, where you can see the users who have access to that specific wallet. This article is focused on adding users. If you need to revoke access, refer to [How to restrict access to your wallet](how-to-restrict-access-to-your-wallet). If you need to adjust user roles, refer to [How to manage user roles](how-to-manage-user-roles). ## From your profile menu [#from-your-profile-menu] ### Add a new user [#add-a-new-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, click **Add new user**. From the dropdown, select a wallet to which you want to share access. Enter the email address of a user to whom you want to grant access. Click **Add**. A new user will be added to the **Staff** tab. By default, users are assigned the *Read only* role. See [How to manage user roles](how-to-manage-user-roles) for step-by-step instructions on how to change it. ### Share access to an existing user [#share-access-to-an-existing-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user to whom you want to grant access. Click **Add wallet access**. From the **Wallet** dropdown, select a wallet to which you want to share access. From the **Role** dropdown, select a role that you want to assign. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Add**. The user now have access to the wallet according to the assigned role. ## From the wallet details [#from-the-wallet-details] To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to share access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, click **Invite user**. In the **Invite new user** popup, enter the email address of a user to whom you want to grant access and select a user role. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Confirm** to invite the user. The user will receive an email invitation with a link to activate access to the wallet. You can revoke access anytime in the wallet settings by deleting the user from the access list. You can manage access to your wallets by assigning different roles to users. Refer to [User roles](../../references/user-roles) for more details. You can change access for a single wallet or for multiple wallets at a time. Only users with the *Owner* role can assign user roles to other users. The *Owner* role can't be assigned or changed. ## For a single wallet [#for-a-single-wallet] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Hover over a required wallet and click the **pencil icon** that appears to the right. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the specific wallet. ## For multiple wallets [#for-multiple-wallets] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Mark the checkboxes of required wallets. Mark the top checkbox to select all wallets. From the **Action** menu above the wallet list, select **Edit access**. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the selected wallets. You can revoke access to your Enterprise and Merchant wallets from other members of your team. Only users with the *Owner* role can restrict access to wallets. To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to restrict access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, select a user and click the **pencil icon** to change a user role or the **bin icon** to revoke user access. Click **Confirm** to apply changes. For additional security measures, you can also limit access to the system by the IP white list. For step-by-step instructions, refer to [How to whitelist IP addresses](../manage-your-profile-and-system/how-to-whitelist-ip-addresses). You can set thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of the role of the user who created such payout. The thresholds can be applied to withdrawals made by specific users or user groups. Only users with the *Owner* role can set withdrawal thresholds. To set a threshold: Go to **Wallet management** > **Wallets**. Select a wallet for which you want to set thresholds and click its **ID** to open wallet details. Switch to the **Thresholds** tab. Enable the **Thresholds** toggle. In the **Approvers** section that appears, specify who can approve the payouts. You can select one or more user roles (the *Owner* role is selected by default and can be deselected), individual users, or both. Select a required option: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Click **Add new threshold**. To set a threshold for users, from the **User/User group** dropdown select **User**, and then select one or more emails. The threshold will be applied when the specified user will make a payout. To set a threshold for user groups, from the **User/User group** dropdown select **User group**, and then select one or more groups. The threshold will be applied when users from the specified groups will make a payout. In the **Number of confirmations** field, enter how many approvals the payout will require. The default value is 1. Enter a threshold amount. Payouts with amounts exceeding the specified value will require an approval. For the **Max sum of payout per timeframe** option, set a timeframe: * Select **Minute**, **Hour**, or **Day**. * Enter a value greater than 0 (zero). Click **Add**. The newly added threshold is now available in the list. When a payout exceeding a threshold amount is created, it appears on the **Events** page, where all assigned Approvers can review and confirm it. Once the required number of confirmations is received, the payout is processed. To change a threshold, hover over it and click the **pencil icon** to go to threshold settings. To remove a threshold, hover over it and click the **bin icon**, and then confirm the deletion. ## Obtain API credentials [#obtain-api-credentials] Only users with the *Owner* role can generate API credentials. To get access to API: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Manage API access** section, optionally whitelist IP addresses for API access: refer to [How to whitelist IP addresses](how-to-whitelist-ip-addresses#restrict-access-to-api) for step-by-step instructions. Enable the **Activate API user** toggle. In the **Your API access credentials** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated API key and secret are displayed in the popup. Use **Copy** buttons to copy values. Mind that the credentials only reveal once in this popup. They can’t be accessed after the popup is closed and have to be regenerated. Now you can access the system via the API. The new API user with the *Admin* role is automatically granted access to all your wallets. ## Security tips [#security-tips] If sharing your API keys with other persons to set up integrations: * Use password managers for secure credential sharing. * Whitelist IP addresses for API access. * Generate new credentials after the setup is complete. ## Obtain a callback secret [#obtain-a-callback-secret] Only users with the *Owner* role can generate callback secrets. To get a callback secret: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **Callback secret** tab. In the **Your callback secret** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated callback secret displayed in the popup. Use **Copy** button to copy the value. Mind that the callback secret only reveals once in this popup. It can’t be accessed after the popup is closed and has to be regenerated. Now you can use the callback secret for [deposit](../../api-guide/deposit-methods#callback-verification) and [payout](../../api-guide/payout-methods#callback-verification) callback verifications. To change your password, you must have access to your profile. If you forgot your password and can’t log in to the system, please click **Forgot password?** on the log in page and proceed with the password resetting procedure. If you suspect your account has been compromised, immediately contact your B2BINPAY manager. To change the password: Click your user icon in the upper right corner of the page and select **Settings**. In the **Password** section, click the **Change password** button. In the **Set new password** popup, enter your current password, then enter and repeat a new password. Mind that the password must meet the following requirements: * Latin characters, numbers, and special symbols are allowed. * The minimum length is 8 symbols. * At least one upper-case character must be used. Click **Confirm** to apply changes. Your password has been successfully changed. Use the Google Authenticator app for receiving *Payment system 2FA* verification codes. If you lost your device or forgot the secret code and can’t get access to your account, contact your B2BINPAY manager. Mind that in order to restore access, you’ll be asked to provide all the necessary documents to verify your identity. To enable 2FA: Click your user icon in the upper right corner of the page and select **Settings**. In the **Two-factor authentication** section, activate the **Google Authenticator** toggle. Download and install the Google Authenticator app from AppStore or Google Play, and then click **Proceed**. Scan the displayed QR code with Google Authenticator or enter the code manually, and then click **Proceed**. In the **Enable Google Authenticator** popup, enter your password and click **Confirm**. The 2FA is enabled. Next time you log in, you’ll be asked to enter a 2FA verification code provided via the selected method. Mind that 2FA codes are one-time and time-sensitive. You can add your personal account of the AML provider as an additional level of verification. If enabled, after successfully passing the default B2BINPAY AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. To enable custom AML check: Click your user icon in the upper right corner of the page and select **Settings**. In the **AML check** section, activate the toggle. In the popup: 1. Select an AML provider. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). 2. Enter your AML provider credentials: API key and API secret. 3. Specify **Risk for alert** to receive email notifications on suspicious transactions, and **Risk for block** to block them. The values from 0 (zero) to 100 are supported. 4. In the **Retries max** field, specify the maximum number of attempts to resend a request in case the AML provider doesn't respond. Click **Enable** to finish setup. The additional AML check is now enabled. All incoming transfers are now subject to two AML checks. You can disable custom AML check or edit credentials anytime in your profile. Use the partner program to earn a percentage of B2BINPAY commissions from clients who sign up using your referral link. This guide explains how to choose a wallet for rewards and generate your referral URL. Only users with the *Owner* role can configure the partner program. Before you start, make sure you have at least one **Merchant** wallet in USD. This wallet will be used to receive partner rewards. For details, refer to [How to create a wallet](../manage-your-wallets/how-to-create-a-wallet). To start a partner program: Go to **Partner program**. In the **How it works** section, click the **Terms & conditions** link to review the program settings. In the **Unique referral URL** section, click **Select wallet** and select your Merchant wallet is USD. Once the link is generated, use the **Copy** button to copy it to the clipboard. Share the copied URL with partners who want to join B2BINPAY. When an invited client signs up through your link, passes KYB checks, and starts processing eligible transactions, their commissions begin generating partner rewards for your legal entity according to the program settings. You can track invited clients, their statuses, and rewards on the **Partner program** page in the **Invited partners** table. You can limit access to your legal entity Web UI and API by whitelisting trusted IP addresses. We recommend that you use this option to protect your finances. Only users with the *Owner* role can whitelist IP addresses. ## Restrict access to Web UI [#restrict-access-to-web-ui] This setting will apply to all users under this particular legal entity, including the *Owner*. Enter IP addresses carefully, otherwise you risk losing access to the system. To let your users access the system only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **IP whitelist** tab. In the **Specify IP addresses** filed, click the **pencil icon** and add trusted IP addresses. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system Web UI is allowed only from the specified IPs. All users currently logged in from untrusted IP addresses will be logged out. ## Restrict access to API [#restrict-access-to-api] To let your users access the system API only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Whitelist IP access** field, click the **pencil icon** and add trusted IP addresses. Press **Enter** after each IP. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system API is allowed only from the specified IPs. On this page, you can view a list of balance operations on your Custody wallets. Only users with the *Owner* role can access this section. ## Operation list [#operation-list] The following information is provided about each operation: **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Operation** The transfer type. Possible values: * **Custody wallet withdrawal**: The withdrawal of funds from a Custody wallet to an Enterprise/Merchant wallet or to an external address. * **Custody wallet top up**: The deposit of funds to a Custody wallet from an Enterprise or Merchant wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the wallet currency. *** **Created at** The date and time when a transaction was created. Only users with the *Owner* role can access this section. **Requests** are orders to withdraw funds from your Custody wallets. Only users with the *Owner* role can access this section. For step-by-step instructions, refer to [Withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet#withdraw-funds-from-your-custody-wallet). ### Key points [#key-points] * Regardless of where the funds are withdrawn — to a Merchant or Enterprise wallet, or to an external address — video verification is required for any withdrawal request. * Once submitted, a withdrawal request may take up to 48 hours to complete. ## Request list [#request-list] The following information is provided about each request: **ID** The unique system identifier of a request. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Status** The current status of a request. Possible values: * **Created**: The withdrawal request was created, but video verification hasn't yet been passed. * **Approved**: The withdrawal request was approved by a Compliance officer. * **Declined**: The withdrawal request wasn't approved by a Compliance officer. *** **Created at** The date and time when a request was created. *** **Action** The buttons are available for the requests that haven't yet been reviewed by a Compliance officer. * **Cancel**: Click this button to cancel the request. * **Verification**: Click this button to proceed with video verification. **Custody wallets** are accounts with an additional level of security. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. * You can only create one Custody wallet per currency. * To withdraw funds from a Custody wallet, you must create a request, pass video verification, and receive approval from a Compliance officer. * Withdrawals from Custody wallets can be made to any external address as well as to Merchant or Enterprise wallets denominated in the same currency. * You can top up Custody wallets from your Merchant or Enterprise wallets. For Merchant wallets, conversion is possible. Enterprise wallets must be denominated in the same currency as the target Custody wallet. * Fees are applied for storing funds on Custody wallets. Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and for each withdrawal from the Custody wallet. ## Wallet list [#wallet-list] On this page, you can view a list of all your Custody wallets created in the system. Click the **%** button above the table to view the applied commission tiers. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance / Available for withdrawal** The current total balance and the balance available for financial operations. The available balance is calculated as *Balance* – *Accumulated commission*. *** **Accumulated commission** The fee for storing the funds accumulated to date. This value is calculated daily, according to the tiers that you can see by clicking the **%** button above the wallet. The commission is charged on the first day of each month and when withdrawing funds. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **Created at** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **Funds** button to top up or withdraw funds. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, type (`C` for Custody), and status. * The wallet currency. * The total balance. * The balance available for withdrawal (calculated as *Balance – Accumulated commission*). * The accumulated commission. * The total balance in conversion to USD. * The date and time when the wallet was created. ### Wallet settings [#wallet-settings] In this section, you can view and manage the following wallet settings: **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. The list can be changed anytime. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#custody-wallets) * [How to top up or withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet) On this page, you can view all swap and other balance operations related to your Swap wallets. The content of the page is divided into tabs: On this tab, you can view a history of swap operations between your Swap wallets. The following information is provided about each operation: **ID** The unique system identifier of a swap. This is a link to swap details. This value is generated automatically at the moment of swap creation and can’t be changed. *** **Status** The current status of a swap. Possible values: * **Success**: The swap has been successfully completed, balances of Swap wallets have been updated. * **Failed**: The swap hasn’t been completed due to some technical issues. *** **Wallet from** The identifier and currency of a debiting wallet. *** **Amount from** The swap amount, in the debiting wallet currency. *** **Wallet to** The identifier and currency of a crediting wallet. *** **Amount to** The swap amount, in the crediting wallet currency. *** **Pair** The currency pair. The first currency in the pair is the currency in which the swap amount was specified. *** **Rate** The exchange rate of the first currency in the pair to the second currency, valid at the moment of a swap operation. *** **Created** The date and time of swap creation. On this tab, you can view a history of swap-related transfers on your Swap wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The system identifier, type, label, and currency of a wallet to or from which the transfer was made. This is a link to wallet details. *** **Operation type** Possible values: * **Swap withdrawal**: The withdrawal of funds from a Swap wallet to an Enterprise or Merchant wallet. * **Swap top up**: The deposit of funds to a Swap wallet from an Enterprise or Merchant wallet. * **Swap charge**: The debiting of funds from a debiting Swap wallet. * **Swap enrolled**: The crediting of funds to a crediting Swap wallet. *** **Amount** The amount of a transfer without commissions, in the wallet currency. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Created** The date and time when a transaction was created. **Swaps** are exchange operations between your Swap wallets. For step-by-step instructions, refer to [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds). ### Key points [#key-points] * Swap operations are fast and convenient. * Swap operations are [off-chain](../../references/key-terms#off-chain-transaction), and hence don’t require [block confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Swap operations are possible only between your own Swap wallets denominated in different currencies. * You can exchange all [available currencies](../../references/currency-codes), including fiat, coins, and tokens. * Funds from your Swap wallets can be transferred to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, and vice versa. Refer to [Wallets](wallets) for more details. **Swap wallets** are your virtual wallets for swap operations. ### Key points [#key-points] * Swap wallets can be denominated either in crypto or in fiat currencies. * You can only create one wallet per currency. * Swap wallets aren’t linked to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, but you can top up your Swap wallets from your Enterprise or Merchant wallets. All balance operations are allowed only between wallets denominated in the same currency. For example, if you create a Swap wallet denominated in USD, you can top it up only from your Merchant wallet denominated in USD. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction), and hence require block [confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Balance operations between Swap and Enterprise/Merchant wallets are displayed on the **Wallet management** > **Transfers** page. Swap operations between Swap wallets are available on the **Swaps** > **History** page and aren’t displayed on the **Wallet management** > **Transfers** page. ## Wallet list [#wallet-list] On this page, you can view a list of all your Swap wallets created in the system. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance** The current balance available for financial operations. *** **Created** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **wallet icon** to top up or withdraw funds, and the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, the date and time when a wallet was created in the system. * The wallet currency. * The current balance. The following content of the page is divided into tabs: On this tab, you can access and manage wallet settings. **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. On this tab, you can grant access to your wallet to other users: * Click **Invite user** to grant them access to the wallet. * Click the **bin icon** near the added user to revoke access. Mind that no user roles are applicable to Swap wallets: all added users are granted full access to balance and swap operations. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#swap-wallets) * [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds) [TRX staking](../../references/key-terms#staking) is a process of freezing funds for a certain period of time to get resources and additional profit. ### Key points [#key-points] * When staking, you can “exchange” your funds for resources, such as bandwidth or energy, which allow you to save on blockchain fees. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are available immediately after staking and are replenished throughout the day. * When staked, the funds remain on your wallet but are locked and can’t be used for financial operations. * You can unstake funds at any time after staking, but keep in mind that the unstaking process takes 14 days on the blockchain. Until then your funds remain locked. Unstaking is limited to 32 pending transactions. * For each staked TRX, you receive one vote. You can give your votes to one or more [Super Representatives](../../references/key-terms#sr) to gain rewards for each voting round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-assign your votes at any time. * Staking is only available for wallet *Owners*. ## General information [#general-information] In the upper part of the page, you can review the conditions of the TRX staking: * **Term**: The minimum period for which funds are blocked. * **Min amount of funds to stake**: The minimum allowed amount of TRX that can be staked. * **Commission from the reward**: The commission amount that will be deduced from the reward amount. The withdrawabale amount is calculated as follows: *Amount to withdraw – (Amount to withdraw × Transaction fee/100%)*. ## Wallets [#wallets] In this section, you can view your wallets denominated in TRX. The following information is provided about each wallet: **Wallet** The information about your TRX wallet: the wallet identifier, type (always `E` for Enterprise), label (if set), and total balance. *** **Accumulated reward** The reward from staking, which can be withdrawn. *** **Available / Total votes** The amount of votes. The **Available votes** are votes that haven’t yet been distributed among SRs[^1]. The **Total votes** is the sum of distributed and undistributed votes. *** **Actions** The action buttons: * **Withdraw reward**: Clicking this button opens the **Withdraw reward** popup where you can review withdrawal details such as a target wallet, withdrawal amount, transaction fee, and so on. Mind that reward claiming is available only once in 24 hours. The button is inactive if the **Accumulated rewards** is 0 (zero) or the reward was claimed less than 24 hours ago. * **Get votes**: Clicking this button leads you to the **Resources** tab of the **Wallet details** where you can stake TRX to get votes. [^1]: Super Representatives. For more information, see [#sr](../../references/key-terms#sr "mention") **Callbacks** are `POST`-requests sent to your callback URL, to notify about transaction-related events in the system. For more information, see [Callback](../../references/key-terms#callback) ## Callback list [#callback-list] On this page, you can view a list of callbacks. The following information is provided about each callback: **ID** The unique system identifier of a callback. This is a link to callback details. *** **Time sent** The date and time when a callback was sent. *** **Type** The callback type. Possible values: * **Confirmation**: The transfer has received a required number of [block confirmations](../../references/key-terms#confirmation-block). * **Fail**: The transfer failed. * **No transfer**: The deposit has expired or the payout wasn't approved, no transfer was created. * **Request rejection**: The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. * **Block**: The deposit was blocked by an AML provider, the transfer was canceled. * **Cancel**: The payout was blocked by an AML provider, the transfer was canceled. * **User confirmation**: The transfer has received a number of [block confirmations](../../references/key-terms#confirmation-block) specified by a client to receive an additional callback. * **Manual**: The callback was resent manually. *** **URL** The callback URL specified when creating a deposit or payout. *** **Status** The current status of a callback. Possible values: * **New**: The callback was created but hasn't yet been sent. * **In progress**: The callback has been sent and awaits a response. * **Failed**: The callback was sent and a negative response from the client server was received. * **Sent**: The callback was sent and a response with the HTTP code `200` from the client server was received. *** **Attempts** The number of attempts to send a callback. *** **Transfer ID** The unique system identifier of a related transfer. This is a link to transfer details. *** **Action** In this column, you can click the **Resend** button to resend the callback. ## Callback details [#callback-details] To access callback details, click a callback **ID** the callback list. In the upper part of the page, you can find essential information about the callback — click the **chevron icon** to expand it: * The callback identifier and status. * The callback type. * The date and time when sent callback was sent. * The number of attempts to send the callback. * The identifier of a related transfer. * The callback URL along with the copy button. The information below is divided into tabs: On this tab, you can see the JSON payload of a callback. On this tab, you can see a response received (if any) from a client server. **Deposits** are invoices that you create to receive payments to your wallets. ### Key points [#key-points] * The system accepts payments only in cryptocurrencies. Fiat payments to [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies can be made via the B2BINPAY Finance department. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Each [on-chain](../../references/key-terms#on-chain-transaction) transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a deposit, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. The fee amount is selected by a payer. * Information about new transfers associated with a deposit can be sent to your system via a [callback](../../references/key-terms#callback). * Each deposit can be assigned a special identifier by which the related transactions can be tracked in an external system. * For each deposit, a payment page is automatically generated. It can be useful to send payment details to your payers. The exchange rate on the payment page is frozen for 15 minutes after its creation. * For Merchant wallets, it’s possible to set time limits to specify the sum or expiration time for a deposit as well as payment limits to address possible payment amount variations due to rate changes. ## Deposit list [#deposit-list] On this page, you can view a list of all deposits to your wallets. The following information is provided about each deposit: **ID** The unique system identifier of a deposit. This is a link to deposit details. This value is generated automatically at the moment of deposit creation and can’t be changed. *** **Created** The date and time when a deposit was created. *** **Updated** The date and time when the deposit status was last updated or payment received. *** **Wallet type** The type of a wallet to which deposit-related payments are made. *** **Wallet** The label or system identifier of a wallet to which deposit-related payments are made. This is a link to wallet details. *** **Address** The deposit address. This is a link to the explorer. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the address generated depending on the payment currency selected by the payer and can’t be changed. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the payment currency selected by the payer and can’t be changed. *** **Label** The tag or name assigned to a deposit for easier locating it in the system. This value is set when creating a deposit and can be changed anytime. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. This value is set when creating a deposit and can be changed anytime. *** **Status** *Available only for deposits to Merchant wallets.* The deposits to Enterprise wallets are always assigned the *Invoice* status. The current deposit status. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Requested amount** The requested amount, in the wallet currency (only for deposits with indicated amounts). This value is set when creating a deposit and can be changed anytime. *** **Requested rate** If the payment currency differs from the wallet currency, this is the current exchange rate of a payment currency to the wallet currency. This value is updated with each payment received or the deposit status updated. If the deposit currency wasn’t specified, this field is empty until a payer selects the payment currency. *** **Paid amount** The total amount of funds that have already been received to the deposit address, in the wallet currency. *** **Enrolled amount** The total amount credited, in the wallet currency. This value is calculated as *Paid amount – Total commission amount*. *** **Expired at** The date and time of deposit expiration (only for Merchant deposit with indicated expiration time). ## Deposit details [#deposit-details] To access deposit details, click a deposit **ID** in the deposit list. In the upper part of the page, you can find essential information about the deposit — click the **chevron icon** to expand it: * The deposit identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The deposit currency (if defined). * The deposit address (if the payment currency is specified). * The link to a payment page. * The paid amount in the wallet currency. * The enrolled amount in the wallet currency (*Paid amount – Total commission amount*). The information below is divided into tabs: On this tab, you can access and change deposit settings. The content on this tab differs for Enterprise and Merchant deposits. **Currency** The payment currency. Available only for deposits to Merchant wallets, if the payment currency wasn’t specified. *** **Status** The current deposit status. Available only for deposits to Merchant wallets. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Limits** *Available for deposits to Merchant wallets only.* The time and payment limits. **Requested amount in wallet currency** The deposit amount, in the wallet currency. *** **Delta** *Applicable for deposits to Merchant wallets with indicated amounts.* The payment delta, in the wallet currency. The delta can be useful to address possible rate changes. For example, you create a deposit for 100 USDT with the expiration time of 10 minutes without specifying the payment currency. This means that the payer can pay in any currency within 10 minutes. But the rate of the currency pair may change within the specified time. In order to minimize your risks, you can set the delta value, for example of 5 USDT, which means that you expect payment from 95 USDT to 105 USDT (depending on the rate) within 10 minutes. The delta can be also useful when the payment currency is the same as the wallet currency. For example, you create a deposit with the indicated amount of 0.1 BTC, and the payer sends 0.1 BTC minus the commission, and thus you don’t receive the full amount of the deposit and the deposit can’t be transferred to the *Paid* status. To avoid such situations, enter the delta value. Mind that the delta must be less than the requested amount. *** **Requested amount in payment currency** The deposit amount, in the payment currency. If the deposit currency wasn’t specified, this field is unavailable until a payer selects the payment currency. *** **Expired at** The date and time of the deposit expiration. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of a payment currency to the wallet currency. If the deposit currency wasn’t specified, this is the exchange rate to a base currency (USD). The exchange rates are automatically updated. Click the **refresh icon** to see the current value. **Advanced options** Additional deposit settings. **Label** The tag or name assigned to a deposit for easier locating it in the system. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. *** **Callback URL** The URL for callback notifications on new payments. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field received. *** **Payment page URL** The link that is displayed as a button on the payment page. *** **Payment page button name** The custom name of a button displayed on the payment page. On this tab, you can find a list of payments to your wallet associated with the deposit. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Currency** The payment currency. On this tab, you can view the deposit history. **Created** The date and time of an action. **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. **Reason** The action type. Possible values: * **Created**: The deposit has been created. * **Changed**: The deposit has been changed. * **Deleted**: The deposit has been deleted. **Comment** The description of the action. **Field name** The field that has been changed as a result of the action. **Old value** The previous state of the field. **Actual value** The new state of the field. **See also:** * [How to create a deposit](../../how-tos/manage-your-assets/how-to-create-a-deposit) **Events** are system notifications that require your attention or action. Some actions can only be performed by users with the *Owner* and *Admin* roles. ## Event list [#event-list] On this page, you can find a list of all events logged in the system. The number of new notifications is displayed on the counter near the **Events** menu item. The following information is provided about each event: **ID** The unique system identifier of an event. *** **Created** The date and time when an event was logged in the system. *** **Updated** The date and time when an event was last updated. *** **Type** The event type. Refer to the **Event types** section below for details. *** **Operation ID** For events related to deposits or payouts, this is the unique operation identifier in the system. This is a link to deposit or payout details. *** **Action** The action button(s) applicable for this event type. ## Event types [#event-types] In the table below, you can find descriptions of all system events. [^1]: A notification sent to a user’s callback URL when a new transaction occurs on the blockchain. For more information, see [#callback](../../references/key-terms#callback "mention") [^2]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^3]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^4]: A user-created token in certain blockchains. For more details, see [#custom-token](../../references/key-terms#custom-token "mention") **Payout** are payments, withdrawals, and transfers made from your wallets. ### Key points [#key-points] * The system supports payouts in crypto currencies. For [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies, the system supports [Bank withdrawal](../../references/key-terms#bank-withdrawal) in fiat currencies with various options: one-time withdrawals and regular withdrawals of a fixed or floating amount. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Payouts involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Payouts between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a payout, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. You can choose the fee amount when creating a payout. * Information about new transfers associated with a payout can be sent to your system via a [callback](../../references/key-terms#callback). * Each payout can be assigned a special identifier by which the related transactions can be tracked in an external system. * You can save frequently used addresses to the Address book to save up time when creating regular payouts. ## Payout list [#payout-list] On this page, you can view a list of all payout from your wallets. The following information is provided about each payout: **ID** The unique system identifier of a payout. This is a link to payout details. This value is generated automatically at the moment of payout creation and can’t be changed. *** **Created** The date and time when a payout was created. *** **Label** The tag or name assigned to a payout for easier locating it in the system. This value is set when creating a payout and can be changed anytime. *** **Wallet type** The type of a wallet from which the payout was made. *** **Wallet** The label or system identifier of a wallet from which the payout was made. This is a link to wallet details. *** **Receiver** The blockchain address (abridged) of a receiver’s wallet. This is a link to the explorer. *** **Receiver (full)** The blockchain address (full) of a receiver’s wallet. This is a link to the explorer. *** **Status** The current payout status. Possible values: * **Waiting for approval**: For a payout created by a user with the *Withdrawal with approval* role: the payout was created and awaits the approval. * **Approved**: The payout was approved. * **Canceled**: The payout was canceled. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. This value is set when creating a payout and can be changed anytime. *** **Amount** The payout amount, in the payment currency. *** **Charged amount** The payout amount, in the wallet currency, including commissions charged. *** **Updated** The date and time when the payout status was last updated. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron icon** to expand it: * The payout identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The payment currency. * The paid amount in the payment currency. * The total commission amount charged for payout processing. * The destination address. The information below is divided into tabs: On this tab, you can access and change payout settings. **Label** The tag or name assigned to a payout for easier locating it in the system. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. *** **Callback URL** The URL for callback notifications on new transactions. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field is received. *** **Receiver** The receiver type (natural or legal person) and name. *** **Address** The receiver’s address, as defined by postal services. On this tab, you can find a list of transactions associated with the payout. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Currency** The payment currency. On this tab, you can view the payout history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The payout has been created. * **Changed**: The payout has been changed. * **Deleted**: The payout has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. **See also:** * [How to create a payout](../../how-tos/manage-your-assets/how-to-create-a-payout) * [How to create a bank withdrawal](../../how-tos/manage-your-assets/how-to-create-a-bank-withdrawal) * [How to create an internal transfer](../../how-tos/manage-your-assets/how-to-create-an-internal-transfer) * [How to select the optimal blockchain fee](../../how-tos/manage-your-assets/how-to-select-the-optimal-blockchain-fee) * [How to speed up your payout by changing the blockchain fee](../../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) **Transfers** are incoming or outgoing transactions made to or from your wallets, such as deposits, payouts, activation fees, payments for custom tokens processing, and so on. For a full list of possible types, refer to [Transfer types](../../references/transfer-types). ### Key points [#key-points] * The list shows all transactions, including canceled, failed, and others. * In this section, you can’t create a new transaction. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the transaction currency always matches the wallet currency. For [Merchant wallets](../../references/key-terms#merchant-wallet), the transaction currency may differ from the wallet currency. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Some transactions between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. * Each deposit passes the [AML](../../references/key-terms#aml) check. The check is performed on the side of an AML provider connected using the B2BINPAY Back Office. If during the AML check a payment is considered suspicious (red), it’s assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. Additionally, [custom AML verification](../../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) can be enabled for incoming transfers. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Created** The date and time when a transfer was created. *** **Wallet type** The type of a wallet to or from which the transfer was made. *** **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **AML risk** The status of built-in AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Custom AML risk** If enabled, the status of custom AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The label or system identifier of a wallet to or from which the transfer was made. This is a link to wallet details. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The amount of a transfer, in the payment currency. For deposits, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Amount target** The total amount of a transfer, in the wallet currency. *** **Target currency** The wallet currency. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Operation ID** For deposits and payouts, this is the unique operation identifier in the system. This is a link to operation details. ## Transfer details [#transfer-details] To access transfer details, click a **Transfer ID** in the Transfer list. In the upper part of the page, you can find the essential information about the transfer: * The transfer identifier, current status, and AML check result. * The information about your wallet to or from which the transfer was made: the wallet identifier, type (`E` for Enterprise and `M` for Merchant), label (if set), and current balance. Below you can see the transfer details: **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **Created at** The date and time when a transfer was created. *** **Updated at** The date and time when a transfer status was last updated. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The total amount of a transfer, in the payment currency. *** **Amount target** The total amount of a transfer, in the wallet currency. This field is only visible if the payment currency differs from the wallet currency. *** **Commission** The B2BINPAY fee charged for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for transaction processing, in the payment currency. Applicable only for on-chain transactions. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Rate** The exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. This field is only visible if the payment currency differs from the wallet currency. *** **Callback** The callback status. Applicable only for deposits and payouts. Possible values: * **Not needed**: The *Confirmations needed* field wasn’t specified for an associated deposit or payout. * **Sent**: The callback is sent. * **Not sent**: The callback hasn’t yet been sent (not enough confirmations received yet). *** **Operation ID** The unique operation identifier in the system. Applicable only for deposits and payouts. This is a link to operation details. *** **Description** Any comment for an operation made via the B2BINPAY Back Office. *** **Replace by fee** This option is available for payouts that got stuck on the blockchain due to a low fee amount. It allows you to change the blockchain fee amount. As a result, the existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. **Wallets** are your B2BINPAY accounts denominated either in crypto or in fiat currency. ### Key points [#key-points] * B2BINPAY offers two types of wallets: [Enterprise](../../references/key-terms#enterprise-wallet) and [Merchant](../../references/key-terms#merchant-wallet). * Enterprise wallets can be denominated in any [crypto currency](../../references/currency-codes) supported by B2BINPAY. Fiat currencies aren’t supported for the Enterprise wallets. Such wallets have their own addresses. All transactions involving Enterprise wallets are executed [on-chain](../../references/key-terms#on-chain-transaction). * Merchant wallets are virtual wallets. These wallets don’t have their own addresses; instead, a deposit address is generated for each deposit made to such a wallet. The Merchant wallets can be denominated in fiat currencies and cryptocurrencies supported for Merchant wallets. Transactions between B2BINPAY Merchant wallets can be executed [off-chain](../../references/key-terms#off-chain-transaction). You can withdraw fiat funds from your fiat Merchant wallets using a [Bank withdrawal](../../references/key-terms#bank-withdrawal). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * The wallet currency is selected during the wallet creation and can’t be changed afterwards. * You can create numerous Enterprise and Merchant wallets. * You can grant access to your wallets to other users so that they can perform balance operations depending on assigned roles. * [Activation fee](../../references/key-terms#activation-fee) is required for Enterprise wallets denominated in ETH, XRP, XLM, or BNB currencies. You can activate such wallets by depositing funds from your Merchant wallets. * Wallets denominated in tokens require [parent wallets](../../references/key-terms#parent-wallet). The parent wallet must be an Enterprise wallet created in the same blockchain as the token. Commissions for token processing are deducted from the parent wallet. Each parent wallet can serve as the parent for a single token wallet, it’s not possible to link two token wallets to the same parent wallet. * Enterprise wallets in the ETH and BNB-BSC blockchains can be duplicated. For example, for your wallet in ETH, an identical wallet and contract in BNB-BSC can be created. This feature can be useful if clients mistakenly send funds to the wrong blockchain. Each wallet can only be duplicated once. * You can stake funds on TRX wallets to gain TRON blockchain resources and save on blockchain fees. ## Wallets list [#wallets-list] On this page, you can view a list of all your Enterprise and Merchant wallets created in the system. The following information is provided about each wallet: **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Wallet type** The type of a wallet: Enterprise or Merchant. This value was selected when creating a wallet and can’t be changed. *** **Balance** The balance available for financial operations. *** **Pending** The sum of all deposit- and payout-related transactions that haven’t yet received the required number of confirmation blocks or passed AML check. This value is positive for incoming and negative for outgoing transactions. This balance can’t currently be used for financial operations. *** **Status** The current status of a wallet. Possible values: * **Active**: The wallet has been activated (if required) and can be used. * **In progress**: The wallet is now being registered in the system or requires the activation and currently unavailable. * **Not active**: The wallet hasn’t been activated due to some technical or blockchain issues. *** **Action** In this column, you can click the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier and status. * The wallet currency. * For wallets denominated in tokens, the parent wallet. * The available balance. * The pending balance. * For Enterprise wallets, the wallet address; for wallets denominated in XRP, the address type is additionally available for selection: * `Address`: The deposit address; the destination tag should be additionally specified for sending funds. * `X-address`: The deposit address with the destination tag included in it. No need to specify the destination tag additionally. The following content of the page is divided into tabs: On this tab, you can access and change wallet settings. The content on this tab differs for Enterprise and Merchant wallets. **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Minimum transfer amount** *For Enterprise wallets only.* The minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount are automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. In this case, you can see a new transfer with the *Canceled* status on the **Wallet management** > **Transfers** page; the [callback](../../references/key-terms#callback) isn’t sent. You will also receive a notification on the **Events** page, where you can confirm and accept such transfers manually. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Customer support emails** The comma-separated list of your customer support email addresses. These emails are displayed on the Payment page, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. *** **Site URL** *For Merchant wallets only.* The link to your landing page or any other resources. *** **Regular withdrawals** *For Merchant wallets denominated in fiat currencies only.* In this section, you can create a one-time or regular bank withdrawal. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. *** **Duplication** *For Enterprise wallets in the ETH, BNB-BSC, MATIC, and AVAX blockchains only.* This option allows you to copy your wallet blockchain address and contract to another blockchain. This way you can prevent sending funds to a wrong blockchain by mistake on behalf of a sender. You can duplicate each wallet only once. *For Enterprise wallets denominated in TRX only.* On this tab, you can stake and unstake TRX, and overview your resources. *For Enterprise wallets denominated in TRX only.* On this tab, you can get votes for staked funds as well as distribute them among SRs[^1] to further gain rewards. On this tab, you can view a wallet history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The wallet has been created. * **Changed**: The wallet has been changed. * **Deleted**: The wallet has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. On this tab, you can whitelist addresses, so that payouts sent to these addresses don't require approvals. See [How to whitelist a payout address](../../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for more details. On this tab, you can limit withdrawal amounts. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of user roles. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. For each threshold, you can specify how many approvals are required and which user roles and/or specific users act as *Approvers*. For example, you can set fewer approvals for smaller payouts and more approvals for payouts with greater amounts. See [How to set withdrawal thresholds](../../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) for more details. On this tab, you can grant other users access to your wallet and manage permissions. A checkmark in the **Approver** column indicates that the user was added as an *Approver* on the **Thresholds** tab. See [How to grant access to your wallet](../../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) and [How to restrict access to your wallet](../../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) for more details on managing wallet access. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet) * [How to generate a report on wallet balances](../../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) [^1]: Super Representatives. For more details: [#sr](../../references/key-terms#sr "mention") Explore the interface basics, create your first wallet, and set up essential protection Explore the interface basics, create your first wallet, and set up essential protection Dive deeper in the product Web UI, features, and business logic behind it Dive deeper in the product Web UI, features, and business logic behind it Follow the step-by-step tutorials illustrating solutions to the most common tasks Follow the step-by-step tutorials illustrating solutions to the most common tasks Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses Get acquainted with key terms and catalogs of values which are found here and there Get acquainted with key terms and catalogs of values which are found here and there Identify and address common issues quickly and effectively with our guides Identify and address common issues quickly and effectively with our guides ## July 31, 2026 [#july-31-2026] ### New features [#new-features] #### Admin UI [#admin-ui] ##### Fee level selection for AML withdrawals [#fee-level-selection-for-aml-withdrawals] When withdrawing funds from a blocked transfer (**Transfer → Blocked → AML Withdrawal**), you now choose the blockchain fee level — **Recommended**, **Low**, or **Custom** — and see the fee amount with its fiat equivalent before confirming. Previously, only the withdrawal address could be set, and refunds sent with a low fee were sometimes rejected by the network. *** ### Improvements [#improvements] #### Admin UI [#admin-ui-1] ##### Safer forms and smoother sign-in [#safer-forms-and-smoother-sign-in] The Admin UI adopts several usability behaviors from the client interface. After signing in, you return to the page you originally tried to open instead of the home page. Create and edit forms — including wallets, deposits, notifications, transfers, refunds, and user creation — now warn about unsaved changes before you leave the page, and the cursor is placed in the first field automatically. *** ### Resolved issues [#resolved-issues] #### Client UI [#client-ui] * Fixed the read-only **Secret** field in callback settings accepting pasted text; the control for viewing the secret now keeps a stable size instead of expanding with scrollbars. ## July 29, 2026 [#july-29-2026] ### Improvements [#improvements-1] #### Admin UI [#admin-ui-2] ##### Faster commissions page [#faster-commissions-page] The default commissions page now loads faster and no longer creates noticeable database load on every visit. #### Client UI [#client-ui-1] ##### Toncoin becomes Gram [#toncoin-becomes-gram] Following the rebranding of The Open Network's native coin, **Toncoin (TON)** is renamed **Gram (GRAM)**, and the network's tokens follow the same pattern — for example, **USDT-TON** becomes **USDT-GRAM**. Only the currency names and tickers change — balances, wallets, and transfers are not affected. *** ### Resolved issues [#resolved-issues-1] #### Admin UI [#admin-ui-3] * Fixed the **Company**, **Wallet**, **Currency**, and **Blockchain wallet** filters on the finance transfers page showing *Error* for administrators with the **Finance read only** role. #### Client UI [#client-ui-2] * Fixed **Approve** and **Cancel** actions in **Events** staying available for payout approval requests whose auto-cancellation time had already passed. * Fixed expired payout approval requests being reactivated when the auto-cancellation timeout was increased — the deadline is now set when the request is created. * Fixed *Request Rejection* callbacks being sent with the *Unknown* type. * Fixed the email search in **Wallets → Thresholds** returning unfiltered results and breaking words across lines in the suggestion list. ## July 24, 2026 [#july-24-2026] ### New features [#new-features-1] #### Client UI [#client-ui-3] ##### Commissions tab with your full fee schedule [#commissions-tab-with-your-full-fee-schedule] Account owners now have a **Commissions** tab showing the commission ladder at a glance — your current turnover, commission tier, and rate — along with the full list of tiers, minimum blockchain fees for each network, and bank fees for deposits and payouts. *** ### Improvements [#improvements-2] #### Admin UI [#admin-ui-4] ##### Faster transfer lists [#faster-transfer-lists] Opening a client's list of transfers now takes under a second instead of tens of seconds, and pending AML compliance checks no longer create noticeable background load. ##### Neutral messages for unexpected server errors [#neutral-messages-for-unexpected-server-errors] When an unexpected server error occurs, the system returns a neutral message with a short error ID instead of internal technical details. Share this ID with support to have the issue traced quickly. *** ### Resolved issues [#resolved-issues-2] #### Admin UI [#admin-ui-5] * Fixed spurious *Can not lock transfer in node* incidents raised when a small deposit was canceled on networks without transfer-locking support — Solana, EVM-based networks, Tron, and Algorand. * Fixed Solana multi-address collections being rejected as a whole batch with an *InvalidPayoutParameters* error when the number of addresses exceeded node limits — addresses are now split automatically to fit. * Fixed transportation transfers getting stuck indefinitely when an address received more funds than expected during collection — extra incoming funds no longer block confirming transfers already completed on the blockchain. ## July 17, 2026 [#july-17-2026] ### New features [#new-features-2] #### Admin UI [#admin-ui-6] ##### Changed User and Legal Entity columns in Action Requests [#changed-user-and-legal-entity-columns-in-action-requests] The **Action Requests** list now shows a **Changed User** column — the account a request applies changes to — and a **Legal Entity Name** column, each with its own filter. The legal entity name also appears as a separate line in the request details, and the list can now be exported. #### Client UI [#client-ui-4] ##### Reworked approval flow for withdrawals [#reworked-approval-flow-for-withdrawals] Withdrawal approval requests for Enterprise and Merchant transfers in the same currency no longer expire after 15 minutes — the request stays valid until it is approved or rejected. For conversion payouts, the request now shows a countdown timer to automatic cancellation, visible both in the client interface and in the Admin UI. ##### Automatic callback on Callback URL changes [#automatic-callback-on-callback-url-changes] When you set or change the **Callback URL** of a deposit or withdrawal, a callback with the operation's current status is now sent automatically — no need to contact support to have it re-sent. Support staff can also update a deposit's **Callback URL** on your behalf. ##### Smoother sign-up, 2FA setup, and wallet access [#smoother-sign-up-2fa-setup-and-wallet-access] This release bundles several usability refinements. **One-time password entry at sign-up.** During registration, you now set your password once, after confirming your email address, instead of entering it several times. **Clear 2FA names.** Two-factor authentication entries in your authenticator app are now clearly named — *B2BinPay Auth 2FA* and *B2BinPay Ops 2FA* — and include your email address, so entries for different accounts are easy to tell apart. **Clearer error messages.** Messages now state exactly what to do — for example, *B2BinPay Ops 2FA must be enabled to process payouts* or *Accesses to wallets cannot be granted until user is activated*. **Wallet access for API users right after activation.** An API user can now be added to wallets as soon as it is activated, without having to sign in first. **Tidier lists.** The **Regular Withdrawal** column is hidden when bank withdrawals are not available, and identifiers now use a unified format — for example, *Wallet #888*. *** ### Improvements [#improvements-3] #### Admin UI [#admin-ui-7] ##### Faster lists and dashboard statistics [#faster-lists-and-dashboard-statistics] Heavily used list pages — blockchain wallets, addresses, deposits, and transfers — now load faster, and so do the deposits and payouts statistics on the dashboard. *** ### Resolved issues [#resolved-issues-3] #### Admin UI [#admin-ui-8] * Fixed a false *Collected amount mismatch* error: unrelated incoming funds on an address are now included in the expected collection amount, so transportation transfers no longer get stuck in *Need review*. * Fixed an AML check failure for withdrawals linked to transfers without an associated wallet, which prevented such withdrawals from being processed. * Fixed an issue where conversion payouts could expire automatically regardless of their status. ## July 10, 2026 [#july-10-2026] ### New features [#new-features-3] #### Admin UI [#admin-ui-9] ##### Invited by search matches legal entity names [#invited-by-search-matches-legal-entity-names] The **Invited by** search in the **Partner Program** now also matches legal entity names, so legal entities no longer drop out of the search results. ##### Role-aware data in lists and detail pages [#role-aware-data-in-lists-and-detail-pages] Lists and detail pages across the Admin UI now show data according to your role and permissions, so each administrator sees exactly what their access level allows. #### Client UI [#client-ui-5] ##### Sign-in opens the production environment [#sign-in-opens-the-production-environment] After you pass **KYB** verification, an interactive sign-in always opens the production environment instead of Sandbox. If you sign out from Sandbox and have several legal entities, the one you last opened is selected. ##### Inactive API users hidden from wallet access [#inactive-api-users-hidden-from-wallet-access] Wallet access rights now show only active **API users**. For a user whose API access is not yet activated, the **API access → Wallets** tab shows an empty list. ##### Refreshed interface visuals and 2FA setup [#refreshed-interface-visuals-and-2fa-setup] The interface gets a refreshed look aligned with the latest design system: dialog overlays are lighter in the dark theme, connecting **Google Authenticator** for two-factor authentication follows a new flow with the confirmation code entered directly in the dialog, and the **How it works** screens in **Staking** and **Wallets** feature refreshed, theme-aware illustrations. *** ### Improvements [#improvements-4] #### Client UI [#client-ui-6] ##### Smoother actions in the Events list [#smoother-actions-in-the-events-list] The **Actions** column in **Events** now keeps a stable width, so buttons no longer shift as you work. While an action is in progress, a spinner replaces the button, and repeated or conflicting actions are blocked; if an action fails, the row returns to its previous state. *** ### Resolved issues [#resolved-issues-4] #### Admin UI [#admin-ui-10] * Fixed transportation transfers being confirmed without verifying the collected amount against the deposits actually received on the node — a mismatch now raises an incident instead of silently overstating the **Locked in node** balance and causing false *insufficient funds* errors later. #### Client UI [#client-ui-7] * Fixed the **Apply** button in the date and time picker not appearing disabled when it was inactive. ## July 2, 2026 [#july-2-2026] ### New features [#new-features-4] #### Admin UI [#admin-ui-11] ##### Read-only admin pages for orders, payouts, and wallets [#read-only-admin-pages-for-orders-payouts-and-wallets] The Admin UI gains new read-only pages: **Orders** and **Payouts** under **Operations**, and **Blockchain Wallets**, **Global Wallets Balance History**, and **Global Wallets Staking** under **Wallets**. The **Payouts** and **Swap Wallets** sections are now available in read-only mode too — fuller visibility into operations and balances without changing any data. ##### USD volumes for transfers in Dealing [#usd-volumes-for-transfers-in-dealing] In **Trading → Orders**, transfers now carry the same USD-normalized base and quote volumes already shown for swaps, removing the manual rate calculations previously needed for some Merchant wallets. #### Client UI [#client-ui-8] ##### Initial deposit link for duplicated blockchain deposits [#initial-deposit-link-for-duplicated-blockchain-deposits] When a deposit sent on the wrong network is automatically re-created on the correct network, the resulting **Duplicated Blockchain deposit** event now links directly to the original deposit. Instead of tracing callback or tracking IDs by hand, open the event and follow the **Initial deposit** reference to the deposit details. Deposit details also gain **copy buttons** for the **Tracking ID** and **Callback URL** under **Advanced options**. *** ### Improvements [#improvements-5] #### Admin UI [#admin-ui-12] ##### Transfers list filters, columns, and links [#transfers-list-filters-columns-and-links] The Admin UI **Transfers** list gains a **Wallet Type** column, a filter by internal transfer type, and a filter by client or blockchain wallet ID. Global and blockchain wallets now have distinct labels, and each links through to its own page. ##### Audit log filtering by event type [#audit-log-filtering-by-event-type] Audit log tables now filter on the **Reason** column, so you can show only one event type — for example *Password changed* or *Payouts blocked* — across the brand, group, user, and legal-entity logs. ##### Localized operation log comments [#localized-operation-log-comments] Log **Comment** entries are now built from translatable parts (field name, reason, old and new values) instead of a fixed English string, so they display in the selected language across the Client Management and Wallets logs. ##### Multi-select currency filters [#multi-select-currency-filters] Currency filters now use the same multi-select control as the client interface, and long currency lists load in pages as you scroll instead of all at once — removing the brief freeze when opening the dropdown. Matches are ordered with exact matches first, then names starting with your query, then the rest. ##### Owner ID and Legal Entity columns in reports [#owner-id-and-legal-entity-columns-in-reports] The **Transfers** and **Wallets** reports now include **Owner ID** and, where applicable, **Legal Entity Name** columns in the exported files. *** ### Resolved issues [#resolved-issues-5] #### Admin UI [#admin-ui-13] * Fixed a duplicate **Label** column shown in the Admin UI Deposits list and its column configurator. * Fixed the wallet balance-at-date finance report failing to generate, which could leave an export hanging. ## June 26, 2026 [#june-26-2026] ### New features [#new-features-5] ##### Low balance notifications [#low-balance-notifications] You can now set a **balance threshold** for each wallet and be notified automatically when the wallet balance falls below it. Each wallet has its own threshold field, with the value denominated in the wallet currency. When the available balance drops below the configured value, a notification is sent so you can top up in time — helping you avoid situations where end-user withdrawals fail because of insufficient funds on the wallet. ##### Unconfirmed transaction callbacks [#unconfirmed-transaction-callbacks] The system now sends a callback as soon as an incoming transaction is detected on the blockchain, before it has gathered the number of confirmations required to become *Confirmed*. This lets you notify your end users that their payment has already been seen by the system and is simply awaiting confirmations, rather than lost or stuck on the network. The result is fewer support enquiries and a smoother payment experience. *** ### Improvements [#improvements-6] ##### Multi-select currency filters [#multi-select-currency-filters-1] The **Currency** filter has been upgraded from a single-select to a multi-select control, so you can now filter a list by several currencies at once instead of one at a time. The multi-select filter is available on the **Wallets**, **Deposits**, **Payouts**, and **Transfers** pages, as well as in the **Access list**, **Bank details**, **Custody**, and **Swaps** sections. ##### Wallet list card view refinements [#wallet-list-card-view-refinements] Following the card view introduced for transaction wallets in the previous release, the wallets list has been refined with a **sort selector** and an improved **Table / Cards** view toggle, so you can order and display your wallets exactly the way that works best for you. ##### Operation ID filter for Callbacks [#operation-id-filter-for-callbacks] The **Callbacks** list now includes an **Operation ID** filter. This makes it easier to track down a specific callback during investigations — including callbacks that have no associated transfer, such as the *Request rejection* and *No transfer* types. *** ### Resolved issues [#resolved-issues-6] * Fixed a false *insufficient fee* error (code 4009) that could appear when withdrawing certain tokens, such as USDT-TRX and USDT-BSC. * Fixed an issue where creating a custom token incorrectly required the **Balance shift amount** field to be filled in. * Fixed an issue where the daily *transfer growing total* report was not delivered to Report Subscriptions. ## May 23, 2026 [#may-23-2026] ### New features [#new-features-6] ##### Column-based table filters [#column-based-table-filters] Table filtering across the Web UI has been redesigned to match the standard data-handling experience you know from Excel and Google Sheets. Filters are now embedded directly into table columns instead of being grouped in the side panel. The side panel remains available only for filters that cannot be represented within a column (for example, complex multi-parameter filters). An always-active **Reset all filters** button has been added to clear all applied filters in one click, and the column configurator now uses an updated icon for clearer visual hierarchy. This change brings filtering closer to the tools you already use day-to-day, reduces the number of clicks needed to refine large lists, and provides a single consistent way to work with tables across the entire platform. ##### Repeat Payout for failed withdrawals [#repeat-payout-for-failed-withdrawals] A new **Repeat payout** button has been added for payouts that have failed and contain no successful transfers. Previously, a failed withdrawal could not be retried — you had to recreate it manually from scratch or contact support. The button appears on the payout details page when the payout has at least one failed transfer and no successful ones, and takes you to the payout creation form so you can submit a fresh attempt without re-entering all the details by hand. ##### Card layout for transaction wallets [#card-layout-for-transaction-wallets] The transaction wallets list now supports two display modes — the existing **Table view** and a new **Card view** that presents each wallet as a standalone card with all its key data: currency, label, ID, wallet type, balance, pending amount, and status. You can switch between views at any time using the toggle above the wallets list, choosing whichever layout works best for your current task. In addition, action buttons for **Deposit** and **Payout** are now available directly on each wallet entry — in both table and card views — allowing you to start the corresponding operation in one click without opening wallet details first. *** #### Improvements [#improvements-7] ##### IP whitelist enhancements [#ip-whitelist-enhancements] The IP whitelist functionality has been expanded to better support corporate clients and reduce accidental lockouts. **CIDR subnet support.** You can now whitelist entire IP ranges using CIDR notation (for example, `10.0.0.0/24`) instead of adding addresses one by one. Both IPv4 and IPv6 are supported, and you can freely combine single addresses, IPv4 subnets, and IPv6 subnets within a single whitelist. All existing whitelists continue to work without changes. When access is denied because of an IP restriction, the error message now includes the IP address you're connecting from, so you can quickly identify the issue and contact your administrator with the right information. **Self-lockout protection.** When you save a whitelist that does not include your current IP address, the system will now show a warning dialog with your current IP and ask you to confirm before applying the change. This helps prevent the most common cause of support requests — accidentally locking yourself out of the account. Your current IP address is also shown directly in the whitelist editor for reference. ##### Memo / Destination Tag emphasis on the Payment Page [#memo--destination-tag-emphasis-on-the-payment-page] For blockchains that require an additional parameter alongside the deposit address — **Ripple (XRP)**, **Stellar (XLM)**, and **The Open Network (TON)** — the Payment Page layout has been redesigned to make this requirement visually prominent for end users. This reduces the risk of payers submitting deposits without the required Memo / Destination Tag / Comment value, which previously led to unattributed deposits and additional load on Customer Support. ##### Additional columns in Events and Transfers tabs [#additional-columns-in-events-and-transfers-tabs] To make day-to-day account oversight faster and more accurate, two tabs have received new columns: * On the **Events** tab — **Amount** and **Tracking ID** columns. When reviewing payout requests submitted by users with the *Withdrawals with approval* role, you can now see the payout amount and Tracking ID directly in the events list and make approval or decline decisions without opening each request individually. * On the **Transfers** tab — a **Tracking ID** column, consistent with the same column already available on the Deposits and Payouts pages. This makes it easier to follow all transfers associated with a particular Tracking ID end-to-end. ##### Client UI unification [#client-ui-unification] A set of small but practical refinements has been applied across the Web UI to improve consistency and search ergonomics: * **Currency search** now matches both by alpha code and by full currency name, in every dropdown across the platform. * **Wallet search** now matches by ID, alpha code, currency name, and label. * The **Tag** input is now automatically disabled when an *x-address* is entered for Payouts, Custody Withdrawals, and Swap Withdrawals, preventing invalid combinations. * A **Commission is included** toggle has been added to Custody wallet withdrawals, matching the behavior already available for Enterprise wallets. * **Funds** and **Settings** controls in Swap wallets are now displayed as dedicated square buttons, in line with the rest of the wallet types. ## January 20, 2026 [#january-20-2026] ### New features [#new-features-7] #### Partner program [#partner-program] You can now launch a **Partner program** for your legal entity and earn from clients who join B2BINPAY through your referral link. For each invited client who signs up with your link, passes KYB, and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions. The new **Partner program** section in the left menu provides a dedicated dashboard to manage referrals and rewards. It shows your current percentage, total bonus, bonus for the previous month, and a detailed **Invited partners** list with registration dates, KYB status, and per‑client bonuses. Partner rewards are credited once per month based on B2BINPAY commissions from eligible transactions of referred clients. A new **Partner program** report is available in the **Reports** section. You can generate CSV or XLSX reports with bonuses per partner and for all referrals over a selected month or historical period, using the same data that powers the partner dashboard. #### Legal documents and contract management [#legal-documents-and-contract-management] A new **Legal documents** item has been added to the account menu. From this page, you can access and check the current version of your Terms & Conditions, as well as previous contract versions associated with your legal entity and jurisdiction. For new KYB requests, Terms & Conditions are now accepted as an offer agreement during the KYB initiation step instead of requiring a separate bilateral contract. #### Android app download [#android-app-download] The B2BINPAY Android app is now available directly from the Web UI. A new **Download Android app** section has been added to the account menu, redirecting you to the latest APK download location managed by the Android APK registry. *** ### Improvements [#improvements-8] #### Stronger password policy [#stronger-password-policy] Password rules have been tightened to improve account security. New passwords must contain at least twelve characters, including at least one uppercase letter, one lowercase letter, one digit, and one symbol, and must not contain spaces. You can no longer reuse your previous passwords when changing credentials. #### Withdrawal thresholds enhancements [#withdrawal-thresholds-enhancements] Withdrawal thresholds now give you more control over who approves payouts and how many approvals are required. For any Merchant or Enterprise wallet, you can set the number of required approvals and choose which roles or specific users act as *Approvers*. Approver status is shown in wallet access lists, and approvers can review and confirm payout requests on the **Events** page. This flexible setup can be used as a governance control layer for high‑value transactions when your policies require it. ## October 1, 2025 [#october-1-2025] ### New features [#new-features-8] #### Multi-authentication and social login support [#multi-authentication-and-social-login-support] **Google ID** and **Apple ID** can now be used for system authentication alongside the existing email login option, providing users with more convenient and secure access methods. #### Multi-entity user management [#multi-entity-user-management] The platform now supports advanced user management capabilities where a single user can be associated with multiple legal entities, each with distinct roles and permissions. Additionally, users can create their own sandboxes, automatically becoming *Owners* with the ability to initiate KYB processes for their businesses. #### BTC Testnet faucet [#btc-testnet-faucet] You can now utilize the Testnet faucet functionality to deposit test funds to your Sandbox wallets. Currently, the **BTC testnet faucet** is supported. #### Bank details management [#bank-details-management] A new **Bank details** section is now available in the **Profile menu**, allowing to store and manage multiple bank accounts (IBAN, SWIFT, IFSC, A/C No.) for fiat withdrawals. Each newly added bank record automatically triggers a Compliance review, and its status is clearly tracked as *Pending*, *Approved*, or *Declined*, ensuring only verified bank details are used for [bank withdrawals](references/key-terms#bank-withdrawal). #### New callback type [#new-callback-type] A new **Request rejection** callback type has been implemented that automatically handles failed payout approvals. This callback triggers when payouts requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — fail to receive confirmation within the specified timeframe or was manually cancelled by a user with proper rights. Your external system will now receive automatic notifications for these scenarios, eliminating the need for manual payout cancellation due to failed requests. #### Blockchain deposit recovery [#blockchain-deposit-recovery] For Ethereum-like blockchains, a common pool of addresses has been established. Now, when a deposit address is created on any ETH-like blockchain, the system instantly tracks activity associated with that address across all ETH-like blockchains. This feature eliminates the risk of missed transactions. #### New currency support [#new-currency-support] The platform now supports four additional cryptocurrencies: * RLUSD-ETH * USD1-BSC * SAFE-ETH * TRX-SOL *** ### Improvements [#improvements-9] #### Advanced swap operation controls [#advanced-swap-operation-controls] Two new swap operation settings have been introduced to provide greater control over trading execution. The **No slippage** setting implements an RFQ (Request for Quote) model with price updates every 5 seconds, executing swap requests only when price thresholds remain stable. The **Clients' slippage** setting allows users to specify acceptable price deviation percentages, executing trades at the latest price unless the configured slippage threshold is exceeded. Mode selection is available when creating a new swap operation. #### Staff access to Swap wallets [#staff-access-to-swap-wallets] Administrative staff can now be granted access to Swap wallets with full fund control capabilities without requiring specific user role assignments, streamlining operational management and providing greater flexibility in wallet administration. #### Streamlined legal entity selection [#streamlined-legal-entity-selection] The **Jurisdiction** dropdown has been replaced with a more intuitive **Legal entity** dropdown, significantly improving user experience when managing multiple legal entities within the same jurisdiction and providing clearer organizational structure. #### Enhanced pricing accuracy [#enhanced-pricing-accuracy] Deposit calculations now utilize VWAP (Volume Weighted Average Price) instead of Top-of-the-Book prices, providing more accurate and representative pricing that reflects actual market conditions and trading volumes. #### Centralized security management [#centralized-security-management] IP whitelist management has been restructured so that only *Owners* can configure and manage IP restrictions for all users within their organization, creating a more centralized and secure approach to access control. #### Optimized SOL transaction processing [#optimized-sol-transaction-processing] The SOL smart contract has been enhanced to support multiple transaction collections, allowing a single collection transaction to gather funds from up to 10 deposit addresses simultaneously. This optimization significantly reduces operational costs and improves transaction efficiency. #### Comprehensive localization enhancement [#comprehensive-localization-enhancement] The platform's internationalization capabilities have been substantially improved through integration with the [B2TRANSLATE](https://docs.b2translate.b2broker.com/) platform, providing support for additional languages while enhancing translation quality and consistency across the entire user interface. #### Currency naming clarification [#currency-naming-clarification] To prevent confusion with Binance's discontinued BUSD token, BUSD-T-BSC has been renamed to USDT-BSC throughout the interface, ensuring clear identification and reducing potential user errors in currency selection. ## August 1, 2025 [#august-1-2025] ### New features [#new-features-9] #### KYB verification system [#kyb-verification-system] We're excited to introduce **Know Your Business (KYB) verification**, a comprehensive business verification system that enables secure access to Coinsbuy production environment. This major enhancement transforms how businesses onboard and maintain compliance on our platform, providing a seamless path from testing to live operations. **Key features** * **Jurisdictions** The platform automatically detects jurisdictional requirements based on your country of incorporation, ensuring compliance with local regulations. To maintain ongoing compliance, the system implements periodic re-verification schedules that are clearly displayed in your dashboard. * **Streamlined verification process** We've partnered with [Sumsub](https://sumsub.com/), a leading verification provider, to deliver a secure and efficient KYB process. The system guides you through each verification step with clear instructions and contextual help. If additional documents are required, you can easily upload them through our secure interface. The process is designed to be flexible — you can exit at any point and resume where you left off, with all progress automatically saved. * **Status tracking & notifications** Real-time status updates keep you informed throughout the verification journey, from initial submission through final approval. Visual indicators appear throughout the platform when your attention is needed. You'll also receive email notifications for important status changes and document requests, ensuring you never miss critical updates. **Access & security** The KYB section is restricted to users with the Owner role, providing an additional layer of security for sensitive business verification processes. All document handling occurs through encrypted channels, and our compliance-first approach ensures we meet international regulatory standards. Production environment access is exclusively gated behind successful KYB approval, while the Sandbox environment remains freely available during the verification process. This clear separation ensures you can continue testing and integrating while completing your business verification. **How it works** You can initiate the KYB process any time after account creation, when you gain instant access to our Sandbox environment for testing and integration. When you're ready for production access, simply navigate to the KYB section and add your legal entity by providing basic business information. The system then guides you through verification with our Sumsub integration, which may include identity verification, document submission, and business legitimacy checks. If our verification partner requests additional information or documents, you'll see clear indicators and instructions for what's needed. Once your verification is approved, you immediately gain access to the production environment with full platform capabilities. #### Dual 2FA system [#dual-2fa-system] A new dual 2FA system with separate codes for authentication and operations has been implemented to strengthen account security. The system now uses two distinct 2FA codes: the **Authentication 2FA** that's mandatory for all users and required at every login, and the **Authorization 2FA for operations** that can be enabled in Profile Settings for sensitive actions like IP whitelist setup, API credentials generation, callback secret generation, and payout confirmation. This layered security approach provides enhanced protection by separating routine access from system operations, ensuring that even if one authentication method is compromised, your most sensitive account functions remain secure. #### API v3 [#api-v3] The new API v3 is designed to comply with the latest platform updates. Explore our new [API guide](api-guide/api-overview) and update your integrations accordingly, before the deprecated API v2 will be shut down on **December 1, 2025**. *** ### Improvements [#improvements-10] #### Payout enhancements [#payout-enhancements] Enterprise wallet withdrawals now feature a **Commission is included** toggle that's automatically enabled when selecting 100% of available funds, clearly indicating that the platform fees will be deducted from the payout amount. The payout confirmation window has been enhanced to display the **To be sent** amount, providing users with precise information about what the recipient will actually receive. #### Address whitelisting for Ripple-like blockchains [#address-whitelisting-for-ripple-like-blockchains] Ripple-like blockchains use an additional address tag to identify the recipient of a transaction. When whitelisting addresses on such blockchains, you can now specify the Address tag value along with the regular address. ## January 21, 2025 [#january-21-2025] ### New features [#new-features-10] #### Custody services [#custody-services] With this release, we're excited to introduce our new Custody services, designed to provide secure and efficient storage and management of funds. **Key features**: * **Secure storage**: Custody wallets ensure secure storage and are available only to users with the *Owner* role, requiring video verification for every withdrawal. * **Top ups**: Custody wallets can be topped up from your Merchant and Enterprise wallets. The transaction currency must match the currency of the Custody wallet. * **Withdrawals**: Withdrawals from Custody wallets can be made to Merchant and Enterprise wallets (without currency conversion), as well as to external addresses. * **Fees**: Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged monthly and with every withdrawal from the Custody wallet. Contact your manager to sign an additional agreement and enable the new **Custody** section in the main menu. #### Callbacks [#callbacks] All [callbacks](references/key-terms#callback) sent by the system can now be easily accessed and resent via the Web UI. Find the new **Callback** section under the **Wallet management** menu item. #### Internal transfers [#internal-transfers] A new payout type **Internal transfer** has been added, allowing you to transfer funds between Merchant wallets if they share the same currency and *Owner*. These transfers don't incur any fees since they're executed off-chain. You can find the new **Internal transfer** option on the **Wallet management** > **Payouts** page under the **Add new** menu. #### Custom AML check [#custom-aml-check] From now on, you can configure your own AML check, in addition to built-in verification provided by B2BINPAY. It can be useful if you need to carry out its own set of compliance procedures. The new **AML check** section has been added to the **Settings** page in your profile menu. #### Duplicated blockchain deposit event [#duplicated-blockchain-deposit-event] This newly added event type is triggered when a deposit is made in one currency but subsequently paid in another, resulting in its duplication on another blockchain. The duplicated deposit doesn't inherit the Tracking ID and Callback URL of the original deposit. With this event, you can manage these parameters to ensure proper tracking of duplicated deposits, eliminating the risk of their loss. #### New blockchain integrations [#new-blockchain-integrations] With this release, **The Open Network (TON)** blockchain has been integrated. Also, several new coins and stablecoins have been added: * ISO 1029 **TON** (The Open Network) * ISO 2032 **USDT-TON** (The Open Network) * ISO 2033 **NOT-TON** (The Open Network) * ISO 2034 **DOGS-TON** (The Open Network) * ISO 2035 **HMSTR-TON** (The Open Network) * ISO 2036 **FDUSD-ETH** (Ethereum) * ISO 2037 **FDUSD-BSC** (BNB Smart Chain) * ISO 2038 **CATI-TON** (The Open Network) * ISO 2039 **POL-ETH** (Ethereum) * ISO 2315 **BTCB-BSC** (BNB Smart Chain) *** ### Improvements [#improvements-11] * When creating a Bank withdrawal, you can now specify the **Amount to be withdrawn**, and the total amount including the commission will be calculated automatically. * The **Side collecting funds** transfers now always display the ID of the original deposit. * For security purposes, API credentials are now displayed only once when regenerated and will no longer be emailed to the *Owner*. * When logging in, users who haven't yet enabled IP whitelists will now see a popup reminding them to do so. Remember: IP whitelisting is effective in protecting your accounts and funds. Make sure you and your team members have it enabled. * An information icon has been added to the **Resources** tab in the wallet details, informing users of the 32 active unstaking transaction limit. When attempting to exceed this limit, a notification will appear. * The links to API docs and Release notes have been added to the Web interface. Access them at any time from your profile menu. *** ## Past releases [#past-releases] ### September, 2024 [#september-2024] #### New features [#new-features-11] ##### Enhanced security [#enhanced-security] With this release, several major updates have been made to improve security, among which are the following: * **Withdrawal thresholds** This new feature enables you to specify withdrawal thresholds that, when exceeded, will require *Owner*’s approval to make a payout. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to Approval request, but the approver must enter a 2FA code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Options can be used individually or in combination. Each option can be configured for individual users or user roles. Therefore, when limits are exceeded, approval requests will be triggered for payouts made by any user, not just those with the *Withdrawals with approval* role. All this gives you maximum flexibility in controlling your funds. Thresholds settings can be accessed on the new **Thresholds** tab in the wallet details. **Mind that** you need to have 2FA enabled to set thresholds. * **Address whitelists** This new option enables you to create and manage address whitelists. Payouts sent to whitelisted addresses will bypass restrictions related to thresholds or user roles. However, such payouts are still subject to our standard AML & KYC procedures. There are two options provided: * **Wallet-level whitelists**, considering payouts made from a specific wallet. * **Blockchain-level whitelists**, considering payouts made from any wallet in a specific blockchain. Click your profile icon in the upper-right page corner to access a newly added **Address whitelists** section. The section is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the newly added **Address whitelist** tab in the wallet details. **Mind that** you need to have 2FA enabled to whitelist addresses. * **Access list** The UI has been improved to easier manage access to your wallets. The API access in the profile menu has been replaced with a new Access list section, containing two tabs: * **Staff**: Here you can add new users to the system, assign roles, and grant or restrict access to specific wallets. * **API**: Here you can manage IP whitelists, API keys, and bulk grant or restrict access to their wallets. Other security improvements include: * **Login notifications**: Clients now receive an email notification upon logging in. * **Payout approval**: When approving a withdrawal, the Owner now sees an additional confirmation popup to prevent accidental approvals by mistake. * **2FA reminder**: Upon login, users who haven’t yet enabled 2FA will now see a popup urging them to complete the 2FA procedure. Remember: 2FA is essential for protecting your accounts and funds. Additionally, many new system features now require 2FA. Always ensure that you and your team members have it enabled. ##### New blockchain integrations [#new-blockchain-integrations-1] With this release, two new blockchains have been integrated: * Algorand * Solana Also, several new coins and stablecoins have been added: * ISO 1022 **ALGO** (Algorand) * ISO 2016 **USDC-ALGO** (Algorand) * ISO 2017 **USDT-ALGO** (Algorand) * ISO 1028 **SOL** (Solana) * ISO 2030 **USDT-SOL** (Solana) * ISO 2031 **USDC-SOL** (Solana) ##### Zendesk integration [#zendesk-integration] A new Helpdesk solution, **Zendesk**, has been integrated, providing AI support and knowledge base. Integration with SupportPal remains active in read-only mode, for ticket history. #### Improvements [#improvements-12] * The main enhancement in the current release is an **updated Enterprise commission model**, now focused on outbound transactions.This change better aligns with our clients’ business models and significantly reduces commissions. B2BINPAY now charges commissions on outgoing transactions from Enterprise wallets, rather than incoming ones. * The activation of Enterprise wallets denominated in ETH, TRX, BNB, XRP, or XLM has become user-managed. When creating such a wallet, you can now specify an Enterprise or Merchant wallet from which the activation fee should be charged. * A new **Target commission** field, displaying the commission amount converted to the wallet currency, has been added to the **Transfers** page and transfer details, as well as to the **Transactions** tab of the deposit details. * When creating a new deposit, you can now add a link that will be displayed as a button on the **Payment page**. You can specify a URL and a custom name for the button. *** ### May, 2024 [#may-2024] #### New features [#new-features-12] ##### TRX staking [#trx-staking] With this release, B2BINPAY introduces a new **TRX Staking** feature. This allows you to stake your Tron tokens to gain bandwidth or energy to save on blockchain fees. Along with the resources, for each staked TRX, you receive one vote. The votes you can distribute among SRs (Super Representatives) and further gain rewards from them. A new **Staking** > **TRX staking** item has been added to the main menu. On this page, you can overview the staking terms and monitor your rewards. The **Wallet details** page of your TRX wallets has been updated with the following two tabs: * **Resources**: Here you can overview available resources and perform staking-related operations: stake, unstable, and withdraw funds. * **Staking**: Here you can overview your total and available votes and give them to SRs, as well as monitor rounds and key performance indicators of the SRs. #### Improvements [#improvements-13] * Several more icons for currencies and tokens have been added. Icon sizes in QR codes on payment pages have been adjusted. * On the Sign up page, country flags have been added for all phone codes. * Internal logic of the procedure of enabling 2FA with Google Authenticator has been improved, to avoid situations when the 2FA code expires before the password is entered. * It has become possible to customize displayed rows in the mobile version. * Three new blockchains have been integrated: * Base (BASE) * Arbitrum (ARB) * Optimism (OP) * Several new stablecoins have been added: * USDT-OP * USDC-OP * USDCE-OP * USDT-ARB * USDC-ARB * USDCE-ARB * USDC-BASE * Several new tokens have been added: * ARB-ETH * OPTIMISM-OP *** ### February, 2024 [#february-2024] #### New features [#new-features-13] ##### Swaps [#swaps] With this release, B2BINPAY implements a new **Swap** functionality for the clients. This is a replacement for exchanges, but swaps are faster, more flexible and accurate thanks to VWAP. You can now perform currency exchange operations between your Swap wallets. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your Enterprise or Merchant wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. Swap operations are always off-chain. You can exchange all available currencies, including fiat, coins, and tokens. #### Improvements [#improvements-14] * Two new blockchains have been integrated: * Avalanche (AVAX) * Polygon (MATIC) * Several new tokens have been added: * PYUSD-ETH * USDC-AVAX * USDT-AVAX * USDC-MATIC * USDT-MATIC * The TerraUSD (ISO 2150, 2166) token has been renamed to TerraClassicUSD. * New options for wallet duplication have been added: AVAX and MATIC. In total, B2BINPAY now supports wallet duplication in 4 blockchains: * BNB-BSC (Binance Coin) * ETH (Ethereum) * AVAX (Avalanche) * MATIC (Polygon) * Charging of B2BINPAY commission is now displayed as a separate **Commission** transfer type, for more clarity. ### November 13, 2023 [#november-13-2023] #### New features [#new-features-14] ##### Unified Merchant and Enterprise users [#unified-merchant-and-enterprise-users] The Merchant and Enterprise users are no longer separated in B2BINPAY, meaning that a user can now create wallets of both types under the same user profile. ##### A new UI [#a-new-ui] A new B2BINPAY user interface is introduced with this release. The UI has been redesigned to create a more engaging and user-friendly experience. The key changes include the following: * the main menu is now displayed on the left * a new Wallet Management item has been added to the main menu, enabling you to create and manage both Merchant and Enterprise wallets * updated table layouts and icons * amended light and dark themes #### Improvements [#improvements-15] * The blockchain name is now displayed on the Payment page, enabling you to ensure that you send your funds to the correct blockchain for processing and preventing you from funds loss. * The length of phone numbers entered on the Sign up page is now validated, preventing extra or missing digits in phone numbers specified during registration. * The HelpDesk tickets for which there are unread messages in the chart are now marked with a red dot. * The HelpDesk work schedule has become available in the HelpDesk section. * The exchange rates marked as favorites on the Rates page are now available on all user devices. #### Resolved issues [#resolved-issues-7] * For payments in Binance Coin, it’s now possible to select the BNB Chain (BNB-DEX) blockchain that wasn’t previously displayed as an option on the Payment page. * Email addresses specified in Wallet Details are now validated to include only allowed characters. The entered email can be saved only after it’s validated. *** ### September 7, 2023 [#september-7-2023] #### New features [#new-features-15] ##### New currencies [#new-currencies] * Two new stablecoins have been added to the list of currencies in which Merchant wallets can be denominated: **TUSD** (ERC20, BEP20, TRC20) and **EUROC** (ERC20). * Two new stablecoins are now supported for Merchant transactions: **LUSD** (ERC20) and **FRAX** (ERC20, BEP20). * 79 new currencies (113 new tokens in different blockchains) have become available for Enterprise wallets. See the full list of available currencies [here](references/currency-codes). ##### Onboarding [#onboarding] More tours to guide you on using the app are now accessible by clicking your profile information. ##### Favourites [#favourites] On the **Rates** page, it is now possible to filter the results by your favourite pairs and sort them by coin, fiat, or token. #### Improvements [#improvements-16] * When creating a payout, the commission amount is now additionally displayed in the default currency (USD). You can enter a custom commission amount in the default or payout currency. * The 7-day expiration limit for merchant invoices has been removed. When creating or editing an invoice, you can now set any value in the **Expired at** field without any restrictions. * A new button has been added for deleting wallets with zero balances and no transactions. * For large reports, a new notification is now displayed, informing the client that the report will be sent to their email once generated. * The parent wallet is now visible when creating a new payout for tokens. * The QR code generator now supports double-image icons for tokens. * Enterprise clients can now sort the **Wallets** list by ID and currency. * For **Currency** dropdowns, grouping by currency type and filtering by group have been added. * For **Wallet** dropdowns, grouping by active state has been added. * The IP-whitelist management has been changed — now each IP address is added or removed separately. Popups are now displayed for entering passwords required to confirm adding or removing an IP address. * The counter has been added on the **Helpdesk** icon, showing the number of unread messages in tickets. A message is counted as “new“ if a user receives it while the app is open. After the page is reloaded, the counter resets. In the **Helpdesk** section, the tickets with unread messages are marked with a red marker. * Sorting by first letter in dropdowns has been fixed. *** ### May 30, 2023 [#may-30-2023] #### New features [#new-features-16] ##### Reports on wallet balances [#reports-on-wallet-balances] A new **Reports** feature has been implemented to provide you with the possibility to generate reports on your wallet balances for the custom time range. The feature is available for both Enterprise and Merchant users. ##### A notification counter for events [#a-notification-counter-for-events] A notification counter has been added near the **Events** tab displaying the number of new events in the main menu near the **Events** tab. #### Improvements [#improvements-17] * It has become possible to transfer funds within the same blockchain wallet. This option is available for both Enterprise and Merchant users in BTC, BCH, BSC, ADA, DASH, DOGE, ETH, LTC, OMNI, TRX, and ZCASH wallets. * It has become possible to add IP addresses in both IPv4 and IPv6 formats to the API whitelist in the **API access** section. * The number of tickets displayed in the HelpDesk ticket list has been increased up to 30. * The **Target currency** column has been added to the Transfer list for Merchant users. * The **Balance** and the **Pending** tabs have been added to the **Wallet info** tab both for Enterprise and Merchant users. * A limit has been added on the number of tickets created in the HelpDesk. Now you can create only 3 tickets within 5 minutes; when trying to create more than 3 tickets within the specified time, a message about reaching the ticket number limit is displayed.. * The **Registration number** and the **Company address** fields have been added to the sign up form. *** ### March 21, 2023 [#march-21-2023] #### Improvements [#improvements-18] * The design of the payment page has been renewed to offer a more user-friendly experience. * The calculation of balances has been improved. * The response speed of the API has been increased. ### December 28, 2022 [#december-28-2022] #### Improvements [#improvements-19] * The B2BINPAY operation speed has been increased for all operations. * The B2BINPAY interface as well as the mobile version of B2BINPAY have been redesigned and improved for a better user experience. * The Merchant model has been updated to support two types of Merchant users: * Merchant Crypto Settlement: users that can have only crypto wallets and pay reduced commissions for crypto processing. * Merchant Fiat Settlement: users that can have both crypto and fiat wallets and are able to send funds to their bank accounts. * Around 100 new tokens have been added to B2BINPAY. For a list of supported tokens, refer to [Currency codes](references/currency-codes). * The API response speed has been increased. *** ### November 16, 2022 [#november-16-2022] #### Improvements [#improvements-20] * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * It has become possible for Merchant users to set time limits to specify the expiration time for invoices as well as payment limits to hedge possible payment amount variations due to rate changes. * New **Cardano** blockchain has been added to the system. *** ### July 22, 2022 [#july-22-2022] #### New features [#new-features-17] ##### Customized field arrangement for Enterprise and Merchant users [#customized-field-arrangement-for-enterprise-and-merchant-users] A new tool has been implemented to help you arrange fields displayed on a page. With this tool, you can select the fields that you want to display and arrange them in a desired order on the Wallets, Transfers, Deposits, Invoices and Payouts pages. ##### HelpDesk implementation [#helpdesk-implementation] A HelpDesk option has been implemented. Using HelpDesk, you can create a ticket with a description of an issue you encountered with your B2BINPAY account and send it to our Support Team. #### Improvements [#improvements-21] * The display of Bank details for Merchant users has been improved: when creating a bank withdrawal, you can now see all the information related to bank details, not only their title. * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * In addition to the monthly payment for a custom token processing, one more option has been implemented: it has become possible to pay a specified percentage from the credited custom token amount. #### Resolved issues [#resolved-issues-8] * Fixed an issue that caused multiple wallet report downloads upon opening several tabs. * Fixed an issue due to which the transfer type was not displayed on the Transfers page. * Fixed an issue due to which a dialog window did not appear when trying to save updated information in the Wallet details. * Fixed an issue due to which the language in the table on the payment page was not changing. * Fixed an issue due to which incorrect values were displayed in the Currency filter on the Transfer page. * Fixed an issue due to which extraneous pagination options were displayed on the Rates page. * Fixed an issue due to which it was impossible to save an address to the address book when creating a new payout. * Fixed an issue due to which a warning that should be displayed when the sum of a payout exceeds the wallet balance did not appear. * Fixed an issue due to which fiat currencies were unavailable to Merchant users in the Currency filter on the Transfer page. * Fixed an issue due to which tips were not displayed on some pages. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-18] ##### A new Field name field in Logs [#a-new-field-name-field-in-logs] A new field, **Field Name**, has been added to the **Log** for all pages, both for Merchant and Enterprise users. It displays the name of the field whose value has been changed. ##### Currency filter for Merchant users [#currency-filter-for-merchant-users] With a new **Currency** filter on the **Wallet** page, it has become possible for Merchant users to filter their wallets list by currency. ##### Refund button for Merchant users [#refund-button-for-merchant-users] A new **Refund** button has been added to the **Invoice details** page for Merchant users. This button can be used to return funds to the payer. ##### List of support emails for Merchant users [#list-of-support-emails-for-merchant-users] A new **Custom support emails** field has been added to the **Create wallet** and **Edit wallet** pages of the Merchant user accounts. This is a list of email addresses to which requests from payers will be sent. ##### New dialog window for the Create new bank withdrawal window [#new-dialog-window-for-the-create-new-bank-withdrawal-window] A new dialog window has been implemented. It appears upon clicking the **Create new bank withdrawal** button after deleting a regular withdrawal or editing its data. ##### New AML provider integration [#new-aml-provider-integration] A new AML provider, **Chainanalysis KYT**, has been integrated. #### Improvements [#improvements-22] * The AML system logic has been improved: * Repeated checks in case of delay on a provider’s side are now performed with a short delay. * In case of a failure on a provider’s side to perform the final check, no additional checks are attempted. An email notification is sent to Compliance. * A long delay (up to 1 hour) is not used anymore. * A commission for the bank withdrawal for Merchant users is now calculated as follows: a fixed percentage of the withdrawal + a fixed amount in the withdrawal currency (but not less than the minimum commission amount). For example: 2.00% + 30 USD (the minimum commission is 100 USD). The percentage, fixed amount and minimum commission values are configured via the B2BINPAY Back Office. Additionally, the commission amount is now displayed under the Amount field on the withdrawal creation form. * The **Payment page** for Merchant users has been improved for a better user experience. Among other improvements, tags have been added to all currencies, while token icons and the search field have been updated, and cryptocurrencies have been divided into the following categories: Coins, Stablecoins, Others. #### Resolved issues [#resolved-issues-9] * Fixed an issue that caused incorrect filtration in the Amount to field on the Exchange page. * Fixed an issue that caused an incorrect display of the commission currency on the Create exchange page. * Fixed an issue due to which the language in the calendar widget did not change. ### December 28, 2021 [#december-28-2021] #### New features [#new-features-19] ##### Replace by Fee option [#replace-by-fee-option] A new **Replace by Fee** option has become available for Enterprise users. You can speed up the execution of your payout that has stuck due to the low fee by clicking the **Replace** button and selecting a higher fee on the Transfer Details page. ##### Freeze funds on Tron blockchain [#freeze-funds-on-tron-blockchain] For Enterprise users, it has become possible to freeze a certain amount of TRX currency in order to restore Tron blockchain resources such as bandwidth points and energy. In 72 hours, you can unfreeze the frozen amount and it will be returned to your wallet in full. #### Improvements [#improvements-23] * A new **System** initiator that represents the doer of the action in the system has been added to the Log subsection of the Wallets, Deposits and Payout sections both for Enterprise and Merchant users. * The **All** checkbox has been changed to the **All sum** switch in the **Create payout** form both for Enterprise and Merchant users. Now it is possible to select the whole wallet amount, the fee will be automatically included in the payout amount. #### Resolved issues [#resolved-issues-10] * Fixed an issue due to which blocked transaction was displayed as a confirmed one on the payment page. * Fixed an issue due to which changes in the wallet details of the Merchant users were not displayed in logs. * Fixed an issue due to which the icons for some currencies were missed on the invoice payment page. * Fixed an issue due to which the payout amount in tokens was incorrectly calculated for Merchant users. * Fixed an issue due to which the link in the TXID field for XMR currencies of the Transfers page led to the incorrect page. * Fixed an issue due to which the Minimal transfer amount field was not filled automatically. * Fixed an issue due to which values in the Old value and Actual value fields on the Payout details page for Merchant uses were absent. * Fixed an issue due to which the rates were not updated when creating payouts for Merchant users. * Fixed an issue due to which the links in the TXID field of the Deposits and Transfers pages were absent. * Fixed an issue due to which after the payout creation the commissions section was not displayed. * Fixed an issue that caused the amount discrepancy on the Create Exchange page and in the modal window. * Fixed an issue that caused an error when restoring the password. * Fixed an issue that caused an infinite loader to appear in the Add wallet to API window in the Access list section. * Fixed an issue that caused an eternal loader to appear when adding white list API in the API Access section. * Fixed an issue due to which the ID link on the deposit payment page led to the incorrect page. * Fixed an issue that restricted the number of adding wallets to 10 in the Access List. * Fixed an issue that caused troubles with verification when registering in the system. * Fixed an issue due to which it was impossible to get access to the API Access menu for Merchant users. * Fixed an issue due to which the From address book button was not available on the payout creation form. *** ### November 16, 2021 [#november-16-2021] #### New features [#new-features-20] * New currencies are added. The currencies are available for Enterprise users only. * New Monero XMR currency is added. It is available both for Enterprise and Merchant users. #### Improvements [#improvements-24] * The limitation for number of requests without prior authentication to the endpoint is now limited to 70 requests per 1 minute. *** ### October 21, 2021 [#october-21-2021] #### New features [#new-features-21] ##### Risk status [#risk-status] A new **Risk status** tag is added to the Transfer details page. This field indicates the status of the AML verification of the transfer: * the tag is orange if the AML is successful * blue if AML is pending * red if AML failed * grey if AML is unavailable Tags are displayed now for token wallets on the Wallets, Deposits, Payouts and Exchanges pages. #### Improvements [#improvements-25] * Merchant users can now specify Tag and Tag type fields when creating a payout with XLM and XRP currencies. * When clicking on the Exchange button on the Wallets list page, you are redirected to the Creating Exchange page with the selected wallet already filled in the From field. * The payment page for tokens now has 2 links: one link for the payment address and the other link for the contract. #### Resolved issues [#resolved-issues-11] * Fixed an issue which caused redirecting to the Wallet Details instead of Log when clicking on the Log button at the Access List section. * Fixed an issue that enabled funds withdrawal from a fiat wallet to a crypto wallet for Merchant users. * Fixed an issue due to which the link to the explorer was absent on the Deposit payment page. * Fixed an issue due to which on the Transfers page an Unknown type transfers were displayed when selecting the Side collecting funds in the Type filter. * Fixed an issue due to which the payment currencies and “No currencies available” message were displayed simultaneously on the Payment page. * Fixed an issue due to which the Payouts commission was not recalculated in the payout currency. * Fixed an issue due to which it was possible to create a token payout when there was not enough funds on the parent wallet. * Fixed an issue that caused multiple notifications for one operation on a wallet. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-22] * Integration with Tron blockchain is added, as well as new currencies such as Tron, USDT-TRX, USDC-TRX. * New Merchant User role is added. * New Bank Withdrawal feature is added to the Payout tab, which allows withdrawing fiat funds immediately or creating a conditional schedule. Bank Withdrawal is available for fiat wallets and for Merchant users only. * New ETH and BSC tokens are added. #### Improvements [#improvements-26] * New risk status field is added to the Transfer Object, so that clients can check transfer AML status. * DASH integration is updated. Latest version of DASH allows you to create multiple wallets per node. * Unverified users now can log in to a private area and pass verification later. #### Resolved issues [#resolved-issues-12] * Fixed an issue which caused wrong error code for API when obtaining token more than 15 times within 1 minute. * Fixed an issue which caused an error when navigating to the Payouts and Deposits tabs. * Fixed an issue which caused a false check of fee and payout amount when validating token payouts. * Fixed an issue due to which it was impossible to create a token payout with the sufficient amount of funds. * Fixed an issue which caused troubles with changing password or enabling 2FA. * Fixed an issue due to which it was impossible to create a deposit with a number of confirmation blocks from 13 to 20. * Fixed an issue which caused multiple callback notifications in the Event section when creating a payout with callback. *** ### August 04, 2021 [#august-04-2021] #### Improvements [#improvements-27] * Reworked the logic of the Exchange process. Now rates are recalculated if the transaction takes more than 15 minutes, and the final amount is updated according to the current quote. Also the notification about the rate change is sent. * Lowered minimal activation amount for BSC to 0.025 BNB. #### Resolved issues [#resolved-issues-13] * Fixed an issue due to which it was possible to set the amount less than the Minimal transfer amount when creating an exchange. * Fixed an issue due to which BEP20 was not displayed in the list of token types. * Fixed an issue due to which the Export button worked incorrectly. *** ### July 07, 2021 [#july-07-2021] #### New features [#new-features-23] ##### User verification by phone number [#user-verification-by-phone-number] Added a new verification step — verification of the user's phone number, which follows the email verification step and is mandatory. #### Improvements [#improvements-28] * Added filter by tokens. To filter by currency, a user can now select the tokens and custom tokens on the Wallets, Transfers, Deposits, and Payouts pages. * Reworked the logic of the Exchange page. Now wallets with 0 balance are displayed at the end of the list. * Updated Select all funds switch on the Exchange page. #### Resolved issues [#resolved-issues-14] * Fixed an issue due to which when exchanging, the transfer amount was not validated and could be indicated less than the available funds on the wallet. * Fixed an issue due to which the exchange became unavailable after rates update. * Fixed an issue due to which it was possible to create a custom token with alpha code of the existing currency. * Fixed an issue which caused 500 error when filtering deposits and payouts. *** ### June 22, 2021 [#june-22-2021] #### New features [#new-features-24] ##### Binance smart chain support\*\* [#binance-smart-chain-support] Now it is possible to create wallets in BSC. ##### Duplicating wallets [#duplicating-wallets] It is now possible to generate the same addresses in two different currencies. This may be useful when the payer is sending money on the wrong blockchain. For example, instead of paying 10 ETH to the A1 address, 10 BSC were sent to the A1 address. The option is available for wallets that support duplication in the Wallet Settings section. ##### Duplicating deposits [#duplicating-deposits] After duplicating a wallet when creating a deposit on one wallet, it becomes possible to clone it to a second wallet, if that second wallet is a clone of the first one. The option is available on the Create a Deposit page, when choosing duplicate in the address type and selecting the required deposit ID from the list. ##### New transfer type [#new-transfer-type] Side collecting funds on wallet is the amount of deposit that was previously canceled because of a small amount and then debited to your wallet along with another valid transfer. ##### New stablecoins support [#new-stablecoins-support] New stablecoins were added: PAX, DAI, TUSD, BUSD. #### Improvements [#improvements-29] * For BNB-BSC wallets, a notification has been added about the need to top-up the balance to activate the wallet. * Invoice updates. For all tokens, the link is now generated not by the token currency, but by the parent currency. #### Updating nodes [#updating-nodes] * DASH node was updated to version 16.1.1. #### Resolved issues [#resolved-issues-15] * Fixed an issue that caused incorrect login when saving credentials in the browser. * Fixed an issue due to which the Stellar icon did not change when switching theme from dark to light. *** ### April 19, 2021 [#april-19-2021] * **Integration with Ethereum and ERC-20 tokens has been made**. Now you can exchange and create wallets, deposits, withdrawals using new currency. The system collects tokens from deposit addresses in one place via smart contract. That significantly reduces the costs of token processing for the client. Integration with Ethereum also includes the possibility of replacing a payout by fee from the personal area in case it's stuck due to low blockchain fee. * **Working with ERC-20 tokens is available to all enterprises**. Through the client's office, you can add your token, pay processing fee from any of your wallets and start accepting tokens after confirmation of payment on the blockchain. The owner can specify any alpha code for custom token so that it is displayed on the payment pages. From your personal account at any time you can change the payment wallet or refuse to pay next month. * **The registration form is now unified for all types of clients** and contains fields where the user needs to enter information about himself in full. This will help our sales team and account managers to get in touch with the client faster and prepare everything to start working with the payment system. Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/api-overview) for updated descriptions. ## General information [#general-information] The B2BINPAY API is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. All methods are private. All requests except for [Obtain token](authentication#obtain-token) and [Refresh token](authentication#refresh-token) should contain HTTP header: `Authorization: Bearer `. According to [JSON API Specification](https://jsonapi.org/format/), all requests should contain HTTP header: `Content-Type: application/vnd.api+json`. ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/authentication) for updated descriptions. ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token` #### Request example [#request-example] ```sh curl --request POST \ --url [base]/token/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "login": "", "password": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'login': '', 'password': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'login' => '', 'password' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } }, "meta": { "time": "2020-12-29T05:27:11.925654Z", "sign": "bcd6519ce27fed2ce9efe49cd09b387f050c0122c96..." } } ``` #### Response codes [#response-codes] *** ## Refresh token [#refresh-token] Once you receive a new key pair using your refresh token, the previous refresh token can no longer be used. A refresh token that is found to be invalid while not being expired must be rendered suspicious. ### Request [#request-1] `POST` `[base]/token/refresh/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/token/refresh/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "refresh": "" } } }' ``` ```python import requests url = '[base]/token/refresh/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'refresh': '', }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/refresh/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'refresh' => 'Your refresh token', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] The response body is the same as for [Obtain token](authentication#obtain-token) request, but without `meta` fields. #### Response body example [#response-body-example] ```json { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } } ``` #### Response codes [#response-codes-1] *** ## Auth verification [#auth-verification] Refer to the example below for a sign verification instance. ```javascript // "crypto-js": "4.0.0" is installed as a dependency const SHA256 = require("crypto-js/sha256"); const hmacSHA256 = require('crypto-js/hmac-sha256'); // set API user login and password const login = 'Your API key'; const password = 'Your API secret'; // parse /api/token/ response payload const authResponse = JSON.parse("{\n" + " \"data\": {\n" + " \"type\": \"auth-token\",\n" + " \"id\": \"0\",\n" + " \"attributes\": {\n" + " \"refresh\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUz\",\n" + " \"access\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI\",\n" + " \"access_expired_at\": \"2020-08-24T13:50:12.192479+03:00\",\n" + " \"refresh_expired_at\": \"2020-08-24T19:33:33.192479+03:00\",\n" + " \"is_2fa_confirmed\": false\n" + " }\n" + " },\n" + " \"meta\": {\n" + " \"time\": \"2020-08-24T10:33:33.192479Z\",\n" + " \"sign\": \"e70adec551e26b560049e42aa0993ae42cac4e03fbbb300320d8be\"\n" + " }\n" + "}"); // prepare data for hash check const message = authResponse['meta']['time'] + authResponse['data']['attributes']['refresh']; const responseSign = authResponse['meta']['sign']; const secret = SHA256(login + password); const calculatedSign = hmacSHA256(message, secret).toString(); // print result if (responseSign === calculatedSign) { console.log('Verified'); } else { console.log('Invalid sign'); } ``` ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/deposit-methods) for updated descriptions. ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2147483647 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/payout-methods) for updated descriptions. ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-2] `POST` `[base]/payout/calculate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-2] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-2] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-3] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-3] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-3] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-3] #### Response body example [#response-body-example-1] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## Main menu [#main-menu] Use the main menu displayed on the left to navigate across platform pages and access the Helpdesk. Use the **Collapse**/**Expand** button to adjust the main menu display. Main menu ## Topbar options [#topbar-options] In the upper part of the page, you can see a topbar that provides access to the following functions: * the **Legal entity** dropdown — to switch between Sandbox and Production environments as well as different legal entities where you hold membership. Access permissions vary across legal entities based on your assigned user roles within each organization. Through this dropdown, users can also create new Sandbox environments to initiate KYB processes for their own businesses. * the **Dark/Light theme** switch — to adjust the B2BINPAY Web UI to your preferences. * the **Language** dropdown — to select a preferred language for the B2BINPAY Web UI. * the **Notifications** page — to view and manage system notifications. * the **User profile** icon — to access the **Profile menu** (see below). Topbar ## Profile menu [#profile-menu] ### Custom tokens [#custom-tokens] On this page, you can view a list of your [custom tokens](../references/key-terms#custom-token) and their settings. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. ### Testnet faucet [#testnet-faucet] On this page, you can deposit test funds to your Sandbox wallets for testing purposes. See [Set up integrations](quick-start-guide#step-5-set-up-integrations) for more details on using Sandbox. ### Logins and sessions [#logins-and-sessions] On this page, you can find a log of user sessions, which includes the user email and location, along with the device fingerprint data and exact date and time of each login. The *Owner* sees all sessions of all users. ### Access list [#access-list] Only users with the *Owner* role can access this section. On this page, you can manage user access to your wallets, API credentials, and IP whitelists. The page is divided into two tabs: On this tab, you can add new users to your legal entity, assign roles, and grant or restrict access to specific wallets. See the following guides for step-by-step instructions: * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) In the wallet details, you can find the **Access rights** tab featuring a list of users who have access to this particular wallet. On this tab, you can manage API access, as well as bulk grant or restrict API access to your wallets. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-api-credentials) *Available on Production environments only.* On this tab, you can manage IP whitelists for your legal entity to allow access it from trusted IPs only. This setting will apply to all users under this particular legal entity, including the *Owner*. See the following guides for step-by-step instructions: * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) On this tab, you can generate the Callback secret for callback verification. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) ### Address whitelist [#address-whitelist] On this page, you can create and manage address whitelists for blockchains and wallets. The page is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the **Address whitelist** tab in the wallet details. See [How to whitelist a payout address](../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for step-by-step instructions. ### Bank details [#bank-details] On this page, you can add and manage your bank details saved for [bank withdrawals](../references/key-terms#bank-withdrawal). The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. ### Reports [#reports] On this page, you can generate and download wallet reports. See [How to generate a report on wallet balances](../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) for step-by-step instructions. ### Settings [#settings] On this page, you can configure your profile and system access. See the following guides for step-by-step instructions: * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [How to enable additional AML check](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) ### Legal documents [#legal-documents] On this page, you can view and manage legal documents such as policies and contract agreements. When contract terms and conditions change, the *Owner* of the legal entity sees a notification on their next sign‑in. A modal window opens and requires them to read and accept the new terms. The *Owner* can also initiate unilateral contract termination by clicking **Terminate** next to the latest contract version. After initiation, your account remains available for withdrawals until the termination is processed by the B2BINPAY Compliance team. ## Configuring columns [#configuring-columns] Information on most pages and tabs is presented in tables and you can configure columns to display. If a display setting is available for a given page, you may see the **Configure columns** button above the table. Click it to display the column list: * Mark or unmark column checkboxes to display or hide them; the column checkboxes highlighted in grey can’t be disabled. * Drag and drop the columns to adjust their order in the table. Configuring columns ## Quick search [#quick-search] On some pages, you can perform a **quick search** by a certain parameter, such as wallet label or currency. To perform the quick search, start typing a desired value in the quick search field displayed above the table. Only the records containing the entered value are displayed on the page. ## Sorting [#sorting] Information in tables can be sorted by certain parameters. By default, page data is sorted by creation date in descending order. You can sort the page data by other fields. To find out whether you can sort table data by a particular field, hover over a corresponding column header. If sorting by this field is supported, you will see an arrow next to it indicating the available sorting options: * Arrow inactive — sorting by this field is disabled. * Up arrow (active) — descending sorting by this field is enabled (you can click the arrow to enable ascending sorting). * Down arrow (active) — ascending sorting by this field is enabled (you can click the arrow to enable descending sorting). You can sort table data only by a single field at a time. Sorting ## Filters [#filters] The **funnel icon** displayed on some pages indicates that you can specify custom **search filters**. You can click this icon to open a filter popup and enter desired values. The set of available filtering parameters varies for different pages. The displayed input corresponds to a parameter type: it can be text, number, date, selector, and so on. Typically, two values are required for filtering by a time interval: the start date and the end date. You can enter these values manually or select them using the calendar tool. To enable filtering, click the **Apply** button. To disable filtering, click **Reset**. On some pages, you can choose among predefined **quick filters** to filter data by a specific parameter, such as a wallet or currency type. To enable these filters, use the corresponding buttons displayed above data tables. Filtering ## Pagination [#pagination] Most of the pages support **pagination** and display data on multiple pages. You can instantly **Jump to** a specific page or use the left and right arrows to switch to the previous or next page. You can also specify the number of rows displayed on each page. Pagination ## Copying values [#copying-values] On some pages, the option to copy certain values to the clipboard is provided. Copying values ## Export data [#export-data] On some pages, the data export option is provided. You can download the page data in the CSV or XLSX format. The exported file matches the filtering and sorting settings applied to the page. Exporting data ## Step 1: Understand the wallet types [#step-1-understand-the-wallet-types] B2BINPAY offers two distinct wallet types: **Enterprise** and **Merchant**. Both can be created under a single account. Understanding these wallet types is essential, as their differences determine the functionality, workflow and the fees involved. Watch our video to explore our Enterprise (Wallet as a Service) and Merchant (Crypto Payment Processing) solutions and discover which solution best fits your needs. **References:** * [B2BINPAY Pricing](https://b2binpay.com/en/fees-crypto-payment-processing) *** ## Step 2: Sign up and pass KYB verification [#step-2-sign-up-and-pass-kyb-verification] To start using B2BINPAY, you need to create an account and complete the Know Your Business (KYB) verification process. ## Create your account [#create-your-account] 1. **Fill out the registration form** with your: * Full name * Email address * Phone number 2. **Create a secure password** that meets our security requirements. 3. **Set up 2FA** to receive *Authentication 2FA codes*: follow instruction on the screen. 4. **Verify your email address** by either: * Clicking the verification link sent to your email, or * Entering the verification code from the email. You now have access to our **Sandbox environment** — a secure testing environment where you can safely integrate B2BINPAY with your systems without any financial risk. Never send real money to Sandbox deposit addresses. This will result in **permanent and irreversible loss** of your funds. ## Submit your KYB request [#submit-your-kyb-request] 1. Navigate to **KYB** in the main menu. 2. Click **Add new legal entity**. 3. Fill out the required information: * **Legal entity name** — Your company's official registered name. * **Country of incorporation** — Where your business is legally registered. * **Business type** — Select the category that best describes your business. * **UBO residency** — Country where the Ultimate Beneficial Owner resides. 4. Review and accept the **Terms and conditions**. 5. Click **Create** to submit your request. Once submitted, you'll be directed to begin the KYB verification process. ## Complete the verification process [#complete-the-verification-process] Follow the on-screen instructions provided by our KYB verification provider. Once finished, the status of your request will change to *Pending*. You can safely exit and return to complete the verification later. Your progress will be automatically saved, the status of your request will change to *In progress*. ## Submit additional documents (if required) [#submit-additional-documents-if-required] Some applications may require additional supporting documents. **If documents are needed:** * A red notification badge will appear on the **KYB** menu item. * Your application status will change to *Action required*. Once your KYB request changes the status to *Approved*, you can begin using B2BINPAY production environment: switch to it using the dropdown in the topbar. **Next steps:** 1. Update your integration to use production base URLs. 2. Replace Sandbox API credentials with your production credentials. 3. Start processing real transactions. **Remember:** Never use Sandbox addresses for live transactions. *** ## Step 3: Start using your B2BINPAY [#step-3-start-using-your-b2binpay] Once your account is activated, you can begin working with B2BINPAY. Setting up your account involves the following steps: 1. **Configure essential security**: Ensure your account is secure. 2. **Create your first wallet**: Set up your initial wallet to start receiving payments. 3. **Enable API access**: Allow integration with other systems. 4. **Share wallet access**: Provide access to team members as needed. For a detailed walkthrough, watch our setup video. **References:** * [Enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [Whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) * [Create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) * [Access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [Grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [Manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) *** ## Step 4: Ensure security [#step-4-ensure-security] B2BINPAY readily supports KYC and AML procedures, enabling you to verify the identity of your clients and ensure compliance with anti-money laundering regulations. Other security features include 2FA, whitelists, thresholds, robust notifications, and logging systems. Keep in mind that the security of your accounts is your own responsibility. Watch our video to learn about B2BINPAY security features. ### Follow best practices to protect your finances [#follow-best-practices-to-protect-your-finances] Follow the guidelines below to better protect your account. #### Use strong passwords and 2FA [#use-strong-passwords-and-2fa] Make sure that you and all of your team members: * Use strong passwords that include uppercase and lowercase letters, numbers, and special symbols. * Use password managers for storing passwords. * Never share passwords with anyone. * Have IP whitelists enabled. **References:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) #### Enable notifications [#enable-notifications] Add your email as a notification address in the settings of all your wallets to make sure that you will be notified about any transactions. This way, you are able to detect suspicious transactions and intervene as quickly as possible. **References:** * [How to create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) #### Take special care when managing access permissions [#take-special-care-when-managing-access-permissions] Make sure that your users are granted only those permissions that are necessary for completing their tasks. Such permissions include access to wallets and availability of various kinds of transactions. In particular, you can assign the *Withdrawals with approval* role to all users, so that no funds withdrawal can be made unless it’s explicitly approved by you. **References:** * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) #### Enable withdrawal thresholds [#enable-withdrawal-thresholds] Specify thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require the approval of the *Owner*, regardless of the role of the user who created such payout. **References:** * [How to set withdrawal thresholds](../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) #### Generate new API credentials after integration is complete [#generate-new-api-credentials-after-integration-is-complete] When sharing your API keys with developers, generate new keys and reset IP access to API after the setup is complete. **References:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Take immediate actions if you account security has been compromised [#take-immediate-actions-if-you-account-security-has-been-compromised] Do the following if you come to suspect that someone has obtained access to your account. ### Change your password as soon as possible [#change-your-password-as-soon-as-possible] Please note that changing the system password may take time. Note that you must enter a 2FA code to confirm the password change. **References:** * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) ### Reset access permissions and IP whitelists [#reset-access-permissions-and-ip-whitelists] Revoke all accesses to your wallets or at least temporarily assign the *Read only* or *Withdrawals with approval* role to all users. In this case, any further transactions on these wallets can be made only after your approval. In addition, restrict access to the B2BINPAY API by removing non-trusted IPs from the whitelists. **References:** * [How to restrict access to your wallet](../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Immediately inform your account manager [#immediately-inform-your-account-manager] And follow the provided instructions. *** ## Step 5: Set up integrations [#step-5-set-up-integrations] B2BINPAY is designed to integrate seamlessly into various external systems to streamline and automate payment processes, such as creating deposit addresses, fetching exchange rates, processing withdrawals, and so on. To ensure a secure and comprehensive testing experience, B2BINPAY provides a Sandbox environment. This allows you to experiment with the platform features safely, understand the system logic, test interactions, set up integrations without any risk, and tailor them to your specific scenarios. You get access to Sandbox immediately after signing up to the system. B2BINPAY provides you with the Testnet faucet: using it, you can receive test funds to your Sandbox wallet to test system functions — payouts, deposits, transfers, and other features. Currently, the **BTC** testnet faucet is supported. To receive test funds: Create a BTC wallet in the Sandbox environment. Access the wallet details and copy the wallet address. Click your **profile icon** in the upper right page corner and select **Testnet faucet**. In the **Address** field, paste your wallet address. In the **Amount** field, enter the amount to deposit. Amount limits are specified under the field. Click **Send deposit**. Simulate transaction confirmations by clicking the **Generate blocks** button several times. Now, as your wallet is topped up, you can proceed with testing the financial operations in B2BINPAY and configuring integrations with external systems. Never use Sandbox deposit addresses on Production environments. This will result in **irreversible loss** of funds. **See also:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) *** ## Step 6: Use Helpdesk to get assistance [#step-6-use-helpdesk-to-get-assistance] Click **Helpdesk** in the main menu to access our Support Team platform where you can get quick help from the online chat bot or report any issues related to the B2BINPAY operation. We provide multi-lingual support, you can find the working hours of corresponding teams in the right part of the **Helpdesk** page. Check our [Troubleshooting articles](../troubleshooting/no-active-account) where you can find solutions for most common issues. *** ## Step 7: Learn about other B2BINPAY features [#step-7-learn-about-other-b2binpay-features] Watch our video to learn about other B2BINPAY features that you can use. ## Important announcement [#important-announcement] We announce the release of the new API version **v3** on June 1, 2025. This version introduces the following significant changes: * New [base URLs](#base-urls) * New [Authentication](authentication) procedure * New [Callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) and modifications in the callback verification method for [deposits](deposit-methods#callback-verification) and [payouts](payout-methods#callback-verification) **Action required:** We strongly encourage you to review the changes and update your integrations **before December 1, 2025**, as the old API version will be shut down after this date. Please ensure all updates are completed before the deadline to avoid any service disruptions. **Deprecated API notice:** The previous version of the API guide has been moved to a [separate section](../api-guide-v2-deprecated/api-overview) and is now marked as deprecated. Before you start working with the B2BINPAY API, you need to enable API access to the system. Refer to [How to access the API](../how-tos/manage-your-profile-and-system/how-to-access-api) for step-by-step instructions. ## General information [#general-information] The B2BINPAY API v3 is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. Except for [Authentication](authentication), all requests must contain the following HTTP headers: * `Authorization: Bearer {YOUR_ACCESS_TOKEN}`: Used to authenticate your request. * `Content-Type: application/vnd.api+json`: Required according to [JSON API Specification](https://jsonapi.org/format/). ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token/` #### Request example [#request-example] ```sh curl --location '{base_url}/token/' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "client_id": "", "client_secret": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'client_id': '', 'client_secret': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'client_id' => '', 'client_secret' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "access": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjMy...", "expires_in": 3599, "token_type": "Bearer" } } } ``` #### Response codes [#response-codes] ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message`. The `message` composition depends on whether the callback includes a transfer: * **With a transfer** — concatenate `transfer.status`, `transfer.amount`, `deposit.tracking_id`, and `meta.time`. * **Without a transfer** (deposit status change only) — concatenate `deposit.status`, `deposit.tracking_id` (if non-empty), and `meta.time`. Refer to the examples below for callback verification examples. ```php ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2592000 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Validate payout [#validate-payout] Validates a payout request without creating it. The endpoint runs the same validation pipeline as [Create payout](payout-methods#create-payout), checking the address, currency, fee, balance, commissions, `tracking_id` uniqueness, wallet activity, and target wallet or deposit resolution. On success, the response contains the resulting `total_amount` that would be debited from the source wallet. The endpoint has no side effects and doesn't require the `Idempotency-Key` header. ### Request [#request-2] `POST` `[base]/payout/validate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url [base]/payout/validate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/validate/" payload = json.dumps({ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": False, "is_commission_included": False, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $body = '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/validate/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains the total amount that would be debited from the source wallet if the payout was created. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-validation", "id": "0", "attributes": { "total_amount": "0.05000550" } } } ``` #### Response codes [#response-codes-2] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-3] `POST` `[base]/payout/calculate/` #### Request example [#request-example-3] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-3] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example-1] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-3] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message` (the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields). Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the payout itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this payout. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-4] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-4] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-4] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-4] #### Response body example [#response-body-example-2] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## 2FA [#2fa] The Two-Factor Authentication is an additional method of authentication that adds one more layer of security to your account. It assumes that, when signing in, in addition to your credentials, you also enter a unique one-time and time-limited confirmation code. B2BINPAY supports 2FA with the **Google Authenticator** app (it's free). B2BINPAY requires two different 2FA codes: * **Authentication 2FA**: This one is mandatory for all users upon registration. It must be entered each time you log in. * **Authorization 2FA for operations**: This one is enabled in the **Profile menu** > **Settings** section. It's required for the following sensitive system actions: * IP whitelist setup * API credentials generation * Callback secret generation * Payout confirmation *** ## Activation fee [#activation-fee] This is a deposit that you have to make to your wallets denominated in specific currencies in order to activate them. After the wallet that require confirmation is created, you'll receive a message on the **Notifications** page indicating the required deposit amount. Once deposited, the fee amount is frozen on the wallet and the wallet is assigned the *Active* status. You can use your Merchant wallets to deposit the required amount of funds. Refer also to [Blockchain fee](#blockchain-fee) and [Commission](#commission) to learn about other commission types. *** ## AML [#aml] Anti-Money Laundering is certain regulations and laws that prevent illegal movement and laundering of funds. ### Default AML check [#default-aml-check] B2BINPAY provides a built-in obligatory AML check for all incoming transfers. The check is performed on the side of a connected AML provider. During AML verification, the incoming transfer amount is displayed in the wallet as *Pending* and can't be used for financial operations. If the check is successful, the incoming transfer amount is enrolled to the wallet balance. If a transaction is considered suspicious, it's assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. ### Additional AML check [#additional-aml-check] You can add your personal account of the AML provider as an additional level of verification. Find the step-by-step instruction [here](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check). If enabled, after successfully passing the default AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). *** ## Bank withdrawal [#bank-withdrawal] This is a withdrawal of fiat funds from your [Merchant wallet](#merchant-wallet) denominated in the same fiat currency to your bank account. B2BINPAY provides three types of bank withdrawals: * **One-time withdrawal**: A single withdrawal of a fixed amount. * **Regular withdrawal with a fixed amount**: A withdrawal that is triggered every time when the wallet balance reaches the specified amount plus the commission amount. * **Regular withdrawal with a changing amount**: A withdrawal where you additionally specify the minimum amount that should be left on your wallet after the withdrawal. This withdrawal is triggered every time when the wallet balance reaches the amount calculated as *Withdrawal amount* + *Leftover amount* + *B2BINPAY commission amount*. To enable bank withdrawals, submit your banking details in advance on the **Bank details** page available under your **Profile menu**. The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. *** ## Blockchain fee [#blockchain-fee] This is a blockchain commission for [on-chain transactions](#on-chain-transaction). These fees are essential for the network's operation, as they compensate miners or validators who secure and maintain the blockchain. Each network dictates its own fee structure, which can vary based on network traffic. During peak times, fees may rise due to increased demand for transaction processing. When sending funds, you can select from possible blockchain fee levels: low, medium, high, or custom. A higher fee typically results in faster processing. These values are pre-calculated by B2BINPAY at the moment of payout creation based on the current blockchain fee records. Refer also to [Commission](#commission) and [Activation fee](#activation-fee) to learn about other commission types that can be charged. *** ## Callback [#callback] This is an asynchronous notification about changing statuses of deposits and payouts, sent by B2BINPAY to your server. You can use callbacks to make changes in your system and notify your payers, or just track the transactions. To handle incoming `POST`-requests from a callback URL in your application: * Define a route, such as `/payment/callback`. * Create an endpoint to process incoming data, such as validating transactions and updating your database accordingly. To receive callbacks, specify the **Callback URL** when creating a new [deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) or [payout](../how-tos/manage-your-assets/how-to-create-a-payout) via the Web interface, or when sending the [Create deposit](../api-guide/deposit-methods#create-deposit) or [Create payout](../api-guide/payout-methods#create-payout) requests via the API. *** ### Callback types [#callback-types] The following callbacks can be sent for transactions: **Confirmation** The transfer has received a required number of [block confirmations](#confirmation-block). This number is determined in the currency settings in the B2BINPAY Back Office. For example, the required number of confirmations for a currency is set to `3`. It means that this callback will be sent after receiving three confirmations. You can use the [Get currency](../api-guide/currency-methods#get-currency) method to receive the required number of confirmations configured for a currency. **Fail** The transfer failed. **No transfer** The deposit has expired or the payout wasn't approved, no transfer was created. **Request rejection** The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. **Block** The deposit was blocked by an AML provider, the transfer was canceled. **Cancel** The payout was blocked by an AML provider, the transfer was canceled. **User confirmation** The transfer has received a number of block confirmations specified by a client. See [Additional callback](#additional-callback) below. **Manual** The callback is resent manually. See [Resending callbacks](#resending-callbacks) below. ### Additional callback [#additional-callback] By default, a callback is sent after a transaction achieves a specified number of block confirmations on the blockchain. This number is determined in the currency settings in the B2BINPAY Back Office. To trigger an additional callback, you can set a different number of confirmations when creating a deposit or payout via the Web UI or API. For example: * Default confirmation requirement: 3 blocks * Specified for a particular deposit or payout: 1 block In this case, the callback will be sent twice: after 1 confirmation and again after 3 confirmations. ### Callback processing [#callback-processing] The callback is sent to your server if the deposit/payout includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. The callback body depends on the callback type. For additional callback structure examples, see [Deposit callback](../api-guide/deposit-methods#callback-body-example) and [Payout callback](../api-guide/payout-methods#callback-body-example). You can check that the callback was sent by B2BINPAY. Refer to [Deposit callback verification](../api-guide/deposit-methods#callback-verification) and [Payout callback verification](../api-guide/payout-methods#callback-verification) for details. After processing the payload, your server should respond with the HTTP `200` response code without a body. ### Resending callbacks [#resending-callbacks] If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Events** page in the Web UI. *** ## Coin [#coin] This is a cryptocurrency that operates independently in its own blockchain. Coins act as native currencies within their specific financial systems and can only be transferred between participants in their respective networks. **Key points**: * Operate on their own independent blockchain. * Can be mined or earned through validation activities like staking or proof-of-work. * Serve as native currencies within their blockchain ecosystem. * Used primarily for transactions, payments, and storing value. **Example**: * **TRX**: The Tron coin operating on the Tron blockchain that can be transferred between participants within the Tron network. *** ## Commission [#commission] This is a commission charged by B2BINPAY for its services. Detailed descriptions of each commission type are provided below. Refer also to [Activation fee](#activation-fee) and [Blockchain fee](#blockchain-fee) to learn about other commission types that can be charged. ### Commissions for transaction processing [#commissions-for-transaction-processing] These are fees charged for handling transfers: deposits and payouts. Their amount depends on: * **Wallet type**: Generally, B2BINPAY charges commissions for incoming transactions for [Merchant wallets](#merchant-wallet), and for outgoing transactions for [Enterprise wallets](#enterprise-wallet). This approach is determined by the internal logic of the wallets and the B2BINPAY services involved in providing these wallets. * **Transaction currency**: Different cryptocurrencies have different commission rates applied. * **Overall transaction volume**: Generally, higher transaction volumes are rewarded with lower commission rates. Once you reach a designated threshold, the applicable commission rate is fixed for the rest of the month. **Note** that previously charged commissions aren't recalculated. Visit [our website](https://b2binpay.com/en/fees-crypto-payment-processing) to view applicable commission rates. ### Commissions for custom token processing [#commissions-for-custom-token-processing] These are fees for maintaining of [custom tokens](#custom-token). They're charged on a monthly basis from the parent wallet. ### Commissions for Custody services [#commissions-for-custody-services] These are fees for storing funds on [Custody wallets](#custody-wallet). The accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and with each withdrawal from the Custody wallet. *** ## Confirmation block [#confirmation-block] This is a process of transaction confirmation on the blockchain. A transaction is being verified on the blockchain and the blocks are added to the transaction thus confirming it. Until the required amount of blocks is received, the corresponding transfer in B2BINPAY is assigned the *Unconfirmed* status. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). *** ## Custody wallet [#custody-wallet] This is an account designed for secure storage, available only to users with the *Owner* role and requiring video verification for withdrawal of funds. Custody wallets can be topped up from your [Merchant](#merchant-wallet) and [Enterprise](#enterprise-wallet) wallets. Enterprise wallets must match the currency of the Custody wallet. Withdrawals form Custody wallets can be made to Merchant and Enterprise wallets denominated in the same currency, as well as to external addresses. B2BINPAY charges commissions for storing funds on Custody wallets, their amount is calculated based on the tier percentage of stored funds. You can find information about applied tiers on the **Custody** > **Wallets** page. The accumulated commission is calculated daily for each Custody wallet. The commission is charged monthly and with every withdrawal from the Custody wallet. *** ## Custom token [#custom-token] This is a token created by a B2BINPAY user on the Ethereum, Binance Smart Chain, or Tron blockchains. B2BINPAY charges a fixed commission for custom token processing, which is applied on a monthly basis. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. *** ## Deposit [#deposit] This is an invoice that you create in B2BINPAY to receive payments from other people. Deposits can be made to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the deposits to Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The deposits to Merchant wallets can be made in any currency, including the option when payers select the payment currency themselves. Payments from other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For the deposits to Merchant wallets, you can also specify various time and amount limits. You can enable [callback](#callback) sending for any deposit to be notified about new deposit-related transactions. Deposits shouldn't be confused with [direct deposits](#direct-deposit). *** ## Destination tag [#destination-tag] This is a special identifier used for transactions in XRP. It's used to indicate the recipient of the payment. The absence of the destination tag or incorrect destination tag results in payment rejection or irreversible loss of funds. The destination tag for Stellar-based currencies (*memo*) can be applied both to deposits and withdrawals. You can indicate the following memo types: * `MEMO_TEXT`: A string encoded using either ASCII or UTF-8; maximum length is 28 bytes. * `MEMO_ID`: A 64-bit unsigned integer. *** ## Direct deposit [#direct-deposit] This is a crediting of funds to your own wallet. Direct deposits should not be confused with [deposits](#deposit). *** ## Enterprise wallet [#enterprise-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds in cryptocurrencies. Enterprise wallets support transactions in the same currencies in which they're denominated. All transactions involving Enterprise wallets are [on-chain](#on-chain-transaction). *** ## KYC [#kyc] The Know Your Customer or Know Your Client are standards for financial institutions obliging them to verify a client's identity before carrying out financial transactions. The aim of KYC is to better understand the clientele, monitor financial transactions, reduce client risks, and prevent bribery and corruption. B2BINPAY provides a built-in obligatory KYC check of all new clients. After signing up for B2BINPAY, you'll be asked to provide certain information and documents verifying your identity to complete the KYC procedure. *** ## Merchant wallet [#merchant-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds either in fiat or in cryptocurrencies. Merchant wallets support transactions in various currencies that may differ from the currency in which the wallet is denominated. Transactions between B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). *** ## Minimum transfer amount [#minimum-transfer-amount] This is a threshold set for incoming transfers to a wallet, that is, the minimum deposit amount that can be made to your wallet. Payments below this minimum are automatically rejected to ensure economic viability, particularly when [blockchain fee](#blockchain-fee) might exceed the transaction amount. You can find information about minimum allowed deposits [here](https://b2binpay.com/en/available-currencies). For Enterprise wallets, the **Minimum transfer amount** can be customized; for Merchant wallets, it's defined in the system settings. *** ## Off-chain transaction [#off-chain-transaction] This is a transaction between [Merchant wallets](#merchant-wallet) within B2BINPAY. Such transactions aren't recorded on the blockchain, don't require [blockchain confirmations](#confirmation-block), and therefore, don't incur [blockchain fees](#blockchain-fee). This method offers a cost-effective and rapid solution to transfer funds within the ecosystem. However, for payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## On-chain transaction [#on-chain-transaction] This is a transaction processed on the blockchain. Such transactions are recorded on the blockchain, require [blockchain confirmations](#confirmation-block), and therefore, incur [blockchain fees](#blockchain-fee). All transactions involving [Enterprise wallets](#enterprise-wallet) are always on-chain. For payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## Parent wallet [#parent-wallet] This is an [Enterprise wallet](#enterprise-wallet) to which a wallet denominated in [tokens](#token) is linked. The parent wallet must be created in the same blockchain as the token. Each parent wallet can serve as the parent for a single token wallet, it's not possible to link two token wallets to the same parent wallet. The B2BINPAY commission for token processing is charged from the parent wallet. Therefore it's important to maintain the minimum required amount of funds on the wallet to process transactions. The required amounts are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) *** ## Payout [#payout] This is a payment, withdrawal, or transfer made from your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the payouts from Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The payouts from Merchant wallets can be made in any currency, payments to other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For Merchant wallets denominated in fiat currencies, B2BINPAY also supports [bank withdrawals](#bank-withdrawal). *** ## Stablecoin [#stablecoin] This is a cryptocurrency, the market value of which is pegged to a reference asset, such as fiat currency, precious metal, and so on. Stablecoins combine the efficiency and security of blockchain technology with the stability of traditional finance, making them attractive for trading, savings, or payments. **Key points**: * Bridge digital assets with the traditional financial ecosystem. * While aren't guaranteed to maintain complete stability, they tend to be less volatile than popular cryptocurrencies. * Based on the "underlying" asset, can be categorized into various types, such as fiat-collateralized, crypto-collateralized, commodity-collateralized, algorithmic. **Example**: * **USDT**: The Tether stablecoin backed by the U.S. dollar at 1:1 ratio. *** ## Staking [#staking] Staking is a process of locking up crypto assets for a certain period of time to support the operation of the blockchain. In exchange for staking your crypto, you earn more crypto and/or save on commissions. At the moment, B2BINPAY supports **TRX staking**. You can stake TRX in exchange for resources: **bandwidth** or **energy**. The resources allow you to save on the blockchain fee. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are replenished throughout the day. Along with the resources, you also receive 1 vote for each TRX staked. You can distribute the votes among [SRs](#sr) and gain additional profit in return: the process is split into rounds, during which SRs generate profit that they can further distribute as rewards among their voters. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. Once in 24 hours the accumulated reward can be claimed and withdrawn to your TRX wallet, with a 10% commission is deducted from the reward. You can re-distribute your votes at any time, this will take effect from the next round. The resources and votes are available immediately after staking. You can unstake your funds anytime, but remember that the unstaking process takes 14 days on the blockchain. So you'll be able to withdraw TRX to your wallet after 14 days, until then they remain locked. You can cancel the unstaking request anytime during this period. When unstaking, all distributed votes are automatically canceled, the resources are no longer available. *** ## SR [#sr] In [TRX staking](#staking), this is a Super Representative to whom you may give your votes. They serve as blockchain "partners", supporting its operation and generating profit, which they can further distribute as rewards among their voters. When deciding on which SR to vote for, you can rely on the following key performance indicators displayed by B2BINPAY for each SR: * **Current votes**: The total number of votes cast for the SR. * **Reward distribution**: The proportion of rewards distributed to voters to all rewards gained by the SR. * **Productivity**: The percentage of successfully validated blocks. * **Expected APR**: The expected annual percentage rate. The APR may change at any time and the estimated profit may differ from the actual profit received. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. The process is divided into rounds. You can gain profit for each round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-distribute your votes to SRs at any time, this will take effect from the next round. The list of 27 SRs available for voting is provided by the Tron blockchain and is valid for a certain period of time. After that, a redistribution of positions in the list may occur. Keep in mind that if an SR is no longer ranked in the top 27, they can no longer generate and distribute rewards. The votes given to such SRs aren't automatically canceled, if you want to recall your votes, you have to do it manually. *** ## Swap [#swap] This is a currency exchange operation between your [Swap wallets](#swap-wallet). Swap operations are always [off-chain](#off-chain-transaction). You can exchange all available currencies, including fiat, coins, and tokens. *** ## Swap wallet [#swap-wallet] This is a B2BINPAY account enabling you to [swap](#swap) currencies. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. *** ## Token [#token] This is a digital asset that operates on an existing blockchain. Unlike [coins](#coin), which have their own blockchains, tokens are issued on established third-party blockchains, such as Ethereum, Tron, or BNB Smart Chain. Companies often issue tokens during Initial Coin Offerings (ICOs) or other token sale events. Tokens can represent assets, utilities, or even voting rights within a specific project. **Key points**: * Issued on top of existing blockchains. * Non-mineable and created through smart contracts. * Represent assets, utilities, or rights within a particular project. * Offer a wider range of functionalities compared to coins. **Example**: * **USDT-TRX**: The Tether (USDT) token issued on the Tron blockchain that can be used within the Tron network. *** ## Tracking ID [#tracking-id] This is a unique identifier that you can assign to your deposits and payouts. Its primary purpose is to help identify specific transactions in B2BINPAY and external systems. This identifier can be composed of any combination of numbers and letters, chosen by you for ease of reference. For each payout, the **Tracking ID** must be unique within the wallet, whereas you can reuse the same identifier across multiple deposits. The **Tracking ID** can be specified when creating deposits and payouts via both the Web UI and API, and can be utilized in callbacks sent by the system. It helps both businesses and customers track transactions and quickly locate and address issues in case of any discrepancies. *** ## Transfer [#transfer] This is any crediting or debiting of funds registered on the wallet. For more information on operation types, refer to [Transfer types](transfer-types). *** ## TXID [#txid] This is a transaction identifier, or transaction hash, which is a unique identifier assigned to each blockchain transaction. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. The example of a TXID: `f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e1`. B2BINPAY logs TXIDs for all transactions registered in the system. You can find them on the **Transfers** page and in **Transactions** tabs of deposit and payout details. Each TXID links to a blockchain explorer — a public tool for tracking transactions. In this documentation, you can also find a list of [block explorers](block-explorer-list). *** ## User role [#user-role] This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. For more information, refer to [User roles](user-roles). *** ## Wallet [#wallet] This is an account of a B2BINPAY user. B2BINPAY supports four wallet types for various purposes: * [Enterprise wallet](#enterprise-wallet) * [Merchant wallet](#merchant-wallet) * [Swap wallet](#swap-wallet) * [Custody wallet](#custody-wallet) In the **Operation type** column, you can find codes corresponding to the `op_type` field value of the [Transfer object](../api-guide/transfer-methods#transfer-object). The **In/Out** column indicates whether the transfer is incoming or outgoing. The **Fiat/Crypto** column indicates which types of currency are supported for the transfer: crypto, fiat, or both. ## UUID tools [#uuid-tools] Here you can find a list of UUID tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/uuid](https://www.npmjs.com/package/uuid) * **PHP**: [https://packagist.org/packages/ramsey/uuid](https://packagist.org/packages/ramsey/uuid) * **Java**: [https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html](https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html) * **Ruby**: [https://www.rubydoc.info/gems/uuid/2.3.8/UUID](https://www.rubydoc.info/gems/uuid/2.3.8/UUID) * **Python**: [https://docs.python.org/3/library/uuid.html](https://docs.python.org/3/library/uuid.html) * **C#**: [https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid](https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid) ## HMAC tools [#hmac-tools] Here you can find a list of HMAC tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/crypto-js](https://www.npmjs.com/package/crypto-js) * **PHP**: [https://www.php.net/manual/ru/function.hash-hmac.php](https://www.php.net/manual/ru/function.hash-hmac.php) * **Python**: [https://docs.python.org/3/library/hmac.html](https://docs.python.org/3/library/hmac.html) ## Reference information [#reference-information] * [JSON API Specification](https://jsonapi.org/format/) * [FIAT currency codes](https://en.wikipedia.org/wiki/ISO_4217) * [Bitcoin Wiki](https://en.bitcoinwiki.org/wiki/Main_Page) * [HMAC algorithm description](https://wikipedia.org/wiki/HMAC) User access to B2BINPAY is restricted according to user roles. The default roles include: * **Owner**: A a user with this role has the maximum permissions and can’t be assigned any other roles. This user has Web UI and API access. Only one user can be assigned this role. * **Admin**: A user has access to the API. * **Withdrawals with approval**: A user has access to the Web UI, can make deposits and payouts, but the payouts require confirmation from the *Owner*. * **Read only**: A user has access to the Web UI and can view information on wallets and transactions, but can’t perform any actions such as creating new deposits or payouts. The first user registered in B2BINPAY is automatically assigned the *Owner* and *Admin* roles. Users with these roles can invite other users to B2BINPAY and manage their access permissions. After registration, the *Owner* also receives the API keys to the email. ## Security [#security] ## Enterprise and Merchant wallets [#enterprise-and-merchant-wallets] ## Transfers [#transfers] ## Deposits [#deposits] ## Payouts [#payouts] ## Callbacks [#callbacks] ## Custody wallets [#custody-wallets] ## Staking [#staking] ## Swaps [#swaps] ## Helpdesk [#helpdesk] ## API [#api] [^1]: This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. ## Problem [#problem] * The incoming transfer is assigned the *Canceled* status. * I need to collect funds from the canceled transfer. * I encountered the *Transfer amount is less than required minimum* event. ## Possible reasons [#possible-reasons] This issue may occur if the amount of the incoming transfer is less than the [Minimum transfer amount](../references/key-terms#minimum-transfer-amount) set for your wallet. In this case, the transfer is automatically assigned the *Canceled* status. The funds stay on the deposit address and can't be used until further action is taken. ## Solution [#solution] When you detect a canceled transfer, it can be resolved through the **Side collecting funds** process. Here are the possible ways to do it. ### Initiate another transfer exceeding the minimum amount [#initiate-another-transfer-exceeding-the-minimum-amount] Request your payer to make another deposit to the same wallet address. Ensure this deposit amount is equal to or exceeds the wallet's **Minimum transfer amount**. Upon receiving the new transfer, the system will automatically recover the previously canceled deposit through the **Side collecting funds** process: * The status of the canceled transfer will update to *Failed*. * A new transfer of the **Side collecting funds on wallet** type will be created, which includes the ID of the original canceled deposit. * The funds of both deposits will then be credited to your wallet. ## Understand Smart Contract logic [#understand-smart-contract-logic] The underlying smart contract includes programmed instructions that only permit the collection of transfers meeting or exceeding the specified minimum amount. If the new transfer doesn't meet this requirement, it will also remain stuck in the *Canceled* status, even if the total of incoming transfers surpasses the minimum transfer amount. ## Important consideration [#important-consideration] Note that while the first deposit failed, it still will be credited to your wallet along with the next successful transfer. Therefore, as a merchant, you are responsible for manually refunding any differences to the payer. Instead of requesting a new transfer from your payer, you can wait until a larger transfer arrives to your wallet address. When this happens, the system will automatically process the previously canceled deposit just as described above. ### For Enterprise wallets only: Manually accept the canceled transfer [#for-enterprise-wallets-only-manually-accept-the-canceled-transfer] If a deposit to your Enterprise wallet is less than the **Minimum transfer amount** set for the wallet, you have an additional option to accept it manually. 1. Locate the deposit on the **Wallet management** > **Events** page. You can filter it by the *Transfer amount is less than required minimum* event type. 2. Click **Confirm anyway** to accept the deposit. Be cautious when accepting deposits below the required minimum amount. Confirming each deposit incurs [blockchain fees](../references/key-terms#blockchain-fee) charged from your wallet. If the deposit amount is less than these costs, accepting it may not be economically reasonable. Once confirmed, the system will automatically process the previously canceled deposit using the **Side collecting funds** process described above. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Events](../user-guide/wallet-management/events) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) ## Problem [#problem] I can't pass 2FA because I encounter the **Wrong 2FA code** error. ## Possible reasons [#possible-reasons] This issue may occur due to time discrepancies between your device and Google Authenticator, or browser-related problems. ## Solution [#solution] Here are several steps that can help you resolve most common 2FA issues. ### Verify the 2FA code [#verify-the-2fa-code] **Multiple accounts**: If you manage multiple accounts, ensure you're using the correct 6-digit code associated with this specific account. ### Synchronize device time settings [#synchronize-device-time-settings] By ensuring your device's time is accurately synchronized, you can reduce the likelihood of encountering the error during the 2FA process. **For Windows**: 1. Right-click the time display in the taskbar and select **Adjust date/time**. 2. Ensure that **Set time automatically** is enabled. 3. Click **Sync now** under **Synchronize your clock**. **For macOS**: 1. Go to **System settings** > **General** and select **Date & Time**. 2. Ensure that **Set date and time automatically** is checked. 3. If adjustments are needed, click the **lock icon** to make changes. **For Android**: 1. Go to **Settings**. 2. Scroll to **System** and select **Date & Time**. 3. Ensure that **Set time automatically** and **Set time zone automatically** are enabled. **For iPhone**: 1. Go to **Settings**. 2. Go to **General** and select **Date & Time**. 3. Enable the **Set automatically** toggle. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the 2FA process. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Delete browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Use Incognito/Private browsing mode [#use-incognitoprivate-browsing-mode] This mode disables extensions and uses default settings, which can help identify browser-related issues. **For Google Chrome**: * Press `Ctrl + Shift + N` to open an incognito window. **For Mozilla Firefox**: * Press `Ctrl + Shift + P` to open a private browsing window. ### Check the Internet connection [#check-the-internet-connection] A stable internet connection is important for 2FA processes. 1. Ensure you're connected to a reliable network. 2. Avoid using VPNs or proxies during the authentication process, as they can cause synchronization issues. ### Remove and re-add the account in Google Authenticator [#remove-and-re-add-the-account-in-google-authenticator] If none of the above worked, try deleting and re-adding your account in Google Authenticator. 1. **If you can access your profile settings in B2BINPAY**, disable the 2FA temporarily. 2. Open Google Authenticator and delete the existing 2FA entry for your account. 3. Re-enable 2FA on your account and scan the new QR code to add it back to Google Authenticator. 4. Test logging in with the new code. If the problem persists, contact the Support Team for further assistance. **See also:** * [Profile menu](../get-started/explore-the-web-interface#profile-menu) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) ## Problem [#problem] I can't login to the system because I encounter the **You IP is not whitelisted** error. ## Possible reasons [#possible-reasons] This issue may occur due to the IP address from which you're trying to access the system not being whitelisted. ## Solution [#solution] Here are several steps that can help you resolve most common IP-related issues. ### Check IP configuration [#check-ip-configuration] Verify if your current IP address is included in the list of whitelisted IPs. To identify your IP address, use resources like [http://ifconfig.net/](http://ifconfig.net/). ### Update the whitelist [#update-the-whitelist] If your IP is not on the list and **if you can access your profile settings**, add your IP address to the list. ### Use a VPN [#use-a-vpn] If accessing a whitelist isn't possible, consider using a VPN or proxy server that routes traffic through a whitelisted IP address. Make sure the VPN service is secure and trustworthy. ### Dynamic IP consideration [#dynamic-ip-consideration] If your Internet provider assigns dynamic IP addresses, your public IP might change frequently. Ensure your current IP address is granted access. Mind that the system doesn't support whitelisting of dynamic IP addresses. ### Firewall and security software [#firewall-and-security-software] Check any firewalls or security software that might be affecting network settings and ensure they aren't blocking your access. If the problem persists, contact the Support Team for further assistance. **See also:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) ## Problem [#problem] * The payer sent me funds, but I didn't receive the payment. * I can't find the incoming transaction in the external systems. ## Possible reasons [#possible-reasons] These issues may occur due to: * The transaction still being processed on the blockchain. * Wrong deposit address. * Missing callback details. ## Solution [#solution] Here are several ways that can help you verify the transaction. ### Check for transfers [#check-for-transfers] Go to the **Wallet management** > **Transfers** page and filter transfers by [TXID](../references/key-terms#txid). Double check the TXID was accurately obtained or provided. * If the transfer is found and assigned the *Confirmed* status, it means that it has been successfully processed and credited to your wallet. * If the transfer is found but assigned the *Unconfirmed* status, it means that the transaction hasn't yet received enough block confirmations on the blockchain, please wait. Once the required number of confirmation blocks received, the transfer status in B2BINPAY will change to *Confirmed*, and the deposit amount will be credited to your wallet. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](../references/block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If the transaction is confirmed on the blockchain, but in B2BINPAY the transfer remains unconfirmed for an extended period, there might be a technical issue. Contact the Support Team for further assistance: provide the TXID and transfer ID. ### Check the deposit address [#check-the-deposit-address] If no transfer is found, verify if the deposit address is associated with the system. Go to the **Wallet management** > **Deposits** page and filter deposits by the address. * If the deposit is located but no transfers were credited, contact the Support Team for further assistance. Provide the TXID, address, and deposit ID. * If no deposit is located, it indicates that the address is not within the system, and such deposits can't be credited. ### Check for callback issues [#check-for-callback-issues] Even if the transfer is found and confirmed in B2BINPAY, it still can be missing in the external systems due to [callback](../references/key-terms#callback) issues. 1. Go to the **Wallet management** > **Deposits** page, find the required deposit and click its **ID** to access the details. In the **Advanced options** on the **Settings** tab, verify that the **Tracking ID** and **Callback URL** are correctly specified. Adjust them if needed. Missing these details can cause callback issues, leading to unrecorded transactions in the external system. 2. Ensure the server handling callbacks is correctly configured and functioning. 3. Go to the **Wallet management** > **Callbacks** page, locate the corresponding callback, and click the **Resend** button. * **Unsupported blockchains**: Transactions can only be credited if the blockchain is supported by the system. Transactions on unsupported networks can't be recovered. * **Unsupported tokens**: Funds can be reversed, contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Deposits](../user-guide/wallet-management/deposits) * [Callbacks](../user-guide/wallet-management/callbacks) ## Problem [#problem] I can't log in to my account because I encounter the **No active account found with the given credentials** error. ## Possible reasons [#possible-reasons] This issue may occur due to entering incorrect credentials when trying to log in. ## Solution [#solution] Here are several steps that can help you resolve most common login issues. ### Check the credentials [#check-the-credentials] Make sure that you enter the correct credentials. ### Check the keyboard layout [#check-the-keyboard-layout] Ensure your keyboard layout matches your usual settings, especially if special characters are involved. ### Check CapsLock [#check-capslock] Check if the CapsLock key is active, as it may alter the input. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the login process. Clear your browser's cache and cookies and try again. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Clear browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Account lockout [#account-lockout] After multiple failed login attempts, your account may be locked. Wait for about a minute to be able to try again. ### Reset password [#reset-password] If none of the above worked, click the **Forgot password** link to reset it. If the problem persists, contact the Support Team for further assistance. ## Problem [#problem] * The outgoing transfer is stuck in the *Unconfirmed* status. * I encountered the *Insufficient funds on parent wallet* event. ## Possible reasons [#possible-reasons] These issues may occur due to: * The fee amount being to low (for payouts). * The [parent wallet](../references/key-terms#parent-wallet) lacks funds for accepting payment in tokens (for deposits). ## Solution [#solution] ### Stuck payouts [#stuck-payouts] The confirmation time for a transaction varies depending on the blockchain used, paid fees, and network load. For example, Bitcoin transactions typically take around 10 minutes to confirm, while Ethereum transactions are confirmed in about 12 seconds. You can find the required numbers of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If a transaction remains at zero confirmations for a long time, it may indicate the transaction fee was too low. In such cases, you can either wait for network fees to decrease, or resubmit the transaction with a higher fee to accelerate processing. For details, refer to [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee). ### Insufficient funds on parent wallet [#insufficient-funds-on-parent-wallet] When receiving payments to your token wallet, commissions are deducted from the linked parent wallet. If the parent wallet lacks sufficient funds to cover these commissions, the payment will not be processed until it's replenished. Here are several steps that can help you handle it. ### Identify the parent wallet [#identify-the-parent-wallet] 1. Locate the transfer on the **Wallet management** > **Events** page. You can filter events by the **Insufficient funds on parent wallet** type to identify all unconfirmed transfers. 2. Click the deposit ID in the **Operation ID** column to access the deposit details. 3. In the deposit details, find the information about your token wallet to which the deposit was made and click its **ID** to access the wallet details. 4. In the token wallet details, find the link to its parent wallet and click it to access the details. ### Check the minimum required balance [#check-the-minimum-required-balance] Compare the parent wallet current balance against the required minimum amounts for transaction processing. The necessary amounts for various blockchains are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) ### Top up the parent wallet [#top-up-the-parent-wallet] 1. In the wallet details of the parent wallet, find the **Wallet address** and copy it. 2. Make a direct deposit to the parent wallet. Make sure your deposit amount is enough to cover the minimum required amount. ### Retry the transfer [#retry-the-transfer] 1. Check the deposit status on the **Wallet management** > **Transfers** page. You can identify it by filtering transfers by the **Direct deposit to wallet address** type. The status should update to *Confirmed*. 2. Once the deposit is successfully credited to your parent wallet, go back to the **Wallet management** > **Events page**. 3. Click the **Retry** button for the corresponding event to process the transaction. If after successful replenishing of the parent wallet the **Retry** button is unavailable (grayed out), contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/deposits) * [Events](../user-guide/wallet-management/events) * [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) ## Problem [#problem] * My deposit is assigned the *Unresolved* status. * I need to collect funds from the unresolved deposit. * I encountered the *Overpaid deposit* or *Transfer to expired deposit* events. ## Possible reasons [#possible-reasons] This issue may occur with the deposits that have set limits (amount or expiration date) due to: * **Overpaid deposit**: The amount of an incoming transfer exceeds the specified deposit amount. * **Overdue deposit**: The incoming transfer is received after the specified expiration date. ## Solution [#solution] Here are several steps that can help you handle the unresolved deposit. ### Find out why the deposit is unresolved [#find-out-why-the-deposit-is-unresolved] Check if the deposit is unresolved because it's overpaid or overdue. 1. Locate the deposit in the list on the **Deposits** page. You can filter it by the *Unresolved* status. 2. Click the deposit **ID** to access deposit details. 3. In the **Limits** section on the **Settings** tab, check the specified **Requested amount** and **Expired at**. 4. On the **Transactions** tab, locate the related transfer. Check its amount and creation time against the set limits. ### Adjust the deposit limits [#adjust-the-deposit-limits] **For overpaid deposits**: Adjust the **Delta** to match the overpaid amount. For example, if the requested amount is 10 USDT and the payer sent 15 USDT, set the Delta to 5 USDT. **For overdue deposits**: Change the **Expired at** to match the time of the transaction. You can also extend the time limit to give payers another chance to send a payment within the new timeframe. An overdue deposit's status changes to *Canceled* and payers won't be able to see the address on the Payment page. ### Manually change the deposit status [#manually-change-the-deposit-status] Once all the requirements are met, change the deposit status from *Unresolved* to **Paid** if you want to collect funds and "close" the deposit, or to **Invoice** if you want to extend the deposit's lifetime. In the latter case, the Payment page remains active and can be used for sending funds. The above information is only applicable to deposits with set limits made to Merchant wallets. Deposits without limits or made to Enterprise wallets are always assigned the *Invoice* status, manual status changing is unavailable. The status can't be changed to *Paid* if the limit requirements are unmet. Attempting this may result in errors such as *Change of deposit status is prohibited*. **See also:** * [Deposits](../user-guide/wallet-management/deposits) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit#deposits-to-merchant-wallets) **Know Your Business (KYB)** is a verification process that confirms the authenticity and legitimacy of your business entity. This process verifies that your company is: * Legally registered and operating. * Compliant with regulatory requirements. * Protected against corporate fraud and illegal activities. **KYB verification is mandatory** to access B2BINPAY production environment and begin processing real transactions. B2BINPAY uses [Sumsub](https://sumsub.com/) as our trusted KYB verification provider to ensure secure and compliant business verification. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Until KYB verification is completed, you can only use the Sandbox environment. * Verification must be renewed periodically to maintain compliance. * You'll see a red notification badge on the KYB menu item when: * KYB verification hasn't been initiated yet. * Additional documents are requested by the verification provider. ## Legal entity list [#legal-entity-list] On this page, you can view a list of all your legal entities registered in the system and their statuses. The following information is provided about each entity: **Legal entity name** The official business name, as specified during KYB. *** **Country of incorporation** The country where your business is legally registered and incorporated, as specified during KYB. *** **Jurisdiction** Automatically determined based on your country of incorporation. This affects which regulatory requirements apply to your business. *** **Status** The current status of your KYB verification request. Possible values: * **In progress**: You've started but haven't completed the KYB verification process. * **Pending**: Your application is being reviewed by our verification provider. * **Approved**: Verification successful — you can access production features. * **Declined**: Verification was rejected — you may submit a new application with a different entity. * **Cancelled by client**: You cancelled the verification process. * **Action required**: Additional documents or information needed — **respond promptly to avoid delays**. *** **KYB start date** The date and time when the KYB process was initiated for this entity. *** **Next KYB date** *For approved entities only.* The date and time when your next periodic re-verification is due to maintain compliance. *** **Available actions** Depending on your entity's current status, the following options are available: * **Cancel**: *(Available for: In progress status)* * Stop the current verification process. * **Check**: *(Available for: In progress, Pending, Action required status)* * View verification progress. * Continue incomplete verification. * Submit additional required documents. The **partner program** is a referral program that lets you earn additional revenue when new clients sign up to B2BINPAY through your unique referral link. For each invited client who passes KYB and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions for a limited period defined in the partner program settings. Rewards are credited once per month and credited to the wallet you selected for receiving partner rewards. On this page, you can manage your referral link and monitor the rewards you earn from invited clients. ### Key points [#key-points] * The partner program issues a unique referral URL for each legal entity, to share with potential clients. * Rewards are calculated as a percentage of B2BINPAY commissions on eligible transactions of referred clients. * Rewards are credited once per month for the previous period. * Partner rewards are limited by the partner program settings, including the percentage and program lifetime. ## Access the Partner program page [#access-the-partner-program-page] To open the partner dashboard: * In the left menu, go to **Partner Program**. The page shows three main blocks: * **Unique referral URL** — your personal referral link and copy action. * **How it works** — a short explanation of the referral flow and terms. * **Overview** — your current percentage, invited and active partners, and accumulated rewards. Below these blocks, you see the **Invited partners** table with detailed information about each referral. ## Unique referral URL [#unique-referral-url] This is the unique referral identifier assigned to your legal entity. Share this link with partners who want to sign up for B2BINPAY. When a new client completes onboarding using your link and passes KYC and KYB checks, their commissions may start generating rewards for you, depending on the partner program configuration. To get your referral link, first select or create a Merchant wallet in USD, to which you will receive your partner rewards. ## Overview panel [#overview-panel] This block summarizes the key partner metrics for your legal entity: **Invited/Active partners** Displays how many clients you have invited in total and how many of them are currently active and generating rewards. *** **Current percentage** Displays the percentage of B2BINPAY commissions that you receive from eligible transactions of your active referred clients. *** **Total bonus** Displays the total amount of partner program rewards accumulated for all referred clients over the entire program lifetime. *** **Reward for previous month** Displays the amount of rewards calculated for the previous reporting month. ## Terms and conditions [#terms-and-conditions] You can find the settings of the partner program by clicking the **Terms and conditions** link in the **How it works** block. ## Invited partners list [#invited-partners-list] The following information is provided about each client who registered using your referral link: **ID** The internal identifier of the referred client. *** **Partner** The email address of the referred client and, when KYB is approved, the legal entity name. *** **Registered date** The date when the referred client’s legal entity was registered in the production environment. This date is also used to calculate the referral program validity period together with the configured time limit. *** **Status** The current status of the referred client. Possible values: * **In progress**: The client has started onboarding but has not yet passed KYB. * **Active**: The client has passed KYB and currently generates rewards according to the partner program rules. * **Inactive**: The referral no longer generates rewards as the program time limit expires, or the referred client's KYB fails. *** **Bonus for previous month** The amount of partner program reward calculated for this referred client for the previous month. *** **Total bonus** The total accumulated reward amount for this referred client over the lifetime of the partner program. *** **Expired at** The date when the referral stops generating partner rewards. After this date, new commissions paid by this client no longer increase your partner bonus. **See also:** * [How to launch a partner program](../how-tos/manage-your-profile-and-system/how-to-launch-a-partner-program) **Rates** are the current exchange rates for currency conversion used for different financial operations. On this page, you can find a list of all currency pairs available in B2BINPAY. By default, B2BINPAY obtains prices from [B2CONNECT Liquidity Hub](https://b2broker.com/products/b2connect/) (if you haven’t connected another liquidity provider when setting up the system). The rates are updated every 20 seconds. If the price cell is highlighted in green, the value has increased since the previous update; in red — decreased. No highlighting means that the value hasn’t changed. Above the table, you can see **quick filters**: * **Favorites**: To display currency pairs added to *Favorites*. To add a currency pair to *Favorites*, click the **star icon** near it. * **All** (default): To display all available currency pairs. * **Fiat**: To display currency pairs where one or both currencies are fiat. * **Tokens**: To display currency pairs where one or both currencies are tokens. * **Coins**: To display currency pairs where one or both currencies are coins. Next to quick filters, you can see the **Decimal places** option. Use it to adjust the number of digits after a decimal separator in prices to be displayed (by default, 8). Available values are in the range from 0 to 18, but the actual number of digits is limited by the number specified in currency settings, refer to [Currency codes](../references/currency-codes). The **B2BINPAY DeFi API** allows you to integrate B2BINPAY DeFi app features into your own systems. You can manage accounts, create invoices, monitor transactions, and inspect callbacks using a unified REST interface. Before you start working with the B2BINPAY DeFi API, you need to generate API keys required for request authentication. Refer to [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for step-by-step instructions. B2BINPAY DeFi charges credits for using API: access the **Credits** page to view the detailed pricing. Refer to [View credit balance and pricing](../user-guide/credits#view-credit-balance-and-pricing) and [Top up the credit balance](../user-guide/credits#top-up-the-credit-balance) for step-by-step instructions. ## General information [#general-information] * **Base URL**: `https://api.defi.b2binpay.com/api/v1`. * **Format**: All endpoints use JSON for requests and responses. ## Required headers [#required-headers] * `x-api-key: {Your API key}` — required for all endpoints. * `Accept: application/json` — required for all endpoints. * `Content-Type: application/json` — required for requests with a body. ## HTTP response codes [#http-response-codes] * `2xx` — success (`200 OK`, `201 Created`). * `400` — validation error (`Invalid input`). * `401` — `Invalid or missing token` or `Invalid or expired token`. * `403` — permission issues (for example, *You are not a member of this account or deployment*). * `404` — resource not found (transaction, invoice, account, etc.). * `409` — conflicts (for example, invoice with the same tracking ID already exists). * `503` — service unavailable (for example, failing health check). ## Deployment ID [#deployment-id] To obtain the `deploymentId` parameter value which is used in many API calls, use the `GET [base]/api/v1/accounts/{accountId}` method. Refer to [Account methods](account) for details. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. A **callback** is an outbound HTTP webhook that B2BINPAY DeFi sends to your system when an invoice- or payout-related event occurs. When such an event happens, the app sends a `POST` request with a JSON body to the callback URL you configured, so you can react to payments and operations in real time. To inspect delivered callbacks or resend a failed one, open the **Callbacks** tab of the relevant invoice or payout in the app. Callback inspection and resending are not part of the API key surface. ## Callback payload [#callback-payload] Every callback body uses the same top-level structure: **`id`** `string · UUID` The unique callback identifier, in the UUID format. **`type`** `string` The callback type. Invoice-related types: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. Payout-related types: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **`operation_id`** `string · UUID` The identifier of the original operation: `invoiceId` for invoice-related callback types, `payoutId` for payout-related callback types. **`operation_type`** `string` The original operation type: `invoice` or `payout`. **`timestamp`** `string` The date and time the callback was generated, in ISO 8601 format (UTC). Updated with each callback resend attempt. **`data`** `object` The callback-specific payload. Always includes the original operation object (`invoice` or `payout`). May include transactions, claims, and other associated objects. Below you can find examples of payloads for different callback types. ```json { "id": "f7f2a2f4-2a8a-48cb-9c7a-6b5f2c1b1a33", "type": "INVOICE_CREATED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:00:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "dd08d1b9-0a1e-4e0b-9c8e-7a6f5e4d3c2b", "type": "INVOICE_DEPOSIT_RECEIVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:05:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "PENDING", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345670, "confirmations": 0, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:05:00Z", "isClaimed": false } } } ``` ```json { "id": "3f5a2a2b-4c1d-49d2-8e8a-9f3b0b0a1a22", "type": "INVOICE_DEPOSIT_CONFIRMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:10:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "EXECUTED", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345678, "blockchainFee": "0.001", "confirmations": 12, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:10:00Z", "confirmedAt": "2025-08-22T10:10:00Z", "isClaimed": false } } } ``` ```json { "id": "d2a5ee9c-6d9a-4f6a-a6a7-6efaf0a5b6f7", "type": "INVOICE_PAID", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:12:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "150.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "a8a4c8b7-3a4b-4f74-9e3d-bb3b0f9d0c9a", "type": "INVOICE_UNRESOLVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:15:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "160.00", "status": "UNRESOLVED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "b1f2c3d4-e5f6-47a8-9123-4567890abcde", "type": "INVOICE_CLAIMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:20:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "claim": { "id": "123e4567-e89b-12d3-a456-426614174000", "status": "PENDING", "chainId": 1, "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "300.00", "fromAddress": "0x1234567890123456789012345678901234567890", "toAddress": "0x9876543210987654321098765432109876543210", "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "linkedTransfers": [ "001e4567-e89b-12d3-a456-426614174000", "002e4567-e89b-12d3-a456-426614174000" ], "createdAt": "2024-01-01T00:00:00.000Z", "ethAmount": 0.5, "tokenAmount": 100 } } } ``` ```json { "id": "0c9d8e7f-6a5b-4c3d-9e0f-1a2b3c4d5e6f", "type": "PAYOUT_CREATED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:30:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CREATED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ```json { "id": "92f13f4b-5c7d-4f3a-912a-37b7e6a23f90", "type": "PAYOUT_SENT", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:33:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "SENT", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "e7a89cde-1f23-45ab-9876-12c34d5678ef", "direction": "OUT", "chainId": 1, "txHash": "0xaaaabbbbccccddddeeeeffff1111222233334444555566667777888899990000", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "PENDING", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": null, "confirmations": 0, "createdAt": "2025-08-22T10:33:00Z" } } } ``` ```json { "id": "2e4f6a8c-0b1d-4f2a-93c7-3d2e1f0a9b8c", "type": "PAYOUT_EXECUTED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:37:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "EXECUTED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "def56789-1234-4abc-5678-901234567890", "direction": "OUT", "chainId": 1, "txHash": "0xaaaa...bbbb", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "EXECUTED", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": 23456789, "confirmations": 15, "createdAt": "2025-08-22T10:35:00Z", "confirmedAt": "2025-08-22T10:37:00Z" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_FAILED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "FAILED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "error": { "code": "INSUFFICIENT_FUNDS", "message": "Account balance at execution time was insufficient" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_CANCELLED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CANCELLED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ## Callback verification [#callback-verification] Each callback request is signed to confirm that it was sent by the B2BINPAY DeFi API and was not modified in transit. The signature is provided in the `X-CALLBACK-SIGNATURE` HTTP header, that contains an HMAC-SHA256 hash of the raw JSON payload and your [callback secret](../get-started/key-terms#callback-secret). ### Verification steps [#verification-steps] ### Read the raw request body [#read-the-raw-request-body] Capture the exact HTTP body bytes as received: * Do not re-serialize the JSON before verification. * Use `JSON.stringify(payload)` **without custom replacers/spacing** (no pretty print). * Ensure numbers and booleans stay as JSON primitives (do not stringify them). * Timestamps must be in the UTC ISO 8601 format, for example: `2025-08-22T10:10:00Z`. ### Read the signature header [#read-the-signature-header] Get the value of the `X-CALLBACK-SIGNATURE` header. → If the header is missing, reject the request (HTTP code `400`). ### Compute the expected signature [#compute-the-expected-signature] Use HMAC with SHA-256: * Key: `callback_secret` (UTF-8) * Message: raw request body bytes (UTF-8) * Output: hex string ### Compare signatures [#compare-signatures] Compare the received signature with the computed one using a constant-time comparison. ### Accept or reject [#accept-or-reject] * If signatures match → process the callback (HTTP code `200`). * If they do not match → reject the request (HTTP code `401`). ```js // Express.js handler example import crypto from 'node:crypto'; import express from 'express'; const app = express(); // Capture the raw HTTP request body. // This preserves the exact byte sequence used to generate the HMAC signature. app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } })); // Computes an HMAC-SHA256 signature (hex) over the raw request body. function computeHmacHex(rawBodyBuffer, secret) { return crypto .createHmac('sha256', Buffer.from(secret, 'utf8')) .update(rawBodyBuffer) // IMPORTANT: use the raw body bytes, not a re-stringified JSON object. .digest('hex'); } app.post('/webhook/invoice', (req, res) => { // Read the signature provided by the sender. const provided = req.get('X-CALLBACK-SIGNATURE'); if (!provided) { return res.status(400).send('Missing X-CALLBACK-SIGNATURE'); } // Shared callback secret (account-specific). const secret = process.env.CALLBACK_SECRET; // Recompute the expected signature from the raw request body. const expected = computeHmacHex(req.rawBody, secret); // Compare signatures using a constant-time algorithm to prevent timing attacks. const ok = crypto.timingSafeEqual( Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8') ); if (!ok) { return res.status(401).send('Invalid signature'); } // (Optional) Apply replay protection here: // - Reject callbacks with duplicate IDs. // - Reject callbacks with stale timestamps. // At this point, the callback is verified and can be safely processed. const { type, operation_type, operation_id, data, timestamp } = req.body; // ... Your business logic ... // Acknowledge receipt so the sender does not retry. return res.sendStatus(200); }); app.listen(3000, () => { console.log('Callback receiver listening on port 3000'); }); ``` The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. This section groups endpoints that do not belong to a specific resource area. ## Smart contract versions [#smart-contract-versions] Use this endpoint to retrieve metadata for a given smart contract version, such as the version string and supported features. The `versionId` value is returned by account-related endpoints as part of the deployment information. Use these methods to list, inspect, and manage queue operations for a deployment, including multisig configuration changes, rejects, and signatures. *** ## Sign a queue operation with a private key (EIP-712) [#sign-a-queue-operation-with-a-private-key-eip-712] Queue operations are signed using EIP‑712 typed data. The signature is created off‑chain with a raw private key, without a wallet UI, and authorizes execution of a multisig operation on‑chain. ### What is signed [#what-is-signed] Only the following data is signed: ```solidity Execute { Call[] calls; uint256 nonce; } ``` No other fields from the queue operation are included in the signature. ### Input data sources [#input-data-sources] #### From queue operation (API) [#from-queue-operation-api] To build the signed payload, load the queue operation from the API: * `GET /api/v1/deployments/{deploymentId}/operations` * `GET /api/v1/deployments/{deploymentId}/operations/{operationId}` From the queue operation object, use only: ```json { "nonce": "1", "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ] } ``` When building the typed data: * Treat `nonce` as `uint256`. * Treat `value` as `uint256`. * Treat `data` as a hex‑encoded `bytes` value (the literal `"0x"` is valid for empty data). #### From deployment and network [#from-deployment-and-network] The EIP‑712 domain uses deployment and network data: * `name` — always `MultiSigWallet`. * `version` — current smart contract version. * `chainId` — blockchain chain ID of the deployment. * `verifyingContract` — address of the multisig contract. You can obtain `verifyingContract` from the account: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` Use the value from the `account.contract` field for the multisig contract address. ### EIP-712 typed data structure [#eip-712-typed-data-structure] The exact typed data that is signed has the following structure: ```json { "domain": { "name": "MultiSigWallet", "version": "1.0.0", "chainId": "11155111", "verifyingContract": "0x71db8821df07d95f35d7c3bef22987397a965060" }, "primaryType": "Execute", "types": { "EIP712Domain": [ { "name": "name", "type": "string" }, { "name": "version", "type": "string" }, { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ], "Execute": [ { "name": "calls", "type": "Call[]" }, { "name": "nonce", "type": "uint256" } ], "Call": [ { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" }, { "name": "data", "type": "bytes" } ] }, "message": { "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ], "nonce": "1" } } ``` Use this structure as a template. Do not change field names, types, or their order when building the typed data object. ### Signing algorithm [#signing-algorithm] #### Step 1. Build EIP-712 typed data [#step-1-build-eip-712-typed-data] * Use the structure shown above with `domain`, `types`, `primaryType`, and `message`. * Encode all numeric values (`chainId`, `nonce`, `value`) as `uint256`. #### Step 2. Compute the EIP-712 digest [#step-2-compute-the-eip-712-digest] The digest is computed as: ```text keccak256( "\x19\x01" || hashDomain(domain) || hashStruct(Execute(message)) ) ``` Standard EIP‑712 libraries perform this step automatically when you sign typed data. #### Step 3. Sign the digest with a private key [#step-3-sign-the-digest-with-a-private-key] Sign the digest using ECDSA over `secp256k1`: ```text signature = sign(digest, privateKey) ``` The resulting signature has the format: ```text 0x{r}{s}{v} ``` Where: * `r` — 32 bytes. * `s` — 32 bytes. * `v` — 1 byte. ### Example signature [#example-signature] Example of a valid signature value: ```text 0xf8d5a66ed464b5d39bf2b3f6c45932c901467b84bdfc4d534a24dcc532569bf3\ 27b3f19289912d223f69aceeab7a61edbffb1fc26d755e1db53f68263cbe03491b ``` ### Submit the signature to the API [#submit-the-signature-to-the-api] After computing the signature, submit it using the `Sign operation` endpoint: ```http POST /api/v1/deployments/{deploymentId}/operations/{operationId}/sign x-api-key: {your-api-key} Content-Type: application/json Accept: application/json { "signature": "0x..." } ``` On success, the API returns the updated signature status for the operation. If the same signer submits another signature for the same operation, the API returns a conflict error. ### Common errors when signing [#common-errors-when-signing] Common issues when building or submitting signatures include: * `Invalid signature` — incorrect domain (`chainId` or `verifyingContract` do not match the deployment). * `Invalid signature` — wrong data types in the message (for example, `nonce` passed as a string instead of `uint256` in the typed data). * `Invalid signature` — `calls` array order does not match the operation in the queue. * `You have already signed this operation` — the same address already submitted a signature. * `canSign = false` in the operation — the signer address is not an approver or is not allowed to sign. ### Summary [#summary] * Extract `calls[]` and `nonce` from the queue operation. * Build the EIP‑712 `Execute` typed data (`domain`, `types`, `message`). * Sign the EIP‑712 digest with a private key. * Submit the resulting signature to the B2BINPAY DeFi API. ## Execute a READY queue operation with a private key [#execute-a-ready-queue-operation-with-a-private-key] When a queue operation reaches the `READY` status and `canExecute = true`, you execute it by sending a regular Ethereum transaction to the deployed `MultiSigWallet` contract and calling: ```solidity function execute(Operation[] operations) external returns (bytes[][] results); struct Operation { Call[] calls; bytes signatures; // packed signatures bytes32 id; } struct Call { address to; uint256 value; bytes data; } ``` ### Preconditions [#preconditions] The queue operation must satisfy all of the following: * `status = "READY"`. * `canExecute = true`. * `signaturesCollected >= signaturesRequired`. * The `signatures` array in the API response contains at least the threshold number of signatures. ### Required inputs [#required-inputs] #### From API (queue operation) [#from-api-queue-operation] * `executeOperationId` — used as `Operation.id`. * `calls[]` — used as `Operation.calls`. * `signatures[]` — used to build packed bytes for `Operation.signatures`. #### From deployment and network [#from-deployment-and-network-1] * `verifyingContract` — multisig contract address for the deployment: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` * use `account.contract`. * `chainId` — chain ID of the network where the multisig is deployed. * `rpcUrl` — RPC endpoint for sending the transaction. * `executorPrivateKey` — private key of the externally owned account (EOA) that sends the transaction. ### Build Operation.calls [#build-operationcalls] Convert each API call object into the Solidity `Call` struct: * `to` → `Call.to`. * `value` (decimal string) → `Call.value` (`uint256`). * `data` (hex string) → `Call.data` (`bytes`). Keep the order of `calls` exactly the same as in the queue operation and in the EIP‑712 signing step. ### Build Operation.signatures (packed bytes) [#build-operationsignatures-packed-bytes] In the API response, signatures are returned as separate entries: ```json "signatures": [ { "user": "0x...", "sign": "0x<65 bytes>" } ] ``` The contract expects a single `bytes` value: ```solidity bytes signatures; // NOT bytes[] ``` #### Signature format [#signature-format] Each signature is a standard 65‑byte ECDSA signature: ```text r (32 bytes) || s (32 bytes) || v (1 byte) ``` For example: ```text 0xf8d5...3491b ``` #### Packing rule [#packing-rule] Build `Operation.signatures` as: ```text packedSignatures = sig1 || sig2 || ... || sigN ``` Sort signatures by signer address in ascending alphabetical order before concatenation. ### Build the operations array [#build-the-operations-array] Even if you execute a single queue operation, you must pass an array with one element: ```solidity operations = [ Operation({ calls: [...], signatures: packedSignatures, id: executeOperationId }) ]; ``` ### ABI-encode execute(operations) [#abi-encode-executeoperations] Encode the function call data for: ```solidity execute((Call[] calls, bytes signatures, bytes32 id)[] operations) ``` This produces the transaction `data` field that you send to the multisig contract. ### Build, sign, and broadcast the Ethereum transaction [#build-sign-and-broadcast-the-ethereum-transaction] #### Transaction fields [#transaction-fields] Set the transaction fields as follows: * `to` — multisig contract address (`verifyingContract`). * `data` — ABI‑encoded `execute(operations)` call. * `value` — `0`. * `chainId` — correct chain ID (for example, Sepolia `11155111`). * Gas parameters — EIP‑1559 fields (`maxFeePerGas`, `maxPriorityFeePerGas`) appropriate for the network. * `nonce` — EOA nonce of the executor account (this is not the multisig queue nonce). #### Sign [#sign] Sign the transaction with `executorPrivateKey` using ECDSA (`secp256k1`). #### Broadcast [#broadcast] Send the raw signed transaction through the RPC endpoint, for example using `eth_sendRawTransaction`. The result is a `txHash`. ### Expected on-chain result [#expected-on-chain-result] If the transaction succeeds: * The contract verifies the packed signatures internally (for example, via `checkSignatures(hash, signatures)`). * All `calls` are executed in order. * An `ExecuteSuccess(nonce, digest, id)` event is emitted. * The function returns operation and call‑level results as `bytes[][] results`. The backend then updates the queue operation: * `status` changes to `EXECUTED`. * `txHash` is populated with the resulting on‑chain transaction hash. ### Common reverts and errors [#common-reverts-and-errors] Common revert classes when executing operations include: * `InsufficientSignatures(signatures, threshold)` — packed signatures contain fewer signatures than the required threshold. * `InvalidSignature(owner)` — signature bytes, signed digest, or ordering are incorrect for at least one signer. * `DuplicateSignature(owner)` — the same signer appears more than once in the packed signatures. * `FailedCall` — one of the internal calls reverted. * `InsufficientBalance(balance, needed)` — the multisig contract lacks enough ETH for the `value` transfers. * `ReentrancyGuardReentrantCall` — a reentrancy attempt was detected during execution. ## Main menu [#main-menu] Use the main menu on the left to navigate across platform pages. At the bottom of the menu, you can access: * **Helpdesk**: Open the support portal in a new tab. * **Collapse/Expand**: Hide or show the main menu labels to save horizontal space. Main menu Eligible accounts (for example, accounts that have topped up credits) also see a floating **support chat** launcher. Click it to start a live conversation with the B2BINPAY support team directly from the app, without leaving the page. ## Header options [#header-options] At the top of each page, the header provides access to the following global controls: * (1) **Account selector**: Shows the current account's name and address. Use the dropdown to switch between accounts or create a new one. * (2) **Wallet selector**: Displays the connected wallet. The dropdown provides access to profile‑level options: * **Profile settings**: Here you can select and manage the base currency for your account. * **Log out**: To disconnect the wallet. * (3) **Network selector**: Shows the active blockchain network. Use the dropdown to switch to another supported network. * (4) **Theme switch**: Toggles between light and dark themes of the interface. * (5) **Language selector**: Use the dropdown to select a preferred language for the Web UI. * **dApp connection**: Opens the WalletConnect side panel for connecting external dApps. The button shows a green dot when at least one dApp session is active. Visible only for accounts with smart contract version 1.1.0 or later. See [dApps](../user-guide/dapps). Header ## Column configuration [#column-configuration] On pages that show tables, you can configure which columns are visible and in what order. If column configuration is available, a **Configure columns** control is shown above the table: * Mark or unmark checkboxes to show or hide specific columns. Columns highlighted in grey are always visible and can't be hidden. * Drag and drop column names to change their order in the table. Column configuration ## Table header controls [#table-header-controls] Most tables in the B2BINPAY DeFi share the same header controls for searching, sorting, and filtering data. ### Quick search [#quick-search] Some columns provide a quick search field: click the **magnifying glass** icon and start typing a value to filter records that contain the entered text in that column. Quick search ### Sorting [#sorting] Columns that support sorting display the arrow icons next to the header: * **Arrows inactive**: Sorting by this column is currently disabled. * **Up arrow active**: Data is sorted in ascending order (smallest values first). * **Down arrow active**: Data is sorted in descending order (largest values first). Only one column can be used for sorting at a time. Sorting ### Filters and date ranges [#filters-and-date-ranges] The (1) **funnel** icon displayed next to the column header indicates that filters are available: click the icon to open a filter panel and specify filtering parameters. To apply filters, click **Apply**. To clear them, click **Reset**. The (2) **calendar** icon opens the date picker with predefined values (for example: *Today*, *Yesterday*, *Last 7 days*, and so on) and possibility to select a custom date or date range. Filters ## Pagination [#pagination] Most pages support pagination to split data into multiple pages and help you work efficiently with long lists. At the bottom of the page, you can: * Navigate between pages using the **previous/next** arrows or the numbered page selector. * Use **Jump to** to quickly move to a specific page. * Choose how many rows are displayed per page. Pagination ## Copying values [#copying-values] Certain fields feature the **copy** icon that copies the underlying value to your clipboard. Click the icon next to the value you need; a short confirmation appears when the value is copied. Copying values ## Account [#account] An **account** is a shared multi‑signature wallet. Technically, it's a smart contract deployed for a specific account and network. Each account is managed collectively by a group of users. Each operation on such account requires certain independent [signatures](#signature) to approve the operation before it's executed. In the B2BINPAY DeFi app, each account has: * A list of [Signers](#signer). * A [Required signatures](#required-signatures) threshold. Refer also to [Queue](#queue). *** ## Address [#address] An **address** is a unique blockchain identifier used for deposits, payouts, or transaction execution.\ Depending on context, an address can represent: * An **invoice address** (deposit address) created by the smart contracts. * A **wallet address** belonging to a signer or payout receiver. Refer also to [Deposit address](#deposit-address), [Invoice](#invoice), and [Payout](#payout). *** ## Address book [#address-book] The **address book** is a list of saved receiver addresses and labels. Saved entries can be reused when creating payouts or other operations, which reduces manual input and the risk of sending funds to an incorrect address. Refer also to [Payout](#payout). *** ## API key [#api-key] An **API key** is a credential used to access B2BINPAY DeFi API app programmatically.\ Each key is associated with a specific account. API keys are managed on the **Settings** tab of the **Account** page. Refer also to [API service](#api-service) and [Callback secret](#callback-secret). *** ## API service [#api-service] The **API service** exposes B2BINPAY DeFi REST APIs for working with entities such as invoices, payouts, and so on. Refer also to [API guide](../api-guide/api-overview). *** ## Base currency [#base-currency] The **base currency** is the currency used for presenting balances, totals, and some reports in the B2BINPAY DeFi app.\ It doesn't change the underlying blockchain currency of deposits and payouts; it only affects how values are displayed and settled in the UI. The base currency is selected on the **Profile settings** page. *** ## Balance [#balance] The **balance** of an account or asset is the aggregated value of all relevant transactions.\ Primary balance types include: * **Total balance**: Reflects all executed transactions for the account across assets, converted to the base currency. * **Uncollected balance**: Reflects deposits received on invoice addresses but not yet claimed to the account wallet. * **Balance by asset**: Shows per‑token and per‑network balances for the account. Refer also to [Deposit](#deposit), [Claim](#claim), and [Base currency](#base-currency). *** ## Batch claim [#batch-claim] A **batch claim** is an operation that collects funds from multiple invoice deposit addresses in a single claim transaction for a given currency.\ Batch claims reduce on‑chain fees by aggregating several claims into one transaction, where supported by smart contracts. Batch claims are initiated from the **Claims** page when more than one uncollected claim exists for the selected currency. Refer also to [Claim](#claim) and [Invoice](#invoice). *** ## Batch execution [#batch-execution] **Batch execution** is the process of executing several fully signed queue operations in a single on‑chain transaction.\ Batch execution is available only when: * The selected operations are fully signed. * Their nonce values form a continuous sequence (for example, `5`, `6`, `7`). Batch execution is initiated from the **Queue** page with the **Execute batch** action. Refer also to [Queue](#queue), [Nonce](#nonce), and [Payout](#payout). *** ## Blockchain [#blockchain] A **blockchain** is a specific network environment. Each network is identified by its `chainId` and has its own set of assets, contracts, and block explorers. The selected network in the app header determines which balances, queue operations, and transactions are shown. *** ## Callback [#callback] A **callback** is an HTTP notification that the B2BINPAY DeFi app sends to a client system when an invoice- or payout-related event occurs. **Invoice-related callback types:** * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. **Payout-related callback types:** * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **Retry policy:** If a callback delivery fails, the system retries it a limited number of times (by default, up to three attempts) at short, regular intervals. If every attempt fails, the callback is marked as failed and can be resent manually. For details, payload examples, and callback verification, see [Callbacks](../api-guide/callbacks). Refer also to [Callback secret](#callback-secret), [Invoice](#invoice), and [Payout](#payout). *** ## Callback secret [#callback-secret] The **callback secret** is a value used to sign callbacks so that the receiving system can verify their authenticity.\ Rotating the callback secret invalidates the previous value and is recommended when credentials are updated or exposed. The callback secret is managed on the **Settings** tab of the **Account** page. See [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for more details. Refer also to [Callback](#callback) and [API key](#api-key). *** ## Claim (collection) [#claim-collection] A **claim** (or **collection**) is an operation that transfers funds from an invoice deposit address to the account wallet. When withdrawing a token from an invoice address, the native currency is always withdrawn as well. Claims can be created for a single invoice and currency or grouped into [Batch claims](#batch-claim). * On the **Invoices** page, claims are initiated from the **Claims** tab of a specific invoice. * On the **Claims** page, claims are initiated from aggregated entries that represent uncollected funds for an invoice and currency. Refer also to [Deposit](#deposit), [Invoice](#invoice), and [Transfer](#transfer). *** ## Currency [#currency] A **currency** is a cryptocurrency (coin, stablecoin, or token) supported by the system. Refer also to [Blockchain](#blockchain) and [Balance](#balance). *** ## dApp [#dapp] A **dApp** (decentralized application) is an external application that connects to a B2BINPAY DeFi account through the [WalletConnect](#walletconnect) protocol. Connected dApps can request transactions and message signatures, which are routed to the account [queue](#queue) for multisig approval. dApps are available for [EVM-compatible](#blockchain) accounts with smart contract version 1.1.0 or later. Refer also to [WalletConnect](#walletconnect) and [Queue](#queue). *** ## Deposit [#deposit] A **deposit** is an incoming transaction to an invoice or directly to an account. Deposits increase the uncollected balance of an invoice or account until a [Claim](#claim) or payout moves the funds. Refer also to [Deposit address](#deposit-address) and [Transfer](#transfer). *** ## Deposit address [#deposit-address] A **deposit address** is a blockchain address generated by the smart contracts for receiving payments.\ Each deposit address is bound to the wallet (public address): * Funds can be collected only to the owner’s wallet or account. * The smart contract can't direct funds to arbitrary third‑party addresses. In invoices, the deposit address is represented by a smart contract and managed by the [multisig](#multisig) wallet. Deposit addresses are typically created through [Invoices](#invoice). *** ## Invoice [#invoice] An **invoice** is a request for cryptocurrency payment that generates a unique deposit address for receiving funds. The invoice address is represented by a smart contract and managed by the [multisig](#multisig) wallet.\ Invoice activity is tracked across the **Settings**, **Transfers**, **Claims**, and **Callbacks** tabs on the invoice details page. Refer also to [Deposit address](#deposit-address), [Claim](#claim), and [Transfer](#transfer).\ For detailed workflows, see [Invoices](../user-guide/invoices). *** ## Multisig [#multisig] **Multisig** (multi‑signature) is the security model behind every account. Instead of a single private key, an account is controlled by a group of [signers](#signer), and sensitive actions require approval from a minimum number of them before they can run on‑chain. In the B2BINPAY DeFi app, the multisig model defines: * Who can approve operations — the list of [signers](#signer). * How many approvals each operation needs — the [required signatures](#required-signatures) threshold. This means no single person can move funds or change account settings alone, which keeps control distributed across your team. Refer also to [Account](#account), [Signer](#signer), [Required signatures](#required-signatures), and [Threshold](#threshold). *** ## Network [#network] The **network** is the blockchain environment on which an account operates. Switching the network in the app header changes: * Which balances are shown. * Which queue operations, invoices, and transfers are visible. Refer also to [Blockchain](#blockchain). *** ## Nonce [#nonce] A **nonce** is the sequential identifier that defines the order of operations executed by a smart contract. In the B2BINPAY DeFi app: * Each queue operation (for example, a payout or configuration change) has a nonce. * Operations must be executed in nonce order; the item with the smallest nonce is processed first. * Creating a payout with a nonce that matches an existing one creates a conflicting or replacement operation. Nonce values are visible in the **Queue** and can be adjusted when creating certain operations such as payouts. Refer also to [Queue](#queue), [Batch execution](#batch-execution), and [Operation](#operation). *** ## Operation [#operation] An **operation** is an action that requires multisig approval before execution.\ Examples include: * Account configuration changes (for example, signers and thresholds). * Payouts and other asset transfers. Each operation has a [nonce](#nonce) and requires one or more [operation signatures](#operation-signature). Refer also to [Queue](#queue) and [Payout](#payout). *** ## Operation signature [#operation-signature] An **operation signature** is a digital signature added by a signer to authorize a specific operation.\ Multiple signatures can be attached to the same operation until the [threshold](#threshold) is met and the operation becomes executable. Refer also to [Signature](#signature), [Signer](#signer), and [Operation](#operation). *** ## Payout [#payout] A **payout** is an outgoing on‑chain transfer from the account to an external receiver address.\ Payouts: * Are created in the **Payouts** section by specifying a receiver address, currency, amount, and optional callback settings. * Enter the [Queue](#queue) and must be signed by the required number of signers. For details, see [Payouts](../user-guide/payouts). *** ## Queue [#queue] The **queue** is an ordered list of operations waiting for signatures or execution.\ Typical queue items include: * Payouts. * Configuration changes (for example, confirmation rules). * Reject (if you need to cancel an operation in the middle of a queue). Queue items are processed in the [nonce](#nonce) order. The **Queue** page exposes: * Pending operations that need signatures or execution. * History of executed or failed operations. * Tools for signing, executing, rejecting, or replacing operations. For detailed workflows, see [Queue](../user-guide/queue). *** ## Read‑only access [#readonly-access] **Read‑only access** is a restricted mode in which an account or user can view data but can't perform sensitive actions. Read‑only users cannot: * Create, sign, or execute operations. * Add or disconnect accounts. * Change required signatures or other critical settings. Read‑only states may apply to accounts that were removed from configuration on a given network but still exist elsewhere. *** ## Required signatures [#required-signatures] The **required signatures** value defines how many signers must approve an operation before it can be executed, expressed as `X/Y`, where: * `Y` is the total number of signers. * `X` is the minimum number required to execute an operation. The setting is configured on the **Members** tab of the **Account** page. Refer also to [Multisig](#multisig), [Signer](#signer), and [Threshold](#threshold). *** ## Signature [#signature] A **signature** is a cryptographic proof generated when a user signs a message or transaction with their private key.\ In B2BINPAY DeFi it's used for: * Authentication and login flows (for example, SIWE and EIP‑712 signatures). * Approving multisig operations and transactions. Refer also to [Operation signature](#operation-signature) and [Wallet authentication](#wallet-authentication). *** ## Signer [#signer] A **signer** is an account that has permission to approve and execute operations for an account. Signers can: * Create operations (such as payouts or configuration changes). * Sign queue items. * Execute fully signed operations. The list of signers for an account is managed on the **Members** tab of the **Account** page. Refer also to [Required signatures](#required-signatures) and [Multisig](#multisig). *** ## Threshold [#threshold] The **threshold** is another name for the number of [Required signatures](#required-signatures) needed to execute a multisig operation.\ It's defined when the account is created and can later be updated through configuration operations. Refer also to [Multisig](#multisig). *** ## Transaction [#transaction] A **transaction** is a blockchain record representing the execution of a call on a network. Each blockchain transaction is assigned a unique **TXID** which is a transaction identifier, or transaction hash. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. Each TXID links to a blockchain explorer — a public tool for tracking transactions. *** ## Transfer [#transfer] A **transfer** is a record of an on‑chain transaction tracked by the B2BINPAY DeFi app.\ Transfers can represent: * Incoming deposits to invoices. * Claims collecting funds from deposit addresses to the account. * Payouts and other outgoing operations. For details, see [Transfers](../user-guide/transfers). *** ## User [#user] A **user** represents a wallet address interacting with the B2BINPAY DeFi app. Users authenticate by signing messages and may belong to one or more [accounts](#account) as signers or viewers. Refer also to [Wallet authentication](#wallet-authentication) and [Signer](#signer). *** ## Wallet authentication [#wallet-authentication] **Wallet authentication** is the login mechanism based on external wallets. Instead of passwords, the B2BINPAY DeFi app: * Generates a message. * Asks the user to sign it. * Verifies the signature to confirm wallet ownership. Refer also to [Signature](#signature) and [User](#user). *** ## WalletConnect [#walletconnect] **WalletConnect** is an open protocol for linking external [dApps](#dapp) to a wallet session. In the B2BINPAY DeFi app, users paste a WalletConnect URI from a dApp to establish a session; subsequent dApp transaction and signature requests are delivered to the account [queue](#queue) for multisig approval. Refer also to [dApp](#dapp). The **B2BINPAY DeFi app** connects your non‑custodial wallet to smart‑contract infrastructure on EVM‑ and TVM-compatible networks. ## How it works [#how-it-works] * **Generate invoices**: Create deposit addresses for supported assets and track incoming payments in real time. * **Collect funds**: Move funds from invoice (deposit) addresses to your account smart‑contract address when you are ready. * **Approve payouts**: Create payout operations, collect signatures from account signers, and execute transactions on‑chain once the required threshold is reached. * **Manage access and rules**: Add or remove signers and adjust confirmation thresholds through multisig operations, with all changes recorded on‑chain. ## Key features [#key-features] * **Multisig accounts** Collaborate safely by managing funds through smart‑contract accounts that require multiple signatures for sensitive actions. Configure signer lists and signature thresholds per account to match your internal approval policies. * **Invoice generation** Accept crypto payments via automatically generated deposit addresses, with support for both single‑currency and multi‑currency invoices. Track each invoice in real time from creation to payment and collection. * **Fund collection** Pull funds from invoice (deposit) addresses to your main account address, either per invoice or in batches, helping you optimize network fees while keeping deposit flows and main balances clearly separated. * **Approval queue** Have all important actions — payouts, account configuration changes, signer updates — added to an operations queue where they can be reviewed, signed, and executed only after the required approvals are collected. * **API access** Use the same capabilities programmatically via the B2BINPAY DeFi API: create invoices, monitor deposits, trigger fund collections, manage payouts, and track transaction and operation statuses from your backend systems. * **Security and transparency** Benefit from a non‑custodial design where B2BINPAY DeFi never stores private keys, all transactions are signed in your wallet, and smart contracts provide on‑chain logging of operations. Multisig approvals and per‑network deployments keep control distributed across your accounts and networks. ## Set up your account [#set-up-your-account] ### Connect your wallet [#connect-your-wallet] 1. Open the B2BINPAY DeFi login page. 2. From the **Network** select in the topbar, select your network. 3. Click **Connect wallet** and follow the instructions. 4. In your wallet, select the account you want to use and approve the connection. 5. Review the signature request that the app sends to your wallet, then sign it. The app verifies the signature to confirm that you control the selected address. If the signature verification fails, reconnect the correct wallet or repeat the signature request and sign again. ### Create an account [#create-an-account] 1. Click **Create**. 2. In the **Create new account** form: 1. Enter the account name. 2. Add one or more signers or do it later. 3. Select the number of signatures required for operation confirmation (based on the number of added signers). 4. Click **Create account** and confirm the action. You'll be redirected to the **Account** page. ### Activate your account [#activate-your-account] If you see the *Your account is not activated yet* message: 1. Click **Activate** and confirm the action. 2. Confirm the transaction in your wallet. Once the account is successfully activated, in the upper part of the **Account** page, you'll see your account balances and information. ### Select a base currency for the account [#select-a-base-currency-for-the-account] The base currency is used to display account balances, including conversions from other currencies/tokens. You can manage and change your base currency at any time in your profile settings. 1. Click the **wallet selector** in the topbar and select **Profile settings**. 2. From the **Select base currency** dropdown, select the base currency for your account. The new base currency will be applied across the account. ### Make a direct deposit to the account address (optional) [#make-a-direct-deposit-to-the-account-address-optional] Fund the account directly from an external wallet. 1. Go to **Account** in the main menu. 2. In the upper part of the page, locate the **Account address** field and click the **copy** icon to copy the account address to your clipboard. 3. In your external wallet, paste the copied address as the receiver and select the token and network that match your account configuration. 4. Send a test transfer with a small amount first. After the transaction is confirmed on‑chain, the **Transfers** page shows the new incoming transfer with the *Direct deposit* type and the balances are updated accordingly on the **Account** page. ### Add account users and configure confirmation rules [#add-account-users-and-configure-confirmation-rules] Invite additional users and adjust how many signatures are required for transaction confirmation. 1. Go to **Account** in the main menu and switch to the **Members** tab. 2. In the **Confirmation rules** section, click **Edit**. 3. To add a new user to the account, enter their public address in the **Add signer** field. The app validates the address format and network: 1. If the address format or network is invalid, an error explains that the address is invalid. 2. If the address is already added as a signer, a message explains that the address is already in the list. 4. Adjust **Required signatures** to define how many signers must approve each transaction. Consider adding more than one signer for production environments so that payouts and configuration changes require multiple approvals. 5. Click **Save** and sign the corresponding configuration transaction in your wallet if prompted. The updated list of signers and required signatures appears in the **Confirmation rules** section. ## Next steps [#next-steps] Now, as you're all set up, you can: * Create invoices to generate deposit addresses and accept payments. * Use the **Queue** page to track pending multisig actions. * Configure callbacks and API keys to integrate B2BINPAY DeFi API app with your systems. ## July 1, 2026 [#july-1-2026] ### Cross-chain transfers, TRX staking, and in-app support [#cross-chain-transfers-trx-staking-and-in-app-support] **Cross-chain transfers** * Added **Cross-chain transfers**: move funds from your account on one network to a recipient on another network without leaving the interface. Transfers use a live quote that shows the amount received, bridge fee, route, and estimated delivery time, and run through the account queue for multisig approval. Track delivery progress and open the cross-chain explorer from the operation details. See [Cross-chain transfers](../user-guide/cross-chain-transfers). **TRX staking** * Added **TRX staking** for TRON accounts: freeze TRX to obtain Energy or Bandwidth, unstake and withdraw matured TRX, vote for Super Representatives, and delegate resources to other addresses. All staking operations run through the account queue. The account balance now shows the spendable amount, excluding staked, unstaking, and pending-withdrawal TRX. See [Staking](../user-guide/staking). **Support** * Added an in-app **support chat**. Eligible accounts (for example, accounts that have topped up credits) get a live chat launcher that connects you with the B2BINPAY support team directly from the app, tied to your connected account. The launcher appears without a reload right after you become eligible. **Smart contracts** * Released smart contract version **1.2.1** for TRON, adding staking support. ## June 1, 2026 [#june-1-2026] ### Overview dashboard and integrated apps [#overview-dashboard-and-integrated-apps] **Overview** * Added the **Overview** dashboard, the landing page you see after signing in. It summarizes your total balance and uncollected funds, invoice and payout activity, asset allocation, finance volume, pending queue operations, credit balance, and per-network status. Use the period selector to switch between the last week, month, and quarter. See [Overview](../user-guide/overview). **Apps** * Added the **Apps** page, a catalog of integrated applications that work directly through your multisig account. See [Apps](../user-guide/apps). * Added **CoW Swap**: MEV-protected token swaps for EVM-compatible accounts. Each swap runs through the account queue for multisig approval, the same way as payouts. See [Apps](../user-guide/apps). **Smart contracts** * Released smart contract version **1.2.0**. On accounts using this version, only account signers can claim funds from invoice deposit addresses. Addresses that are not signers can no longer perform claims, which adds an extra layer of protection for deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. See [Claims](../user-guide/claims). ## April 17, 2026 [#april-17-2026] ### dApp integration, API enhancements, and Tron support [#dapp-integration-api-enhancements-and-tron-support] **dApps** * Added support for connecting external dApps through the **WalletConnect** protocol. Use the new **dApp** control in the header to connect dApps, review incoming transaction and message requests, and track active sessions. See [dApps](../user-guide/dapps). * Queue operations initiated by connected dApps now show the dApp name and icon in the queue list and details. See [Queue](../user-guide/queue). * The header displays a live indicator when at least one dApp session is active and a badge when pending dApp requests require approval. **Smart contracts** * Released smart contract version **1.1.0** with **ERC-1271** support. The multisig account can now validate signatures on-chain, which lets it sign messages requested by connected dApps. dApp features are available for accounts on this version or later. See [dApps](../user-guide/dapps). **API** * Added callback resending: retry a previously failed callback from the **Callbacks** tab of an invoice or payout. See [Callbacks](../api-guide/callbacks). * Added the **Get account balances** endpoint that returns balances for all assets of the account in a single call. See [Account](../api-guide/account). * Added the **Get smart contract version** endpoint. See [Other](../api-guide/other). **SDK** * The TypeScript SDK now supports **Tron** networks (Mainnet and Shasta) in addition to EVM chains. Invoices, payouts, and claims flows work with a unified API surface across EVM and TVM deployments. ## February 3, 2026 [#february-3-2026] ### Initial release [#initial-release] An **account** represents a shared multisig wallet managed by a group of users. ## Account details [#account-details] To access account details, go to **Account** in the main menu. In the upper part of the page, you can find essential information about the account: **Total balance** The total value of all assets held by the account, converted to the base currency. This value reflects both collected and uncollected funds. *** **Uncollected balance** The total amount of funds that were received but not yet collected to the account base address, converted to the base currency. *** **Uncollected invoices** The number of invoices that currently have payments that haven't yet been collected. *** **Current nonce** The latest transaction nonce used by the account smart contract. This value shows how many transactions were already processed and helps avoid transaction conflicts. *** **Account address** The smart contract address representing the account on the selected blockchain network. This address is used as the main destination for incoming funds and can't be modified. *** **Account name** The label for the account that helps distinguish it from other accounts. This value can be modified anytime. The information below is divided into tabs. On this tab, you can view a list of all assets held on the account, including their balances and value in the base currency. The following information is provided about each asset: **Currency** The asset alphabetical code, logo, and full name. *** **Balance** The amount of the asset held on the account, in the asset units. *** **Balance in base currency** The value of the asset converted to the account base currency. On this tab, you can view and manage the members and signing policy of the account. ### Member cards [#member-cards] The upper part of the tab shows a set of member cards that represent wallets associated with the account. Each card provides the label assigned to the member and the underlying blockchain address. Members marked with the **eye icon** have read-only access to the account. ### Confirmation rules [#confirmation-rules] The lower part of the tab contains the **Confirmation rules** section, which defines who can approve transactions and how many approvals are required. **Signers** The list of addresses and names that have full control over the account. Signers can create, sign, execute, and decline transactions. Each row shows the signer label (if available) and the wallet address. *** **Required signatures** The number of signer approvals that must be collected before a transaction can be executed. The ratio, such as `1/3`, shows how many signatures are required out of the total number of signers. Transactions remain pending until the required number of signatures is collected. View [Manage signers and required signatures](#manage-signers-and-required-signatures) for step-by-step instructions. On this tab, you can manage integration and security settings for the account, including the callback secret and API keys. ### Callback secret [#callback-secret] The **Your callback secret** section provides the **Regenerate** action that issues a new secret. Regeneration invalidates the previous secret and updates the value used for verifying callbacks. ### API key management [#api-key-management] The **API key management** section lists API keys used to access the account through integrations. The table includes the following columns: **Name** The label assigned to the key.\ This value helps identify where the key is used. *** **Key** The shortened representation of the API key, for example `094j8...9h34a`.\ The full value is shown only when the key is created.\ For security reasons, it is not possible to restore the full key from this page. *** **Created at** The date and time when the key was created. *** **Revoked at** The date and time when the key was revoked.\ For active keys, the value is shown as `—`. View [Configure callback secret and API keys](#configure-callback-secret-and-api-keys) for step-by-step instructions. ## Common use cases [#common-use-cases] The **Account** page helps with daily monitoring and administration of the account. This section describes common scenarios step by step. ### Rename the account [#rename-the-account] You can modify the account name anytime. Go to **Account** in the main menu and select the required account in the header. Click the **pencil icon** next to the account name and enter a new value. In the **Edit account name** popup, enter the new account name, up to 32 characters long. Click **Save** to confirm changes. The changes are applied immediately. The smart contract address, confirmation rules, and accesses remain unchanged. ### Manage signers and required signatures [#manage-signers-and-required-signatures] Add new signers and adjust account settings that affect confirmation rules. Go to **Account** in the main menu and switch to the **Members** tab. Click **Edit** in the **Confirmation rules** section. **To add a new signer:** Click **Add signer** and enter a new signer address in the corresponding field. The system validates the address format and network before allowing you to proceed: * If the entered address has an invalid format or doesn't belong to the expected network, the `Invalid address format` error appears and the changes aren't saved. * If the entered address is already in the signer list, the `Address is already added` notification appears and the address isn't duplicated. **To remove a signer:** Click the **bin icon** in the corresponding signer row. Adjust the **Required signatures** value to set how many signatures are needed to execute transactions: * If there is only one signer, confirm that **Required signatures** is set to `1/1` by default and that editing is disabled. * If the account has more than one signer, click **Edit**, then adjust the **Required signatures** value in the `X/Y` format, where `Y` is the number of signers and `X` is less than or equal to `Y`. If you set `X` equal to `Y`, review the warning that explains the risk of losing funds if any single account becomes unavailable, then save the changes only if this configuration is acceptable. When signers are added or removed, the `Y` value in `Required signatures` updates to match the current signer list, and the editing control reflects the updated limits immediately. Click **Save**. The **Sign transaction** popup appears with the note that the action requires collecting a certain number of signatures before it can be completed. Review the changes and click **Sign**. The changes are processed according to the current confirmation rules. New rules will be applied once the transaction is properly confirmed. ### Configure a callback secret and API keys [#configure-a-callback-secret-and-api-keys] Set up technical integration with external systems through [callbacks](../get-started/key-terms#callback) and API access. Go to **Account** in the main menu and switch to the **Settings** tab. In the **Your callback secret** section, click **Regenerate** to issue a new callback secret, then update this value in your external systems. In the **API key management** section, click **Generate API key**. In the **Generate API key** popup, enter the name for the API key and click **Generate**. The newly generated key will be displayed in the **API key is generated** popup: make sure to copy it and store it securely, as it only reveals once in this popup. The new API key entry is added to the list where you can revoke it anytime. ### Create a new account [#create-a-new-account] Create a new multisig account and define its initial configuration. In the topbar, expand the **account select**. Select **Create new account**. In the **Create account** popup, click **Create**. If a popup appears with the text “Creating new account will discard all unsaved changes,” decide whether to continue and click **Proceed** to move on or **Cancel** to keep working with the current account. In the **Create new account** popup: * Enter the account name. * Add one or more members. * Specify the number of signatures required for transaction confirmation. Then click **Create account**. In the **Confirm new account** popup, verify the summary of **Account name**, **Members**, **Required signatures**, and then click **Confirm**. The changes are processed according to the configured confirmation rules. ### Disconnect the wallet [#disconnect-the-wallet] Log out from the current account and return to the login screen. In the topbar, click the **account select**. Select **Logout**. In the **Logout confirmation** modal, confirm the action. You'll be redirected to the login page with account selection. The **address book** is a list of saved receiver addresses that you can reuse across payouts and other operations.\ Saving addresses reduces the risk of copying incorrect addresses and speeds up everyday workflows. ## Address list [#address-list] On this page, you can view a list of all saved addresses for the account. The following information is provided about each address: **Name** The label assigned to the address. *** **Address** The full blockchain address saved in the address book. Icons next to the value let you copy the address or open it in the block explorer. *** **Actions** The available actions for each saved address: * **Edit**: Opens the edit modal where you can update the address and its name. * **Delete**: Removes the entry from the address book after confirmation. ## Common use cases [#common-use-cases] The **Address book** page helps you keep a curated list of trusted receivers.\ This section describes common scenarios step by step. ### Add a new address [#add-a-new-address] Save a frequently used receiver address. Go to **Address book** in the main menu. If no addresses exist, click **Add address** in the center of the page. If the table already contains entries, click **Add address** in the upper right corner. In the **Add address to address book** popup: 1. Enter the receiver **Address**. 2. In the **Address name** field, enter a clear label for the address. It can be any combination of letters and numbers convenient for you. Click **Save** to add the address to the address book. The newly added address appears in the table and becomes available when you select receivers for payouts. ### Edit an existing address [#edit-an-existing-address] Update an address or rename it. Go to **Address book** in the main menu. In the table, locate the address you want to change and click the **pencil icon**. In the **Edit address** popup, update the **Address** and/or **Address name** values. Click **Save** to apply the changes. The updated name and address appear in the address list and are used wherever the address book is referenced. ### Delete an address [#delete-an-address] Remove an address that is no longer needed. Go to **Address book** in the main menu. In the table, locate the entry you want to remove and click the **bin icon**. In the **Delete address from address book?** confirmation popup, review the message and click **Delete** to confirm or **Cancel** to keep the address. After deletion, the address no longer appears in the list and is not offered as a saved receiver. The **Apps** page is a catalog of integrated third-party applications that work directly with your account. Unlike external dApps that you connect through [WalletConnect](dapps), integrated apps run inside the B2BINPAY DeFi interface and route their on-chain actions through your account [queue](queue) for multisig approval. To open the catalog, go to **Apps** in the main menu. ## Availability [#availability] Each app card shows the app name, a short description, and tags that describe its category. An app is available only when both conditions are met: * The active network is **EVM-compatible**. On a TVM (TRON) account, EVM-only apps are disabled with the message *TVM network doesn't support this app. Switch to EVM account*. * The account is **deployed** on the selected network. If it isn't, the app is disabled with the message *To use the app, deploy the account on the selected network first*. When an app is unavailable, its card is greyed out and a tooltip explains why. To enable it, switch to a supported network or activate the account on the current network. ## CoW Swap [#cow-swap] **CoW Swap** is a decentralized exchange aggregator that provides MEV-protected token swaps through batch auctions. It is available for EVM-compatible accounts. Because every swap is performed by your multisig account, the swap and any required token approval don't execute immediately. Instead, they enter the [Queue](queue) as operations that the required number of signers must approve, the same way payouts and configuration changes do. ### Make a swap [#make-a-swap] ### Open CoW Swap [#open-cow-swap] On the **Apps** page, click the **CoW Swap** card. The CoW Swap widget opens inside the interface. ### Build the swap [#build-the-swap] In the widget, select the token to sell, the token to buy, and the amount. Review the quoted price, fees, and expiry, then confirm the swap. ### Approve in the queue [#approve-in-the-queue] The swap (and a token approval, if one is needed) is added to the account [queue](queue) as an operation. Go to the **Queue** page, collect the required signatures, and execute the operation. Once executed, CoW Swap settles the order on-chain and the resulting balances appear on your **Account** and **Transfers** pages. A swap depends on funds held by the account. Make sure the account holds enough of the token you want to sell, plus the network's native currency to cover execution fees. ## Cross-chain transfer [#cross-chain-transfer] **Cross-chain transfer** moves funds from your account on one network to a recipient on another network. Like a swap, it runs through the account [queue](queue) for multisig approval and shows a live quote before you confirm. Open the **Cross-chain transfer** card to start. For the full flow, see [Cross-chain transfers](cross-chain-transfers). A **claim** is an operation that collects funds from invoice deposit addresses and transfers them to your account.\ Claims can be executed for a single invoice or grouped into batch claims. On accounts using smart contract version 1.2.0 or later, only account signers can claim funds. Addresses that are not signers can no longer perform claims, which protects deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. ## Claim list [#claim-list] On this page, you can view all uncollected funds that are available for claiming, grouped by invoice and currency. The following information is provided about each claim: **ID** The unique system identifier of a claimable position (invoice and currency combination).\ This value is generated automatically and can't be modified. *** **Received at** The date and time when funds were first received to the invoice deposit address in this currency. *** **Last received at** The date and time when the most recent payment was received for this invoice and currency. *** **Currency** The currency currently held on the invoice deposit address. *** **Amount** The total uncollected amount for this invoice and currency.\ If multiple transfers with the same currency were received to the invoice, they are aggregated into a single amount. *** **Transactions** The number of uncollected transactions in this currency for the invoice. This is a link that opens the list of underlying transfers associated with this claim. *** **Invoice ID** The identifier of the invoice for which funds are to be claimed.\ This is a link to invoice details. *** **Claim** Executes a [single claim](#execute-a-single-claim) for this invoice and currency. ## Common use cases [#common-use-cases] The **Claims** page provides a consolidated view of uncollected funds and helps you control when claims are executed.\ This section describes common scenarios step by step. ### Execute a single claim [#execute-a-single-claim] Collect funds for a specific invoice and currency directly from the **Claims** page. Go to **Claims** in the main menu. Locate the row corresponding to the invoice and currency you want to collect and click **Claim**. In the **Sign claim** popup, review the details, and click **Sign**. After the claim is completed, it will disappear from the list. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. ### Create a batch claim [#create-a-batch-claim] Collect funds from several invoices at once. Go to **Claims** in the main menu. Click **Create batch claim** in the upper right corner. The button is active only when more than one claim that can be collected together is available. In the **Create batch claim** popup, select a currency, then click **Next step**. Mark the checkboxes of the claims you want to include in the batch, then click **Batch claim**. In the **Sign batch claim** modal, review the account address and the total amount being claimed, then click **Save**. In the **Sign claim** popup, review the details, and click **Sign**. After the batch claim is completed, all related claims will disappear from the list. On the **Transfers** page, a corresponding number of new transfers with the *Claim* type will appear, providing full transaction information. Once the transfers are assigned the *Executed* status, funds will be credited to the account address. The **Credits** page helps you track your balance and usage, understand pricing, and fund your account with crypto. The upper section contains the key balance and pricing information: **Credits balance** The current number of credits available on your account. This value updates after each top-up and whenever credits are spent. *** **Top up** The **+ Top up** action that opens the funding flow. *** **Credit price** The fixed credit-to-crypto rate shown on the page. *** **Credits used** The number of credits already spent within the selected time range. *** **What we charging for?** A link that opens the pricing rules and explains how credits are charged per operation. Below the balance section, the page is divided into two panels: **History of credits** The chart shows how your credit balance changes during the selected period. Use the date selector above the chart to switch the range. *** **Top-ups** A list of completed top-ups with their details. ## Common use cases [#common-use-cases] ### View credit balance and pricing [#view-credit-balance-and-pricing] Check your current credit balance, plan, and request pricing. Go to **Credits** in the main menu. On the **Credits** page: * View your **credit balance** and **used credits** in the upper part of the page. * View your **top-up history** in the lower part of the page. Click **What we charging for** in the upper part of the page to see how many credits are charged per each operation and how pricing is applied to your plan. ### Top up the credit balance [#top-up-the-credit-balance] Add more credits to your balance using cryptocurrency. Go to **Credits** in the main menu. Click **+ Top up** in the balance section (upper part of the page). In the **Top up credits** popup, select the payment currency and enter the amount you want to add. Review the auto-calculated number of credits, then confirm the payment, and follow the instructions on the payment page to send funds from your wallet. A **cross-chain transfer** moves funds from your account on one network to a recipient on another network, without leaving the B2BINPAY DeFi interface. Transfers are routed through the account [queue](queue) for multisig approval, the same way as payouts. You reach the feature from the [Apps](apps) catalog: open the **Cross-chain transfer** card on the **Apps** page. ## Availability [#availability] Cross-chain transfers are available only when the provider is enabled for your account and the current network has bridgeable assets. When the service is unavailable, the app card is disabled and a tooltip explains why. ## Make a cross-chain transfer [#make-a-cross-chain-transfer] ### Open the form [#open-the-form] On the **Apps** page, click the **Cross-chain transfer** card. ### Choose source and destination [#choose-source-and-destination] Select the currency to send from your account, the destination network, and the currency to receive on that network. Only assets and network pairs that can be bridged are offered. ### Enter the amount and recipient [#enter-the-amount-and-recipient] Enter the amount to send and the recipient address on the destination network. A quote is fetched automatically and refreshed as you type. It shows the amount that will arrive, the bridge fee, the route, and the estimated delivery time. Each quote has a countdown and refreshes automatically when it expires. ### Confirm [#confirm] Review the confirmation summary — source and destination networks, the next queue **Nonce**, recipient address, amounts, fee, and route — then confirm. Confirming does not send funds immediately. It creates an operation in the account [queue](queue) and assigns it the next nonce. ### Collect signatures [#collect-signatures] Go to the [Queue](queue) page and open the cross-chain transfer operation. The required number of account signers must sign it before it can run. See [Sign transactions](queue#sign-transactions). ### Execute [#execute] Once all required signatures are collected and the operation has the smallest nonce in the queue, execute it to send the transfer on-chain. See [Execute transactions](queue#execute-transactions). The bridge fee is paid in the network's native coin and is debited from the account balance in addition to the transfer amount. Make sure the account holds enough of both the currency you send and the native coin to cover the fee. ## Track a transfer [#track-a-transfer] After execution, the transfer is delivered across chains by the bridge. Open the operation details to follow its progress through the delivery states — from *Awaiting confirmation* and *Transfer initiated* to *Cross-chain delivery in progress*, and finally *Delivered* or *Delivery failed*. The details view also provides a link to the cross-chain explorer and the destination transaction hash once the funds arrive. The **dApps** feature lets you connect external decentralized applications to your B2BINPAY DeFi account through the **WalletConnect** protocol. Connected dApps can request transactions and message signatures, which are routed to the account queue for multisig approval. The **dApp connection** control is only visible when both conditions are met: * The current account is on an **EVM-compatible network** (the feature is not available for TVM networks such as Tron). * The account's smart contract version is **1.1.0 or later**. For earlier contract versions, upgrade the account to use dApps. ## Access the dApp panel [#access-the-dapp-panel] The dApp connection control is located in the header, next to the wallet selector. The button indicates the current state: * **No badge, no dot**: No active sessions and no pending messages. * **Green dot**: At least one active dApp session. * **Red badge**: Pending messages or transactions from connected dApps await approval in the queue. The badge shows the number of pending items. Click the button to open the **dApp** side panel, which contains the URI input field and the list of active sessions. ## Common use cases [#common-use-cases] ### Connect a dApp [#connect-a-dapp] Connect a new dApp to the current account using a WalletConnect URI. In the external dApp, choose **WalletConnect** as the connection method and copy the connection URI (for example, `wc:...`). In the B2BINPAY DeFi app, click the **dApp connection** button in the header. Paste the URI into the **WalletConnect URI** input and click **Connect**. In the **Session approval** popup, review: * The dApp **name**, **icon**, and **URL**. * The **verification status** — `VERIFIED`, `UNKNOWN`, or a warning if the dApp is flagged as malicious. * The list of **networks** the dApp requests access to. * The **connected account address**. Then click **Approve** to establish the session or **Reject** to cancel the request. The **Approve** button is disabled if the dApp requests unsupported WalletConnect methods or is flagged as malicious. In those cases, only **Reject** is available. ### Approve a dApp transaction request [#approve-a-dapp-transaction-request] When a connected dApp requests a transaction, a modal appears for your review. In the **Transaction approval** popup, review: * The **dApp** name and icon. * The **From** and **To** addresses. * The transaction **Value**. * The raw **Data** (hex calldata) — use the **Copy** icon to copy it. * The **Decoded data** section, when available — shows the function signature and parameter values. Click **Approve** to send the request to the queue as a dApp transaction, or **Reject** to decline. Open the **Queue** page to collect required signatures and execute the operation. See [Queue](queue) for details. ### Approve a dApp message signature request [#approve-a-dapp-message-signature-request] When a dApp requests a personal or typed-data signature, a separate modal appears. In the **Message signature** popup, review: * The **dApp** name and icon. * The **Message** contents. * The **Required signatures** count for the current account. * The **Address** and raw **Hex** under the collapsible details section. Click **Sign** to add the message to the queue for multisig signing, or **Reject** to decline. ### View and disconnect active sessions [#view-and-disconnect-active-sessions] Click the **dApp connection** button in the header to open the side panel. Under the URI input, review the list of active sessions with dApp names, icons, and session details. Click the **Disconnect** action next to a session to terminate it and confirm the action in the popup. Disconnecting does not cancel pending dApp transactions already in the queue — handle them on the **Queue** page. ## dApp-initiated transactions in the queue [#dapp-initiated-transactions-in-the-queue] Transactions created from a dApp request appear in the **Queue** list with the following characteristics: * The **Operation** column shows the **dApp name and icon** instead of a generic type label. * Clicking the dApp name link opens the dApp's URL in a new tab. * Canceling or deleting the operation from the queue sends a cancellation event back to the dApp. For the full queue workflow, see [Queue](queue). An **invoice** is a request for cryptocurrency payments that generates a unique deposit address for receiving funds. Funds received to this address must be [claimed](#claim-funds) to the account address (smart contract). ## Invoice list [#invoice-list] On this page, you can view a list of all invoices created for your accounts. The following information is provided about each invoice: **ID** The unique system identifier of an invoice.\ This is a link to invoice details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the invoice was created. *** **Updated at** The date and time of the most recent status change or payment receipt. *** **Currency** The payment currency or asset list. * If a single currency was selected, this field shows the asset symbol and name. * If more than one currencies were selected, this field shows the number of selected assets. * If no currency was specified, this field displays `—` and payers can pay the invoice in any supported currency. *** **Requested amount** The amount to be paid in the selected currency. * If a single payment currency was specified, this field shows the requested amount. * If no currency or more than one currencies were specified, this field displays `—`. The value can be specified when creating an invoice and can be modified later. *** **Paid amount** The total amount paid so far, in the payment currency. * If more than one currencies were specified, this field displays the amount converted to the account base currency. * If no payments were received, this field displays `—`. *** **Status** The current invoice status. Possible values: * **Created**: The invoice was created and is awaiting payments. * **Paid**: The invoice with the indicated amount was paid in full (for invoices with indicated amount). * **Unresolved**: The amount of an incoming transfer is greater than the invoice amount (for invoices with indicated amount). *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. This value can be specified when creating an invoice and can be modified anytime. ## Invoice details [#invoice-details] To access invoice details, click an invoice **ID** in the invoice list. In the upper part of the page, you can find essential information about the invoice — click the **chevron** icon to expand it: * The invoice identifier and current status. * The payment currency (if defined). * The requested amount (if specified). * The paid amount. * The created and updated timestamps. * The invoice address. * The link to the payment page. The information below is divided into tabs. On this tab, you can access and change invoice settings and advanced options. If the currency was selected for the invoice, the following fields are available: **Currency** The payment currency associated with the invoice. *** **Status** The current invoice status. *** **Requested amount** The invoice amount, in the payment currency. *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other invoice events. Can be changed anytime. *** **Payment page URL** The link that is displayed as a button on the payment page. Can be changed anytime. *** **Payment page button name** The custom name of a button displayed on the payment page. Can be changed anytime. On this tab, you can find a list of transfers associated with the invoice. **ID** The unique system identifier of a transfer.\ This is a link to transfer details. *** **Created at** The date and time when a transfer was received by B2BINPAY. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain transaction identifier, the same as the transaction hash.\ This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The transaction amount, in the payment currency. *** **Blockchain fee** The blockchain fee charged for this transfer, in the payment currency.\ The total fee reflects all claim attempts, including failed ones. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Operation ID** For invoices and payouts: The unique operation identifier in the system. This is a link to operation details. On this tab, you can view claim operations related to the invoice and trigger new claims. At the top of the tab, a set of cards may show uncollected balances per network or currency, including: * **Uncollected tx**: The number of transactions that were deposited but not yet claimed. * **Uncollected balance**: The total amount available to claim for this currency. Each card contains a **Claim** button that starts a [claim flow](#claim-funds) for that asset. On this tab, you can view a list of callbacks sent for the invoice. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. ## Common use cases [#common-use-cases] The **Invoices** page helps create payment requests, monitor their status, and claim collected funds.\ This section describes common scenarios step by step. ### Create a new invoice [#create-a-new-invoice] Create a new invoice and generate a payment page for your customers. Go to **Invoices** in the main menu. Click **Create invoice** in the upper‑right corner. Fill in the **Main details**: * From the **Payment currency** dropdown, select the asset you want to receive or leave the field empty if the payer should be able to pay in any supported currency. * In the **Amount** field, optionally enter the amount to be paid in the selected currency. If you leave this field empty, the invoice will not enforce a specific amount. Fill in the **Advanced options**: * In the **Tracking ID** field, optionally enter an invoice identifier to track the invoice-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about invoice events. * In the **Payment page URL** field, provide the link that should be displayed as a button on the payment page. * In the **Payment page button name**, specify the custom name of a button displayed on the payment page. Click **Create**. The newly created invoice will appear in the list. You can access and manage its settings anytime by clicking the invoice **ID**. ### View invoice details [#view-invoice-details] Track invoice-related transfers, callbacks, and claims. Go to **Invoices** in the main menu. In the invoice list, locate the required invoice and click its **ID** to open details. Switch to the **Transfers** tab to see all payments associated with the invoice, including **Status**. Switch to the **Claims** tab to review claim operations and their statuses or to see uncollected balances per currency. Switch to the **Callbacks** tab to review callback history. ### Claim funds [#claim-funds] Claim funds that were deposited to the invoice address but not yet collected to the account. Go to **Invoices** in the main menu and click the required invoice **ID**. Switch to the **Claims** tab and locate cards with uncollected transactions and a non‑zero uncollected balance. Click **Claim** on the card. In the **Sign claim** popup, review the details, and click **Sign**. Repeat for other claims. After the claim is completed, it will disappear from the **Claims** tab. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. You can also claim funds from the [Claims](claims) page, including batch claiming of several transactions at a time. The **Overview** page is the dashboard you see right after you sign in and select an account. It summarizes your account activity in one place and gives you quick shortcuts to the most common actions. To open it, go to **Overview** in the main menu. ## Select a time period [#select-a-time-period] A period selector at the top of the page controls the time range used for the activity cards and charts. You can choose: * **Last week** * **Last month** * **Last quarter** The totals, inflow and outflow figures, and the finance volume chart update to reflect the selected period. Balances and pending operations always show the current state, regardless of the period. ## Summary cards [#summary-cards] The upper part of the page shows three summary cards with the headline numbers for your account. * **Total balance**: The total value of your account across all assets, converted to your [base currency](../get-started/key-terms#base-currency), along with the **Uncollected funds** that are still waiting to be claimed from invoice addresses. Use the **Claim** action to collect those funds. * **Total invoices**: The number of invoices created in the selected period and the **Inflow** they generated. Use the **Invoice** action to create a new invoice. * **Total payouts**: The number of payouts in the selected period and the **Outflow** they represent. Use the **Payout** action to create a new payout. All amounts are shown in your base currency. ## Asset allocation and finance volume [#asset-allocation-and-finance-volume] The middle section gives you a more detailed view of where your funds are and how they move over time. * **Asset allocation**: A breakdown of your account balance by asset, showing each currency and its share of the total. If you have no assets yet, the card explains that assets appear automatically after you claim an invoice or receive a payment. * **Finance volume**: A chart of inflow and outflow over the selected period. You can switch between a bar chart and a line chart. The chart stays empty until you create your first invoice or payout. ## Status cards [#status-cards] The lower section helps you keep track of operations, credits, and network health. * **Network status**: The synchronization state of each supported network — **Synced**, **Syncing**, or **Unavailable** — together with the **Last block** processed for the network. Use this card to confirm that the app is up to date with the blockchain before you act on balances or operations. * **Operations in queue**: The number of multisig operations **Ready to execute** and the number **Waiting for sign**. Use the **Check** action to open the [Queue](queue) and sign or execute pending operations. * **Credit balance**: Your current **Credit balance**, the amount **Burnt** in the selected period, and the **Forecast expenses** per month. Use the **Top Up** action to add credits. For details, see [Credits](credits). The Overview reflects the network selected in the app header. Switch the network to see balances, activity, and pending operations for a different blockchain. A **payout** is an outgoing on‑chain transfer from your account.\ Payouts are created in the app and added to the queue with a specific nonce, signed by account members, and executed once the required signatures are collected. ## Payout list [#payout-list] On this page, you can view a list of all payouts created for the selected account and network. The following information is provided about each payout: **Payout ID** The unique system identifier of a payout.\ This is a link to payout details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the payout was created. *** **Updated at** The date and time of the most recent status change for the payout. *** **Amount** The payout amount, in the payment currency. *** **Currency** The payout currency. *** **Created by** The account name and address of the user who created the payout. *** **Receiver** The receiver’s address or saved contact name, shown in a short format. *** **Status** The current payout status. Possible values: * **Created**: The payout has been initialized in the system but has not yet been signed. * **Signed**: The transaction has received the required number of signatures. * **Sent**: The signed transaction has been sent to the blockchain and is awaiting confirmation. * **Executed**: The transaction has been successfully confirmed on the blockchain and the payout is considered complete. * **Failed**: The transaction failed during signing, sending, or blockchain confirmation. * **Canceled**: The transaction was replaced, rejected, or deleted by a user. *** **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. This value can be specified when creating a payout and can be modified anytime. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron** icon to expand it: * The payout identifier and current status. * The address and name of the user who created the payout. * The payout currency. * The payout amount in the payment currency. * The created and updated timestamps. * The receiver name and address in short format. * The number of collected and required signatures, for example `3/3`. The information below is divided into tabs. On this tab, you can view a list of account members that signed the payout. On this tab, you can view a list of callbacks sent for the payout. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. On this tab, you can access and change payout settings. **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other payout events. Can be changed anytime. ## Common use cases [#common-use-cases] The **Payouts** page helps create on‑chain withdrawals, coordinate signatures, and monitor payout callbacks.\ This section describes common scenarios step by step. ### Create a new payout [#create-a-new-payout] Create a new payout. Go to **Payouts** in the main menu. Click **Create payout** in the upper‑right corner. Fill in the **Receiver** info: * In the **Receiver address** field, enter the address where funds will be sent. You can select a receiver from the [Address book](address-book) (if added). Fill in the **Payment details**: * From the **Payment currency** dropdown, select an asset to be withdrawn. * In the **Amount** field, enter the payout amount in the selected currency. Fill in the **Advanced options**: * In the **Nonce** field, specify the transaction nonce number used in the queue for this payout.\ By default, the field is prefilled with the next number in the queue. - If you leave the value as is, the payout is added as the last transaction in the [queue](queue). - If you set a value higher than the latest nonce in the queue, the payout is added as a new transaction that will be executed after existing ones. - If you set the nonce to match an existing transaction, a replacement transaction is created and both transactions are treated as [conflicting](queue#handle-conflicting-transactions) in the queue. - If you try to set a nonce lower than the first transaction in the queue, the *Nonce cannot be lower than first transaction in the queue* error appears and the payout can't be created. * In the **Tracking ID** field, optionally enter a payout identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about payout events. Click **Create** and confirm the payout details. The newly created payout appears in the list with the *Created* status and is added to the [Queue](queue) with the specified nonce. ### View payout details [#view-payout-details] View full payout information, including signers and callbacks. Go to **Payouts** in the main menu. In the payout list, locate the required payout and click its **ID** to open details. In the upper part of the page, review the payout status, the number of collected and required signatures, and other details. On the **Signed by**, view the list of members who have already signed the payout. Switch to the **Callbacks** tab to review callback history. Switch to the **Settings** tab to view or adjust **Tracking ID** and **Callback URL**. The **Queue** is a list of multisig operations that were created for the account but are not yet fully executed. The number of new operations requiring your attention is displayed on the counter near the **Queue** menu item. Each operation uses a **nonce** and requires a certain number of signatures from account members.\ Transactions must be processed in order: an operation with a smaller nonce needs to be executed before any operation with a larger nonce. ## Queue list [#queue-list] The information on this page is divided into tabs. On this tab, you can view a list of operations that are still waiting for signatures or execution. The first block on the tab highlights the transaction that needs to be executed first.\ This block corresponds to the operation with the smallest **Nonce** in the queue. The following information is provided about each pending operation: **Nonce** The sequential number used by the smart contract to keep transactions in the correct order. The queue is sorted from the smallest nonce to the largest. *** **Created at** The time when the operation was added to the queue. The value is shown as relative time (for example, *5 minutes ago*) and can be viewed as a date and time in the details. *** **Operation** The type of the pending operation. Possible values: * **Payout** * **Multisig config change** * **Reject** * **Cross-chain transfer**: A transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **dApp transaction**: For operations initiated by an external dApp connected via WalletConnect, the column shows the dApp name and icon instead of the generic label. See [dApps](dapps). *** **Amount** For operations that change balances: the amount of the transaction. Amounts that reduce the balance are shown with a minus sign and include the currency, for example `-1,056.06 ETH`. For configuration operations, the value displays `—`. *** **Signatures** The number of collected signatures versus the required number, in the `X/Y` format (for example, `2/5` or `5/5`). *** **Action** The set of actions available for the current user and operation state. Possible values: * **Sign**: Available if the current user has not yet signed the operation and is allowed to sign it. * **Execute**: Available when all required signatures are collected and the operation has the smallest nonce in the queue. When an action is not available, the corresponding button is disabled or hidden. ### Operation details [#operation-details] Click the **chevron icon** to expand the operation details: **Created at** The date and time when an operation was created. *** **Created by** The account name and address of the user who created the operation. *** **Signed by** The list of accounts that already signed the operation, shown with names and addresses in the expanded view. *** **Action** Additional actions available for the current user and operation state. Possible values: * **Copy link**: Copy a direct link to the operation. The link can be shared with other signers to speed up collaboration. * **Reject**: Available when the operation can be replaced or canceled. On this tab, you can view a list of executed and failed operations. The table structure is similar to the **Pending** tab and additionally displays the **Status** column: all operations here are assigned a final status — *Success* or *Failed*. The history view helps trace which actions were executed, by whom, and with which result. ## Common use cases [#common-use-cases] The **Queue** page helps coordinate multisig actions between several accounts.\ This section describes common scenarios step by step. ### View the operation queue [#view-the-operation-queue] Review pending operations and see which transaction needs to be executed first. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. In the **This transaction needs to be executed first** block, review the first transaction with the smallest **Nonce**. Scroll down to the **Pending transactions** section to see all remaining operations in the queue, ordered by nonce from smallest to largest. If the queue is empty for the selected network, the *There are no transactions yet* message appears instead of the table. ### Sign transactions [#sign-transactions] Sign a pending operation so that it can eventually be executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation that requires your signature and verify that: * Not all required signatures are collected. * The **Sign** action is available, which confirms that you haven't yet signed it and you're authorized to. Then click **Sign**. In the **Sign transaction** popup, review and verify operation details before signing, and then click **Sign**. The **Sign** action for the corresponding operation will gray out signaling that you've already signed the operation. If your signature is the last required one, both **Sign** and **Execute** actions may be available, allowing you to sign and immediately [execute](#execute-transactions) the operation when conditions are met. ### Execute transactions [#execute-transactions] Execute a fully signed operation and send it to the blockchain. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to execute and verify that: * The required number of signatures is collected. * There are no other pending operations with a smaller **Nonce**. * The **Execute** action is available. Then click **Execute**. In the **Confirm transaction** popup, review the operation details and estimated fee, and then click **Execute**. The operation will display the *Executing* status for some time, and then will be moved from the *Pending* tab to the *History* tab. If your wallet lacks enough funds to cover the fee, the *Your connected wallet does not have enough funds to execute this transaction* error appears and the **Execute** button becomes disabled. ### Reject or replace transactions [#reject-or-replace-transactions] Reject or replace a queued transaction before it's executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to reject, expand the transaction row and click **Reject** if the option is available. Choose one of the available options in the popup: * **Replace with another transaction**: Propose a new transaction with the same nonce. Follow the creation flow in the opened transaction form or reuse an existing transaction from the queue; both the original and replacement transactions then appear as [conflicting](#handle-conflicting-transactions). * **Reject transaction**: Create an on‑chain cancellation transaction with the same nonce. Confirm the action in the **Reject transaction?** popup. After signing, a separate rejection transaction appears in the queue as [conflicting](#handle-conflicting-transactions) and can be executed instead of the original transaction. * **Delete from queue**: Remove the transaction locally (available when only one transaction with this nonce exists). Confirm your choice in the **Delete transaction?** popup. A new, empty transaction slot with the same nonce becomes available. ### Handle conflicting transactions [#handle-conflicting-transactions] Handle several transactions with the same nonce and execute only one of them. Go to **Queue** in the main menu. Identify groups of transactions marked as conflicting, indicated by a message *Conflicting transactions. Executing one will automatically replace the others.* Review the details of each conflicting transaction to decide which one should be executed. Execute the chosen transaction following the steps in [Execute transaction](#execute-transactions). After the chosen transaction is executed, check that **Execute** becomes unavailable for other conflicting transactions and that they disappear from the queue. ### Batch execution [#batch-execution] Execute several fully signed and sequential transactions in a single blockchain transaction. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Verify that: * There are multiple transactions in the queue. * All of them are fully signed. * Their nonces form a continuous sequence (for example: `5`, `6`, `7`). * The **Execute batch** button above the table is available. Then click **Execute batch**. In the **Batch execution** popup, review a list of transactions to be executed and their details and then click **Execute**. The executed transactions will be displayed on the *History* tab. ### View the queue history [#view-the-queue-history] Review the history of previously signed and executed operations. Go to **Queue** in the main menu. Switch to the **History** tab. Review the list of past operations. If needed, open the details for a specific operation to see its parameters and the list of signers. Use filters or sorting (where available) to focus on a particular period, operation type, or status, such as *Failed* operations that may require attention. **Staking** lets a TRON account freeze TRX to obtain **Energy** or **Bandwidth**, take part in TRON governance by voting for Super Representatives, and delegate resources to other addresses. Like every account action, staking operations are performed by your multisig account: each one enters the [Queue](queue) and must collect the required number of signatures before it executes. Energy and Bandwidth are renewable resources: TRON regenerates them over time. Use them to pay for your account's transactions without burning TRX, so processing on TRON costs you nothing while enough resource is available. ## Availability [#availability] Staking is available only when both conditions are met: * The active network is a **TVM (TRON)** network. * The account is **deployed** on that network and its smart contract version supports staking (version **1.2.1** or later). When staking is available, a **TRX Staking** group with the **Staking**, **Voting**, and **Delegation** items appears in the main menu. If the account isn't deployed on the selected network, a *No deployment in this network* placeholder is shown instead. The account balance shown on the **Account** and **Payouts** pages is the *spendable* amount. TRX that is staked, pending unstake, or waiting to be withdrawn is excluded, so it can't be spent by mistake. ## Staking [#staking] To open the page, go to **Staking** in the main menu. The upper part of the page shows four summary cards, each with its own action: * **Available**: The amount of TRX that can be staked. Use the **Stake** action to freeze TRX for Energy or Bandwidth. * **Staked**: The amount currently frozen. Use the **Unstake** action to begin releasing it. * **Pending unstake**: The amount that is unstaking and maturing before it can be withdrawn. Use **Cancel unstaking** to return it to the staked balance. * **To be withdrawn**: The matured amount ready to return to the account. Use the **Withdraw** action to collect it. Below the cards, a table lists staking operations with their status. Click a row to open the operation details. ### Stake TRX [#stake-trx] Freeze TRX to obtain Energy or Bandwidth. Go to **Staking** in the main menu and click **Stake** on the **Available** card. In the **Stake** popup, choose the resource to obtain — **Energy** or **Bandwidth**. Enter the amount of TRX to stake. The minimum is **1 TRX**. A preview shows the approximate amount of the resource you will receive at current network rates. Click **Stake**. The operation is added to the [Queue](queue), where the required number of signers must approve and execute it. ### Unstake TRX [#unstake-trx] Begin releasing staked TRX back to the account. Go to **Staking** in the main menu and click **Unstake** on the **Staked** card. Select the resource to release and enter the amount, at least **1 TRX**. The popup explains that unstaked TRX matures for a fixed number of days before it can be withdrawn. Click **Unstake** and approve the operation in the queue. The amount moves to the **Pending unstake** card. When it matures, it moves to **To be withdrawn**. While an amount is pending unstake, you can use **Cancel unstaking** to return it to the staked balance without waiting for the maturation period. ### Withdraw TRX [#withdraw-trx] Collect matured TRX back to the account balance. Go to **Staking** in the main menu and click **Withdraw** on the **To be withdrawn** card. Review the amount and click **Withdraw**, then approve the operation in the queue. Once executed, the withdrawn TRX is added back to the spendable account balance. ## Voting [#voting] The **Voting** page lets the account use its staking power to vote for TRON **Super Representatives** and claim voting rewards. To open it, go to **Voting** under **TRX Staking** in the main menu. The page shows three summary cards: * **Total** voting power and the amount **Available** to allocate, with the **Vote** action. * **Allocated** voting power, with the **Get Vote** action to obtain more voting power by staking. * **Claimable rewards**, with the **Claim** action. Below the cards, a table lists Super Representatives with your current votes. You can search and sort the list to find a specific representative. ### Vote for Super Representatives [#vote-for-super-representatives] Go to **Voting** in the main menu and click **Vote**. Allocate your available voting power across one or more Super Representatives. Confirm and approve the operation in the [Queue](queue). Voting power comes from staked TRX. If you don't have enough, use **Get Vote** to stake more TRX first. ## Delegation [#delegation] The **Delegation** page lets the account delegate its Energy or Bandwidth to another address and reclaim it later. To open it, go to **Delegation** under **TRX Staking** in the main menu. The page shows a delegation summary and a table of active delegations, each with the recipient address, amount, resource, and lock state. Use **Reclaim** in a row to return delegated resources to the account; the action is unavailable while a delegation is still locked. ### Delegate resources [#delegate-resources] Go to **Delegation** in the main menu and click **Delegate**. Enter the recipient address, the amount, and the resource to delegate — **Energy** or **Bandwidth**. The minimum is **1 TRX** of staked value. Confirm and approve the operation in the queue. **Transfers** are incoming or outgoing transactions made to or from your account. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your account. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically and can’t be modified. *** **Created at** The date and time when a transfer was created. *** **Operation** The transfer type. Possible values: * **Invoice**: The incoming payment associated with an invoice. * **Direct deposit**: The direct crediting of funds to an account address. * **Set account config**: The changing of an account configuration, such as adding/removing signers or modification of confirmation rules. * **Claim**: The claiming of funds from a deposit address to the account address. * **Payout**: The withdrawal of funds from an account. * **Cross-chain transfer**: The transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **Reject**: The operation rejection. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain identifier of a transaction, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The amount of a transfer, in the payment currency. For invoices, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. ## Transfer details [#transfer-details] To access transfer details, click a transfer **ID** in the transfer list. In the upper part of the page, you can find the essential information about the transfer — click the **chevron icon** to expand it: * The transfer identifier and current status. * The account address and name of a user who created the operation. * The payment currency. * The payment amount. * The date and time the transfer was created. * The TXID. This a link to the explorer. * The identifier of a related operation. This is a link to an invoice or payout. * The number of confirmations the transaction received on the blockchain. * The blockchain fee charged for transaction processing, in the payment currency. Below you can see a list of callbacks sent: **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values depend on the operation type (invoice or payout). *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. Bank withdrawals in fiat currencies are only available from Merchant wallets denominated in fiat currencies. To withdraw funds, you have to provide your bank details in advance. Consult your B2BINPAY manager about the procedure. Only users with the *Owner* role can create bank withdrawals. You can create a one-time withdrawal or regular withdrawal which is triggered every time when the wallet balance reaches a specific value. ## One-time withdrawals [#one-time-withdrawals] Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **One-time withdrawal** option and click **Proceed**. Select the bank details. In the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. Click **Submit** to create the withdrawal. After the withdrawal is created, it’s sent to the B2BINPAY Finance department for confirmation. Once confirmed and processed, the corresponding transfer will be assigned the *Confirmed* status. ## Regular withdrawals [#regular-withdrawals] Only one regular withdrawal can be connected to one wallet. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **Regular withdrawal when the amount is reached** option and click **Proceed**. Select the bank details. Select the withdrawal option: * **Fixed amount**: To withdraw funds immediately after the required amount is reached on the wallet. * **Changing amount**: To additionally specify the minimum amount that should be left on the wallet after the withdrawal. For fixed amount, in the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. For changing amount, specify the minimum non-reducible amount and minimum withdrawal amount. Click **Proceed** to create the withdrawal. After the withdrawal is created, you can see the **Regular withdrawal connected** tag near the corresponding wallet on the **Wallet management** > **Wallets** page. You can delete the regular withdrawal in the wallet settings. ## Deposits to Enterprise wallets [#deposits-to-enterprise-wallets] To create a deposit to your Enterprise wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited and click **Proceed**. Only Enterprise wallets are displayed in the list. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Address type** — for deposits to wallets denominated in BTC: an address format. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * the **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. ## Deposits to Merchant wallets [#deposits-to-merchant-wallets] To create a deposit to your Merchant wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited. Only Merchant wallets are displayed in the list. After you specified the wallet, a list of available payment currencies are displayed. Select the payment currency or activate the **Payer will choose currency by himself** toggle to allow your payers to select the payment currency. In this case, you’ll see a list of currencies available for payments. All payments will be credited in your wallet currency. If you specify the payment currency, below the currency list you’ll see the current exchange rate. Select the required option and click **Proceed**. If you select the payment currency, you can’t change this value after creating the deposit. If you don’t specify the payment currency, you can change this value later, until a payer selects the currency. 6\. If needed, specify the **Limits**. You can set: * the deposit amount in your wallet currency. You can change this value later. If you specify this value and the payment currency, the requested amount in the payment currency will be calculated automatically, according to the exchange rate displayed below. * the delta in your wallet currency. This value is only applicable if the requested amount is specified. You can change this value later. * the requested amount in the payment currency (only if you specified the payment currency). You can change this value later. If you specify this value, the requested amount in the wallet currency will be calculated automatically, according to the exchange rate displayed below. * the date and time when your deposit expires. You can change this value later anytime before the expiration time. You can change these values anytime. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Payout**. Select the type of a wallet: mark the **Enterprise wallet** or **Merchant wallet**, and then click **Proceed**. In the dropdown, select a wallet from which the payment amount will be debited. Only wallets of the selected type are available. For payouts from Merchant wallets, select the payment currency. If the payment currency differs from the wallet currency, the exchange rate is displayed. Enter the payment amount: * For Enterprise wallets, in the wallet currency. * For Merchant wallets, in the wallet or payment currency. Alternatively, you can select a percentage of your wallet balance to automatically calculate the payout amount. Possible options: 25%, 50%, 75%, or 100%. If needed, activate the toggles: * **Fee is included**: To deduct the blockchain fee from the payment amount, the remaining part will be credited to the receiver’s wallet. * **Commission is included**: To deduct the platform commission from the payment amount, the remaining part will be credited to the receiver’s wallet. If the toggles are inactive, the blockchain fee and platform commission are additionally debited from your wallet. If you selected **100%** in the previous step, the toggles are activated by default. The amount to be credited to the receiver’s wallet is calculated as *Available wallet balance* – (*Blockchain fee* + *Commission*). In the payout confirmation window, you'll see the **To be sent** amount which is the precise sum that will be credited to the receiver’s wallet. After making the payout, your wallet will have zero balance. For ETH, BSC, and TRX blockchains, the resulting balance may be positive due to the floating blockchain fee value. In the **Address** field, enter the destination address. You can save the entered address to your address book by activating the **Save to address book** toggle. Next time you can just pick it from the list by clicking **From address book**. For XRP and XLM, you can’t transfer funds within the same blockchain wallet. Choose the blockchain fee mode and click **Proceed**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. If needed, specify the **Advanced options** and click proceed. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. Click **Proceed** to create the payout. The newly created payout is now available in the payout list where you can monitor its status. Click the payout **ID** to access the details. If your payout got stuck on the blockchain due to low fee paid, refer to [How to speed up your payout by changing the blockchain fee](how-to-speed-up-your-payout-by-changing-the-blockchain-fee) to learn how to fix it. Internal transfers can be made between Merchant wallets denominated in the same currency and belonging to the same *Owner*. Such transfers are executed [off-chain](../../references/key-terms#off-chain-transaction) and aren't subject to any fees. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Internal transfer**. From the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets are available for selection. From the next dropdown, select a wallet to which funds should be transferred. Only Merchant wallets denominated in the same currency as the source wallet are available for selection. Enter the transfer amount. Alternatively, you can select a percentage of the source wallet balance to automatically calculate the transfer amount. Possible options: 25%, 50%, 75%, or 100%. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. The speed of the transaction processing depends on the blockchain fee selected when creating a payout: the lower the fee, the longer the transaction processing time. The following fee modes are available: * **Low**: The economy mode when speed doesn’t matter. * **Medium**: The optimal processing speed for a reasonable blockchain fee. * **High**: The priority transaction processing via high blockchain fees. * **Custom**: The customized fee value: you can specify your own blockchain fee value. Mind that your custom value can’t be two times lower than the *Low* value and three times higher than the *High* value. The blockchain fee can vary, therefore we suggest that you refer to the links containing blockchain gas[^1] fees in the table below for more precise information about blockchain fee values. | Blockchain | Links for reference | | --------------- | ------------------------------------------------------------------ | | BNB Smart Chain | [https://bscscan.com/gastracker](https://bscscan.com/gastracker) | | Ethereum | [https://etherscan.io/gastracker](https://etherscan.io/gastracker) | [^1]: Commission charged for processing token transactions in the Ethereum blockchain. If your payout got stuck on the blockchain due to low fee paid, it’s possible to speed up its processing using the **Replace by fee** option. Go to **Transfers**. Select the transfer you need to speed up: filter transfers by the *Payout* type and *Unconfirmed* status. Click the transfer **ID** to go to payout details. Click the **Replace by fee** button. If a payout can’t be replaced, the button isn’t displayed. Select the new blockchain fee value and click **OK**. The updated fee level should align with the blockchain's fees. The existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. ## Create Swap wallets [#create-swap-wallets] To swap currencies, you need to have Swap wallets denominated in these currencies. For example, if you want to swap USDT for EUR between your Merchant wallets, you need to create two Swap wallets: one denominated in USDT and another denominated in EUR. Refer to [Create a Swap wallet](../manage-your-wallets/how-to-create-a-wallet#swap-wallets) for step-by-step-instructions. ## Top up the source Swap wallet [#top-up-the-source-swap-wallet] Transfer the funds you want to exchange to the created Swap wallet. 1. Go to **Swaps** > **Wallets**. 2. Select the required wallet and click the **wallet icon (Funds)**. 3. In the **Top up** section, select an Enterprise or Merchant wallet from which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Create a swap operation [#create-a-swap-operation] Next, create a swap operation to exchange funds between your Swap wallets. 1. Go to **Swaps** > **Swap**. 2. Select a tab for the desired swap mode: * **No slippage**: No slippage will be applied, the swap will be processed at the shown price unless it changes significantly. * **Client's slippage**: Your specified slippage will be applied, the swap will be processed at the latest price unless the set **Slippage tolerance** is exceeded. 3. In the **From** section, select a source Swap wallet from which you want to swap funds. 4. In the **To** section, select a target Swap wallet to which you want to swap funds. 5. Enter a swap amount, in either the source (**From**) or target (**To**) currency. The equivalent amount in the other currency is calculated automatically and along with the actual exchange rate is displayed below. 6. If you selected the **Client's slippage** mode, in the **Slippage tolerance** field, specify the acceptable price deviation threshold, in percents, or select from the predefined options. 7. Click **Preview swap** and check operation details. 8. Click **Confirm** to create a swap. The newly created swap operation is now available on the **Swaps** > **History** page where you can monitor its status and related payments. ## Withdraw funds from your Swap wallet [#withdraw-funds-from-your-swap-wallet] Finally, withdraw the exchanged funds from your Swap wallet to your Merchant or Enterprise wallet denominated in the same currency. 1. Go to **Swaps** > **Wallets**. 2. Select a wallet from which you want to withdraw funds and click the **wallet icon (Funds)**. 3. In the **Withdraw** section, select an Enterprise or Merchant wallet to which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds to an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers to Enterprise wallets are credited after receiving enough confirmations on the blockchain. Only users with the *Owner* role can access Custody wallets. ## Top up your Custody wallet [#top-up-your-custody-wallet] To top up a wallet: Go to **Custody** > **Wallets**. Select a wallet that you want to top up and click the **Funds** button. Select **Top up funds** and click **Proceed**. From the dropdown, select a wallet from which funds should be transferred. You can select: * Any Merchant wallet. * An Enterprise wallet denominated in the same currency as the target Custody wallet. Enter the amount of transfer. The amount must be greater than or equal to the minimum transfer amount set for the target Custody wallet. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Custody** > **History** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Withdraw funds from your Custody wallet [#withdraw-funds-from-your-custody-wallet] Mind that to withdraw funds from your Custody wallet, you have to pass video verification. The Accumulated commission will be charged from the Custody wallet along with a withdrawal. To withdraw funds: Go to **Custody** > **Wallets**. Select a wallet from which you want to transfer funds and click the **Funds** button. Select **Withdraw funds** and click **Proceed**. To withdraw funds **to an Enterprise or Merchant wallet**: 1. Select the **Wallet** destination. 2. From the dropdown, select a wallet to which funds should be transferred. The target wallet must be denominated in the same currency as the source Custody wallet. To withdraw funds **to an external address**: 1. Select the **External address** destination. 2. From the dropdown, select a network. 3. Enter the destination address. Enter the amount of transfer. When transferring funds to **an Enterprise or Merchant wallet**, choose the blockchain fee mode. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. Activate the **Fee is included** toggle to deduct the blockchain fee from the transfer amount, the remaining part will be credited to the target wallet. For example, if the amount is 100 and the fee is 20, then 80 will be credited (*100 – 20*). If the toggle is inactive, the blockchain fee is additionally debited from the source wallet. Click **Proceed**. Optionally, specify the **Advanced options**. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the withdrawal-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Click **Proceed**. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. In the popup, check the withdrawal details and click **Confirm**. To process a withdrawal, you have to pass video verification. Click **Complete verification** to proceed. You can do it later on the **Custody** > **Requests** page. The newly created withdrawal is now available on the **Custody** > **Requests** page where you can monitor its status. Mind that the withdrawal may take up to 48 hours to complete after submitting and passing video verification. You can add an address to the whitelist, so that payouts made to such an address will not require approval, regardless of their amount or the role of the user who made such a payout. You can create a whitelist either for a specific wallet or for the entire blockchain. In the latter case, the whitelist will apply to all your wallets on that blockchain. The wallet-level whitelists have priority over the blockchain-level whitelists. Only users with the *Owner* role can whitelist payout addresses. To whitelist addresses, you must have 2FA enabled. ## Whitelist an address for a blockchain [#whitelist-an-address-for-a-blockchain] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To blockchain** tab, select a blockchain from the **Blockchain** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Blockchains** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. ## Whitelist an address for a wallet [#whitelist-an-address-for-a-wallet] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To wallet** tab, select a wallet from the **Wallet** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Wallets** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. You can also manage whitelisted addresses on the **Address whitelist** tab in the wallet details. Only users with the *Owner* role can create wallets. ## Enterprise wallets [#enterprise-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Enterprise wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If you select a token as the wallet currency, you’ll be additionally asked to select a [parent wallet](#user-content-fn-1)[^1]. For wallets denominated in ETH, TRX, BNB, XRP, or XLM, select a wallet from which the [Activation fee](#user-content-fn-2)[^2] will be deposited, or enable the **Activate wallet later** toggle. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Minimum transfer amount** — the minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount will be automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more comma-separated email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. Wallets denominated in ETH, TRX, BNB, XRP, or XLM require the [Activation fee](#user-content-fn-2)[^2]. If you enabled the **Activate wallet later** toggle while creating such a wallet, it will remain in the *In progress* status. Deposit the required amount of funds to the wallet to activate it. You can find the deposit address in the wallet details. ## Merchant wallets [#merchant-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Merchant wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Site URL** — a link to your landing page or any other resources. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. ## Swap wallets [#swap-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Swaps** > **Wallets**. Click **Add swap wallet**. Select a wallet currency and click **Confirm**. Swap wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. The newly created wallet is now available on the **Swaps** > **Wallets** page and can be topped up and used for swap operations. ## Custody wallets [#custody-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Custody** > **Wallets**. Click **Add custody wallet**. Select a wallet currency. Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. Click **Proceed**. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. Click **Confirm** to create the wallet. The newly created wallet is now available on the **Custody** > **Wallets** page and can be topped up. [^1]: Enterprise wallet to which a token wallet is linked. [^2]: A deposit to activate your wallet. For more details: [#activation-fee](../../references/key-terms#activation-fee "mention") You can generate a report on wallet balances and transactions for a specific time period, and download it as a CSV file. The report contains information about all your Enterprise and Merchant wallets existing in the system during the specified time period. A report on wallet balances contains information about wallet transactions and balances for the custom time period. To create a report: Click your user icon in the upper right corner of the page and select **Reports**. Click **Download report**. Click the **calendar icon** to pick up start and end dates of the reporting period. Click **Download** to start creating the report. Mind that the report generating may take some time. Once generated, it’ll be automatically downloaded to your computer as a zip-archive containing the report file in the CSV format. In the downloaded report, for each wallet all possible transfer types are listed, regardless of the actual amount of funds. Refer to [Transfer types](../../references/transfer-types) for more details about operations. You can grant access to your Enterprise and Merchant wallets to other members of your team. Only users with the *Owner* role can grant access to wallets. To grant access, you need to add a new user and assign them a user role. Access can be managed either centrally from your profile menu, where you can see a list of all users and the wallets they have access to, or from the wallet details, where you can see the users who have access to that specific wallet. This article is focused on adding users. If you need to revoke access, refer to [How to restrict access to your wallet](how-to-restrict-access-to-your-wallet). If you need to adjust user roles, refer to [How to manage user roles](how-to-manage-user-roles). ## From your profile menu [#from-your-profile-menu] ### Add a new user [#add-a-new-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, click **Add new user**. From the dropdown, select a wallet to which you want to share access. Enter the email address of a user to whom you want to grant access. Click **Add**. A new user will be added to the **Staff** tab. By default, users are assigned the *Read only* role. See [How to manage user roles](how-to-manage-user-roles) for step-by-step instructions on how to change it. ### Share access to an existing user [#share-access-to-an-existing-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user to whom you want to grant access. Click **Add wallet access**. From the **Wallet** dropdown, select a wallet to which you want to share access. From the **Role** dropdown, select a role that you want to assign. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Add**. The user now have access to the wallet according to the assigned role. ## From the wallet details [#from-the-wallet-details] To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to share access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, click **Invite user**. In the **Invite new user** popup, enter the email address of a user to whom you want to grant access and select a user role. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Confirm** to invite the user. The user will receive an email invitation with a link to activate access to the wallet. You can revoke access anytime in the wallet settings by deleting the user from the access list. You can manage access to your wallets by assigning different roles to users. Refer to [User roles](../../references/user-roles) for more details. You can change access for a single wallet or for multiple wallets at a time. Only users with the *Owner* role can assign user roles to other users. The *Owner* role can't be assigned or changed. ## For a single wallet [#for-a-single-wallet] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Hover over a required wallet and click the **pencil icon** that appears to the right. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the specific wallet. ## For multiple wallets [#for-multiple-wallets] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Mark the checkboxes of required wallets. Mark the top checkbox to select all wallets. From the **Action** menu above the wallet list, select **Edit access**. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the selected wallets. You can revoke access to your Enterprise and Merchant wallets from other members of your team. Only users with the *Owner* role can restrict access to wallets. To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to restrict access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, select a user and click the **pencil icon** to change a user role or the **bin icon** to revoke user access. Click **Confirm** to apply changes. For additional security measures, you can also limit access to the system by the IP white list. For step-by-step instructions, refer to [How to whitelist IP addresses](../manage-your-profile-and-system/how-to-whitelist-ip-addresses). You can set thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of the role of the user who created such payout. The thresholds can be applied to withdrawals made by specific users or user groups. Only users with the *Owner* role can set withdrawal thresholds. To set a threshold: Go to **Wallet management** > **Wallets**. Select a wallet for which you want to set thresholds and click its **ID** to open wallet details. Switch to the **Thresholds** tab. Enable the **Thresholds** toggle. In the **Approvers** section that appears, specify who can approve the payouts. You can select one or more user roles (the *Owner* role is selected by default and can be deselected), individual users, or both. Select a required option: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Click **Add new threshold**. To set a threshold for users, from the **User/User group** dropdown select **User**, and then select one or more emails. The threshold will be applied when the specified user will make a payout. To set a threshold for user groups, from the **User/User group** dropdown select **User group**, and then select one or more groups. The threshold will be applied when users from the specified groups will make a payout. In the **Number of confirmations** field, enter how many approvals the payout will require. The default value is 1. Enter a threshold amount. Payouts with amounts exceeding the specified value will require an approval. For the **Max sum of payout per timeframe** option, set a timeframe: * Select **Minute**, **Hour**, or **Day**. * Enter a value greater than 0 (zero). Click **Add**. The newly added threshold is now available in the list. When a payout exceeding a threshold amount is created, it appears on the **Events** page, where all assigned Approvers can review and confirm it. Once the required number of confirmations is received, the payout is processed. To change a threshold, hover over it and click the **pencil icon** to go to threshold settings. To remove a threshold, hover over it and click the **bin icon**, and then confirm the deletion. ## Obtain API credentials [#obtain-api-credentials] Only users with the *Owner* role can generate API credentials. To get access to API: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Manage API access** section, optionally whitelist IP addresses for API access: refer to [How to whitelist IP addresses](how-to-whitelist-ip-addresses#restrict-access-to-api) for step-by-step instructions. Enable the **Activate API user** toggle. In the **Your API access credentials** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated API key and secret are displayed in the popup. Use **Copy** buttons to copy values. Mind that the credentials only reveal once in this popup. They can’t be accessed after the popup is closed and have to be regenerated. Now you can access the system via the API. The new API user with the *Admin* role is automatically granted access to all your wallets. ## Security tips [#security-tips] If sharing your API keys with other persons to set up integrations: * Use password managers for secure credential sharing. * Whitelist IP addresses for API access. * Generate new credentials after the setup is complete. ## Obtain a callback secret [#obtain-a-callback-secret] Only users with the *Owner* role can generate callback secrets. To get a callback secret: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **Callback secret** tab. In the **Your callback secret** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated callback secret displayed in the popup. Use **Copy** button to copy the value. Mind that the callback secret only reveals once in this popup. It can’t be accessed after the popup is closed and has to be regenerated. Now you can use the callback secret for [deposit](../../api-guide/deposit-methods#callback-verification) and [payout](../../api-guide/payout-methods#callback-verification) callback verifications. To change your password, you must have access to your profile. If you forgot your password and can’t log in to the system, please click **Forgot password?** on the log in page and proceed with the password resetting procedure. If you suspect your account has been compromised, immediately contact your B2BINPAY manager. To change the password: Click your user icon in the upper right corner of the page and select **Settings**. In the **Password** section, click the **Change password** button. In the **Set new password** popup, enter your current password, then enter and repeat a new password. Mind that the password must meet the following requirements: * Latin characters, numbers, and special symbols are allowed. * The minimum length is 8 symbols. * At least one upper-case character must be used. Click **Confirm** to apply changes. Your password has been successfully changed. Use the Google Authenticator app for receiving *Payment system 2FA* verification codes. If you lost your device or forgot the secret code and can’t get access to your account, contact your B2BINPAY manager. Mind that in order to restore access, you’ll be asked to provide all the necessary documents to verify your identity. To enable 2FA: Click your user icon in the upper right corner of the page and select **Settings**. In the **Two-factor authentication** section, activate the **Google Authenticator** toggle. Download and install the Google Authenticator app from AppStore or Google Play, and then click **Proceed**. Scan the displayed QR code with Google Authenticator or enter the code manually, and then click **Proceed**. In the **Enable Google Authenticator** popup, enter your password and click **Confirm**. The 2FA is enabled. Next time you log in, you’ll be asked to enter a 2FA verification code provided via the selected method. Mind that 2FA codes are one-time and time-sensitive. You can add your personal account of the AML provider as an additional level of verification. If enabled, after successfully passing the default B2BINPAY AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. To enable custom AML check: Click your user icon in the upper right corner of the page and select **Settings**. In the **AML check** section, activate the toggle. In the popup: 1. Select an AML provider. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). 2. Enter your AML provider credentials: API key and API secret. 3. Specify **Risk for alert** to receive email notifications on suspicious transactions, and **Risk for block** to block them. The values from 0 (zero) to 100 are supported. 4. In the **Retries max** field, specify the maximum number of attempts to resend a request in case the AML provider doesn't respond. Click **Enable** to finish setup. The additional AML check is now enabled. All incoming transfers are now subject to two AML checks. You can disable custom AML check or edit credentials anytime in your profile. Use the partner program to earn a percentage of B2BINPAY commissions from clients who sign up using your referral link. This guide explains how to choose a wallet for rewards and generate your referral URL. Only users with the *Owner* role can configure the partner program. Before you start, make sure you have at least one **Merchant** wallet in USD. This wallet will be used to receive partner rewards. For details, refer to [How to create a wallet](../manage-your-wallets/how-to-create-a-wallet). To start a partner program: Go to **Partner program**. In the **How it works** section, click the **Terms & conditions** link to review the program settings. In the **Unique referral URL** section, click **Select wallet** and select your Merchant wallet is USD. Once the link is generated, use the **Copy** button to copy it to the clipboard. Share the copied URL with partners who want to join B2BINPAY. When an invited client signs up through your link, passes KYB checks, and starts processing eligible transactions, their commissions begin generating partner rewards for your legal entity according to the program settings. You can track invited clients, their statuses, and rewards on the **Partner program** page in the **Invited partners** table. You can limit access to your legal entity Web UI and API by whitelisting trusted IP addresses. We recommend that you use this option to protect your finances. Only users with the *Owner* role can whitelist IP addresses. ## Restrict access to Web UI [#restrict-access-to-web-ui] This setting will apply to all users under this particular legal entity, including the *Owner*. Enter IP addresses carefully, otherwise you risk losing access to the system. To let your users access the system only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **IP whitelist** tab. In the **Specify IP addresses** filed, click the **pencil icon** and add trusted IP addresses. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system Web UI is allowed only from the specified IPs. All users currently logged in from untrusted IP addresses will be logged out. ## Restrict access to API [#restrict-access-to-api] To let your users access the system API only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Whitelist IP access** field, click the **pencil icon** and add trusted IP addresses. Press **Enter** after each IP. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system API is allowed only from the specified IPs. On this page, you can view a list of balance operations on your Custody wallets. Only users with the *Owner* role can access this section. ## Operation list [#operation-list] The following information is provided about each operation: **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Operation** The transfer type. Possible values: * **Custody wallet withdrawal**: The withdrawal of funds from a Custody wallet to an Enterprise/Merchant wallet or to an external address. * **Custody wallet top up**: The deposit of funds to a Custody wallet from an Enterprise or Merchant wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the wallet currency. *** **Created at** The date and time when a transaction was created. Only users with the *Owner* role can access this section. **Requests** are orders to withdraw funds from your Custody wallets. Only users with the *Owner* role can access this section. For step-by-step instructions, refer to [Withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet#withdraw-funds-from-your-custody-wallet). ### Key points [#key-points] * Regardless of where the funds are withdrawn — to a Merchant or Enterprise wallet, or to an external address — video verification is required for any withdrawal request. * Once submitted, a withdrawal request may take up to 48 hours to complete. ## Request list [#request-list] The following information is provided about each request: **ID** The unique system identifier of a request. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Status** The current status of a request. Possible values: * **Created**: The withdrawal request was created, but video verification hasn't yet been passed. * **Approved**: The withdrawal request was approved by a Compliance officer. * **Declined**: The withdrawal request wasn't approved by a Compliance officer. *** **Created at** The date and time when a request was created. *** **Action** The buttons are available for the requests that haven't yet been reviewed by a Compliance officer. * **Cancel**: Click this button to cancel the request. * **Verification**: Click this button to proceed with video verification. **Custody wallets** are accounts with an additional level of security. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. * You can only create one Custody wallet per currency. * To withdraw funds from a Custody wallet, you must create a request, pass video verification, and receive approval from a Compliance officer. * Withdrawals from Custody wallets can be made to any external address as well as to Merchant or Enterprise wallets denominated in the same currency. * You can top up Custody wallets from your Merchant or Enterprise wallets. For Merchant wallets, conversion is possible. Enterprise wallets must be denominated in the same currency as the target Custody wallet. * Fees are applied for storing funds on Custody wallets. Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and for each withdrawal from the Custody wallet. ## Wallet list [#wallet-list] On this page, you can view a list of all your Custody wallets created in the system. Click the **%** button above the table to view the applied commission tiers. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance / Available for withdrawal** The current total balance and the balance available for financial operations. The available balance is calculated as *Balance* – *Accumulated commission*. *** **Accumulated commission** The fee for storing the funds accumulated to date. This value is calculated daily, according to the tiers that you can see by clicking the **%** button above the wallet. The commission is charged on the first day of each month and when withdrawing funds. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **Created at** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **Funds** button to top up or withdraw funds. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, type (`C` for Custody), and status. * The wallet currency. * The total balance. * The balance available for withdrawal (calculated as *Balance – Accumulated commission*). * The accumulated commission. * The total balance in conversion to USD. * The date and time when the wallet was created. ### Wallet settings [#wallet-settings] In this section, you can view and manage the following wallet settings: **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. The list can be changed anytime. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#custody-wallets) * [How to top up or withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet) On this page, you can view all swap and other balance operations related to your Swap wallets. The content of the page is divided into tabs: On this tab, you can view a history of swap operations between your Swap wallets. The following information is provided about each operation: **ID** The unique system identifier of a swap. This is a link to swap details. This value is generated automatically at the moment of swap creation and can’t be changed. *** **Status** The current status of a swap. Possible values: * **Success**: The swap has been successfully completed, balances of Swap wallets have been updated. * **Failed**: The swap hasn’t been completed due to some technical issues. *** **Wallet from** The identifier and currency of a debiting wallet. *** **Amount from** The swap amount, in the debiting wallet currency. *** **Wallet to** The identifier and currency of a crediting wallet. *** **Amount to** The swap amount, in the crediting wallet currency. *** **Pair** The currency pair. The first currency in the pair is the currency in which the swap amount was specified. *** **Rate** The exchange rate of the first currency in the pair to the second currency, valid at the moment of a swap operation. *** **Created** The date and time of swap creation. On this tab, you can view a history of swap-related transfers on your Swap wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The system identifier, type, label, and currency of a wallet to or from which the transfer was made. This is a link to wallet details. *** **Operation type** Possible values: * **Swap withdrawal**: The withdrawal of funds from a Swap wallet to an Enterprise or Merchant wallet. * **Swap top up**: The deposit of funds to a Swap wallet from an Enterprise or Merchant wallet. * **Swap charge**: The debiting of funds from a debiting Swap wallet. * **Swap enrolled**: The crediting of funds to a crediting Swap wallet. *** **Amount** The amount of a transfer without commissions, in the wallet currency. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Created** The date and time when a transaction was created. **Swaps** are exchange operations between your Swap wallets. For step-by-step instructions, refer to [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds). ### Key points [#key-points] * Swap operations are fast and convenient. * Swap operations are [off-chain](../../references/key-terms#off-chain-transaction), and hence don’t require [block confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Swap operations are possible only between your own Swap wallets denominated in different currencies. * You can exchange all [available currencies](../../references/currency-codes), including fiat, coins, and tokens. * Funds from your Swap wallets can be transferred to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, and vice versa. Refer to [Wallets](wallets) for more details. **Swap wallets** are your virtual wallets for swap operations. ### Key points [#key-points] * Swap wallets can be denominated either in crypto or in fiat currencies. * You can only create one wallet per currency. * Swap wallets aren’t linked to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, but you can top up your Swap wallets from your Enterprise or Merchant wallets. All balance operations are allowed only between wallets denominated in the same currency. For example, if you create a Swap wallet denominated in USD, you can top it up only from your Merchant wallet denominated in USD. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction), and hence require block [confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Balance operations between Swap and Enterprise/Merchant wallets are displayed on the **Wallet management** > **Transfers** page. Swap operations between Swap wallets are available on the **Swaps** > **History** page and aren’t displayed on the **Wallet management** > **Transfers** page. ## Wallet list [#wallet-list] On this page, you can view a list of all your Swap wallets created in the system. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance** The current balance available for financial operations. *** **Created** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **wallet icon** to top up or withdraw funds, and the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, the date and time when a wallet was created in the system. * The wallet currency. * The current balance. The following content of the page is divided into tabs: On this tab, you can access and manage wallet settings. **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. On this tab, you can grant access to your wallet to other users: * Click **Invite user** to grant them access to the wallet. * Click the **bin icon** near the added user to revoke access. Mind that no user roles are applicable to Swap wallets: all added users are granted full access to balance and swap operations. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#swap-wallets) * [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds) [TRX staking](../../references/key-terms#staking) is a process of freezing funds for a certain period of time to get resources and additional profit. ### Key points [#key-points] * When staking, you can “exchange” your funds for resources, such as bandwidth or energy, which allow you to save on blockchain fees. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are available immediately after staking and are replenished throughout the day. * When staked, the funds remain on your wallet but are locked and can’t be used for financial operations. * You can unstake funds at any time after staking, but keep in mind that the unstaking process takes 14 days on the blockchain. Until then your funds remain locked. Unstaking is limited to 32 pending transactions. * For each staked TRX, you receive one vote. You can give your votes to one or more [Super Representatives](../../references/key-terms#sr) to gain rewards for each voting round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-assign your votes at any time. * Staking is only available for wallet *Owners*. ## General information [#general-information] In the upper part of the page, you can review the conditions of the TRX staking: * **Term**: The minimum period for which funds are blocked. * **Min amount of funds to stake**: The minimum allowed amount of TRX that can be staked. * **Commission from the reward**: The commission amount that will be deduced from the reward amount. The withdrawabale amount is calculated as follows: *Amount to withdraw – (Amount to withdraw × Transaction fee/100%)*. ## Wallets [#wallets] In this section, you can view your wallets denominated in TRX. The following information is provided about each wallet: **Wallet** The information about your TRX wallet: the wallet identifier, type (always `E` for Enterprise), label (if set), and total balance. *** **Accumulated reward** The reward from staking, which can be withdrawn. *** **Available / Total votes** The amount of votes. The **Available votes** are votes that haven’t yet been distributed among SRs[^1]. The **Total votes** is the sum of distributed and undistributed votes. *** **Actions** The action buttons: * **Withdraw reward**: Clicking this button opens the **Withdraw reward** popup where you can review withdrawal details such as a target wallet, withdrawal amount, transaction fee, and so on. Mind that reward claiming is available only once in 24 hours. The button is inactive if the **Accumulated rewards** is 0 (zero) or the reward was claimed less than 24 hours ago. * **Get votes**: Clicking this button leads you to the **Resources** tab of the **Wallet details** where you can stake TRX to get votes. [^1]: Super Representatives. For more information, see [#sr](../../references/key-terms#sr "mention") **Callbacks** are `POST`-requests sent to your callback URL, to notify about transaction-related events in the system. For more information, see [Callback](../../references/key-terms#callback) ## Callback list [#callback-list] On this page, you can view a list of callbacks. The following information is provided about each callback: **ID** The unique system identifier of a callback. This is a link to callback details. *** **Time sent** The date and time when a callback was sent. *** **Type** The callback type. Possible values: * **Confirmation**: The transfer has received a required number of [block confirmations](../../references/key-terms#confirmation-block). * **Fail**: The transfer failed. * **No transfer**: The deposit has expired or the payout wasn't approved, no transfer was created. * **Request rejection**: The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. * **Block**: The deposit was blocked by an AML provider, the transfer was canceled. * **Cancel**: The payout was blocked by an AML provider, the transfer was canceled. * **User confirmation**: The transfer has received a number of [block confirmations](../../references/key-terms#confirmation-block) specified by a client to receive an additional callback. * **Manual**: The callback was resent manually. *** **URL** The callback URL specified when creating a deposit or payout. *** **Status** The current status of a callback. Possible values: * **New**: The callback was created but hasn't yet been sent. * **In progress**: The callback has been sent and awaits a response. * **Failed**: The callback was sent and a negative response from the client server was received. * **Sent**: The callback was sent and a response with the HTTP code `200` from the client server was received. *** **Attempts** The number of attempts to send a callback. *** **Transfer ID** The unique system identifier of a related transfer. This is a link to transfer details. *** **Action** In this column, you can click the **Resend** button to resend the callback. ## Callback details [#callback-details] To access callback details, click a callback **ID** the callback list. In the upper part of the page, you can find essential information about the callback — click the **chevron icon** to expand it: * The callback identifier and status. * The callback type. * The date and time when sent callback was sent. * The number of attempts to send the callback. * The identifier of a related transfer. * The callback URL along with the copy button. The information below is divided into tabs: On this tab, you can see the JSON payload of a callback. On this tab, you can see a response received (if any) from a client server. **Deposits** are invoices that you create to receive payments to your wallets. ### Key points [#key-points] * The system accepts payments only in cryptocurrencies. Fiat payments to [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies can be made via the B2BINPAY Finance department. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Each [on-chain](../../references/key-terms#on-chain-transaction) transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a deposit, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. The fee amount is selected by a payer. * Information about new transfers associated with a deposit can be sent to your system via a [callback](../../references/key-terms#callback). * Each deposit can be assigned a special identifier by which the related transactions can be tracked in an external system. * For each deposit, a payment page is automatically generated. It can be useful to send payment details to your payers. The exchange rate on the payment page is frozen for 15 minutes after its creation. * For Merchant wallets, it’s possible to set time limits to specify the sum or expiration time for a deposit as well as payment limits to address possible payment amount variations due to rate changes. ## Deposit list [#deposit-list] On this page, you can view a list of all deposits to your wallets. The following information is provided about each deposit: **ID** The unique system identifier of a deposit. This is a link to deposit details. This value is generated automatically at the moment of deposit creation and can’t be changed. *** **Created** The date and time when a deposit was created. *** **Updated** The date and time when the deposit status was last updated or payment received. *** **Wallet type** The type of a wallet to which deposit-related payments are made. *** **Wallet** The label or system identifier of a wallet to which deposit-related payments are made. This is a link to wallet details. *** **Address** The deposit address. This is a link to the explorer. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the address generated depending on the payment currency selected by the payer and can’t be changed. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the payment currency selected by the payer and can’t be changed. *** **Label** The tag or name assigned to a deposit for easier locating it in the system. This value is set when creating a deposit and can be changed anytime. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. This value is set when creating a deposit and can be changed anytime. *** **Status** *Available only for deposits to Merchant wallets.* The deposits to Enterprise wallets are always assigned the *Invoice* status. The current deposit status. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Requested amount** The requested amount, in the wallet currency (only for deposits with indicated amounts). This value is set when creating a deposit and can be changed anytime. *** **Requested rate** If the payment currency differs from the wallet currency, this is the current exchange rate of a payment currency to the wallet currency. This value is updated with each payment received or the deposit status updated. If the deposit currency wasn’t specified, this field is empty until a payer selects the payment currency. *** **Paid amount** The total amount of funds that have already been received to the deposit address, in the wallet currency. *** **Enrolled amount** The total amount credited, in the wallet currency. This value is calculated as *Paid amount – Total commission amount*. *** **Expired at** The date and time of deposit expiration (only for Merchant deposit with indicated expiration time). ## Deposit details [#deposit-details] To access deposit details, click a deposit **ID** in the deposit list. In the upper part of the page, you can find essential information about the deposit — click the **chevron icon** to expand it: * The deposit identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The deposit currency (if defined). * The deposit address (if the payment currency is specified). * The link to a payment page. * The paid amount in the wallet currency. * The enrolled amount in the wallet currency (*Paid amount – Total commission amount*). The information below is divided into tabs: On this tab, you can access and change deposit settings. The content on this tab differs for Enterprise and Merchant deposits. **Currency** The payment currency. Available only for deposits to Merchant wallets, if the payment currency wasn’t specified. *** **Status** The current deposit status. Available only for deposits to Merchant wallets. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Limits** *Available for deposits to Merchant wallets only.* The time and payment limits. **Requested amount in wallet currency** The deposit amount, in the wallet currency. *** **Delta** *Applicable for deposits to Merchant wallets with indicated amounts.* The payment delta, in the wallet currency. The delta can be useful to address possible rate changes. For example, you create a deposit for 100 USDT with the expiration time of 10 minutes without specifying the payment currency. This means that the payer can pay in any currency within 10 minutes. But the rate of the currency pair may change within the specified time. In order to minimize your risks, you can set the delta value, for example of 5 USDT, which means that you expect payment from 95 USDT to 105 USDT (depending on the rate) within 10 minutes. The delta can be also useful when the payment currency is the same as the wallet currency. For example, you create a deposit with the indicated amount of 0.1 BTC, and the payer sends 0.1 BTC minus the commission, and thus you don’t receive the full amount of the deposit and the deposit can’t be transferred to the *Paid* status. To avoid such situations, enter the delta value. Mind that the delta must be less than the requested amount. *** **Requested amount in payment currency** The deposit amount, in the payment currency. If the deposit currency wasn’t specified, this field is unavailable until a payer selects the payment currency. *** **Expired at** The date and time of the deposit expiration. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of a payment currency to the wallet currency. If the deposit currency wasn’t specified, this is the exchange rate to a base currency (USD). The exchange rates are automatically updated. Click the **refresh icon** to see the current value. **Advanced options** Additional deposit settings. **Label** The tag or name assigned to a deposit for easier locating it in the system. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. *** **Callback URL** The URL for callback notifications on new payments. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field received. *** **Payment page URL** The link that is displayed as a button on the payment page. *** **Payment page button name** The custom name of a button displayed on the payment page. On this tab, you can find a list of payments to your wallet associated with the deposit. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Currency** The payment currency. On this tab, you can view the deposit history. **Created** The date and time of an action. **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. **Reason** The action type. Possible values: * **Created**: The deposit has been created. * **Changed**: The deposit has been changed. * **Deleted**: The deposit has been deleted. **Comment** The description of the action. **Field name** The field that has been changed as a result of the action. **Old value** The previous state of the field. **Actual value** The new state of the field. **See also:** * [How to create a deposit](../../how-tos/manage-your-assets/how-to-create-a-deposit) **Events** are system notifications that require your attention or action. Some actions can only be performed by users with the *Owner* and *Admin* roles. ## Event list [#event-list] On this page, you can find a list of all events logged in the system. The number of new notifications is displayed on the counter near the **Events** menu item. The following information is provided about each event: **ID** The unique system identifier of an event. *** **Created** The date and time when an event was logged in the system. *** **Updated** The date and time when an event was last updated. *** **Type** The event type. Refer to the **Event types** section below for details. *** **Operation ID** For events related to deposits or payouts, this is the unique operation identifier in the system. This is a link to deposit or payout details. *** **Action** The action button(s) applicable for this event type. ## Event types [#event-types] In the table below, you can find descriptions of all system events. [^1]: A notification sent to a user’s callback URL when a new transaction occurs on the blockchain. For more information, see [#callback](../../references/key-terms#callback "mention") [^2]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^3]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^4]: A user-created token in certain blockchains. For more details, see [#custom-token](../../references/key-terms#custom-token "mention") **Payout** are payments, withdrawals, and transfers made from your wallets. ### Key points [#key-points] * The system supports payouts in crypto currencies. For [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies, the system supports [Bank withdrawal](../../references/key-terms#bank-withdrawal) in fiat currencies with various options: one-time withdrawals and regular withdrawals of a fixed or floating amount. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Payouts involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Payouts between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a payout, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. You can choose the fee amount when creating a payout. * Information about new transfers associated with a payout can be sent to your system via a [callback](../../references/key-terms#callback). * Each payout can be assigned a special identifier by which the related transactions can be tracked in an external system. * You can save frequently used addresses to the Address book to save up time when creating regular payouts. ## Payout list [#payout-list] On this page, you can view a list of all payout from your wallets. The following information is provided about each payout: **ID** The unique system identifier of a payout. This is a link to payout details. This value is generated automatically at the moment of payout creation and can’t be changed. *** **Created** The date and time when a payout was created. *** **Label** The tag or name assigned to a payout for easier locating it in the system. This value is set when creating a payout and can be changed anytime. *** **Wallet type** The type of a wallet from which the payout was made. *** **Wallet** The label or system identifier of a wallet from which the payout was made. This is a link to wallet details. *** **Receiver** The blockchain address (abridged) of a receiver’s wallet. This is a link to the explorer. *** **Receiver (full)** The blockchain address (full) of a receiver’s wallet. This is a link to the explorer. *** **Status** The current payout status. Possible values: * **Waiting for approval**: For a payout created by a user with the *Withdrawal with approval* role: the payout was created and awaits the approval. * **Approved**: The payout was approved. * **Canceled**: The payout was canceled. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. This value is set when creating a payout and can be changed anytime. *** **Amount** The payout amount, in the payment currency. *** **Charged amount** The payout amount, in the wallet currency, including commissions charged. *** **Updated** The date and time when the payout status was last updated. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron icon** to expand it: * The payout identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The payment currency. * The paid amount in the payment currency. * The total commission amount charged for payout processing. * The destination address. The information below is divided into tabs: On this tab, you can access and change payout settings. **Label** The tag or name assigned to a payout for easier locating it in the system. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. *** **Callback URL** The URL for callback notifications on new transactions. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field is received. *** **Receiver** The receiver type (natural or legal person) and name. *** **Address** The receiver’s address, as defined by postal services. On this tab, you can find a list of transactions associated with the payout. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Currency** The payment currency. On this tab, you can view the payout history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The payout has been created. * **Changed**: The payout has been changed. * **Deleted**: The payout has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. **See also:** * [How to create a payout](../../how-tos/manage-your-assets/how-to-create-a-payout) * [How to create a bank withdrawal](../../how-tos/manage-your-assets/how-to-create-a-bank-withdrawal) * [How to create an internal transfer](../../how-tos/manage-your-assets/how-to-create-an-internal-transfer) * [How to select the optimal blockchain fee](../../how-tos/manage-your-assets/how-to-select-the-optimal-blockchain-fee) * [How to speed up your payout by changing the blockchain fee](../../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) **Transfers** are incoming or outgoing transactions made to or from your wallets, such as deposits, payouts, activation fees, payments for custom tokens processing, and so on. For a full list of possible types, refer to [Transfer types](../../references/transfer-types). ### Key points [#key-points] * The list shows all transactions, including canceled, failed, and others. * In this section, you can’t create a new transaction. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the transaction currency always matches the wallet currency. For [Merchant wallets](../../references/key-terms#merchant-wallet), the transaction currency may differ from the wallet currency. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Some transactions between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. * Each deposit passes the [AML](../../references/key-terms#aml) check. The check is performed on the side of an AML provider connected using the B2BINPAY Back Office. If during the AML check a payment is considered suspicious (red), it’s assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. Additionally, [custom AML verification](../../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) can be enabled for incoming transfers. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Created** The date and time when a transfer was created. *** **Wallet type** The type of a wallet to or from which the transfer was made. *** **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **AML risk** The status of built-in AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Custom AML risk** If enabled, the status of custom AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The label or system identifier of a wallet to or from which the transfer was made. This is a link to wallet details. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The amount of a transfer, in the payment currency. For deposits, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Amount target** The total amount of a transfer, in the wallet currency. *** **Target currency** The wallet currency. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Operation ID** For deposits and payouts, this is the unique operation identifier in the system. This is a link to operation details. ## Transfer details [#transfer-details] To access transfer details, click a **Transfer ID** in the Transfer list. In the upper part of the page, you can find the essential information about the transfer: * The transfer identifier, current status, and AML check result. * The information about your wallet to or from which the transfer was made: the wallet identifier, type (`E` for Enterprise and `M` for Merchant), label (if set), and current balance. Below you can see the transfer details: **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **Created at** The date and time when a transfer was created. *** **Updated at** The date and time when a transfer status was last updated. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The total amount of a transfer, in the payment currency. *** **Amount target** The total amount of a transfer, in the wallet currency. This field is only visible if the payment currency differs from the wallet currency. *** **Commission** The B2BINPAY fee charged for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for transaction processing, in the payment currency. Applicable only for on-chain transactions. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Rate** The exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. This field is only visible if the payment currency differs from the wallet currency. *** **Callback** The callback status. Applicable only for deposits and payouts. Possible values: * **Not needed**: The *Confirmations needed* field wasn’t specified for an associated deposit or payout. * **Sent**: The callback is sent. * **Not sent**: The callback hasn’t yet been sent (not enough confirmations received yet). *** **Operation ID** The unique operation identifier in the system. Applicable only for deposits and payouts. This is a link to operation details. *** **Description** Any comment for an operation made via the B2BINPAY Back Office. *** **Replace by fee** This option is available for payouts that got stuck on the blockchain due to a low fee amount. It allows you to change the blockchain fee amount. As a result, the existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. **Wallets** are your B2BINPAY accounts denominated either in crypto or in fiat currency. ### Key points [#key-points] * B2BINPAY offers two types of wallets: [Enterprise](../../references/key-terms#enterprise-wallet) and [Merchant](../../references/key-terms#merchant-wallet). * Enterprise wallets can be denominated in any [crypto currency](../../references/currency-codes) supported by B2BINPAY. Fiat currencies aren’t supported for the Enterprise wallets. Such wallets have their own addresses. All transactions involving Enterprise wallets are executed [on-chain](../../references/key-terms#on-chain-transaction). * Merchant wallets are virtual wallets. These wallets don’t have their own addresses; instead, a deposit address is generated for each deposit made to such a wallet. The Merchant wallets can be denominated in fiat currencies and cryptocurrencies supported for Merchant wallets. Transactions between B2BINPAY Merchant wallets can be executed [off-chain](../../references/key-terms#off-chain-transaction). You can withdraw fiat funds from your fiat Merchant wallets using a [Bank withdrawal](../../references/key-terms#bank-withdrawal). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * The wallet currency is selected during the wallet creation and can’t be changed afterwards. * You can create numerous Enterprise and Merchant wallets. * You can grant access to your wallets to other users so that they can perform balance operations depending on assigned roles. * [Activation fee](../../references/key-terms#activation-fee) is required for Enterprise wallets denominated in ETH, XRP, XLM, or BNB currencies. You can activate such wallets by depositing funds from your Merchant wallets. * Wallets denominated in tokens require [parent wallets](../../references/key-terms#parent-wallet). The parent wallet must be an Enterprise wallet created in the same blockchain as the token. Commissions for token processing are deducted from the parent wallet. Each parent wallet can serve as the parent for a single token wallet, it’s not possible to link two token wallets to the same parent wallet. * Enterprise wallets in the ETH and BNB-BSC blockchains can be duplicated. For example, for your wallet in ETH, an identical wallet and contract in BNB-BSC can be created. This feature can be useful if clients mistakenly send funds to the wrong blockchain. Each wallet can only be duplicated once. * You can stake funds on TRX wallets to gain TRON blockchain resources and save on blockchain fees. ## Wallets list [#wallets-list] On this page, you can view a list of all your Enterprise and Merchant wallets created in the system. The following information is provided about each wallet: **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Wallet type** The type of a wallet: Enterprise or Merchant. This value was selected when creating a wallet and can’t be changed. *** **Balance** The balance available for financial operations. *** **Pending** The sum of all deposit- and payout-related transactions that haven’t yet received the required number of confirmation blocks or passed AML check. This value is positive for incoming and negative for outgoing transactions. This balance can’t currently be used for financial operations. *** **Status** The current status of a wallet. Possible values: * **Active**: The wallet has been activated (if required) and can be used. * **In progress**: The wallet is now being registered in the system or requires the activation and currently unavailable. * **Not active**: The wallet hasn’t been activated due to some technical or blockchain issues. *** **Action** In this column, you can click the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier and status. * The wallet currency. * For wallets denominated in tokens, the parent wallet. * The available balance. * The pending balance. * For Enterprise wallets, the wallet address; for wallets denominated in XRP, the address type is additionally available for selection: * `Address`: The deposit address; the destination tag should be additionally specified for sending funds. * `X-address`: The deposit address with the destination tag included in it. No need to specify the destination tag additionally. The following content of the page is divided into tabs: On this tab, you can access and change wallet settings. The content on this tab differs for Enterprise and Merchant wallets. **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Minimum transfer amount** *For Enterprise wallets only.* The minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount are automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. In this case, you can see a new transfer with the *Canceled* status on the **Wallet management** > **Transfers** page; the [callback](../../references/key-terms#callback) isn’t sent. You will also receive a notification on the **Events** page, where you can confirm and accept such transfers manually. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Customer support emails** The comma-separated list of your customer support email addresses. These emails are displayed on the Payment page, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. *** **Site URL** *For Merchant wallets only.* The link to your landing page or any other resources. *** **Regular withdrawals** *For Merchant wallets denominated in fiat currencies only.* In this section, you can create a one-time or regular bank withdrawal. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. *** **Duplication** *For Enterprise wallets in the ETH, BNB-BSC, MATIC, and AVAX blockchains only.* This option allows you to copy your wallet blockchain address and contract to another blockchain. This way you can prevent sending funds to a wrong blockchain by mistake on behalf of a sender. You can duplicate each wallet only once. *For Enterprise wallets denominated in TRX only.* On this tab, you can stake and unstake TRX, and overview your resources. *For Enterprise wallets denominated in TRX only.* On this tab, you can get votes for staked funds as well as distribute them among SRs[^1] to further gain rewards. On this tab, you can view a wallet history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The wallet has been created. * **Changed**: The wallet has been changed. * **Deleted**: The wallet has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. On this tab, you can whitelist addresses, so that payouts sent to these addresses don't require approvals. See [How to whitelist a payout address](../../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for more details. On this tab, you can limit withdrawal amounts. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of user roles. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. For each threshold, you can specify how many approvals are required and which user roles and/or specific users act as *Approvers*. For example, you can set fewer approvals for smaller payouts and more approvals for payouts with greater amounts. See [How to set withdrawal thresholds](../../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) for more details. On this tab, you can grant other users access to your wallet and manage permissions. A checkmark in the **Approver** column indicates that the user was added as an *Approver* on the **Thresholds** tab. See [How to grant access to your wallet](../../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) and [How to restrict access to your wallet](../../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) for more details on managing wallet access. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet) * [How to generate a report on wallet balances](../../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) [^1]: Super Representatives. For more details: [#sr](../../references/key-terms#sr "mention") Explore the interface basics, create your first wallet, and set up essential protection Explore the interface basics, create your first wallet, and set up essential protection Dive deeper in the product Web UI, features, and business logic behind it Dive deeper in the product Web UI, features, and business logic behind it Follow the step-by-step tutorials illustrating solutions to the most common tasks Follow the step-by-step tutorials illustrating solutions to the most common tasks Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses Get acquainted with key terms and catalogs of values which are found here and there Get acquainted with key terms and catalogs of values which are found here and there Identify and address common issues quickly and effectively with our guides Identify and address common issues quickly and effectively with our guides ## July 31, 2026 [#july-31-2026] ### New features [#new-features] #### Admin UI [#admin-ui] ##### Fee level selection for AML withdrawals [#fee-level-selection-for-aml-withdrawals] When withdrawing funds from a blocked transfer (**Transfer → Blocked → AML Withdrawal**), you now choose the blockchain fee level — **Recommended**, **Low**, or **Custom** — and see the fee amount with its fiat equivalent before confirming. Previously, only the withdrawal address could be set, and refunds sent with a low fee were sometimes rejected by the network. *** ### Improvements [#improvements] #### Admin UI [#admin-ui-1] ##### Safer forms and smoother sign-in [#safer-forms-and-smoother-sign-in] The Admin UI adopts several usability behaviors from the client interface. After signing in, you return to the page you originally tried to open instead of the home page. Create and edit forms — including wallets, deposits, notifications, transfers, refunds, and user creation — now warn about unsaved changes before you leave the page, and the cursor is placed in the first field automatically. *** ### Resolved issues [#resolved-issues] #### Client UI [#client-ui] * Fixed the read-only **Secret** field in callback settings accepting pasted text; the control for viewing the secret now keeps a stable size instead of expanding with scrollbars. ## July 29, 2026 [#july-29-2026] ### Improvements [#improvements-1] #### Admin UI [#admin-ui-2] ##### Faster commissions page [#faster-commissions-page] The default commissions page now loads faster and no longer creates noticeable database load on every visit. #### Client UI [#client-ui-1] ##### Toncoin becomes Gram [#toncoin-becomes-gram] Following the rebranding of The Open Network's native coin, **Toncoin (TON)** is renamed **Gram (GRAM)**, and the network's tokens follow the same pattern — for example, **USDT-TON** becomes **USDT-GRAM**. Only the currency names and tickers change — balances, wallets, and transfers are not affected. *** ### Resolved issues [#resolved-issues-1] #### Admin UI [#admin-ui-3] * Fixed the **Company**, **Wallet**, **Currency**, and **Blockchain wallet** filters on the finance transfers page showing *Error* for administrators with the **Finance read only** role. #### Client UI [#client-ui-2] * Fixed **Approve** and **Cancel** actions in **Events** staying available for payout approval requests whose auto-cancellation time had already passed. * Fixed expired payout approval requests being reactivated when the auto-cancellation timeout was increased — the deadline is now set when the request is created. * Fixed *Request Rejection* callbacks being sent with the *Unknown* type. * Fixed the email search in **Wallets → Thresholds** returning unfiltered results and breaking words across lines in the suggestion list. ## July 24, 2026 [#july-24-2026] ### New features [#new-features-1] #### Client UI [#client-ui-3] ##### Commissions tab with your full fee schedule [#commissions-tab-with-your-full-fee-schedule] Account owners now have a **Commissions** tab showing the commission ladder at a glance — your current turnover, commission tier, and rate — along with the full list of tiers, minimum blockchain fees for each network, and bank fees for deposits and payouts. *** ### Improvements [#improvements-2] #### Admin UI [#admin-ui-4] ##### Faster transfer lists [#faster-transfer-lists] Opening a client's list of transfers now takes under a second instead of tens of seconds, and pending AML compliance checks no longer create noticeable background load. ##### Neutral messages for unexpected server errors [#neutral-messages-for-unexpected-server-errors] When an unexpected server error occurs, the system returns a neutral message with a short error ID instead of internal technical details. Share this ID with support to have the issue traced quickly. *** ### Resolved issues [#resolved-issues-2] #### Admin UI [#admin-ui-5] * Fixed spurious *Can not lock transfer in node* incidents raised when a small deposit was canceled on networks without transfer-locking support — Solana, EVM-based networks, Tron, and Algorand. * Fixed Solana multi-address collections being rejected as a whole batch with an *InvalidPayoutParameters* error when the number of addresses exceeded node limits — addresses are now split automatically to fit. * Fixed transportation transfers getting stuck indefinitely when an address received more funds than expected during collection — extra incoming funds no longer block confirming transfers already completed on the blockchain. ## July 17, 2026 [#july-17-2026] ### New features [#new-features-2] #### Admin UI [#admin-ui-6] ##### Changed User and Legal Entity columns in Action Requests [#changed-user-and-legal-entity-columns-in-action-requests] The **Action Requests** list now shows a **Changed User** column — the account a request applies changes to — and a **Legal Entity Name** column, each with its own filter. The legal entity name also appears as a separate line in the request details, and the list can now be exported. #### Client UI [#client-ui-4] ##### Reworked approval flow for withdrawals [#reworked-approval-flow-for-withdrawals] Withdrawal approval requests for Enterprise and Merchant transfers in the same currency no longer expire after 15 minutes — the request stays valid until it is approved or rejected. For conversion payouts, the request now shows a countdown timer to automatic cancellation, visible both in the client interface and in the Admin UI. ##### Automatic callback on Callback URL changes [#automatic-callback-on-callback-url-changes] When you set or change the **Callback URL** of a deposit or withdrawal, a callback with the operation's current status is now sent automatically — no need to contact support to have it re-sent. Support staff can also update a deposit's **Callback URL** on your behalf. ##### Smoother sign-up, 2FA setup, and wallet access [#smoother-sign-up-2fa-setup-and-wallet-access] This release bundles several usability refinements. **One-time password entry at sign-up.** During registration, you now set your password once, after confirming your email address, instead of entering it several times. **Clear 2FA names.** Two-factor authentication entries in your authenticator app are now clearly named — *B2BinPay Auth 2FA* and *B2BinPay Ops 2FA* — and include your email address, so entries for different accounts are easy to tell apart. **Clearer error messages.** Messages now state exactly what to do — for example, *B2BinPay Ops 2FA must be enabled to process payouts* or *Accesses to wallets cannot be granted until user is activated*. **Wallet access for API users right after activation.** An API user can now be added to wallets as soon as it is activated, without having to sign in first. **Tidier lists.** The **Regular Withdrawal** column is hidden when bank withdrawals are not available, and identifiers now use a unified format — for example, *Wallet #888*. *** ### Improvements [#improvements-3] #### Admin UI [#admin-ui-7] ##### Faster lists and dashboard statistics [#faster-lists-and-dashboard-statistics] Heavily used list pages — blockchain wallets, addresses, deposits, and transfers — now load faster, and so do the deposits and payouts statistics on the dashboard. *** ### Resolved issues [#resolved-issues-3] #### Admin UI [#admin-ui-8] * Fixed a false *Collected amount mismatch* error: unrelated incoming funds on an address are now included in the expected collection amount, so transportation transfers no longer get stuck in *Need review*. * Fixed an AML check failure for withdrawals linked to transfers without an associated wallet, which prevented such withdrawals from being processed. * Fixed an issue where conversion payouts could expire automatically regardless of their status. ## July 10, 2026 [#july-10-2026] ### New features [#new-features-3] #### Admin UI [#admin-ui-9] ##### Invited by search matches legal entity names [#invited-by-search-matches-legal-entity-names] The **Invited by** search in the **Partner Program** now also matches legal entity names, so legal entities no longer drop out of the search results. ##### Role-aware data in lists and detail pages [#role-aware-data-in-lists-and-detail-pages] Lists and detail pages across the Admin UI now show data according to your role and permissions, so each administrator sees exactly what their access level allows. #### Client UI [#client-ui-5] ##### Sign-in opens the production environment [#sign-in-opens-the-production-environment] After you pass **KYB** verification, an interactive sign-in always opens the production environment instead of Sandbox. If you sign out from Sandbox and have several legal entities, the one you last opened is selected. ##### Inactive API users hidden from wallet access [#inactive-api-users-hidden-from-wallet-access] Wallet access rights now show only active **API users**. For a user whose API access is not yet activated, the **API access → Wallets** tab shows an empty list. ##### Refreshed interface visuals and 2FA setup [#refreshed-interface-visuals-and-2fa-setup] The interface gets a refreshed look aligned with the latest design system: dialog overlays are lighter in the dark theme, connecting **Google Authenticator** for two-factor authentication follows a new flow with the confirmation code entered directly in the dialog, and the **How it works** screens in **Staking** and **Wallets** feature refreshed, theme-aware illustrations. *** ### Improvements [#improvements-4] #### Client UI [#client-ui-6] ##### Smoother actions in the Events list [#smoother-actions-in-the-events-list] The **Actions** column in **Events** now keeps a stable width, so buttons no longer shift as you work. While an action is in progress, a spinner replaces the button, and repeated or conflicting actions are blocked; if an action fails, the row returns to its previous state. *** ### Resolved issues [#resolved-issues-4] #### Admin UI [#admin-ui-10] * Fixed transportation transfers being confirmed without verifying the collected amount against the deposits actually received on the node — a mismatch now raises an incident instead of silently overstating the **Locked in node** balance and causing false *insufficient funds* errors later. #### Client UI [#client-ui-7] * Fixed the **Apply** button in the date and time picker not appearing disabled when it was inactive. ## July 2, 2026 [#july-2-2026] ### New features [#new-features-4] #### Admin UI [#admin-ui-11] ##### Read-only admin pages for orders, payouts, and wallets [#read-only-admin-pages-for-orders-payouts-and-wallets] The Admin UI gains new read-only pages: **Orders** and **Payouts** under **Operations**, and **Blockchain Wallets**, **Global Wallets Balance History**, and **Global Wallets Staking** under **Wallets**. The **Payouts** and **Swap Wallets** sections are now available in read-only mode too — fuller visibility into operations and balances without changing any data. ##### USD volumes for transfers in Dealing [#usd-volumes-for-transfers-in-dealing] In **Trading → Orders**, transfers now carry the same USD-normalized base and quote volumes already shown for swaps, removing the manual rate calculations previously needed for some Merchant wallets. #### Client UI [#client-ui-8] ##### Initial deposit link for duplicated blockchain deposits [#initial-deposit-link-for-duplicated-blockchain-deposits] When a deposit sent on the wrong network is automatically re-created on the correct network, the resulting **Duplicated Blockchain deposit** event now links directly to the original deposit. Instead of tracing callback or tracking IDs by hand, open the event and follow the **Initial deposit** reference to the deposit details. Deposit details also gain **copy buttons** for the **Tracking ID** and **Callback URL** under **Advanced options**. *** ### Improvements [#improvements-5] #### Admin UI [#admin-ui-12] ##### Transfers list filters, columns, and links [#transfers-list-filters-columns-and-links] The Admin UI **Transfers** list gains a **Wallet Type** column, a filter by internal transfer type, and a filter by client or blockchain wallet ID. Global and blockchain wallets now have distinct labels, and each links through to its own page. ##### Audit log filtering by event type [#audit-log-filtering-by-event-type] Audit log tables now filter on the **Reason** column, so you can show only one event type — for example *Password changed* or *Payouts blocked* — across the brand, group, user, and legal-entity logs. ##### Localized operation log comments [#localized-operation-log-comments] Log **Comment** entries are now built from translatable parts (field name, reason, old and new values) instead of a fixed English string, so they display in the selected language across the Client Management and Wallets logs. ##### Multi-select currency filters [#multi-select-currency-filters] Currency filters now use the same multi-select control as the client interface, and long currency lists load in pages as you scroll instead of all at once — removing the brief freeze when opening the dropdown. Matches are ordered with exact matches first, then names starting with your query, then the rest. ##### Owner ID and Legal Entity columns in reports [#owner-id-and-legal-entity-columns-in-reports] The **Transfers** and **Wallets** reports now include **Owner ID** and, where applicable, **Legal Entity Name** columns in the exported files. *** ### Resolved issues [#resolved-issues-5] #### Admin UI [#admin-ui-13] * Fixed a duplicate **Label** column shown in the Admin UI Deposits list and its column configurator. * Fixed the wallet balance-at-date finance report failing to generate, which could leave an export hanging. ## June 26, 2026 [#june-26-2026] ### New features [#new-features-5] ##### Low balance notifications [#low-balance-notifications] You can now set a **balance threshold** for each wallet and be notified automatically when the wallet balance falls below it. Each wallet has its own threshold field, with the value denominated in the wallet currency. When the available balance drops below the configured value, a notification is sent so you can top up in time — helping you avoid situations where end-user withdrawals fail because of insufficient funds on the wallet. ##### Unconfirmed transaction callbacks [#unconfirmed-transaction-callbacks] The system now sends a callback as soon as an incoming transaction is detected on the blockchain, before it has gathered the number of confirmations required to become *Confirmed*. This lets you notify your end users that their payment has already been seen by the system and is simply awaiting confirmations, rather than lost or stuck on the network. The result is fewer support enquiries and a smoother payment experience. *** ### Improvements [#improvements-6] ##### Multi-select currency filters [#multi-select-currency-filters-1] The **Currency** filter has been upgraded from a single-select to a multi-select control, so you can now filter a list by several currencies at once instead of one at a time. The multi-select filter is available on the **Wallets**, **Deposits**, **Payouts**, and **Transfers** pages, as well as in the **Access list**, **Bank details**, **Custody**, and **Swaps** sections. ##### Wallet list card view refinements [#wallet-list-card-view-refinements] Following the card view introduced for transaction wallets in the previous release, the wallets list has been refined with a **sort selector** and an improved **Table / Cards** view toggle, so you can order and display your wallets exactly the way that works best for you. ##### Operation ID filter for Callbacks [#operation-id-filter-for-callbacks] The **Callbacks** list now includes an **Operation ID** filter. This makes it easier to track down a specific callback during investigations — including callbacks that have no associated transfer, such as the *Request rejection* and *No transfer* types. *** ### Resolved issues [#resolved-issues-6] * Fixed a false *insufficient fee* error (code 4009) that could appear when withdrawing certain tokens, such as USDT-TRX and USDT-BSC. * Fixed an issue where creating a custom token incorrectly required the **Balance shift amount** field to be filled in. * Fixed an issue where the daily *transfer growing total* report was not delivered to Report Subscriptions. ## May 23, 2026 [#may-23-2026] ### New features [#new-features-6] ##### Column-based table filters [#column-based-table-filters] Table filtering across the Web UI has been redesigned to match the standard data-handling experience you know from Excel and Google Sheets. Filters are now embedded directly into table columns instead of being grouped in the side panel. The side panel remains available only for filters that cannot be represented within a column (for example, complex multi-parameter filters). An always-active **Reset all filters** button has been added to clear all applied filters in one click, and the column configurator now uses an updated icon for clearer visual hierarchy. This change brings filtering closer to the tools you already use day-to-day, reduces the number of clicks needed to refine large lists, and provides a single consistent way to work with tables across the entire platform. ##### Repeat Payout for failed withdrawals [#repeat-payout-for-failed-withdrawals] A new **Repeat payout** button has been added for payouts that have failed and contain no successful transfers. Previously, a failed withdrawal could not be retried — you had to recreate it manually from scratch or contact support. The button appears on the payout details page when the payout has at least one failed transfer and no successful ones, and takes you to the payout creation form so you can submit a fresh attempt without re-entering all the details by hand. ##### Card layout for transaction wallets [#card-layout-for-transaction-wallets] The transaction wallets list now supports two display modes — the existing **Table view** and a new **Card view** that presents each wallet as a standalone card with all its key data: currency, label, ID, wallet type, balance, pending amount, and status. You can switch between views at any time using the toggle above the wallets list, choosing whichever layout works best for your current task. In addition, action buttons for **Deposit** and **Payout** are now available directly on each wallet entry — in both table and card views — allowing you to start the corresponding operation in one click without opening wallet details first. *** #### Improvements [#improvements-7] ##### IP whitelist enhancements [#ip-whitelist-enhancements] The IP whitelist functionality has been expanded to better support corporate clients and reduce accidental lockouts. **CIDR subnet support.** You can now whitelist entire IP ranges using CIDR notation (for example, `10.0.0.0/24`) instead of adding addresses one by one. Both IPv4 and IPv6 are supported, and you can freely combine single addresses, IPv4 subnets, and IPv6 subnets within a single whitelist. All existing whitelists continue to work without changes. When access is denied because of an IP restriction, the error message now includes the IP address you're connecting from, so you can quickly identify the issue and contact your administrator with the right information. **Self-lockout protection.** When you save a whitelist that does not include your current IP address, the system will now show a warning dialog with your current IP and ask you to confirm before applying the change. This helps prevent the most common cause of support requests — accidentally locking yourself out of the account. Your current IP address is also shown directly in the whitelist editor for reference. ##### Memo / Destination Tag emphasis on the Payment Page [#memo--destination-tag-emphasis-on-the-payment-page] For blockchains that require an additional parameter alongside the deposit address — **Ripple (XRP)**, **Stellar (XLM)**, and **The Open Network (TON)** — the Payment Page layout has been redesigned to make this requirement visually prominent for end users. This reduces the risk of payers submitting deposits without the required Memo / Destination Tag / Comment value, which previously led to unattributed deposits and additional load on Customer Support. ##### Additional columns in Events and Transfers tabs [#additional-columns-in-events-and-transfers-tabs] To make day-to-day account oversight faster and more accurate, two tabs have received new columns: * On the **Events** tab — **Amount** and **Tracking ID** columns. When reviewing payout requests submitted by users with the *Withdrawals with approval* role, you can now see the payout amount and Tracking ID directly in the events list and make approval or decline decisions without opening each request individually. * On the **Transfers** tab — a **Tracking ID** column, consistent with the same column already available on the Deposits and Payouts pages. This makes it easier to follow all transfers associated with a particular Tracking ID end-to-end. ##### Client UI unification [#client-ui-unification] A set of small but practical refinements has been applied across the Web UI to improve consistency and search ergonomics: * **Currency search** now matches both by alpha code and by full currency name, in every dropdown across the platform. * **Wallet search** now matches by ID, alpha code, currency name, and label. * The **Tag** input is now automatically disabled when an *x-address* is entered for Payouts, Custody Withdrawals, and Swap Withdrawals, preventing invalid combinations. * A **Commission is included** toggle has been added to Custody wallet withdrawals, matching the behavior already available for Enterprise wallets. * **Funds** and **Settings** controls in Swap wallets are now displayed as dedicated square buttons, in line with the rest of the wallet types. ## January 20, 2026 [#january-20-2026] ### New features [#new-features-7] #### Partner program [#partner-program] You can now launch a **Partner program** for your legal entity and earn from clients who join B2BINPAY through your referral link. For each invited client who signs up with your link, passes KYB, and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions. The new **Partner program** section in the left menu provides a dedicated dashboard to manage referrals and rewards. It shows your current percentage, total bonus, bonus for the previous month, and a detailed **Invited partners** list with registration dates, KYB status, and per‑client bonuses. Partner rewards are credited once per month based on B2BINPAY commissions from eligible transactions of referred clients. A new **Partner program** report is available in the **Reports** section. You can generate CSV or XLSX reports with bonuses per partner and for all referrals over a selected month or historical period, using the same data that powers the partner dashboard. #### Legal documents and contract management [#legal-documents-and-contract-management] A new **Legal documents** item has been added to the account menu. From this page, you can access and check the current version of your Terms & Conditions, as well as previous contract versions associated with your legal entity and jurisdiction. For new KYB requests, Terms & Conditions are now accepted as an offer agreement during the KYB initiation step instead of requiring a separate bilateral contract. #### Android app download [#android-app-download] The B2BINPAY Android app is now available directly from the Web UI. A new **Download Android app** section has been added to the account menu, redirecting you to the latest APK download location managed by the Android APK registry. *** ### Improvements [#improvements-8] #### Stronger password policy [#stronger-password-policy] Password rules have been tightened to improve account security. New passwords must contain at least twelve characters, including at least one uppercase letter, one lowercase letter, one digit, and one symbol, and must not contain spaces. You can no longer reuse your previous passwords when changing credentials. #### Withdrawal thresholds enhancements [#withdrawal-thresholds-enhancements] Withdrawal thresholds now give you more control over who approves payouts and how many approvals are required. For any Merchant or Enterprise wallet, you can set the number of required approvals and choose which roles or specific users act as *Approvers*. Approver status is shown in wallet access lists, and approvers can review and confirm payout requests on the **Events** page. This flexible setup can be used as a governance control layer for high‑value transactions when your policies require it. ## October 1, 2025 [#october-1-2025] ### New features [#new-features-8] #### Multi-authentication and social login support [#multi-authentication-and-social-login-support] **Google ID** and **Apple ID** can now be used for system authentication alongside the existing email login option, providing users with more convenient and secure access methods. #### Multi-entity user management [#multi-entity-user-management] The platform now supports advanced user management capabilities where a single user can be associated with multiple legal entities, each with distinct roles and permissions. Additionally, users can create their own sandboxes, automatically becoming *Owners* with the ability to initiate KYB processes for their businesses. #### BTC Testnet faucet [#btc-testnet-faucet] You can now utilize the Testnet faucet functionality to deposit test funds to your Sandbox wallets. Currently, the **BTC testnet faucet** is supported. #### Bank details management [#bank-details-management] A new **Bank details** section is now available in the **Profile menu**, allowing to store and manage multiple bank accounts (IBAN, SWIFT, IFSC, A/C No.) for fiat withdrawals. Each newly added bank record automatically triggers a Compliance review, and its status is clearly tracked as *Pending*, *Approved*, or *Declined*, ensuring only verified bank details are used for [bank withdrawals](references/key-terms#bank-withdrawal). #### New callback type [#new-callback-type] A new **Request rejection** callback type has been implemented that automatically handles failed payout approvals. This callback triggers when payouts requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — fail to receive confirmation within the specified timeframe or was manually cancelled by a user with proper rights. Your external system will now receive automatic notifications for these scenarios, eliminating the need for manual payout cancellation due to failed requests. #### Blockchain deposit recovery [#blockchain-deposit-recovery] For Ethereum-like blockchains, a common pool of addresses has been established. Now, when a deposit address is created on any ETH-like blockchain, the system instantly tracks activity associated with that address across all ETH-like blockchains. This feature eliminates the risk of missed transactions. #### New currency support [#new-currency-support] The platform now supports four additional cryptocurrencies: * RLUSD-ETH * USD1-BSC * SAFE-ETH * TRX-SOL *** ### Improvements [#improvements-9] #### Advanced swap operation controls [#advanced-swap-operation-controls] Two new swap operation settings have been introduced to provide greater control over trading execution. The **No slippage** setting implements an RFQ (Request for Quote) model with price updates every 5 seconds, executing swap requests only when price thresholds remain stable. The **Clients' slippage** setting allows users to specify acceptable price deviation percentages, executing trades at the latest price unless the configured slippage threshold is exceeded. Mode selection is available when creating a new swap operation. #### Staff access to Swap wallets [#staff-access-to-swap-wallets] Administrative staff can now be granted access to Swap wallets with full fund control capabilities without requiring specific user role assignments, streamlining operational management and providing greater flexibility in wallet administration. #### Streamlined legal entity selection [#streamlined-legal-entity-selection] The **Jurisdiction** dropdown has been replaced with a more intuitive **Legal entity** dropdown, significantly improving user experience when managing multiple legal entities within the same jurisdiction and providing clearer organizational structure. #### Enhanced pricing accuracy [#enhanced-pricing-accuracy] Deposit calculations now utilize VWAP (Volume Weighted Average Price) instead of Top-of-the-Book prices, providing more accurate and representative pricing that reflects actual market conditions and trading volumes. #### Centralized security management [#centralized-security-management] IP whitelist management has been restructured so that only *Owners* can configure and manage IP restrictions for all users within their organization, creating a more centralized and secure approach to access control. #### Optimized SOL transaction processing [#optimized-sol-transaction-processing] The SOL smart contract has been enhanced to support multiple transaction collections, allowing a single collection transaction to gather funds from up to 10 deposit addresses simultaneously. This optimization significantly reduces operational costs and improves transaction efficiency. #### Comprehensive localization enhancement [#comprehensive-localization-enhancement] The platform's internationalization capabilities have been substantially improved through integration with the [B2TRANSLATE](https://docs.b2translate.b2broker.com/) platform, providing support for additional languages while enhancing translation quality and consistency across the entire user interface. #### Currency naming clarification [#currency-naming-clarification] To prevent confusion with Binance's discontinued BUSD token, BUSD-T-BSC has been renamed to USDT-BSC throughout the interface, ensuring clear identification and reducing potential user errors in currency selection. ## August 1, 2025 [#august-1-2025] ### New features [#new-features-9] #### KYB verification system [#kyb-verification-system] We're excited to introduce **Know Your Business (KYB) verification**, a comprehensive business verification system that enables secure access to Coinsbuy production environment. This major enhancement transforms how businesses onboard and maintain compliance on our platform, providing a seamless path from testing to live operations. **Key features** * **Jurisdictions** The platform automatically detects jurisdictional requirements based on your country of incorporation, ensuring compliance with local regulations. To maintain ongoing compliance, the system implements periodic re-verification schedules that are clearly displayed in your dashboard. * **Streamlined verification process** We've partnered with [Sumsub](https://sumsub.com/), a leading verification provider, to deliver a secure and efficient KYB process. The system guides you through each verification step with clear instructions and contextual help. If additional documents are required, you can easily upload them through our secure interface. The process is designed to be flexible — you can exit at any point and resume where you left off, with all progress automatically saved. * **Status tracking & notifications** Real-time status updates keep you informed throughout the verification journey, from initial submission through final approval. Visual indicators appear throughout the platform when your attention is needed. You'll also receive email notifications for important status changes and document requests, ensuring you never miss critical updates. **Access & security** The KYB section is restricted to users with the Owner role, providing an additional layer of security for sensitive business verification processes. All document handling occurs through encrypted channels, and our compliance-first approach ensures we meet international regulatory standards. Production environment access is exclusively gated behind successful KYB approval, while the Sandbox environment remains freely available during the verification process. This clear separation ensures you can continue testing and integrating while completing your business verification. **How it works** You can initiate the KYB process any time after account creation, when you gain instant access to our Sandbox environment for testing and integration. When you're ready for production access, simply navigate to the KYB section and add your legal entity by providing basic business information. The system then guides you through verification with our Sumsub integration, which may include identity verification, document submission, and business legitimacy checks. If our verification partner requests additional information or documents, you'll see clear indicators and instructions for what's needed. Once your verification is approved, you immediately gain access to the production environment with full platform capabilities. #### Dual 2FA system [#dual-2fa-system] A new dual 2FA system with separate codes for authentication and operations has been implemented to strengthen account security. The system now uses two distinct 2FA codes: the **Authentication 2FA** that's mandatory for all users and required at every login, and the **Authorization 2FA for operations** that can be enabled in Profile Settings for sensitive actions like IP whitelist setup, API credentials generation, callback secret generation, and payout confirmation. This layered security approach provides enhanced protection by separating routine access from system operations, ensuring that even if one authentication method is compromised, your most sensitive account functions remain secure. #### API v3 [#api-v3] The new API v3 is designed to comply with the latest platform updates. Explore our new [API guide](api-guide/api-overview) and update your integrations accordingly, before the deprecated API v2 will be shut down on **December 1, 2025**. *** ### Improvements [#improvements-10] #### Payout enhancements [#payout-enhancements] Enterprise wallet withdrawals now feature a **Commission is included** toggle that's automatically enabled when selecting 100% of available funds, clearly indicating that the platform fees will be deducted from the payout amount. The payout confirmation window has been enhanced to display the **To be sent** amount, providing users with precise information about what the recipient will actually receive. #### Address whitelisting for Ripple-like blockchains [#address-whitelisting-for-ripple-like-blockchains] Ripple-like blockchains use an additional address tag to identify the recipient of a transaction. When whitelisting addresses on such blockchains, you can now specify the Address tag value along with the regular address. ## January 21, 2025 [#january-21-2025] ### New features [#new-features-10] #### Custody services [#custody-services] With this release, we're excited to introduce our new Custody services, designed to provide secure and efficient storage and management of funds. **Key features**: * **Secure storage**: Custody wallets ensure secure storage and are available only to users with the *Owner* role, requiring video verification for every withdrawal. * **Top ups**: Custody wallets can be topped up from your Merchant and Enterprise wallets. The transaction currency must match the currency of the Custody wallet. * **Withdrawals**: Withdrawals from Custody wallets can be made to Merchant and Enterprise wallets (without currency conversion), as well as to external addresses. * **Fees**: Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged monthly and with every withdrawal from the Custody wallet. Contact your manager to sign an additional agreement and enable the new **Custody** section in the main menu. #### Callbacks [#callbacks] All [callbacks](references/key-terms#callback) sent by the system can now be easily accessed and resent via the Web UI. Find the new **Callback** section under the **Wallet management** menu item. #### Internal transfers [#internal-transfers] A new payout type **Internal transfer** has been added, allowing you to transfer funds between Merchant wallets if they share the same currency and *Owner*. These transfers don't incur any fees since they're executed off-chain. You can find the new **Internal transfer** option on the **Wallet management** > **Payouts** page under the **Add new** menu. #### Custom AML check [#custom-aml-check] From now on, you can configure your own AML check, in addition to built-in verification provided by B2BINPAY. It can be useful if you need to carry out its own set of compliance procedures. The new **AML check** section has been added to the **Settings** page in your profile menu. #### Duplicated blockchain deposit event [#duplicated-blockchain-deposit-event] This newly added event type is triggered when a deposit is made in one currency but subsequently paid in another, resulting in its duplication on another blockchain. The duplicated deposit doesn't inherit the Tracking ID and Callback URL of the original deposit. With this event, you can manage these parameters to ensure proper tracking of duplicated deposits, eliminating the risk of their loss. #### New blockchain integrations [#new-blockchain-integrations] With this release, **The Open Network (TON)** blockchain has been integrated. Also, several new coins and stablecoins have been added: * ISO 1029 **TON** (The Open Network) * ISO 2032 **USDT-TON** (The Open Network) * ISO 2033 **NOT-TON** (The Open Network) * ISO 2034 **DOGS-TON** (The Open Network) * ISO 2035 **HMSTR-TON** (The Open Network) * ISO 2036 **FDUSD-ETH** (Ethereum) * ISO 2037 **FDUSD-BSC** (BNB Smart Chain) * ISO 2038 **CATI-TON** (The Open Network) * ISO 2039 **POL-ETH** (Ethereum) * ISO 2315 **BTCB-BSC** (BNB Smart Chain) *** ### Improvements [#improvements-11] * When creating a Bank withdrawal, you can now specify the **Amount to be withdrawn**, and the total amount including the commission will be calculated automatically. * The **Side collecting funds** transfers now always display the ID of the original deposit. * For security purposes, API credentials are now displayed only once when regenerated and will no longer be emailed to the *Owner*. * When logging in, users who haven't yet enabled IP whitelists will now see a popup reminding them to do so. Remember: IP whitelisting is effective in protecting your accounts and funds. Make sure you and your team members have it enabled. * An information icon has been added to the **Resources** tab in the wallet details, informing users of the 32 active unstaking transaction limit. When attempting to exceed this limit, a notification will appear. * The links to API docs and Release notes have been added to the Web interface. Access them at any time from your profile menu. *** ## Past releases [#past-releases] ### September, 2024 [#september-2024] #### New features [#new-features-11] ##### Enhanced security [#enhanced-security] With this release, several major updates have been made to improve security, among which are the following: * **Withdrawal thresholds** This new feature enables you to specify withdrawal thresholds that, when exceeded, will require *Owner*’s approval to make a payout. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to Approval request, but the approver must enter a 2FA code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Options can be used individually or in combination. Each option can be configured for individual users or user roles. Therefore, when limits are exceeded, approval requests will be triggered for payouts made by any user, not just those with the *Withdrawals with approval* role. All this gives you maximum flexibility in controlling your funds. Thresholds settings can be accessed on the new **Thresholds** tab in the wallet details. **Mind that** you need to have 2FA enabled to set thresholds. * **Address whitelists** This new option enables you to create and manage address whitelists. Payouts sent to whitelisted addresses will bypass restrictions related to thresholds or user roles. However, such payouts are still subject to our standard AML & KYC procedures. There are two options provided: * **Wallet-level whitelists**, considering payouts made from a specific wallet. * **Blockchain-level whitelists**, considering payouts made from any wallet in a specific blockchain. Click your profile icon in the upper-right page corner to access a newly added **Address whitelists** section. The section is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the newly added **Address whitelist** tab in the wallet details. **Mind that** you need to have 2FA enabled to whitelist addresses. * **Access list** The UI has been improved to easier manage access to your wallets. The API access in the profile menu has been replaced with a new Access list section, containing two tabs: * **Staff**: Here you can add new users to the system, assign roles, and grant or restrict access to specific wallets. * **API**: Here you can manage IP whitelists, API keys, and bulk grant or restrict access to their wallets. Other security improvements include: * **Login notifications**: Clients now receive an email notification upon logging in. * **Payout approval**: When approving a withdrawal, the Owner now sees an additional confirmation popup to prevent accidental approvals by mistake. * **2FA reminder**: Upon login, users who haven’t yet enabled 2FA will now see a popup urging them to complete the 2FA procedure. Remember: 2FA is essential for protecting your accounts and funds. Additionally, many new system features now require 2FA. Always ensure that you and your team members have it enabled. ##### New blockchain integrations [#new-blockchain-integrations-1] With this release, two new blockchains have been integrated: * Algorand * Solana Also, several new coins and stablecoins have been added: * ISO 1022 **ALGO** (Algorand) * ISO 2016 **USDC-ALGO** (Algorand) * ISO 2017 **USDT-ALGO** (Algorand) * ISO 1028 **SOL** (Solana) * ISO 2030 **USDT-SOL** (Solana) * ISO 2031 **USDC-SOL** (Solana) ##### Zendesk integration [#zendesk-integration] A new Helpdesk solution, **Zendesk**, has been integrated, providing AI support and knowledge base. Integration with SupportPal remains active in read-only mode, for ticket history. #### Improvements [#improvements-12] * The main enhancement in the current release is an **updated Enterprise commission model**, now focused on outbound transactions.This change better aligns with our clients’ business models and significantly reduces commissions. B2BINPAY now charges commissions on outgoing transactions from Enterprise wallets, rather than incoming ones. * The activation of Enterprise wallets denominated in ETH, TRX, BNB, XRP, or XLM has become user-managed. When creating such a wallet, you can now specify an Enterprise or Merchant wallet from which the activation fee should be charged. * A new **Target commission** field, displaying the commission amount converted to the wallet currency, has been added to the **Transfers** page and transfer details, as well as to the **Transactions** tab of the deposit details. * When creating a new deposit, you can now add a link that will be displayed as a button on the **Payment page**. You can specify a URL and a custom name for the button. *** ### May, 2024 [#may-2024] #### New features [#new-features-12] ##### TRX staking [#trx-staking] With this release, B2BINPAY introduces a new **TRX Staking** feature. This allows you to stake your Tron tokens to gain bandwidth or energy to save on blockchain fees. Along with the resources, for each staked TRX, you receive one vote. The votes you can distribute among SRs (Super Representatives) and further gain rewards from them. A new **Staking** > **TRX staking** item has been added to the main menu. On this page, you can overview the staking terms and monitor your rewards. The **Wallet details** page of your TRX wallets has been updated with the following two tabs: * **Resources**: Here you can overview available resources and perform staking-related operations: stake, unstable, and withdraw funds. * **Staking**: Here you can overview your total and available votes and give them to SRs, as well as monitor rounds and key performance indicators of the SRs. #### Improvements [#improvements-13] * Several more icons for currencies and tokens have been added. Icon sizes in QR codes on payment pages have been adjusted. * On the Sign up page, country flags have been added for all phone codes. * Internal logic of the procedure of enabling 2FA with Google Authenticator has been improved, to avoid situations when the 2FA code expires before the password is entered. * It has become possible to customize displayed rows in the mobile version. * Three new blockchains have been integrated: * Base (BASE) * Arbitrum (ARB) * Optimism (OP) * Several new stablecoins have been added: * USDT-OP * USDC-OP * USDCE-OP * USDT-ARB * USDC-ARB * USDCE-ARB * USDC-BASE * Several new tokens have been added: * ARB-ETH * OPTIMISM-OP *** ### February, 2024 [#february-2024] #### New features [#new-features-13] ##### Swaps [#swaps] With this release, B2BINPAY implements a new **Swap** functionality for the clients. This is a replacement for exchanges, but swaps are faster, more flexible and accurate thanks to VWAP. You can now perform currency exchange operations between your Swap wallets. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your Enterprise or Merchant wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. Swap operations are always off-chain. You can exchange all available currencies, including fiat, coins, and tokens. #### Improvements [#improvements-14] * Two new blockchains have been integrated: * Avalanche (AVAX) * Polygon (MATIC) * Several new tokens have been added: * PYUSD-ETH * USDC-AVAX * USDT-AVAX * USDC-MATIC * USDT-MATIC * The TerraUSD (ISO 2150, 2166) token has been renamed to TerraClassicUSD. * New options for wallet duplication have been added: AVAX and MATIC. In total, B2BINPAY now supports wallet duplication in 4 blockchains: * BNB-BSC (Binance Coin) * ETH (Ethereum) * AVAX (Avalanche) * MATIC (Polygon) * Charging of B2BINPAY commission is now displayed as a separate **Commission** transfer type, for more clarity. ### November 13, 2023 [#november-13-2023] #### New features [#new-features-14] ##### Unified Merchant and Enterprise users [#unified-merchant-and-enterprise-users] The Merchant and Enterprise users are no longer separated in B2BINPAY, meaning that a user can now create wallets of both types under the same user profile. ##### A new UI [#a-new-ui] A new B2BINPAY user interface is introduced with this release. The UI has been redesigned to create a more engaging and user-friendly experience. The key changes include the following: * the main menu is now displayed on the left * a new Wallet Management item has been added to the main menu, enabling you to create and manage both Merchant and Enterprise wallets * updated table layouts and icons * amended light and dark themes #### Improvements [#improvements-15] * The blockchain name is now displayed on the Payment page, enabling you to ensure that you send your funds to the correct blockchain for processing and preventing you from funds loss. * The length of phone numbers entered on the Sign up page is now validated, preventing extra or missing digits in phone numbers specified during registration. * The HelpDesk tickets for which there are unread messages in the chart are now marked with a red dot. * The HelpDesk work schedule has become available in the HelpDesk section. * The exchange rates marked as favorites on the Rates page are now available on all user devices. #### Resolved issues [#resolved-issues-7] * For payments in Binance Coin, it’s now possible to select the BNB Chain (BNB-DEX) blockchain that wasn’t previously displayed as an option on the Payment page. * Email addresses specified in Wallet Details are now validated to include only allowed characters. The entered email can be saved only after it’s validated. *** ### September 7, 2023 [#september-7-2023] #### New features [#new-features-15] ##### New currencies [#new-currencies] * Two new stablecoins have been added to the list of currencies in which Merchant wallets can be denominated: **TUSD** (ERC20, BEP20, TRC20) and **EUROC** (ERC20). * Two new stablecoins are now supported for Merchant transactions: **LUSD** (ERC20) and **FRAX** (ERC20, BEP20). * 79 new currencies (113 new tokens in different blockchains) have become available for Enterprise wallets. See the full list of available currencies [here](references/currency-codes). ##### Onboarding [#onboarding] More tours to guide you on using the app are now accessible by clicking your profile information. ##### Favourites [#favourites] On the **Rates** page, it is now possible to filter the results by your favourite pairs and sort them by coin, fiat, or token. #### Improvements [#improvements-16] * When creating a payout, the commission amount is now additionally displayed in the default currency (USD). You can enter a custom commission amount in the default or payout currency. * The 7-day expiration limit for merchant invoices has been removed. When creating or editing an invoice, you can now set any value in the **Expired at** field without any restrictions. * A new button has been added for deleting wallets with zero balances and no transactions. * For large reports, a new notification is now displayed, informing the client that the report will be sent to their email once generated. * The parent wallet is now visible when creating a new payout for tokens. * The QR code generator now supports double-image icons for tokens. * Enterprise clients can now sort the **Wallets** list by ID and currency. * For **Currency** dropdowns, grouping by currency type and filtering by group have been added. * For **Wallet** dropdowns, grouping by active state has been added. * The IP-whitelist management has been changed — now each IP address is added or removed separately. Popups are now displayed for entering passwords required to confirm adding or removing an IP address. * The counter has been added on the **Helpdesk** icon, showing the number of unread messages in tickets. A message is counted as “new“ if a user receives it while the app is open. After the page is reloaded, the counter resets. In the **Helpdesk** section, the tickets with unread messages are marked with a red marker. * Sorting by first letter in dropdowns has been fixed. *** ### May 30, 2023 [#may-30-2023] #### New features [#new-features-16] ##### Reports on wallet balances [#reports-on-wallet-balances] A new **Reports** feature has been implemented to provide you with the possibility to generate reports on your wallet balances for the custom time range. The feature is available for both Enterprise and Merchant users. ##### A notification counter for events [#a-notification-counter-for-events] A notification counter has been added near the **Events** tab displaying the number of new events in the main menu near the **Events** tab. #### Improvements [#improvements-17] * It has become possible to transfer funds within the same blockchain wallet. This option is available for both Enterprise and Merchant users in BTC, BCH, BSC, ADA, DASH, DOGE, ETH, LTC, OMNI, TRX, and ZCASH wallets. * It has become possible to add IP addresses in both IPv4 and IPv6 formats to the API whitelist in the **API access** section. * The number of tickets displayed in the HelpDesk ticket list has been increased up to 30. * The **Target currency** column has been added to the Transfer list for Merchant users. * The **Balance** and the **Pending** tabs have been added to the **Wallet info** tab both for Enterprise and Merchant users. * A limit has been added on the number of tickets created in the HelpDesk. Now you can create only 3 tickets within 5 minutes; when trying to create more than 3 tickets within the specified time, a message about reaching the ticket number limit is displayed.. * The **Registration number** and the **Company address** fields have been added to the sign up form. *** ### March 21, 2023 [#march-21-2023] #### Improvements [#improvements-18] * The design of the payment page has been renewed to offer a more user-friendly experience. * The calculation of balances has been improved. * The response speed of the API has been increased. ### December 28, 2022 [#december-28-2022] #### Improvements [#improvements-19] * The B2BINPAY operation speed has been increased for all operations. * The B2BINPAY interface as well as the mobile version of B2BINPAY have been redesigned and improved for a better user experience. * The Merchant model has been updated to support two types of Merchant users: * Merchant Crypto Settlement: users that can have only crypto wallets and pay reduced commissions for crypto processing. * Merchant Fiat Settlement: users that can have both crypto and fiat wallets and are able to send funds to their bank accounts. * Around 100 new tokens have been added to B2BINPAY. For a list of supported tokens, refer to [Currency codes](references/currency-codes). * The API response speed has been increased. *** ### November 16, 2022 [#november-16-2022] #### Improvements [#improvements-20] * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * It has become possible for Merchant users to set time limits to specify the expiration time for invoices as well as payment limits to hedge possible payment amount variations due to rate changes. * New **Cardano** blockchain has been added to the system. *** ### July 22, 2022 [#july-22-2022] #### New features [#new-features-17] ##### Customized field arrangement for Enterprise and Merchant users [#customized-field-arrangement-for-enterprise-and-merchant-users] A new tool has been implemented to help you arrange fields displayed on a page. With this tool, you can select the fields that you want to display and arrange them in a desired order on the Wallets, Transfers, Deposits, Invoices and Payouts pages. ##### HelpDesk implementation [#helpdesk-implementation] A HelpDesk option has been implemented. Using HelpDesk, you can create a ticket with a description of an issue you encountered with your B2BINPAY account and send it to our Support Team. #### Improvements [#improvements-21] * The display of Bank details for Merchant users has been improved: when creating a bank withdrawal, you can now see all the information related to bank details, not only their title. * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * In addition to the monthly payment for a custom token processing, one more option has been implemented: it has become possible to pay a specified percentage from the credited custom token amount. #### Resolved issues [#resolved-issues-8] * Fixed an issue that caused multiple wallet report downloads upon opening several tabs. * Fixed an issue due to which the transfer type was not displayed on the Transfers page. * Fixed an issue due to which a dialog window did not appear when trying to save updated information in the Wallet details. * Fixed an issue due to which the language in the table on the payment page was not changing. * Fixed an issue due to which incorrect values were displayed in the Currency filter on the Transfer page. * Fixed an issue due to which extraneous pagination options were displayed on the Rates page. * Fixed an issue due to which it was impossible to save an address to the address book when creating a new payout. * Fixed an issue due to which a warning that should be displayed when the sum of a payout exceeds the wallet balance did not appear. * Fixed an issue due to which fiat currencies were unavailable to Merchant users in the Currency filter on the Transfer page. * Fixed an issue due to which tips were not displayed on some pages. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-18] ##### A new Field name field in Logs [#a-new-field-name-field-in-logs] A new field, **Field Name**, has been added to the **Log** for all pages, both for Merchant and Enterprise users. It displays the name of the field whose value has been changed. ##### Currency filter for Merchant users [#currency-filter-for-merchant-users] With a new **Currency** filter on the **Wallet** page, it has become possible for Merchant users to filter their wallets list by currency. ##### Refund button for Merchant users [#refund-button-for-merchant-users] A new **Refund** button has been added to the **Invoice details** page for Merchant users. This button can be used to return funds to the payer. ##### List of support emails for Merchant users [#list-of-support-emails-for-merchant-users] A new **Custom support emails** field has been added to the **Create wallet** and **Edit wallet** pages of the Merchant user accounts. This is a list of email addresses to which requests from payers will be sent. ##### New dialog window for the Create new bank withdrawal window [#new-dialog-window-for-the-create-new-bank-withdrawal-window] A new dialog window has been implemented. It appears upon clicking the **Create new bank withdrawal** button after deleting a regular withdrawal or editing its data. ##### New AML provider integration [#new-aml-provider-integration] A new AML provider, **Chainanalysis KYT**, has been integrated. #### Improvements [#improvements-22] * The AML system logic has been improved: * Repeated checks in case of delay on a provider’s side are now performed with a short delay. * In case of a failure on a provider’s side to perform the final check, no additional checks are attempted. An email notification is sent to Compliance. * A long delay (up to 1 hour) is not used anymore. * A commission for the bank withdrawal for Merchant users is now calculated as follows: a fixed percentage of the withdrawal + a fixed amount in the withdrawal currency (but not less than the minimum commission amount). For example: 2.00% + 30 USD (the minimum commission is 100 USD). The percentage, fixed amount and minimum commission values are configured via the B2BINPAY Back Office. Additionally, the commission amount is now displayed under the Amount field on the withdrawal creation form. * The **Payment page** for Merchant users has been improved for a better user experience. Among other improvements, tags have been added to all currencies, while token icons and the search field have been updated, and cryptocurrencies have been divided into the following categories: Coins, Stablecoins, Others. #### Resolved issues [#resolved-issues-9] * Fixed an issue that caused incorrect filtration in the Amount to field on the Exchange page. * Fixed an issue that caused an incorrect display of the commission currency on the Create exchange page. * Fixed an issue due to which the language in the calendar widget did not change. ### December 28, 2021 [#december-28-2021] #### New features [#new-features-19] ##### Replace by Fee option [#replace-by-fee-option] A new **Replace by Fee** option has become available for Enterprise users. You can speed up the execution of your payout that has stuck due to the low fee by clicking the **Replace** button and selecting a higher fee on the Transfer Details page. ##### Freeze funds on Tron blockchain [#freeze-funds-on-tron-blockchain] For Enterprise users, it has become possible to freeze a certain amount of TRX currency in order to restore Tron blockchain resources such as bandwidth points and energy. In 72 hours, you can unfreeze the frozen amount and it will be returned to your wallet in full. #### Improvements [#improvements-23] * A new **System** initiator that represents the doer of the action in the system has been added to the Log subsection of the Wallets, Deposits and Payout sections both for Enterprise and Merchant users. * The **All** checkbox has been changed to the **All sum** switch in the **Create payout** form both for Enterprise and Merchant users. Now it is possible to select the whole wallet amount, the fee will be automatically included in the payout amount. #### Resolved issues [#resolved-issues-10] * Fixed an issue due to which blocked transaction was displayed as a confirmed one on the payment page. * Fixed an issue due to which changes in the wallet details of the Merchant users were not displayed in logs. * Fixed an issue due to which the icons for some currencies were missed on the invoice payment page. * Fixed an issue due to which the payout amount in tokens was incorrectly calculated for Merchant users. * Fixed an issue due to which the link in the TXID field for XMR currencies of the Transfers page led to the incorrect page. * Fixed an issue due to which the Minimal transfer amount field was not filled automatically. * Fixed an issue due to which values in the Old value and Actual value fields on the Payout details page for Merchant uses were absent. * Fixed an issue due to which the rates were not updated when creating payouts for Merchant users. * Fixed an issue due to which the links in the TXID field of the Deposits and Transfers pages were absent. * Fixed an issue due to which after the payout creation the commissions section was not displayed. * Fixed an issue that caused the amount discrepancy on the Create Exchange page and in the modal window. * Fixed an issue that caused an error when restoring the password. * Fixed an issue that caused an infinite loader to appear in the Add wallet to API window in the Access list section. * Fixed an issue that caused an eternal loader to appear when adding white list API in the API Access section. * Fixed an issue due to which the ID link on the deposit payment page led to the incorrect page. * Fixed an issue that restricted the number of adding wallets to 10 in the Access List. * Fixed an issue that caused troubles with verification when registering in the system. * Fixed an issue due to which it was impossible to get access to the API Access menu for Merchant users. * Fixed an issue due to which the From address book button was not available on the payout creation form. *** ### November 16, 2021 [#november-16-2021] #### New features [#new-features-20] * New currencies are added. The currencies are available for Enterprise users only. * New Monero XMR currency is added. It is available both for Enterprise and Merchant users. #### Improvements [#improvements-24] * The limitation for number of requests without prior authentication to the endpoint is now limited to 70 requests per 1 minute. *** ### October 21, 2021 [#october-21-2021] #### New features [#new-features-21] ##### Risk status [#risk-status] A new **Risk status** tag is added to the Transfer details page. This field indicates the status of the AML verification of the transfer: * the tag is orange if the AML is successful * blue if AML is pending * red if AML failed * grey if AML is unavailable Tags are displayed now for token wallets on the Wallets, Deposits, Payouts and Exchanges pages. #### Improvements [#improvements-25] * Merchant users can now specify Tag and Tag type fields when creating a payout with XLM and XRP currencies. * When clicking on the Exchange button on the Wallets list page, you are redirected to the Creating Exchange page with the selected wallet already filled in the From field. * The payment page for tokens now has 2 links: one link for the payment address and the other link for the contract. #### Resolved issues [#resolved-issues-11] * Fixed an issue which caused redirecting to the Wallet Details instead of Log when clicking on the Log button at the Access List section. * Fixed an issue that enabled funds withdrawal from a fiat wallet to a crypto wallet for Merchant users. * Fixed an issue due to which the link to the explorer was absent on the Deposit payment page. * Fixed an issue due to which on the Transfers page an Unknown type transfers were displayed when selecting the Side collecting funds in the Type filter. * Fixed an issue due to which the payment currencies and “No currencies available” message were displayed simultaneously on the Payment page. * Fixed an issue due to which the Payouts commission was not recalculated in the payout currency. * Fixed an issue due to which it was possible to create a token payout when there was not enough funds on the parent wallet. * Fixed an issue that caused multiple notifications for one operation on a wallet. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-22] * Integration with Tron blockchain is added, as well as new currencies such as Tron, USDT-TRX, USDC-TRX. * New Merchant User role is added. * New Bank Withdrawal feature is added to the Payout tab, which allows withdrawing fiat funds immediately or creating a conditional schedule. Bank Withdrawal is available for fiat wallets and for Merchant users only. * New ETH and BSC tokens are added. #### Improvements [#improvements-26] * New risk status field is added to the Transfer Object, so that clients can check transfer AML status. * DASH integration is updated. Latest version of DASH allows you to create multiple wallets per node. * Unverified users now can log in to a private area and pass verification later. #### Resolved issues [#resolved-issues-12] * Fixed an issue which caused wrong error code for API when obtaining token more than 15 times within 1 minute. * Fixed an issue which caused an error when navigating to the Payouts and Deposits tabs. * Fixed an issue which caused a false check of fee and payout amount when validating token payouts. * Fixed an issue due to which it was impossible to create a token payout with the sufficient amount of funds. * Fixed an issue which caused troubles with changing password or enabling 2FA. * Fixed an issue due to which it was impossible to create a deposit with a number of confirmation blocks from 13 to 20. * Fixed an issue which caused multiple callback notifications in the Event section when creating a payout with callback. *** ### August 04, 2021 [#august-04-2021] #### Improvements [#improvements-27] * Reworked the logic of the Exchange process. Now rates are recalculated if the transaction takes more than 15 minutes, and the final amount is updated according to the current quote. Also the notification about the rate change is sent. * Lowered minimal activation amount for BSC to 0.025 BNB. #### Resolved issues [#resolved-issues-13] * Fixed an issue due to which it was possible to set the amount less than the Minimal transfer amount when creating an exchange. * Fixed an issue due to which BEP20 was not displayed in the list of token types. * Fixed an issue due to which the Export button worked incorrectly. *** ### July 07, 2021 [#july-07-2021] #### New features [#new-features-23] ##### User verification by phone number [#user-verification-by-phone-number] Added a new verification step — verification of the user's phone number, which follows the email verification step and is mandatory. #### Improvements [#improvements-28] * Added filter by tokens. To filter by currency, a user can now select the tokens and custom tokens on the Wallets, Transfers, Deposits, and Payouts pages. * Reworked the logic of the Exchange page. Now wallets with 0 balance are displayed at the end of the list. * Updated Select all funds switch on the Exchange page. #### Resolved issues [#resolved-issues-14] * Fixed an issue due to which when exchanging, the transfer amount was not validated and could be indicated less than the available funds on the wallet. * Fixed an issue due to which the exchange became unavailable after rates update. * Fixed an issue due to which it was possible to create a custom token with alpha code of the existing currency. * Fixed an issue which caused 500 error when filtering deposits and payouts. *** ### June 22, 2021 [#june-22-2021] #### New features [#new-features-24] ##### Binance smart chain support\*\* [#binance-smart-chain-support] Now it is possible to create wallets in BSC. ##### Duplicating wallets [#duplicating-wallets] It is now possible to generate the same addresses in two different currencies. This may be useful when the payer is sending money on the wrong blockchain. For example, instead of paying 10 ETH to the A1 address, 10 BSC were sent to the A1 address. The option is available for wallets that support duplication in the Wallet Settings section. ##### Duplicating deposits [#duplicating-deposits] After duplicating a wallet when creating a deposit on one wallet, it becomes possible to clone it to a second wallet, if that second wallet is a clone of the first one. The option is available on the Create a Deposit page, when choosing duplicate in the address type and selecting the required deposit ID from the list. ##### New transfer type [#new-transfer-type] Side collecting funds on wallet is the amount of deposit that was previously canceled because of a small amount and then debited to your wallet along with another valid transfer. ##### New stablecoins support [#new-stablecoins-support] New stablecoins were added: PAX, DAI, TUSD, BUSD. #### Improvements [#improvements-29] * For BNB-BSC wallets, a notification has been added about the need to top-up the balance to activate the wallet. * Invoice updates. For all tokens, the link is now generated not by the token currency, but by the parent currency. #### Updating nodes [#updating-nodes] * DASH node was updated to version 16.1.1. #### Resolved issues [#resolved-issues-15] * Fixed an issue that caused incorrect login when saving credentials in the browser. * Fixed an issue due to which the Stellar icon did not change when switching theme from dark to light. *** ### April 19, 2021 [#april-19-2021] * **Integration with Ethereum and ERC-20 tokens has been made**. Now you can exchange and create wallets, deposits, withdrawals using new currency. The system collects tokens from deposit addresses in one place via smart contract. That significantly reduces the costs of token processing for the client. Integration with Ethereum also includes the possibility of replacing a payout by fee from the personal area in case it's stuck due to low blockchain fee. * **Working with ERC-20 tokens is available to all enterprises**. Through the client's office, you can add your token, pay processing fee from any of your wallets and start accepting tokens after confirmation of payment on the blockchain. The owner can specify any alpha code for custom token so that it is displayed on the payment pages. From your personal account at any time you can change the payment wallet or refuse to pay next month. * **The registration form is now unified for all types of clients** and contains fields where the user needs to enter information about himself in full. This will help our sales team and account managers to get in touch with the client faster and prepare everything to start working with the payment system. Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/api-overview) for updated descriptions. ## General information [#general-information] The B2BINPAY API is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. All methods are private. All requests except for [Obtain token](authentication#obtain-token) and [Refresh token](authentication#refresh-token) should contain HTTP header: `Authorization: Bearer `. According to [JSON API Specification](https://jsonapi.org/format/), all requests should contain HTTP header: `Content-Type: application/vnd.api+json`. ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/authentication) for updated descriptions. ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token` #### Request example [#request-example] ```sh curl --request POST \ --url [base]/token/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "login": "", "password": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'login': '', 'password': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'login' => '', 'password' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } }, "meta": { "time": "2020-12-29T05:27:11.925654Z", "sign": "bcd6519ce27fed2ce9efe49cd09b387f050c0122c96..." } } ``` #### Response codes [#response-codes] *** ## Refresh token [#refresh-token] Once you receive a new key pair using your refresh token, the previous refresh token can no longer be used. A refresh token that is found to be invalid while not being expired must be rendered suspicious. ### Request [#request-1] `POST` `[base]/token/refresh/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/token/refresh/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "refresh": "" } } }' ``` ```python import requests url = '[base]/token/refresh/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'refresh': '', }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/refresh/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'refresh' => 'Your refresh token', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] The response body is the same as for [Obtain token](authentication#obtain-token) request, but without `meta` fields. #### Response body example [#response-body-example] ```json { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } } ``` #### Response codes [#response-codes-1] *** ## Auth verification [#auth-verification] Refer to the example below for a sign verification instance. ```javascript // "crypto-js": "4.0.0" is installed as a dependency const SHA256 = require("crypto-js/sha256"); const hmacSHA256 = require('crypto-js/hmac-sha256'); // set API user login and password const login = 'Your API key'; const password = 'Your API secret'; // parse /api/token/ response payload const authResponse = JSON.parse("{\n" + " \"data\": {\n" + " \"type\": \"auth-token\",\n" + " \"id\": \"0\",\n" + " \"attributes\": {\n" + " \"refresh\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUz\",\n" + " \"access\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI\",\n" + " \"access_expired_at\": \"2020-08-24T13:50:12.192479+03:00\",\n" + " \"refresh_expired_at\": \"2020-08-24T19:33:33.192479+03:00\",\n" + " \"is_2fa_confirmed\": false\n" + " }\n" + " },\n" + " \"meta\": {\n" + " \"time\": \"2020-08-24T10:33:33.192479Z\",\n" + " \"sign\": \"e70adec551e26b560049e42aa0993ae42cac4e03fbbb300320d8be\"\n" + " }\n" + "}"); // prepare data for hash check const message = authResponse['meta']['time'] + authResponse['data']['attributes']['refresh']; const responseSign = authResponse['meta']['sign']; const secret = SHA256(login + password); const calculatedSign = hmacSHA256(message, secret).toString(); // print result if (responseSign === calculatedSign) { console.log('Verified'); } else { console.log('Invalid sign'); } ``` ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/deposit-methods) for updated descriptions. ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2147483647 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/payout-methods) for updated descriptions. ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-2] `POST` `[base]/payout/calculate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-2] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-2] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-3] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-3] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-3] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-3] #### Response body example [#response-body-example-1] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## Main menu [#main-menu] Use the main menu displayed on the left to navigate across platform pages and access the Helpdesk. Use the **Collapse**/**Expand** button to adjust the main menu display. Main menu ## Topbar options [#topbar-options] In the upper part of the page, you can see a topbar that provides access to the following functions: * the **Legal entity** dropdown — to switch between Sandbox and Production environments as well as different legal entities where you hold membership. Access permissions vary across legal entities based on your assigned user roles within each organization. Through this dropdown, users can also create new Sandbox environments to initiate KYB processes for their own businesses. * the **Dark/Light theme** switch — to adjust the B2BINPAY Web UI to your preferences. * the **Language** dropdown — to select a preferred language for the B2BINPAY Web UI. * the **Notifications** page — to view and manage system notifications. * the **User profile** icon — to access the **Profile menu** (see below). Topbar ## Profile menu [#profile-menu] ### Custom tokens [#custom-tokens] On this page, you can view a list of your [custom tokens](../references/key-terms#custom-token) and their settings. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. ### Testnet faucet [#testnet-faucet] On this page, you can deposit test funds to your Sandbox wallets for testing purposes. See [Set up integrations](quick-start-guide#step-5-set-up-integrations) for more details on using Sandbox. ### Logins and sessions [#logins-and-sessions] On this page, you can find a log of user sessions, which includes the user email and location, along with the device fingerprint data and exact date and time of each login. The *Owner* sees all sessions of all users. ### Access list [#access-list] Only users with the *Owner* role can access this section. On this page, you can manage user access to your wallets, API credentials, and IP whitelists. The page is divided into two tabs: On this tab, you can add new users to your legal entity, assign roles, and grant or restrict access to specific wallets. See the following guides for step-by-step instructions: * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) In the wallet details, you can find the **Access rights** tab featuring a list of users who have access to this particular wallet. On this tab, you can manage API access, as well as bulk grant or restrict API access to your wallets. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-api-credentials) *Available on Production environments only.* On this tab, you can manage IP whitelists for your legal entity to allow access it from trusted IPs only. This setting will apply to all users under this particular legal entity, including the *Owner*. See the following guides for step-by-step instructions: * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) On this tab, you can generate the Callback secret for callback verification. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) ### Address whitelist [#address-whitelist] On this page, you can create and manage address whitelists for blockchains and wallets. The page is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the **Address whitelist** tab in the wallet details. See [How to whitelist a payout address](../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for step-by-step instructions. ### Bank details [#bank-details] On this page, you can add and manage your bank details saved for [bank withdrawals](../references/key-terms#bank-withdrawal). The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. ### Reports [#reports] On this page, you can generate and download wallet reports. See [How to generate a report on wallet balances](../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) for step-by-step instructions. ### Settings [#settings] On this page, you can configure your profile and system access. See the following guides for step-by-step instructions: * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [How to enable additional AML check](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) ### Legal documents [#legal-documents] On this page, you can view and manage legal documents such as policies and contract agreements. When contract terms and conditions change, the *Owner* of the legal entity sees a notification on their next sign‑in. A modal window opens and requires them to read and accept the new terms. The *Owner* can also initiate unilateral contract termination by clicking **Terminate** next to the latest contract version. After initiation, your account remains available for withdrawals until the termination is processed by the B2BINPAY Compliance team. ## Configuring columns [#configuring-columns] Information on most pages and tabs is presented in tables and you can configure columns to display. If a display setting is available for a given page, you may see the **Configure columns** button above the table. Click it to display the column list: * Mark or unmark column checkboxes to display or hide them; the column checkboxes highlighted in grey can’t be disabled. * Drag and drop the columns to adjust their order in the table. Configuring columns ## Quick search [#quick-search] On some pages, you can perform a **quick search** by a certain parameter, such as wallet label or currency. To perform the quick search, start typing a desired value in the quick search field displayed above the table. Only the records containing the entered value are displayed on the page. ## Sorting [#sorting] Information in tables can be sorted by certain parameters. By default, page data is sorted by creation date in descending order. You can sort the page data by other fields. To find out whether you can sort table data by a particular field, hover over a corresponding column header. If sorting by this field is supported, you will see an arrow next to it indicating the available sorting options: * Arrow inactive — sorting by this field is disabled. * Up arrow (active) — descending sorting by this field is enabled (you can click the arrow to enable ascending sorting). * Down arrow (active) — ascending sorting by this field is enabled (you can click the arrow to enable descending sorting). You can sort table data only by a single field at a time. Sorting ## Filters [#filters] The **funnel icon** displayed on some pages indicates that you can specify custom **search filters**. You can click this icon to open a filter popup and enter desired values. The set of available filtering parameters varies for different pages. The displayed input corresponds to a parameter type: it can be text, number, date, selector, and so on. Typically, two values are required for filtering by a time interval: the start date and the end date. You can enter these values manually or select them using the calendar tool. To enable filtering, click the **Apply** button. To disable filtering, click **Reset**. On some pages, you can choose among predefined **quick filters** to filter data by a specific parameter, such as a wallet or currency type. To enable these filters, use the corresponding buttons displayed above data tables. Filtering ## Pagination [#pagination] Most of the pages support **pagination** and display data on multiple pages. You can instantly **Jump to** a specific page or use the left and right arrows to switch to the previous or next page. You can also specify the number of rows displayed on each page. Pagination ## Copying values [#copying-values] On some pages, the option to copy certain values to the clipboard is provided. Copying values ## Export data [#export-data] On some pages, the data export option is provided. You can download the page data in the CSV or XLSX format. The exported file matches the filtering and sorting settings applied to the page. Exporting data ## Step 1: Understand the wallet types [#step-1-understand-the-wallet-types] B2BINPAY offers two distinct wallet types: **Enterprise** and **Merchant**. Both can be created under a single account. Understanding these wallet types is essential, as their differences determine the functionality, workflow and the fees involved. Watch our video to explore our Enterprise (Wallet as a Service) and Merchant (Crypto Payment Processing) solutions and discover which solution best fits your needs. **References:** * [B2BINPAY Pricing](https://b2binpay.com/en/fees-crypto-payment-processing) *** ## Step 2: Sign up and pass KYB verification [#step-2-sign-up-and-pass-kyb-verification] To start using B2BINPAY, you need to create an account and complete the Know Your Business (KYB) verification process. ## Create your account [#create-your-account] 1. **Fill out the registration form** with your: * Full name * Email address * Phone number 2. **Create a secure password** that meets our security requirements. 3. **Set up 2FA** to receive *Authentication 2FA codes*: follow instruction on the screen. 4. **Verify your email address** by either: * Clicking the verification link sent to your email, or * Entering the verification code from the email. You now have access to our **Sandbox environment** — a secure testing environment where you can safely integrate B2BINPAY with your systems without any financial risk. Never send real money to Sandbox deposit addresses. This will result in **permanent and irreversible loss** of your funds. ## Submit your KYB request [#submit-your-kyb-request] 1. Navigate to **KYB** in the main menu. 2. Click **Add new legal entity**. 3. Fill out the required information: * **Legal entity name** — Your company's official registered name. * **Country of incorporation** — Where your business is legally registered. * **Business type** — Select the category that best describes your business. * **UBO residency** — Country where the Ultimate Beneficial Owner resides. 4. Review and accept the **Terms and conditions**. 5. Click **Create** to submit your request. Once submitted, you'll be directed to begin the KYB verification process. ## Complete the verification process [#complete-the-verification-process] Follow the on-screen instructions provided by our KYB verification provider. Once finished, the status of your request will change to *Pending*. You can safely exit and return to complete the verification later. Your progress will be automatically saved, the status of your request will change to *In progress*. ## Submit additional documents (if required) [#submit-additional-documents-if-required] Some applications may require additional supporting documents. **If documents are needed:** * A red notification badge will appear on the **KYB** menu item. * Your application status will change to *Action required*. Once your KYB request changes the status to *Approved*, you can begin using B2BINPAY production environment: switch to it using the dropdown in the topbar. **Next steps:** 1. Update your integration to use production base URLs. 2. Replace Sandbox API credentials with your production credentials. 3. Start processing real transactions. **Remember:** Never use Sandbox addresses for live transactions. *** ## Step 3: Start using your B2BINPAY [#step-3-start-using-your-b2binpay] Once your account is activated, you can begin working with B2BINPAY. Setting up your account involves the following steps: 1. **Configure essential security**: Ensure your account is secure. 2. **Create your first wallet**: Set up your initial wallet to start receiving payments. 3. **Enable API access**: Allow integration with other systems. 4. **Share wallet access**: Provide access to team members as needed. For a detailed walkthrough, watch our setup video. **References:** * [Enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [Whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) * [Create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) * [Access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [Grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [Manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) *** ## Step 4: Ensure security [#step-4-ensure-security] B2BINPAY readily supports KYC and AML procedures, enabling you to verify the identity of your clients and ensure compliance with anti-money laundering regulations. Other security features include 2FA, whitelists, thresholds, robust notifications, and logging systems. Keep in mind that the security of your accounts is your own responsibility. Watch our video to learn about B2BINPAY security features. ### Follow best practices to protect your finances [#follow-best-practices-to-protect-your-finances] Follow the guidelines below to better protect your account. #### Use strong passwords and 2FA [#use-strong-passwords-and-2fa] Make sure that you and all of your team members: * Use strong passwords that include uppercase and lowercase letters, numbers, and special symbols. * Use password managers for storing passwords. * Never share passwords with anyone. * Have IP whitelists enabled. **References:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) #### Enable notifications [#enable-notifications] Add your email as a notification address in the settings of all your wallets to make sure that you will be notified about any transactions. This way, you are able to detect suspicious transactions and intervene as quickly as possible. **References:** * [How to create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) #### Take special care when managing access permissions [#take-special-care-when-managing-access-permissions] Make sure that your users are granted only those permissions that are necessary for completing their tasks. Such permissions include access to wallets and availability of various kinds of transactions. In particular, you can assign the *Withdrawals with approval* role to all users, so that no funds withdrawal can be made unless it’s explicitly approved by you. **References:** * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) #### Enable withdrawal thresholds [#enable-withdrawal-thresholds] Specify thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require the approval of the *Owner*, regardless of the role of the user who created such payout. **References:** * [How to set withdrawal thresholds](../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) #### Generate new API credentials after integration is complete [#generate-new-api-credentials-after-integration-is-complete] When sharing your API keys with developers, generate new keys and reset IP access to API after the setup is complete. **References:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Take immediate actions if you account security has been compromised [#take-immediate-actions-if-you-account-security-has-been-compromised] Do the following if you come to suspect that someone has obtained access to your account. ### Change your password as soon as possible [#change-your-password-as-soon-as-possible] Please note that changing the system password may take time. Note that you must enter a 2FA code to confirm the password change. **References:** * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) ### Reset access permissions and IP whitelists [#reset-access-permissions-and-ip-whitelists] Revoke all accesses to your wallets or at least temporarily assign the *Read only* or *Withdrawals with approval* role to all users. In this case, any further transactions on these wallets can be made only after your approval. In addition, restrict access to the B2BINPAY API by removing non-trusted IPs from the whitelists. **References:** * [How to restrict access to your wallet](../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Immediately inform your account manager [#immediately-inform-your-account-manager] And follow the provided instructions. *** ## Step 5: Set up integrations [#step-5-set-up-integrations] B2BINPAY is designed to integrate seamlessly into various external systems to streamline and automate payment processes, such as creating deposit addresses, fetching exchange rates, processing withdrawals, and so on. To ensure a secure and comprehensive testing experience, B2BINPAY provides a Sandbox environment. This allows you to experiment with the platform features safely, understand the system logic, test interactions, set up integrations without any risk, and tailor them to your specific scenarios. You get access to Sandbox immediately after signing up to the system. B2BINPAY provides you with the Testnet faucet: using it, you can receive test funds to your Sandbox wallet to test system functions — payouts, deposits, transfers, and other features. Currently, the **BTC** testnet faucet is supported. To receive test funds: Create a BTC wallet in the Sandbox environment. Access the wallet details and copy the wallet address. Click your **profile icon** in the upper right page corner and select **Testnet faucet**. In the **Address** field, paste your wallet address. In the **Amount** field, enter the amount to deposit. Amount limits are specified under the field. Click **Send deposit**. Simulate transaction confirmations by clicking the **Generate blocks** button several times. Now, as your wallet is topped up, you can proceed with testing the financial operations in B2BINPAY and configuring integrations with external systems. Never use Sandbox deposit addresses on Production environments. This will result in **irreversible loss** of funds. **See also:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) *** ## Step 6: Use Helpdesk to get assistance [#step-6-use-helpdesk-to-get-assistance] Click **Helpdesk** in the main menu to access our Support Team platform where you can get quick help from the online chat bot or report any issues related to the B2BINPAY operation. We provide multi-lingual support, you can find the working hours of corresponding teams in the right part of the **Helpdesk** page. Check our [Troubleshooting articles](../troubleshooting/no-active-account) where you can find solutions for most common issues. *** ## Step 7: Learn about other B2BINPAY features [#step-7-learn-about-other-b2binpay-features] Watch our video to learn about other B2BINPAY features that you can use. ## Important announcement [#important-announcement] We announce the release of the new API version **v3** on June 1, 2025. This version introduces the following significant changes: * New [base URLs](#base-urls) * New [Authentication](authentication) procedure * New [Callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) and modifications in the callback verification method for [deposits](deposit-methods#callback-verification) and [payouts](payout-methods#callback-verification) **Action required:** We strongly encourage you to review the changes and update your integrations **before December 1, 2025**, as the old API version will be shut down after this date. Please ensure all updates are completed before the deadline to avoid any service disruptions. **Deprecated API notice:** The previous version of the API guide has been moved to a [separate section](../api-guide-v2-deprecated/api-overview) and is now marked as deprecated. Before you start working with the B2BINPAY API, you need to enable API access to the system. Refer to [How to access the API](../how-tos/manage-your-profile-and-system/how-to-access-api) for step-by-step instructions. ## General information [#general-information] The B2BINPAY API v3 is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. Except for [Authentication](authentication), all requests must contain the following HTTP headers: * `Authorization: Bearer {YOUR_ACCESS_TOKEN}`: Used to authenticate your request. * `Content-Type: application/vnd.api+json`: Required according to [JSON API Specification](https://jsonapi.org/format/). ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token/` #### Request example [#request-example] ```sh curl --location '{base_url}/token/' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "client_id": "", "client_secret": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'client_id': '', 'client_secret': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'client_id' => '', 'client_secret' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "access": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjMy...", "expires_in": 3599, "token_type": "Bearer" } } } ``` #### Response codes [#response-codes] ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message`. The `message` composition depends on whether the callback includes a transfer: * **With a transfer** — concatenate `transfer.status`, `transfer.amount`, `deposit.tracking_id`, and `meta.time`. * **Without a transfer** (deposit status change only) — concatenate `deposit.status`, `deposit.tracking_id` (if non-empty), and `meta.time`. Refer to the examples below for callback verification examples. ```php ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2592000 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Validate payout [#validate-payout] Validates a payout request without creating it. The endpoint runs the same validation pipeline as [Create payout](payout-methods#create-payout), checking the address, currency, fee, balance, commissions, `tracking_id` uniqueness, wallet activity, and target wallet or deposit resolution. On success, the response contains the resulting `total_amount` that would be debited from the source wallet. The endpoint has no side effects and doesn't require the `Idempotency-Key` header. ### Request [#request-2] `POST` `[base]/payout/validate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url [base]/payout/validate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/validate/" payload = json.dumps({ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": False, "is_commission_included": False, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $body = '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/validate/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains the total amount that would be debited from the source wallet if the payout was created. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-validation", "id": "0", "attributes": { "total_amount": "0.05000550" } } } ``` #### Response codes [#response-codes-2] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-3] `POST` `[base]/payout/calculate/` #### Request example [#request-example-3] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-3] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example-1] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-3] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message` (the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields). Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the payout itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this payout. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-4] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-4] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-4] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-4] #### Response body example [#response-body-example-2] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## 2FA [#2fa] The Two-Factor Authentication is an additional method of authentication that adds one more layer of security to your account. It assumes that, when signing in, in addition to your credentials, you also enter a unique one-time and time-limited confirmation code. B2BINPAY supports 2FA with the **Google Authenticator** app (it's free). B2BINPAY requires two different 2FA codes: * **Authentication 2FA**: This one is mandatory for all users upon registration. It must be entered each time you log in. * **Authorization 2FA for operations**: This one is enabled in the **Profile menu** > **Settings** section. It's required for the following sensitive system actions: * IP whitelist setup * API credentials generation * Callback secret generation * Payout confirmation *** ## Activation fee [#activation-fee] This is a deposit that you have to make to your wallets denominated in specific currencies in order to activate them. After the wallet that require confirmation is created, you'll receive a message on the **Notifications** page indicating the required deposit amount. Once deposited, the fee amount is frozen on the wallet and the wallet is assigned the *Active* status. You can use your Merchant wallets to deposit the required amount of funds. Refer also to [Blockchain fee](#blockchain-fee) and [Commission](#commission) to learn about other commission types. *** ## AML [#aml] Anti-Money Laundering is certain regulations and laws that prevent illegal movement and laundering of funds. ### Default AML check [#default-aml-check] B2BINPAY provides a built-in obligatory AML check for all incoming transfers. The check is performed on the side of a connected AML provider. During AML verification, the incoming transfer amount is displayed in the wallet as *Pending* and can't be used for financial operations. If the check is successful, the incoming transfer amount is enrolled to the wallet balance. If a transaction is considered suspicious, it's assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. ### Additional AML check [#additional-aml-check] You can add your personal account of the AML provider as an additional level of verification. Find the step-by-step instruction [here](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check). If enabled, after successfully passing the default AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). *** ## Bank withdrawal [#bank-withdrawal] This is a withdrawal of fiat funds from your [Merchant wallet](#merchant-wallet) denominated in the same fiat currency to your bank account. B2BINPAY provides three types of bank withdrawals: * **One-time withdrawal**: A single withdrawal of a fixed amount. * **Regular withdrawal with a fixed amount**: A withdrawal that is triggered every time when the wallet balance reaches the specified amount plus the commission amount. * **Regular withdrawal with a changing amount**: A withdrawal where you additionally specify the minimum amount that should be left on your wallet after the withdrawal. This withdrawal is triggered every time when the wallet balance reaches the amount calculated as *Withdrawal amount* + *Leftover amount* + *B2BINPAY commission amount*. To enable bank withdrawals, submit your banking details in advance on the **Bank details** page available under your **Profile menu**. The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. *** ## Blockchain fee [#blockchain-fee] This is a blockchain commission for [on-chain transactions](#on-chain-transaction). These fees are essential for the network's operation, as they compensate miners or validators who secure and maintain the blockchain. Each network dictates its own fee structure, which can vary based on network traffic. During peak times, fees may rise due to increased demand for transaction processing. When sending funds, you can select from possible blockchain fee levels: low, medium, high, or custom. A higher fee typically results in faster processing. These values are pre-calculated by B2BINPAY at the moment of payout creation based on the current blockchain fee records. Refer also to [Commission](#commission) and [Activation fee](#activation-fee) to learn about other commission types that can be charged. *** ## Callback [#callback] This is an asynchronous notification about changing statuses of deposits and payouts, sent by B2BINPAY to your server. You can use callbacks to make changes in your system and notify your payers, or just track the transactions. To handle incoming `POST`-requests from a callback URL in your application: * Define a route, such as `/payment/callback`. * Create an endpoint to process incoming data, such as validating transactions and updating your database accordingly. To receive callbacks, specify the **Callback URL** when creating a new [deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) or [payout](../how-tos/manage-your-assets/how-to-create-a-payout) via the Web interface, or when sending the [Create deposit](../api-guide/deposit-methods#create-deposit) or [Create payout](../api-guide/payout-methods#create-payout) requests via the API. *** ### Callback types [#callback-types] The following callbacks can be sent for transactions: **Confirmation** The transfer has received a required number of [block confirmations](#confirmation-block). This number is determined in the currency settings in the B2BINPAY Back Office. For example, the required number of confirmations for a currency is set to `3`. It means that this callback will be sent after receiving three confirmations. You can use the [Get currency](../api-guide/currency-methods#get-currency) method to receive the required number of confirmations configured for a currency. **Fail** The transfer failed. **No transfer** The deposit has expired or the payout wasn't approved, no transfer was created. **Request rejection** The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. **Block** The deposit was blocked by an AML provider, the transfer was canceled. **Cancel** The payout was blocked by an AML provider, the transfer was canceled. **User confirmation** The transfer has received a number of block confirmations specified by a client. See [Additional callback](#additional-callback) below. **Manual** The callback is resent manually. See [Resending callbacks](#resending-callbacks) below. ### Additional callback [#additional-callback] By default, a callback is sent after a transaction achieves a specified number of block confirmations on the blockchain. This number is determined in the currency settings in the B2BINPAY Back Office. To trigger an additional callback, you can set a different number of confirmations when creating a deposit or payout via the Web UI or API. For example: * Default confirmation requirement: 3 blocks * Specified for a particular deposit or payout: 1 block In this case, the callback will be sent twice: after 1 confirmation and again after 3 confirmations. ### Callback processing [#callback-processing] The callback is sent to your server if the deposit/payout includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. The callback body depends on the callback type. For additional callback structure examples, see [Deposit callback](../api-guide/deposit-methods#callback-body-example) and [Payout callback](../api-guide/payout-methods#callback-body-example). You can check that the callback was sent by B2BINPAY. Refer to [Deposit callback verification](../api-guide/deposit-methods#callback-verification) and [Payout callback verification](../api-guide/payout-methods#callback-verification) for details. After processing the payload, your server should respond with the HTTP `200` response code without a body. ### Resending callbacks [#resending-callbacks] If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Events** page in the Web UI. *** ## Coin [#coin] This is a cryptocurrency that operates independently in its own blockchain. Coins act as native currencies within their specific financial systems and can only be transferred between participants in their respective networks. **Key points**: * Operate on their own independent blockchain. * Can be mined or earned through validation activities like staking or proof-of-work. * Serve as native currencies within their blockchain ecosystem. * Used primarily for transactions, payments, and storing value. **Example**: * **TRX**: The Tron coin operating on the Tron blockchain that can be transferred between participants within the Tron network. *** ## Commission [#commission] This is a commission charged by B2BINPAY for its services. Detailed descriptions of each commission type are provided below. Refer also to [Activation fee](#activation-fee) and [Blockchain fee](#blockchain-fee) to learn about other commission types that can be charged. ### Commissions for transaction processing [#commissions-for-transaction-processing] These are fees charged for handling transfers: deposits and payouts. Their amount depends on: * **Wallet type**: Generally, B2BINPAY charges commissions for incoming transactions for [Merchant wallets](#merchant-wallet), and for outgoing transactions for [Enterprise wallets](#enterprise-wallet). This approach is determined by the internal logic of the wallets and the B2BINPAY services involved in providing these wallets. * **Transaction currency**: Different cryptocurrencies have different commission rates applied. * **Overall transaction volume**: Generally, higher transaction volumes are rewarded with lower commission rates. Once you reach a designated threshold, the applicable commission rate is fixed for the rest of the month. **Note** that previously charged commissions aren't recalculated. Visit [our website](https://b2binpay.com/en/fees-crypto-payment-processing) to view applicable commission rates. ### Commissions for custom token processing [#commissions-for-custom-token-processing] These are fees for maintaining of [custom tokens](#custom-token). They're charged on a monthly basis from the parent wallet. ### Commissions for Custody services [#commissions-for-custody-services] These are fees for storing funds on [Custody wallets](#custody-wallet). The accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and with each withdrawal from the Custody wallet. *** ## Confirmation block [#confirmation-block] This is a process of transaction confirmation on the blockchain. A transaction is being verified on the blockchain and the blocks are added to the transaction thus confirming it. Until the required amount of blocks is received, the corresponding transfer in B2BINPAY is assigned the *Unconfirmed* status. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). *** ## Custody wallet [#custody-wallet] This is an account designed for secure storage, available only to users with the *Owner* role and requiring video verification for withdrawal of funds. Custody wallets can be topped up from your [Merchant](#merchant-wallet) and [Enterprise](#enterprise-wallet) wallets. Enterprise wallets must match the currency of the Custody wallet. Withdrawals form Custody wallets can be made to Merchant and Enterprise wallets denominated in the same currency, as well as to external addresses. B2BINPAY charges commissions for storing funds on Custody wallets, their amount is calculated based on the tier percentage of stored funds. You can find information about applied tiers on the **Custody** > **Wallets** page. The accumulated commission is calculated daily for each Custody wallet. The commission is charged monthly and with every withdrawal from the Custody wallet. *** ## Custom token [#custom-token] This is a token created by a B2BINPAY user on the Ethereum, Binance Smart Chain, or Tron blockchains. B2BINPAY charges a fixed commission for custom token processing, which is applied on a monthly basis. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. *** ## Deposit [#deposit] This is an invoice that you create in B2BINPAY to receive payments from other people. Deposits can be made to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the deposits to Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The deposits to Merchant wallets can be made in any currency, including the option when payers select the payment currency themselves. Payments from other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For the deposits to Merchant wallets, you can also specify various time and amount limits. You can enable [callback](#callback) sending for any deposit to be notified about new deposit-related transactions. Deposits shouldn't be confused with [direct deposits](#direct-deposit). *** ## Destination tag [#destination-tag] This is a special identifier used for transactions in XRP. It's used to indicate the recipient of the payment. The absence of the destination tag or incorrect destination tag results in payment rejection or irreversible loss of funds. The destination tag for Stellar-based currencies (*memo*) can be applied both to deposits and withdrawals. You can indicate the following memo types: * `MEMO_TEXT`: A string encoded using either ASCII or UTF-8; maximum length is 28 bytes. * `MEMO_ID`: A 64-bit unsigned integer. *** ## Direct deposit [#direct-deposit] This is a crediting of funds to your own wallet. Direct deposits should not be confused with [deposits](#deposit). *** ## Enterprise wallet [#enterprise-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds in cryptocurrencies. Enterprise wallets support transactions in the same currencies in which they're denominated. All transactions involving Enterprise wallets are [on-chain](#on-chain-transaction). *** ## KYC [#kyc] The Know Your Customer or Know Your Client are standards for financial institutions obliging them to verify a client's identity before carrying out financial transactions. The aim of KYC is to better understand the clientele, monitor financial transactions, reduce client risks, and prevent bribery and corruption. B2BINPAY provides a built-in obligatory KYC check of all new clients. After signing up for B2BINPAY, you'll be asked to provide certain information and documents verifying your identity to complete the KYC procedure. *** ## Merchant wallet [#merchant-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds either in fiat or in cryptocurrencies. Merchant wallets support transactions in various currencies that may differ from the currency in which the wallet is denominated. Transactions between B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). *** ## Minimum transfer amount [#minimum-transfer-amount] This is a threshold set for incoming transfers to a wallet, that is, the minimum deposit amount that can be made to your wallet. Payments below this minimum are automatically rejected to ensure economic viability, particularly when [blockchain fee](#blockchain-fee) might exceed the transaction amount. You can find information about minimum allowed deposits [here](https://b2binpay.com/en/available-currencies). For Enterprise wallets, the **Minimum transfer amount** can be customized; for Merchant wallets, it's defined in the system settings. *** ## Off-chain transaction [#off-chain-transaction] This is a transaction between [Merchant wallets](#merchant-wallet) within B2BINPAY. Such transactions aren't recorded on the blockchain, don't require [blockchain confirmations](#confirmation-block), and therefore, don't incur [blockchain fees](#blockchain-fee). This method offers a cost-effective and rapid solution to transfer funds within the ecosystem. However, for payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## On-chain transaction [#on-chain-transaction] This is a transaction processed on the blockchain. Such transactions are recorded on the blockchain, require [blockchain confirmations](#confirmation-block), and therefore, incur [blockchain fees](#blockchain-fee). All transactions involving [Enterprise wallets](#enterprise-wallet) are always on-chain. For payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## Parent wallet [#parent-wallet] This is an [Enterprise wallet](#enterprise-wallet) to which a wallet denominated in [tokens](#token) is linked. The parent wallet must be created in the same blockchain as the token. Each parent wallet can serve as the parent for a single token wallet, it's not possible to link two token wallets to the same parent wallet. The B2BINPAY commission for token processing is charged from the parent wallet. Therefore it's important to maintain the minimum required amount of funds on the wallet to process transactions. The required amounts are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) *** ## Payout [#payout] This is a payment, withdrawal, or transfer made from your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the payouts from Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The payouts from Merchant wallets can be made in any currency, payments to other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For Merchant wallets denominated in fiat currencies, B2BINPAY also supports [bank withdrawals](#bank-withdrawal). *** ## Stablecoin [#stablecoin] This is a cryptocurrency, the market value of which is pegged to a reference asset, such as fiat currency, precious metal, and so on. Stablecoins combine the efficiency and security of blockchain technology with the stability of traditional finance, making them attractive for trading, savings, or payments. **Key points**: * Bridge digital assets with the traditional financial ecosystem. * While aren't guaranteed to maintain complete stability, they tend to be less volatile than popular cryptocurrencies. * Based on the "underlying" asset, can be categorized into various types, such as fiat-collateralized, crypto-collateralized, commodity-collateralized, algorithmic. **Example**: * **USDT**: The Tether stablecoin backed by the U.S. dollar at 1:1 ratio. *** ## Staking [#staking] Staking is a process of locking up crypto assets for a certain period of time to support the operation of the blockchain. In exchange for staking your crypto, you earn more crypto and/or save on commissions. At the moment, B2BINPAY supports **TRX staking**. You can stake TRX in exchange for resources: **bandwidth** or **energy**. The resources allow you to save on the blockchain fee. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are replenished throughout the day. Along with the resources, you also receive 1 vote for each TRX staked. You can distribute the votes among [SRs](#sr) and gain additional profit in return: the process is split into rounds, during which SRs generate profit that they can further distribute as rewards among their voters. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. Once in 24 hours the accumulated reward can be claimed and withdrawn to your TRX wallet, with a 10% commission is deducted from the reward. You can re-distribute your votes at any time, this will take effect from the next round. The resources and votes are available immediately after staking. You can unstake your funds anytime, but remember that the unstaking process takes 14 days on the blockchain. So you'll be able to withdraw TRX to your wallet after 14 days, until then they remain locked. You can cancel the unstaking request anytime during this period. When unstaking, all distributed votes are automatically canceled, the resources are no longer available. *** ## SR [#sr] In [TRX staking](#staking), this is a Super Representative to whom you may give your votes. They serve as blockchain "partners", supporting its operation and generating profit, which they can further distribute as rewards among their voters. When deciding on which SR to vote for, you can rely on the following key performance indicators displayed by B2BINPAY for each SR: * **Current votes**: The total number of votes cast for the SR. * **Reward distribution**: The proportion of rewards distributed to voters to all rewards gained by the SR. * **Productivity**: The percentage of successfully validated blocks. * **Expected APR**: The expected annual percentage rate. The APR may change at any time and the estimated profit may differ from the actual profit received. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. The process is divided into rounds. You can gain profit for each round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-distribute your votes to SRs at any time, this will take effect from the next round. The list of 27 SRs available for voting is provided by the Tron blockchain and is valid for a certain period of time. After that, a redistribution of positions in the list may occur. Keep in mind that if an SR is no longer ranked in the top 27, they can no longer generate and distribute rewards. The votes given to such SRs aren't automatically canceled, if you want to recall your votes, you have to do it manually. *** ## Swap [#swap] This is a currency exchange operation between your [Swap wallets](#swap-wallet). Swap operations are always [off-chain](#off-chain-transaction). You can exchange all available currencies, including fiat, coins, and tokens. *** ## Swap wallet [#swap-wallet] This is a B2BINPAY account enabling you to [swap](#swap) currencies. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. *** ## Token [#token] This is a digital asset that operates on an existing blockchain. Unlike [coins](#coin), which have their own blockchains, tokens are issued on established third-party blockchains, such as Ethereum, Tron, or BNB Smart Chain. Companies often issue tokens during Initial Coin Offerings (ICOs) or other token sale events. Tokens can represent assets, utilities, or even voting rights within a specific project. **Key points**: * Issued on top of existing blockchains. * Non-mineable and created through smart contracts. * Represent assets, utilities, or rights within a particular project. * Offer a wider range of functionalities compared to coins. **Example**: * **USDT-TRX**: The Tether (USDT) token issued on the Tron blockchain that can be used within the Tron network. *** ## Tracking ID [#tracking-id] This is a unique identifier that you can assign to your deposits and payouts. Its primary purpose is to help identify specific transactions in B2BINPAY and external systems. This identifier can be composed of any combination of numbers and letters, chosen by you for ease of reference. For each payout, the **Tracking ID** must be unique within the wallet, whereas you can reuse the same identifier across multiple deposits. The **Tracking ID** can be specified when creating deposits and payouts via both the Web UI and API, and can be utilized in callbacks sent by the system. It helps both businesses and customers track transactions and quickly locate and address issues in case of any discrepancies. *** ## Transfer [#transfer] This is any crediting or debiting of funds registered on the wallet. For more information on operation types, refer to [Transfer types](transfer-types). *** ## TXID [#txid] This is a transaction identifier, or transaction hash, which is a unique identifier assigned to each blockchain transaction. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. The example of a TXID: `f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e1`. B2BINPAY logs TXIDs for all transactions registered in the system. You can find them on the **Transfers** page and in **Transactions** tabs of deposit and payout details. Each TXID links to a blockchain explorer — a public tool for tracking transactions. In this documentation, you can also find a list of [block explorers](block-explorer-list). *** ## User role [#user-role] This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. For more information, refer to [User roles](user-roles). *** ## Wallet [#wallet] This is an account of a B2BINPAY user. B2BINPAY supports four wallet types for various purposes: * [Enterprise wallet](#enterprise-wallet) * [Merchant wallet](#merchant-wallet) * [Swap wallet](#swap-wallet) * [Custody wallet](#custody-wallet) In the **Operation type** column, you can find codes corresponding to the `op_type` field value of the [Transfer object](../api-guide/transfer-methods#transfer-object). The **In/Out** column indicates whether the transfer is incoming or outgoing. The **Fiat/Crypto** column indicates which types of currency are supported for the transfer: crypto, fiat, or both. ## UUID tools [#uuid-tools] Here you can find a list of UUID tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/uuid](https://www.npmjs.com/package/uuid) * **PHP**: [https://packagist.org/packages/ramsey/uuid](https://packagist.org/packages/ramsey/uuid) * **Java**: [https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html](https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html) * **Ruby**: [https://www.rubydoc.info/gems/uuid/2.3.8/UUID](https://www.rubydoc.info/gems/uuid/2.3.8/UUID) * **Python**: [https://docs.python.org/3/library/uuid.html](https://docs.python.org/3/library/uuid.html) * **C#**: [https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid](https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid) ## HMAC tools [#hmac-tools] Here you can find a list of HMAC tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/crypto-js](https://www.npmjs.com/package/crypto-js) * **PHP**: [https://www.php.net/manual/ru/function.hash-hmac.php](https://www.php.net/manual/ru/function.hash-hmac.php) * **Python**: [https://docs.python.org/3/library/hmac.html](https://docs.python.org/3/library/hmac.html) ## Reference information [#reference-information] * [JSON API Specification](https://jsonapi.org/format/) * [FIAT currency codes](https://en.wikipedia.org/wiki/ISO_4217) * [Bitcoin Wiki](https://en.bitcoinwiki.org/wiki/Main_Page) * [HMAC algorithm description](https://wikipedia.org/wiki/HMAC) User access to B2BINPAY is restricted according to user roles. The default roles include: * **Owner**: A a user with this role has the maximum permissions and can’t be assigned any other roles. This user has Web UI and API access. Only one user can be assigned this role. * **Admin**: A user has access to the API. * **Withdrawals with approval**: A user has access to the Web UI, can make deposits and payouts, but the payouts require confirmation from the *Owner*. * **Read only**: A user has access to the Web UI and can view information on wallets and transactions, but can’t perform any actions such as creating new deposits or payouts. The first user registered in B2BINPAY is automatically assigned the *Owner* and *Admin* roles. Users with these roles can invite other users to B2BINPAY and manage their access permissions. After registration, the *Owner* also receives the API keys to the email. ## Security [#security] ## Enterprise and Merchant wallets [#enterprise-and-merchant-wallets] ## Transfers [#transfers] ## Deposits [#deposits] ## Payouts [#payouts] ## Callbacks [#callbacks] ## Custody wallets [#custody-wallets] ## Staking [#staking] ## Swaps [#swaps] ## Helpdesk [#helpdesk] ## API [#api] [^1]: This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. ## Problem [#problem] * The incoming transfer is assigned the *Canceled* status. * I need to collect funds from the canceled transfer. * I encountered the *Transfer amount is less than required minimum* event. ## Possible reasons [#possible-reasons] This issue may occur if the amount of the incoming transfer is less than the [Minimum transfer amount](../references/key-terms#minimum-transfer-amount) set for your wallet. In this case, the transfer is automatically assigned the *Canceled* status. The funds stay on the deposit address and can't be used until further action is taken. ## Solution [#solution] When you detect a canceled transfer, it can be resolved through the **Side collecting funds** process. Here are the possible ways to do it. ### Initiate another transfer exceeding the minimum amount [#initiate-another-transfer-exceeding-the-minimum-amount] Request your payer to make another deposit to the same wallet address. Ensure this deposit amount is equal to or exceeds the wallet's **Minimum transfer amount**. Upon receiving the new transfer, the system will automatically recover the previously canceled deposit through the **Side collecting funds** process: * The status of the canceled transfer will update to *Failed*. * A new transfer of the **Side collecting funds on wallet** type will be created, which includes the ID of the original canceled deposit. * The funds of both deposits will then be credited to your wallet. ## Understand Smart Contract logic [#understand-smart-contract-logic] The underlying smart contract includes programmed instructions that only permit the collection of transfers meeting or exceeding the specified minimum amount. If the new transfer doesn't meet this requirement, it will also remain stuck in the *Canceled* status, even if the total of incoming transfers surpasses the minimum transfer amount. ## Important consideration [#important-consideration] Note that while the first deposit failed, it still will be credited to your wallet along with the next successful transfer. Therefore, as a merchant, you are responsible for manually refunding any differences to the payer. Instead of requesting a new transfer from your payer, you can wait until a larger transfer arrives to your wallet address. When this happens, the system will automatically process the previously canceled deposit just as described above. ### For Enterprise wallets only: Manually accept the canceled transfer [#for-enterprise-wallets-only-manually-accept-the-canceled-transfer] If a deposit to your Enterprise wallet is less than the **Minimum transfer amount** set for the wallet, you have an additional option to accept it manually. 1. Locate the deposit on the **Wallet management** > **Events** page. You can filter it by the *Transfer amount is less than required minimum* event type. 2. Click **Confirm anyway** to accept the deposit. Be cautious when accepting deposits below the required minimum amount. Confirming each deposit incurs [blockchain fees](../references/key-terms#blockchain-fee) charged from your wallet. If the deposit amount is less than these costs, accepting it may not be economically reasonable. Once confirmed, the system will automatically process the previously canceled deposit using the **Side collecting funds** process described above. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Events](../user-guide/wallet-management/events) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) ## Problem [#problem] I can't pass 2FA because I encounter the **Wrong 2FA code** error. ## Possible reasons [#possible-reasons] This issue may occur due to time discrepancies between your device and Google Authenticator, or browser-related problems. ## Solution [#solution] Here are several steps that can help you resolve most common 2FA issues. ### Verify the 2FA code [#verify-the-2fa-code] **Multiple accounts**: If you manage multiple accounts, ensure you're using the correct 6-digit code associated with this specific account. ### Synchronize device time settings [#synchronize-device-time-settings] By ensuring your device's time is accurately synchronized, you can reduce the likelihood of encountering the error during the 2FA process. **For Windows**: 1. Right-click the time display in the taskbar and select **Adjust date/time**. 2. Ensure that **Set time automatically** is enabled. 3. Click **Sync now** under **Synchronize your clock**. **For macOS**: 1. Go to **System settings** > **General** and select **Date & Time**. 2. Ensure that **Set date and time automatically** is checked. 3. If adjustments are needed, click the **lock icon** to make changes. **For Android**: 1. Go to **Settings**. 2. Scroll to **System** and select **Date & Time**. 3. Ensure that **Set time automatically** and **Set time zone automatically** are enabled. **For iPhone**: 1. Go to **Settings**. 2. Go to **General** and select **Date & Time**. 3. Enable the **Set automatically** toggle. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the 2FA process. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Delete browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Use Incognito/Private browsing mode [#use-incognitoprivate-browsing-mode] This mode disables extensions and uses default settings, which can help identify browser-related issues. **For Google Chrome**: * Press `Ctrl + Shift + N` to open an incognito window. **For Mozilla Firefox**: * Press `Ctrl + Shift + P` to open a private browsing window. ### Check the Internet connection [#check-the-internet-connection] A stable internet connection is important for 2FA processes. 1. Ensure you're connected to a reliable network. 2. Avoid using VPNs or proxies during the authentication process, as they can cause synchronization issues. ### Remove and re-add the account in Google Authenticator [#remove-and-re-add-the-account-in-google-authenticator] If none of the above worked, try deleting and re-adding your account in Google Authenticator. 1. **If you can access your profile settings in B2BINPAY**, disable the 2FA temporarily. 2. Open Google Authenticator and delete the existing 2FA entry for your account. 3. Re-enable 2FA on your account and scan the new QR code to add it back to Google Authenticator. 4. Test logging in with the new code. If the problem persists, contact the Support Team for further assistance. **See also:** * [Profile menu](../get-started/explore-the-web-interface#profile-menu) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) ## Problem [#problem] I can't login to the system because I encounter the **You IP is not whitelisted** error. ## Possible reasons [#possible-reasons] This issue may occur due to the IP address from which you're trying to access the system not being whitelisted. ## Solution [#solution] Here are several steps that can help you resolve most common IP-related issues. ### Check IP configuration [#check-ip-configuration] Verify if your current IP address is included in the list of whitelisted IPs. To identify your IP address, use resources like [http://ifconfig.net/](http://ifconfig.net/). ### Update the whitelist [#update-the-whitelist] If your IP is not on the list and **if you can access your profile settings**, add your IP address to the list. ### Use a VPN [#use-a-vpn] If accessing a whitelist isn't possible, consider using a VPN or proxy server that routes traffic through a whitelisted IP address. Make sure the VPN service is secure and trustworthy. ### Dynamic IP consideration [#dynamic-ip-consideration] If your Internet provider assigns dynamic IP addresses, your public IP might change frequently. Ensure your current IP address is granted access. Mind that the system doesn't support whitelisting of dynamic IP addresses. ### Firewall and security software [#firewall-and-security-software] Check any firewalls or security software that might be affecting network settings and ensure they aren't blocking your access. If the problem persists, contact the Support Team for further assistance. **See also:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) ## Problem [#problem] * The payer sent me funds, but I didn't receive the payment. * I can't find the incoming transaction in the external systems. ## Possible reasons [#possible-reasons] These issues may occur due to: * The transaction still being processed on the blockchain. * Wrong deposit address. * Missing callback details. ## Solution [#solution] Here are several ways that can help you verify the transaction. ### Check for transfers [#check-for-transfers] Go to the **Wallet management** > **Transfers** page and filter transfers by [TXID](../references/key-terms#txid). Double check the TXID was accurately obtained or provided. * If the transfer is found and assigned the *Confirmed* status, it means that it has been successfully processed and credited to your wallet. * If the transfer is found but assigned the *Unconfirmed* status, it means that the transaction hasn't yet received enough block confirmations on the blockchain, please wait. Once the required number of confirmation blocks received, the transfer status in B2BINPAY will change to *Confirmed*, and the deposit amount will be credited to your wallet. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](../references/block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If the transaction is confirmed on the blockchain, but in B2BINPAY the transfer remains unconfirmed for an extended period, there might be a technical issue. Contact the Support Team for further assistance: provide the TXID and transfer ID. ### Check the deposit address [#check-the-deposit-address] If no transfer is found, verify if the deposit address is associated with the system. Go to the **Wallet management** > **Deposits** page and filter deposits by the address. * If the deposit is located but no transfers were credited, contact the Support Team for further assistance. Provide the TXID, address, and deposit ID. * If no deposit is located, it indicates that the address is not within the system, and such deposits can't be credited. ### Check for callback issues [#check-for-callback-issues] Even if the transfer is found and confirmed in B2BINPAY, it still can be missing in the external systems due to [callback](../references/key-terms#callback) issues. 1. Go to the **Wallet management** > **Deposits** page, find the required deposit and click its **ID** to access the details. In the **Advanced options** on the **Settings** tab, verify that the **Tracking ID** and **Callback URL** are correctly specified. Adjust them if needed. Missing these details can cause callback issues, leading to unrecorded transactions in the external system. 2. Ensure the server handling callbacks is correctly configured and functioning. 3. Go to the **Wallet management** > **Callbacks** page, locate the corresponding callback, and click the **Resend** button. * **Unsupported blockchains**: Transactions can only be credited if the blockchain is supported by the system. Transactions on unsupported networks can't be recovered. * **Unsupported tokens**: Funds can be reversed, contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Deposits](../user-guide/wallet-management/deposits) * [Callbacks](../user-guide/wallet-management/callbacks) ## Problem [#problem] I can't log in to my account because I encounter the **No active account found with the given credentials** error. ## Possible reasons [#possible-reasons] This issue may occur due to entering incorrect credentials when trying to log in. ## Solution [#solution] Here are several steps that can help you resolve most common login issues. ### Check the credentials [#check-the-credentials] Make sure that you enter the correct credentials. ### Check the keyboard layout [#check-the-keyboard-layout] Ensure your keyboard layout matches your usual settings, especially if special characters are involved. ### Check CapsLock [#check-capslock] Check if the CapsLock key is active, as it may alter the input. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the login process. Clear your browser's cache and cookies and try again. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Clear browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Account lockout [#account-lockout] After multiple failed login attempts, your account may be locked. Wait for about a minute to be able to try again. ### Reset password [#reset-password] If none of the above worked, click the **Forgot password** link to reset it. If the problem persists, contact the Support Team for further assistance. ## Problem [#problem] * The outgoing transfer is stuck in the *Unconfirmed* status. * I encountered the *Insufficient funds on parent wallet* event. ## Possible reasons [#possible-reasons] These issues may occur due to: * The fee amount being to low (for payouts). * The [parent wallet](../references/key-terms#parent-wallet) lacks funds for accepting payment in tokens (for deposits). ## Solution [#solution] ### Stuck payouts [#stuck-payouts] The confirmation time for a transaction varies depending on the blockchain used, paid fees, and network load. For example, Bitcoin transactions typically take around 10 minutes to confirm, while Ethereum transactions are confirmed in about 12 seconds. You can find the required numbers of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If a transaction remains at zero confirmations for a long time, it may indicate the transaction fee was too low. In such cases, you can either wait for network fees to decrease, or resubmit the transaction with a higher fee to accelerate processing. For details, refer to [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee). ### Insufficient funds on parent wallet [#insufficient-funds-on-parent-wallet] When receiving payments to your token wallet, commissions are deducted from the linked parent wallet. If the parent wallet lacks sufficient funds to cover these commissions, the payment will not be processed until it's replenished. Here are several steps that can help you handle it. ### Identify the parent wallet [#identify-the-parent-wallet] 1. Locate the transfer on the **Wallet management** > **Events** page. You can filter events by the **Insufficient funds on parent wallet** type to identify all unconfirmed transfers. 2. Click the deposit ID in the **Operation ID** column to access the deposit details. 3. In the deposit details, find the information about your token wallet to which the deposit was made and click its **ID** to access the wallet details. 4. In the token wallet details, find the link to its parent wallet and click it to access the details. ### Check the minimum required balance [#check-the-minimum-required-balance] Compare the parent wallet current balance against the required minimum amounts for transaction processing. The necessary amounts for various blockchains are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) ### Top up the parent wallet [#top-up-the-parent-wallet] 1. In the wallet details of the parent wallet, find the **Wallet address** and copy it. 2. Make a direct deposit to the parent wallet. Make sure your deposit amount is enough to cover the minimum required amount. ### Retry the transfer [#retry-the-transfer] 1. Check the deposit status on the **Wallet management** > **Transfers** page. You can identify it by filtering transfers by the **Direct deposit to wallet address** type. The status should update to *Confirmed*. 2. Once the deposit is successfully credited to your parent wallet, go back to the **Wallet management** > **Events page**. 3. Click the **Retry** button for the corresponding event to process the transaction. If after successful replenishing of the parent wallet the **Retry** button is unavailable (grayed out), contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/deposits) * [Events](../user-guide/wallet-management/events) * [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) ## Problem [#problem] * My deposit is assigned the *Unresolved* status. * I need to collect funds from the unresolved deposit. * I encountered the *Overpaid deposit* or *Transfer to expired deposit* events. ## Possible reasons [#possible-reasons] This issue may occur with the deposits that have set limits (amount or expiration date) due to: * **Overpaid deposit**: The amount of an incoming transfer exceeds the specified deposit amount. * **Overdue deposit**: The incoming transfer is received after the specified expiration date. ## Solution [#solution] Here are several steps that can help you handle the unresolved deposit. ### Find out why the deposit is unresolved [#find-out-why-the-deposit-is-unresolved] Check if the deposit is unresolved because it's overpaid or overdue. 1. Locate the deposit in the list on the **Deposits** page. You can filter it by the *Unresolved* status. 2. Click the deposit **ID** to access deposit details. 3. In the **Limits** section on the **Settings** tab, check the specified **Requested amount** and **Expired at**. 4. On the **Transactions** tab, locate the related transfer. Check its amount and creation time against the set limits. ### Adjust the deposit limits [#adjust-the-deposit-limits] **For overpaid deposits**: Adjust the **Delta** to match the overpaid amount. For example, if the requested amount is 10 USDT and the payer sent 15 USDT, set the Delta to 5 USDT. **For overdue deposits**: Change the **Expired at** to match the time of the transaction. You can also extend the time limit to give payers another chance to send a payment within the new timeframe. An overdue deposit's status changes to *Canceled* and payers won't be able to see the address on the Payment page. ### Manually change the deposit status [#manually-change-the-deposit-status] Once all the requirements are met, change the deposit status from *Unresolved* to **Paid** if you want to collect funds and "close" the deposit, or to **Invoice** if you want to extend the deposit's lifetime. In the latter case, the Payment page remains active and can be used for sending funds. The above information is only applicable to deposits with set limits made to Merchant wallets. Deposits without limits or made to Enterprise wallets are always assigned the *Invoice* status, manual status changing is unavailable. The status can't be changed to *Paid* if the limit requirements are unmet. Attempting this may result in errors such as *Change of deposit status is prohibited*. **See also:** * [Deposits](../user-guide/wallet-management/deposits) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit#deposits-to-merchant-wallets) **Know Your Business (KYB)** is a verification process that confirms the authenticity and legitimacy of your business entity. This process verifies that your company is: * Legally registered and operating. * Compliant with regulatory requirements. * Protected against corporate fraud and illegal activities. **KYB verification is mandatory** to access B2BINPAY production environment and begin processing real transactions. B2BINPAY uses [Sumsub](https://sumsub.com/) as our trusted KYB verification provider to ensure secure and compliant business verification. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Until KYB verification is completed, you can only use the Sandbox environment. * Verification must be renewed periodically to maintain compliance. * You'll see a red notification badge on the KYB menu item when: * KYB verification hasn't been initiated yet. * Additional documents are requested by the verification provider. ## Legal entity list [#legal-entity-list] On this page, you can view a list of all your legal entities registered in the system and their statuses. The following information is provided about each entity: **Legal entity name** The official business name, as specified during KYB. *** **Country of incorporation** The country where your business is legally registered and incorporated, as specified during KYB. *** **Jurisdiction** Automatically determined based on your country of incorporation. This affects which regulatory requirements apply to your business. *** **Status** The current status of your KYB verification request. Possible values: * **In progress**: You've started but haven't completed the KYB verification process. * **Pending**: Your application is being reviewed by our verification provider. * **Approved**: Verification successful — you can access production features. * **Declined**: Verification was rejected — you may submit a new application with a different entity. * **Cancelled by client**: You cancelled the verification process. * **Action required**: Additional documents or information needed — **respond promptly to avoid delays**. *** **KYB start date** The date and time when the KYB process was initiated for this entity. *** **Next KYB date** *For approved entities only.* The date and time when your next periodic re-verification is due to maintain compliance. *** **Available actions** Depending on your entity's current status, the following options are available: * **Cancel**: *(Available for: In progress status)* * Stop the current verification process. * **Check**: *(Available for: In progress, Pending, Action required status)* * View verification progress. * Continue incomplete verification. * Submit additional required documents. The **partner program** is a referral program that lets you earn additional revenue when new clients sign up to B2BINPAY through your unique referral link. For each invited client who passes KYB and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions for a limited period defined in the partner program settings. Rewards are credited once per month and credited to the wallet you selected for receiving partner rewards. On this page, you can manage your referral link and monitor the rewards you earn from invited clients. ### Key points [#key-points] * The partner program issues a unique referral URL for each legal entity, to share with potential clients. * Rewards are calculated as a percentage of B2BINPAY commissions on eligible transactions of referred clients. * Rewards are credited once per month for the previous period. * Partner rewards are limited by the partner program settings, including the percentage and program lifetime. ## Access the Partner program page [#access-the-partner-program-page] To open the partner dashboard: * In the left menu, go to **Partner Program**. The page shows three main blocks: * **Unique referral URL** — your personal referral link and copy action. * **How it works** — a short explanation of the referral flow and terms. * **Overview** — your current percentage, invited and active partners, and accumulated rewards. Below these blocks, you see the **Invited partners** table with detailed information about each referral. ## Unique referral URL [#unique-referral-url] This is the unique referral identifier assigned to your legal entity. Share this link with partners who want to sign up for B2BINPAY. When a new client completes onboarding using your link and passes KYC and KYB checks, their commissions may start generating rewards for you, depending on the partner program configuration. To get your referral link, first select or create a Merchant wallet in USD, to which you will receive your partner rewards. ## Overview panel [#overview-panel] This block summarizes the key partner metrics for your legal entity: **Invited/Active partners** Displays how many clients you have invited in total and how many of them are currently active and generating rewards. *** **Current percentage** Displays the percentage of B2BINPAY commissions that you receive from eligible transactions of your active referred clients. *** **Total bonus** Displays the total amount of partner program rewards accumulated for all referred clients over the entire program lifetime. *** **Reward for previous month** Displays the amount of rewards calculated for the previous reporting month. ## Terms and conditions [#terms-and-conditions] You can find the settings of the partner program by clicking the **Terms and conditions** link in the **How it works** block. ## Invited partners list [#invited-partners-list] The following information is provided about each client who registered using your referral link: **ID** The internal identifier of the referred client. *** **Partner** The email address of the referred client and, when KYB is approved, the legal entity name. *** **Registered date** The date when the referred client’s legal entity was registered in the production environment. This date is also used to calculate the referral program validity period together with the configured time limit. *** **Status** The current status of the referred client. Possible values: * **In progress**: The client has started onboarding but has not yet passed KYB. * **Active**: The client has passed KYB and currently generates rewards according to the partner program rules. * **Inactive**: The referral no longer generates rewards as the program time limit expires, or the referred client's KYB fails. *** **Bonus for previous month** The amount of partner program reward calculated for this referred client for the previous month. *** **Total bonus** The total accumulated reward amount for this referred client over the lifetime of the partner program. *** **Expired at** The date when the referral stops generating partner rewards. After this date, new commissions paid by this client no longer increase your partner bonus. **See also:** * [How to launch a partner program](../how-tos/manage-your-profile-and-system/how-to-launch-a-partner-program) **Rates** are the current exchange rates for currency conversion used for different financial operations. On this page, you can find a list of all currency pairs available in B2BINPAY. By default, B2BINPAY obtains prices from [B2CONNECT Liquidity Hub](https://b2broker.com/products/b2connect/) (if you haven’t connected another liquidity provider when setting up the system). The rates are updated every 20 seconds. If the price cell is highlighted in green, the value has increased since the previous update; in red — decreased. No highlighting means that the value hasn’t changed. Above the table, you can see **quick filters**: * **Favorites**: To display currency pairs added to *Favorites*. To add a currency pair to *Favorites*, click the **star icon** near it. * **All** (default): To display all available currency pairs. * **Fiat**: To display currency pairs where one or both currencies are fiat. * **Tokens**: To display currency pairs where one or both currencies are tokens. * **Coins**: To display currency pairs where one or both currencies are coins. Next to quick filters, you can see the **Decimal places** option. Use it to adjust the number of digits after a decimal separator in prices to be displayed (by default, 8). Available values are in the range from 0 to 18, but the actual number of digits is limited by the number specified in currency settings, refer to [Currency codes](../references/currency-codes). The **B2BINPAY DeFi API** allows you to integrate B2BINPAY DeFi app features into your own systems. You can manage accounts, create invoices, monitor transactions, and inspect callbacks using a unified REST interface. Before you start working with the B2BINPAY DeFi API, you need to generate API keys required for request authentication. Refer to [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for step-by-step instructions. B2BINPAY DeFi charges credits for using API: access the **Credits** page to view the detailed pricing. Refer to [View credit balance and pricing](../user-guide/credits#view-credit-balance-and-pricing) and [Top up the credit balance](../user-guide/credits#top-up-the-credit-balance) for step-by-step instructions. ## General information [#general-information] * **Base URL**: `https://api.defi.b2binpay.com/api/v1`. * **Format**: All endpoints use JSON for requests and responses. ## Required headers [#required-headers] * `x-api-key: {Your API key}` — required for all endpoints. * `Accept: application/json` — required for all endpoints. * `Content-Type: application/json` — required for requests with a body. ## HTTP response codes [#http-response-codes] * `2xx` — success (`200 OK`, `201 Created`). * `400` — validation error (`Invalid input`). * `401` — `Invalid or missing token` or `Invalid or expired token`. * `403` — permission issues (for example, *You are not a member of this account or deployment*). * `404` — resource not found (transaction, invoice, account, etc.). * `409` — conflicts (for example, invoice with the same tracking ID already exists). * `503` — service unavailable (for example, failing health check). ## Deployment ID [#deployment-id] To obtain the `deploymentId` parameter value which is used in many API calls, use the `GET [base]/api/v1/accounts/{accountId}` method. Refer to [Account methods](account) for details. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. A **callback** is an outbound HTTP webhook that B2BINPAY DeFi sends to your system when an invoice- or payout-related event occurs. When such an event happens, the app sends a `POST` request with a JSON body to the callback URL you configured, so you can react to payments and operations in real time. To inspect delivered callbacks or resend a failed one, open the **Callbacks** tab of the relevant invoice or payout in the app. Callback inspection and resending are not part of the API key surface. ## Callback payload [#callback-payload] Every callback body uses the same top-level structure: **`id`** `string · UUID` The unique callback identifier, in the UUID format. **`type`** `string` The callback type. Invoice-related types: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. Payout-related types: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **`operation_id`** `string · UUID` The identifier of the original operation: `invoiceId` for invoice-related callback types, `payoutId` for payout-related callback types. **`operation_type`** `string` The original operation type: `invoice` or `payout`. **`timestamp`** `string` The date and time the callback was generated, in ISO 8601 format (UTC). Updated with each callback resend attempt. **`data`** `object` The callback-specific payload. Always includes the original operation object (`invoice` or `payout`). May include transactions, claims, and other associated objects. Below you can find examples of payloads for different callback types. ```json { "id": "f7f2a2f4-2a8a-48cb-9c7a-6b5f2c1b1a33", "type": "INVOICE_CREATED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:00:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "dd08d1b9-0a1e-4e0b-9c8e-7a6f5e4d3c2b", "type": "INVOICE_DEPOSIT_RECEIVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:05:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "PENDING", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345670, "confirmations": 0, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:05:00Z", "isClaimed": false } } } ``` ```json { "id": "3f5a2a2b-4c1d-49d2-8e8a-9f3b0b0a1a22", "type": "INVOICE_DEPOSIT_CONFIRMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:10:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "EXECUTED", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345678, "blockchainFee": "0.001", "confirmations": 12, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:10:00Z", "confirmedAt": "2025-08-22T10:10:00Z", "isClaimed": false } } } ``` ```json { "id": "d2a5ee9c-6d9a-4f6a-a6a7-6efaf0a5b6f7", "type": "INVOICE_PAID", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:12:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "150.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "a8a4c8b7-3a4b-4f74-9e3d-bb3b0f9d0c9a", "type": "INVOICE_UNRESOLVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:15:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "160.00", "status": "UNRESOLVED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "b1f2c3d4-e5f6-47a8-9123-4567890abcde", "type": "INVOICE_CLAIMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:20:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "claim": { "id": "123e4567-e89b-12d3-a456-426614174000", "status": "PENDING", "chainId": 1, "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "300.00", "fromAddress": "0x1234567890123456789012345678901234567890", "toAddress": "0x9876543210987654321098765432109876543210", "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "linkedTransfers": [ "001e4567-e89b-12d3-a456-426614174000", "002e4567-e89b-12d3-a456-426614174000" ], "createdAt": "2024-01-01T00:00:00.000Z", "ethAmount": 0.5, "tokenAmount": 100 } } } ``` ```json { "id": "0c9d8e7f-6a5b-4c3d-9e0f-1a2b3c4d5e6f", "type": "PAYOUT_CREATED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:30:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CREATED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ```json { "id": "92f13f4b-5c7d-4f3a-912a-37b7e6a23f90", "type": "PAYOUT_SENT", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:33:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "SENT", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "e7a89cde-1f23-45ab-9876-12c34d5678ef", "direction": "OUT", "chainId": 1, "txHash": "0xaaaabbbbccccddddeeeeffff1111222233334444555566667777888899990000", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "PENDING", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": null, "confirmations": 0, "createdAt": "2025-08-22T10:33:00Z" } } } ``` ```json { "id": "2e4f6a8c-0b1d-4f2a-93c7-3d2e1f0a9b8c", "type": "PAYOUT_EXECUTED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:37:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "EXECUTED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "def56789-1234-4abc-5678-901234567890", "direction": "OUT", "chainId": 1, "txHash": "0xaaaa...bbbb", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "EXECUTED", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": 23456789, "confirmations": 15, "createdAt": "2025-08-22T10:35:00Z", "confirmedAt": "2025-08-22T10:37:00Z" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_FAILED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "FAILED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "error": { "code": "INSUFFICIENT_FUNDS", "message": "Account balance at execution time was insufficient" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_CANCELLED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CANCELLED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ## Callback verification [#callback-verification] Each callback request is signed to confirm that it was sent by the B2BINPAY DeFi API and was not modified in transit. The signature is provided in the `X-CALLBACK-SIGNATURE` HTTP header, that contains an HMAC-SHA256 hash of the raw JSON payload and your [callback secret](../get-started/key-terms#callback-secret). ### Verification steps [#verification-steps] ### Read the raw request body [#read-the-raw-request-body] Capture the exact HTTP body bytes as received: * Do not re-serialize the JSON before verification. * Use `JSON.stringify(payload)` **without custom replacers/spacing** (no pretty print). * Ensure numbers and booleans stay as JSON primitives (do not stringify them). * Timestamps must be in the UTC ISO 8601 format, for example: `2025-08-22T10:10:00Z`. ### Read the signature header [#read-the-signature-header] Get the value of the `X-CALLBACK-SIGNATURE` header. → If the header is missing, reject the request (HTTP code `400`). ### Compute the expected signature [#compute-the-expected-signature] Use HMAC with SHA-256: * Key: `callback_secret` (UTF-8) * Message: raw request body bytes (UTF-8) * Output: hex string ### Compare signatures [#compare-signatures] Compare the received signature with the computed one using a constant-time comparison. ### Accept or reject [#accept-or-reject] * If signatures match → process the callback (HTTP code `200`). * If they do not match → reject the request (HTTP code `401`). ```js // Express.js handler example import crypto from 'node:crypto'; import express from 'express'; const app = express(); // Capture the raw HTTP request body. // This preserves the exact byte sequence used to generate the HMAC signature. app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } })); // Computes an HMAC-SHA256 signature (hex) over the raw request body. function computeHmacHex(rawBodyBuffer, secret) { return crypto .createHmac('sha256', Buffer.from(secret, 'utf8')) .update(rawBodyBuffer) // IMPORTANT: use the raw body bytes, not a re-stringified JSON object. .digest('hex'); } app.post('/webhook/invoice', (req, res) => { // Read the signature provided by the sender. const provided = req.get('X-CALLBACK-SIGNATURE'); if (!provided) { return res.status(400).send('Missing X-CALLBACK-SIGNATURE'); } // Shared callback secret (account-specific). const secret = process.env.CALLBACK_SECRET; // Recompute the expected signature from the raw request body. const expected = computeHmacHex(req.rawBody, secret); // Compare signatures using a constant-time algorithm to prevent timing attacks. const ok = crypto.timingSafeEqual( Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8') ); if (!ok) { return res.status(401).send('Invalid signature'); } // (Optional) Apply replay protection here: // - Reject callbacks with duplicate IDs. // - Reject callbacks with stale timestamps. // At this point, the callback is verified and can be safely processed. const { type, operation_type, operation_id, data, timestamp } = req.body; // ... Your business logic ... // Acknowledge receipt so the sender does not retry. return res.sendStatus(200); }); app.listen(3000, () => { console.log('Callback receiver listening on port 3000'); }); ``` The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. This section groups endpoints that do not belong to a specific resource area. ## Smart contract versions [#smart-contract-versions] Use this endpoint to retrieve metadata for a given smart contract version, such as the version string and supported features. The `versionId` value is returned by account-related endpoints as part of the deployment information. Use these methods to list, inspect, and manage queue operations for a deployment, including multisig configuration changes, rejects, and signatures. *** ## Sign a queue operation with a private key (EIP-712) [#sign-a-queue-operation-with-a-private-key-eip-712] Queue operations are signed using EIP‑712 typed data. The signature is created off‑chain with a raw private key, without a wallet UI, and authorizes execution of a multisig operation on‑chain. ### What is signed [#what-is-signed] Only the following data is signed: ```solidity Execute { Call[] calls; uint256 nonce; } ``` No other fields from the queue operation are included in the signature. ### Input data sources [#input-data-sources] #### From queue operation (API) [#from-queue-operation-api] To build the signed payload, load the queue operation from the API: * `GET /api/v1/deployments/{deploymentId}/operations` * `GET /api/v1/deployments/{deploymentId}/operations/{operationId}` From the queue operation object, use only: ```json { "nonce": "1", "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ] } ``` When building the typed data: * Treat `nonce` as `uint256`. * Treat `value` as `uint256`. * Treat `data` as a hex‑encoded `bytes` value (the literal `"0x"` is valid for empty data). #### From deployment and network [#from-deployment-and-network] The EIP‑712 domain uses deployment and network data: * `name` — always `MultiSigWallet`. * `version` — current smart contract version. * `chainId` — blockchain chain ID of the deployment. * `verifyingContract` — address of the multisig contract. You can obtain `verifyingContract` from the account: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` Use the value from the `account.contract` field for the multisig contract address. ### EIP-712 typed data structure [#eip-712-typed-data-structure] The exact typed data that is signed has the following structure: ```json { "domain": { "name": "MultiSigWallet", "version": "1.0.0", "chainId": "11155111", "verifyingContract": "0x71db8821df07d95f35d7c3bef22987397a965060" }, "primaryType": "Execute", "types": { "EIP712Domain": [ { "name": "name", "type": "string" }, { "name": "version", "type": "string" }, { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ], "Execute": [ { "name": "calls", "type": "Call[]" }, { "name": "nonce", "type": "uint256" } ], "Call": [ { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" }, { "name": "data", "type": "bytes" } ] }, "message": { "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ], "nonce": "1" } } ``` Use this structure as a template. Do not change field names, types, or their order when building the typed data object. ### Signing algorithm [#signing-algorithm] #### Step 1. Build EIP-712 typed data [#step-1-build-eip-712-typed-data] * Use the structure shown above with `domain`, `types`, `primaryType`, and `message`. * Encode all numeric values (`chainId`, `nonce`, `value`) as `uint256`. #### Step 2. Compute the EIP-712 digest [#step-2-compute-the-eip-712-digest] The digest is computed as: ```text keccak256( "\x19\x01" || hashDomain(domain) || hashStruct(Execute(message)) ) ``` Standard EIP‑712 libraries perform this step automatically when you sign typed data. #### Step 3. Sign the digest with a private key [#step-3-sign-the-digest-with-a-private-key] Sign the digest using ECDSA over `secp256k1`: ```text signature = sign(digest, privateKey) ``` The resulting signature has the format: ```text 0x{r}{s}{v} ``` Where: * `r` — 32 bytes. * `s` — 32 bytes. * `v` — 1 byte. ### Example signature [#example-signature] Example of a valid signature value: ```text 0xf8d5a66ed464b5d39bf2b3f6c45932c901467b84bdfc4d534a24dcc532569bf3\ 27b3f19289912d223f69aceeab7a61edbffb1fc26d755e1db53f68263cbe03491b ``` ### Submit the signature to the API [#submit-the-signature-to-the-api] After computing the signature, submit it using the `Sign operation` endpoint: ```http POST /api/v1/deployments/{deploymentId}/operations/{operationId}/sign x-api-key: {your-api-key} Content-Type: application/json Accept: application/json { "signature": "0x..." } ``` On success, the API returns the updated signature status for the operation. If the same signer submits another signature for the same operation, the API returns a conflict error. ### Common errors when signing [#common-errors-when-signing] Common issues when building or submitting signatures include: * `Invalid signature` — incorrect domain (`chainId` or `verifyingContract` do not match the deployment). * `Invalid signature` — wrong data types in the message (for example, `nonce` passed as a string instead of `uint256` in the typed data). * `Invalid signature` — `calls` array order does not match the operation in the queue. * `You have already signed this operation` — the same address already submitted a signature. * `canSign = false` in the operation — the signer address is not an approver or is not allowed to sign. ### Summary [#summary] * Extract `calls[]` and `nonce` from the queue operation. * Build the EIP‑712 `Execute` typed data (`domain`, `types`, `message`). * Sign the EIP‑712 digest with a private key. * Submit the resulting signature to the B2BINPAY DeFi API. ## Execute a READY queue operation with a private key [#execute-a-ready-queue-operation-with-a-private-key] When a queue operation reaches the `READY` status and `canExecute = true`, you execute it by sending a regular Ethereum transaction to the deployed `MultiSigWallet` contract and calling: ```solidity function execute(Operation[] operations) external returns (bytes[][] results); struct Operation { Call[] calls; bytes signatures; // packed signatures bytes32 id; } struct Call { address to; uint256 value; bytes data; } ``` ### Preconditions [#preconditions] The queue operation must satisfy all of the following: * `status = "READY"`. * `canExecute = true`. * `signaturesCollected >= signaturesRequired`. * The `signatures` array in the API response contains at least the threshold number of signatures. ### Required inputs [#required-inputs] #### From API (queue operation) [#from-api-queue-operation] * `executeOperationId` — used as `Operation.id`. * `calls[]` — used as `Operation.calls`. * `signatures[]` — used to build packed bytes for `Operation.signatures`. #### From deployment and network [#from-deployment-and-network-1] * `verifyingContract` — multisig contract address for the deployment: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` * use `account.contract`. * `chainId` — chain ID of the network where the multisig is deployed. * `rpcUrl` — RPC endpoint for sending the transaction. * `executorPrivateKey` — private key of the externally owned account (EOA) that sends the transaction. ### Build Operation.calls [#build-operationcalls] Convert each API call object into the Solidity `Call` struct: * `to` → `Call.to`. * `value` (decimal string) → `Call.value` (`uint256`). * `data` (hex string) → `Call.data` (`bytes`). Keep the order of `calls` exactly the same as in the queue operation and in the EIP‑712 signing step. ### Build Operation.signatures (packed bytes) [#build-operationsignatures-packed-bytes] In the API response, signatures are returned as separate entries: ```json "signatures": [ { "user": "0x...", "sign": "0x<65 bytes>" } ] ``` The contract expects a single `bytes` value: ```solidity bytes signatures; // NOT bytes[] ``` #### Signature format [#signature-format] Each signature is a standard 65‑byte ECDSA signature: ```text r (32 bytes) || s (32 bytes) || v (1 byte) ``` For example: ```text 0xf8d5...3491b ``` #### Packing rule [#packing-rule] Build `Operation.signatures` as: ```text packedSignatures = sig1 || sig2 || ... || sigN ``` Sort signatures by signer address in ascending alphabetical order before concatenation. ### Build the operations array [#build-the-operations-array] Even if you execute a single queue operation, you must pass an array with one element: ```solidity operations = [ Operation({ calls: [...], signatures: packedSignatures, id: executeOperationId }) ]; ``` ### ABI-encode execute(operations) [#abi-encode-executeoperations] Encode the function call data for: ```solidity execute((Call[] calls, bytes signatures, bytes32 id)[] operations) ``` This produces the transaction `data` field that you send to the multisig contract. ### Build, sign, and broadcast the Ethereum transaction [#build-sign-and-broadcast-the-ethereum-transaction] #### Transaction fields [#transaction-fields] Set the transaction fields as follows: * `to` — multisig contract address (`verifyingContract`). * `data` — ABI‑encoded `execute(operations)` call. * `value` — `0`. * `chainId` — correct chain ID (for example, Sepolia `11155111`). * Gas parameters — EIP‑1559 fields (`maxFeePerGas`, `maxPriorityFeePerGas`) appropriate for the network. * `nonce` — EOA nonce of the executor account (this is not the multisig queue nonce). #### Sign [#sign] Sign the transaction with `executorPrivateKey` using ECDSA (`secp256k1`). #### Broadcast [#broadcast] Send the raw signed transaction through the RPC endpoint, for example using `eth_sendRawTransaction`. The result is a `txHash`. ### Expected on-chain result [#expected-on-chain-result] If the transaction succeeds: * The contract verifies the packed signatures internally (for example, via `checkSignatures(hash, signatures)`). * All `calls` are executed in order. * An `ExecuteSuccess(nonce, digest, id)` event is emitted. * The function returns operation and call‑level results as `bytes[][] results`. The backend then updates the queue operation: * `status` changes to `EXECUTED`. * `txHash` is populated with the resulting on‑chain transaction hash. ### Common reverts and errors [#common-reverts-and-errors] Common revert classes when executing operations include: * `InsufficientSignatures(signatures, threshold)` — packed signatures contain fewer signatures than the required threshold. * `InvalidSignature(owner)` — signature bytes, signed digest, or ordering are incorrect for at least one signer. * `DuplicateSignature(owner)` — the same signer appears more than once in the packed signatures. * `FailedCall` — one of the internal calls reverted. * `InsufficientBalance(balance, needed)` — the multisig contract lacks enough ETH for the `value` transfers. * `ReentrancyGuardReentrantCall` — a reentrancy attempt was detected during execution. ## Main menu [#main-menu] Use the main menu on the left to navigate across platform pages. At the bottom of the menu, you can access: * **Helpdesk**: Open the support portal in a new tab. * **Collapse/Expand**: Hide or show the main menu labels to save horizontal space. Main menu Eligible accounts (for example, accounts that have topped up credits) also see a floating **support chat** launcher. Click it to start a live conversation with the B2BINPAY support team directly from the app, without leaving the page. ## Header options [#header-options] At the top of each page, the header provides access to the following global controls: * (1) **Account selector**: Shows the current account's name and address. Use the dropdown to switch between accounts or create a new one. * (2) **Wallet selector**: Displays the connected wallet. The dropdown provides access to profile‑level options: * **Profile settings**: Here you can select and manage the base currency for your account. * **Log out**: To disconnect the wallet. * (3) **Network selector**: Shows the active blockchain network. Use the dropdown to switch to another supported network. * (4) **Theme switch**: Toggles between light and dark themes of the interface. * (5) **Language selector**: Use the dropdown to select a preferred language for the Web UI. * **dApp connection**: Opens the WalletConnect side panel for connecting external dApps. The button shows a green dot when at least one dApp session is active. Visible only for accounts with smart contract version 1.1.0 or later. See [dApps](../user-guide/dapps). Header ## Column configuration [#column-configuration] On pages that show tables, you can configure which columns are visible and in what order. If column configuration is available, a **Configure columns** control is shown above the table: * Mark or unmark checkboxes to show or hide specific columns. Columns highlighted in grey are always visible and can't be hidden. * Drag and drop column names to change their order in the table. Column configuration ## Table header controls [#table-header-controls] Most tables in the B2BINPAY DeFi share the same header controls for searching, sorting, and filtering data. ### Quick search [#quick-search] Some columns provide a quick search field: click the **magnifying glass** icon and start typing a value to filter records that contain the entered text in that column. Quick search ### Sorting [#sorting] Columns that support sorting display the arrow icons next to the header: * **Arrows inactive**: Sorting by this column is currently disabled. * **Up arrow active**: Data is sorted in ascending order (smallest values first). * **Down arrow active**: Data is sorted in descending order (largest values first). Only one column can be used for sorting at a time. Sorting ### Filters and date ranges [#filters-and-date-ranges] The (1) **funnel** icon displayed next to the column header indicates that filters are available: click the icon to open a filter panel and specify filtering parameters. To apply filters, click **Apply**. To clear them, click **Reset**. The (2) **calendar** icon opens the date picker with predefined values (for example: *Today*, *Yesterday*, *Last 7 days*, and so on) and possibility to select a custom date or date range. Filters ## Pagination [#pagination] Most pages support pagination to split data into multiple pages and help you work efficiently with long lists. At the bottom of the page, you can: * Navigate between pages using the **previous/next** arrows or the numbered page selector. * Use **Jump to** to quickly move to a specific page. * Choose how many rows are displayed per page. Pagination ## Copying values [#copying-values] Certain fields feature the **copy** icon that copies the underlying value to your clipboard. Click the icon next to the value you need; a short confirmation appears when the value is copied. Copying values ## Account [#account] An **account** is a shared multi‑signature wallet. Technically, it's a smart contract deployed for a specific account and network. Each account is managed collectively by a group of users. Each operation on such account requires certain independent [signatures](#signature) to approve the operation before it's executed. In the B2BINPAY DeFi app, each account has: * A list of [Signers](#signer). * A [Required signatures](#required-signatures) threshold. Refer also to [Queue](#queue). *** ## Address [#address] An **address** is a unique blockchain identifier used for deposits, payouts, or transaction execution.\ Depending on context, an address can represent: * An **invoice address** (deposit address) created by the smart contracts. * A **wallet address** belonging to a signer or payout receiver. Refer also to [Deposit address](#deposit-address), [Invoice](#invoice), and [Payout](#payout). *** ## Address book [#address-book] The **address book** is a list of saved receiver addresses and labels. Saved entries can be reused when creating payouts or other operations, which reduces manual input and the risk of sending funds to an incorrect address. Refer also to [Payout](#payout). *** ## API key [#api-key] An **API key** is a credential used to access B2BINPAY DeFi API app programmatically.\ Each key is associated with a specific account. API keys are managed on the **Settings** tab of the **Account** page. Refer also to [API service](#api-service) and [Callback secret](#callback-secret). *** ## API service [#api-service] The **API service** exposes B2BINPAY DeFi REST APIs for working with entities such as invoices, payouts, and so on. Refer also to [API guide](../api-guide/api-overview). *** ## Base currency [#base-currency] The **base currency** is the currency used for presenting balances, totals, and some reports in the B2BINPAY DeFi app.\ It doesn't change the underlying blockchain currency of deposits and payouts; it only affects how values are displayed and settled in the UI. The base currency is selected on the **Profile settings** page. *** ## Balance [#balance] The **balance** of an account or asset is the aggregated value of all relevant transactions.\ Primary balance types include: * **Total balance**: Reflects all executed transactions for the account across assets, converted to the base currency. * **Uncollected balance**: Reflects deposits received on invoice addresses but not yet claimed to the account wallet. * **Balance by asset**: Shows per‑token and per‑network balances for the account. Refer also to [Deposit](#deposit), [Claim](#claim), and [Base currency](#base-currency). *** ## Batch claim [#batch-claim] A **batch claim** is an operation that collects funds from multiple invoice deposit addresses in a single claim transaction for a given currency.\ Batch claims reduce on‑chain fees by aggregating several claims into one transaction, where supported by smart contracts. Batch claims are initiated from the **Claims** page when more than one uncollected claim exists for the selected currency. Refer also to [Claim](#claim) and [Invoice](#invoice). *** ## Batch execution [#batch-execution] **Batch execution** is the process of executing several fully signed queue operations in a single on‑chain transaction.\ Batch execution is available only when: * The selected operations are fully signed. * Their nonce values form a continuous sequence (for example, `5`, `6`, `7`). Batch execution is initiated from the **Queue** page with the **Execute batch** action. Refer also to [Queue](#queue), [Nonce](#nonce), and [Payout](#payout). *** ## Blockchain [#blockchain] A **blockchain** is a specific network environment. Each network is identified by its `chainId` and has its own set of assets, contracts, and block explorers. The selected network in the app header determines which balances, queue operations, and transactions are shown. *** ## Callback [#callback] A **callback** is an HTTP notification that the B2BINPAY DeFi app sends to a client system when an invoice- or payout-related event occurs. **Invoice-related callback types:** * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. **Payout-related callback types:** * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **Retry policy:** If a callback delivery fails, the system retries it a limited number of times (by default, up to three attempts) at short, regular intervals. If every attempt fails, the callback is marked as failed and can be resent manually. For details, payload examples, and callback verification, see [Callbacks](../api-guide/callbacks). Refer also to [Callback secret](#callback-secret), [Invoice](#invoice), and [Payout](#payout). *** ## Callback secret [#callback-secret] The **callback secret** is a value used to sign callbacks so that the receiving system can verify their authenticity.\ Rotating the callback secret invalidates the previous value and is recommended when credentials are updated or exposed. The callback secret is managed on the **Settings** tab of the **Account** page. See [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for more details. Refer also to [Callback](#callback) and [API key](#api-key). *** ## Claim (collection) [#claim-collection] A **claim** (or **collection**) is an operation that transfers funds from an invoice deposit address to the account wallet. When withdrawing a token from an invoice address, the native currency is always withdrawn as well. Claims can be created for a single invoice and currency or grouped into [Batch claims](#batch-claim). * On the **Invoices** page, claims are initiated from the **Claims** tab of a specific invoice. * On the **Claims** page, claims are initiated from aggregated entries that represent uncollected funds for an invoice and currency. Refer also to [Deposit](#deposit), [Invoice](#invoice), and [Transfer](#transfer). *** ## Currency [#currency] A **currency** is a cryptocurrency (coin, stablecoin, or token) supported by the system. Refer also to [Blockchain](#blockchain) and [Balance](#balance). *** ## dApp [#dapp] A **dApp** (decentralized application) is an external application that connects to a B2BINPAY DeFi account through the [WalletConnect](#walletconnect) protocol. Connected dApps can request transactions and message signatures, which are routed to the account [queue](#queue) for multisig approval. dApps are available for [EVM-compatible](#blockchain) accounts with smart contract version 1.1.0 or later. Refer also to [WalletConnect](#walletconnect) and [Queue](#queue). *** ## Deposit [#deposit] A **deposit** is an incoming transaction to an invoice or directly to an account. Deposits increase the uncollected balance of an invoice or account until a [Claim](#claim) or payout moves the funds. Refer also to [Deposit address](#deposit-address) and [Transfer](#transfer). *** ## Deposit address [#deposit-address] A **deposit address** is a blockchain address generated by the smart contracts for receiving payments.\ Each deposit address is bound to the wallet (public address): * Funds can be collected only to the owner’s wallet or account. * The smart contract can't direct funds to arbitrary third‑party addresses. In invoices, the deposit address is represented by a smart contract and managed by the [multisig](#multisig) wallet. Deposit addresses are typically created through [Invoices](#invoice). *** ## Invoice [#invoice] An **invoice** is a request for cryptocurrency payment that generates a unique deposit address for receiving funds. The invoice address is represented by a smart contract and managed by the [multisig](#multisig) wallet.\ Invoice activity is tracked across the **Settings**, **Transfers**, **Claims**, and **Callbacks** tabs on the invoice details page. Refer also to [Deposit address](#deposit-address), [Claim](#claim), and [Transfer](#transfer).\ For detailed workflows, see [Invoices](../user-guide/invoices). *** ## Multisig [#multisig] **Multisig** (multi‑signature) is the security model behind every account. Instead of a single private key, an account is controlled by a group of [signers](#signer), and sensitive actions require approval from a minimum number of them before they can run on‑chain. In the B2BINPAY DeFi app, the multisig model defines: * Who can approve operations — the list of [signers](#signer). * How many approvals each operation needs — the [required signatures](#required-signatures) threshold. This means no single person can move funds or change account settings alone, which keeps control distributed across your team. Refer also to [Account](#account), [Signer](#signer), [Required signatures](#required-signatures), and [Threshold](#threshold). *** ## Network [#network] The **network** is the blockchain environment on which an account operates. Switching the network in the app header changes: * Which balances are shown. * Which queue operations, invoices, and transfers are visible. Refer also to [Blockchain](#blockchain). *** ## Nonce [#nonce] A **nonce** is the sequential identifier that defines the order of operations executed by a smart contract. In the B2BINPAY DeFi app: * Each queue operation (for example, a payout or configuration change) has a nonce. * Operations must be executed in nonce order; the item with the smallest nonce is processed first. * Creating a payout with a nonce that matches an existing one creates a conflicting or replacement operation. Nonce values are visible in the **Queue** and can be adjusted when creating certain operations such as payouts. Refer also to [Queue](#queue), [Batch execution](#batch-execution), and [Operation](#operation). *** ## Operation [#operation] An **operation** is an action that requires multisig approval before execution.\ Examples include: * Account configuration changes (for example, signers and thresholds). * Payouts and other asset transfers. Each operation has a [nonce](#nonce) and requires one or more [operation signatures](#operation-signature). Refer also to [Queue](#queue) and [Payout](#payout). *** ## Operation signature [#operation-signature] An **operation signature** is a digital signature added by a signer to authorize a specific operation.\ Multiple signatures can be attached to the same operation until the [threshold](#threshold) is met and the operation becomes executable. Refer also to [Signature](#signature), [Signer](#signer), and [Operation](#operation). *** ## Payout [#payout] A **payout** is an outgoing on‑chain transfer from the account to an external receiver address.\ Payouts: * Are created in the **Payouts** section by specifying a receiver address, currency, amount, and optional callback settings. * Enter the [Queue](#queue) and must be signed by the required number of signers. For details, see [Payouts](../user-guide/payouts). *** ## Queue [#queue] The **queue** is an ordered list of operations waiting for signatures or execution.\ Typical queue items include: * Payouts. * Configuration changes (for example, confirmation rules). * Reject (if you need to cancel an operation in the middle of a queue). Queue items are processed in the [nonce](#nonce) order. The **Queue** page exposes: * Pending operations that need signatures or execution. * History of executed or failed operations. * Tools for signing, executing, rejecting, or replacing operations. For detailed workflows, see [Queue](../user-guide/queue). *** ## Read‑only access [#readonly-access] **Read‑only access** is a restricted mode in which an account or user can view data but can't perform sensitive actions. Read‑only users cannot: * Create, sign, or execute operations. * Add or disconnect accounts. * Change required signatures or other critical settings. Read‑only states may apply to accounts that were removed from configuration on a given network but still exist elsewhere. *** ## Required signatures [#required-signatures] The **required signatures** value defines how many signers must approve an operation before it can be executed, expressed as `X/Y`, where: * `Y` is the total number of signers. * `X` is the minimum number required to execute an operation. The setting is configured on the **Members** tab of the **Account** page. Refer also to [Multisig](#multisig), [Signer](#signer), and [Threshold](#threshold). *** ## Signature [#signature] A **signature** is a cryptographic proof generated when a user signs a message or transaction with their private key.\ In B2BINPAY DeFi it's used for: * Authentication and login flows (for example, SIWE and EIP‑712 signatures). * Approving multisig operations and transactions. Refer also to [Operation signature](#operation-signature) and [Wallet authentication](#wallet-authentication). *** ## Signer [#signer] A **signer** is an account that has permission to approve and execute operations for an account. Signers can: * Create operations (such as payouts or configuration changes). * Sign queue items. * Execute fully signed operations. The list of signers for an account is managed on the **Members** tab of the **Account** page. Refer also to [Required signatures](#required-signatures) and [Multisig](#multisig). *** ## Threshold [#threshold] The **threshold** is another name for the number of [Required signatures](#required-signatures) needed to execute a multisig operation.\ It's defined when the account is created and can later be updated through configuration operations. Refer also to [Multisig](#multisig). *** ## Transaction [#transaction] A **transaction** is a blockchain record representing the execution of a call on a network. Each blockchain transaction is assigned a unique **TXID** which is a transaction identifier, or transaction hash. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. Each TXID links to a blockchain explorer — a public tool for tracking transactions. *** ## Transfer [#transfer] A **transfer** is a record of an on‑chain transaction tracked by the B2BINPAY DeFi app.\ Transfers can represent: * Incoming deposits to invoices. * Claims collecting funds from deposit addresses to the account. * Payouts and other outgoing operations. For details, see [Transfers](../user-guide/transfers). *** ## User [#user] A **user** represents a wallet address interacting with the B2BINPAY DeFi app. Users authenticate by signing messages and may belong to one or more [accounts](#account) as signers or viewers. Refer also to [Wallet authentication](#wallet-authentication) and [Signer](#signer). *** ## Wallet authentication [#wallet-authentication] **Wallet authentication** is the login mechanism based on external wallets. Instead of passwords, the B2BINPAY DeFi app: * Generates a message. * Asks the user to sign it. * Verifies the signature to confirm wallet ownership. Refer also to [Signature](#signature) and [User](#user). *** ## WalletConnect [#walletconnect] **WalletConnect** is an open protocol for linking external [dApps](#dapp) to a wallet session. In the B2BINPAY DeFi app, users paste a WalletConnect URI from a dApp to establish a session; subsequent dApp transaction and signature requests are delivered to the account [queue](#queue) for multisig approval. Refer also to [dApp](#dapp). The **B2BINPAY DeFi app** connects your non‑custodial wallet to smart‑contract infrastructure on EVM‑ and TVM-compatible networks. ## How it works [#how-it-works] * **Generate invoices**: Create deposit addresses for supported assets and track incoming payments in real time. * **Collect funds**: Move funds from invoice (deposit) addresses to your account smart‑contract address when you are ready. * **Approve payouts**: Create payout operations, collect signatures from account signers, and execute transactions on‑chain once the required threshold is reached. * **Manage access and rules**: Add or remove signers and adjust confirmation thresholds through multisig operations, with all changes recorded on‑chain. ## Key features [#key-features] * **Multisig accounts** Collaborate safely by managing funds through smart‑contract accounts that require multiple signatures for sensitive actions. Configure signer lists and signature thresholds per account to match your internal approval policies. * **Invoice generation** Accept crypto payments via automatically generated deposit addresses, with support for both single‑currency and multi‑currency invoices. Track each invoice in real time from creation to payment and collection. * **Fund collection** Pull funds from invoice (deposit) addresses to your main account address, either per invoice or in batches, helping you optimize network fees while keeping deposit flows and main balances clearly separated. * **Approval queue** Have all important actions — payouts, account configuration changes, signer updates — added to an operations queue where they can be reviewed, signed, and executed only after the required approvals are collected. * **API access** Use the same capabilities programmatically via the B2BINPAY DeFi API: create invoices, monitor deposits, trigger fund collections, manage payouts, and track transaction and operation statuses from your backend systems. * **Security and transparency** Benefit from a non‑custodial design where B2BINPAY DeFi never stores private keys, all transactions are signed in your wallet, and smart contracts provide on‑chain logging of operations. Multisig approvals and per‑network deployments keep control distributed across your accounts and networks. ## Set up your account [#set-up-your-account] ### Connect your wallet [#connect-your-wallet] 1. Open the B2BINPAY DeFi login page. 2. From the **Network** select in the topbar, select your network. 3. Click **Connect wallet** and follow the instructions. 4. In your wallet, select the account you want to use and approve the connection. 5. Review the signature request that the app sends to your wallet, then sign it. The app verifies the signature to confirm that you control the selected address. If the signature verification fails, reconnect the correct wallet or repeat the signature request and sign again. ### Create an account [#create-an-account] 1. Click **Create**. 2. In the **Create new account** form: 1. Enter the account name. 2. Add one or more signers or do it later. 3. Select the number of signatures required for operation confirmation (based on the number of added signers). 4. Click **Create account** and confirm the action. You'll be redirected to the **Account** page. ### Activate your account [#activate-your-account] If you see the *Your account is not activated yet* message: 1. Click **Activate** and confirm the action. 2. Confirm the transaction in your wallet. Once the account is successfully activated, in the upper part of the **Account** page, you'll see your account balances and information. ### Select a base currency for the account [#select-a-base-currency-for-the-account] The base currency is used to display account balances, including conversions from other currencies/tokens. You can manage and change your base currency at any time in your profile settings. 1. Click the **wallet selector** in the topbar and select **Profile settings**. 2. From the **Select base currency** dropdown, select the base currency for your account. The new base currency will be applied across the account. ### Make a direct deposit to the account address (optional) [#make-a-direct-deposit-to-the-account-address-optional] Fund the account directly from an external wallet. 1. Go to **Account** in the main menu. 2. In the upper part of the page, locate the **Account address** field and click the **copy** icon to copy the account address to your clipboard. 3. In your external wallet, paste the copied address as the receiver and select the token and network that match your account configuration. 4. Send a test transfer with a small amount first. After the transaction is confirmed on‑chain, the **Transfers** page shows the new incoming transfer with the *Direct deposit* type and the balances are updated accordingly on the **Account** page. ### Add account users and configure confirmation rules [#add-account-users-and-configure-confirmation-rules] Invite additional users and adjust how many signatures are required for transaction confirmation. 1. Go to **Account** in the main menu and switch to the **Members** tab. 2. In the **Confirmation rules** section, click **Edit**. 3. To add a new user to the account, enter their public address in the **Add signer** field. The app validates the address format and network: 1. If the address format or network is invalid, an error explains that the address is invalid. 2. If the address is already added as a signer, a message explains that the address is already in the list. 4. Adjust **Required signatures** to define how many signers must approve each transaction. Consider adding more than one signer for production environments so that payouts and configuration changes require multiple approvals. 5. Click **Save** and sign the corresponding configuration transaction in your wallet if prompted. The updated list of signers and required signatures appears in the **Confirmation rules** section. ## Next steps [#next-steps] Now, as you're all set up, you can: * Create invoices to generate deposit addresses and accept payments. * Use the **Queue** page to track pending multisig actions. * Configure callbacks and API keys to integrate B2BINPAY DeFi API app with your systems. ## July 1, 2026 [#july-1-2026] ### Cross-chain transfers, TRX staking, and in-app support [#cross-chain-transfers-trx-staking-and-in-app-support] **Cross-chain transfers** * Added **Cross-chain transfers**: move funds from your account on one network to a recipient on another network without leaving the interface. Transfers use a live quote that shows the amount received, bridge fee, route, and estimated delivery time, and run through the account queue for multisig approval. Track delivery progress and open the cross-chain explorer from the operation details. See [Cross-chain transfers](../user-guide/cross-chain-transfers). **TRX staking** * Added **TRX staking** for TRON accounts: freeze TRX to obtain Energy or Bandwidth, unstake and withdraw matured TRX, vote for Super Representatives, and delegate resources to other addresses. All staking operations run through the account queue. The account balance now shows the spendable amount, excluding staked, unstaking, and pending-withdrawal TRX. See [Staking](../user-guide/staking). **Support** * Added an in-app **support chat**. Eligible accounts (for example, accounts that have topped up credits) get a live chat launcher that connects you with the B2BINPAY support team directly from the app, tied to your connected account. The launcher appears without a reload right after you become eligible. **Smart contracts** * Released smart contract version **1.2.1** for TRON, adding staking support. ## June 1, 2026 [#june-1-2026] ### Overview dashboard and integrated apps [#overview-dashboard-and-integrated-apps] **Overview** * Added the **Overview** dashboard, the landing page you see after signing in. It summarizes your total balance and uncollected funds, invoice and payout activity, asset allocation, finance volume, pending queue operations, credit balance, and per-network status. Use the period selector to switch between the last week, month, and quarter. See [Overview](../user-guide/overview). **Apps** * Added the **Apps** page, a catalog of integrated applications that work directly through your multisig account. See [Apps](../user-guide/apps). * Added **CoW Swap**: MEV-protected token swaps for EVM-compatible accounts. Each swap runs through the account queue for multisig approval, the same way as payouts. See [Apps](../user-guide/apps). **Smart contracts** * Released smart contract version **1.2.0**. On accounts using this version, only account signers can claim funds from invoice deposit addresses. Addresses that are not signers can no longer perform claims, which adds an extra layer of protection for deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. See [Claims](../user-guide/claims). ## April 17, 2026 [#april-17-2026] ### dApp integration, API enhancements, and Tron support [#dapp-integration-api-enhancements-and-tron-support] **dApps** * Added support for connecting external dApps through the **WalletConnect** protocol. Use the new **dApp** control in the header to connect dApps, review incoming transaction and message requests, and track active sessions. See [dApps](../user-guide/dapps). * Queue operations initiated by connected dApps now show the dApp name and icon in the queue list and details. See [Queue](../user-guide/queue). * The header displays a live indicator when at least one dApp session is active and a badge when pending dApp requests require approval. **Smart contracts** * Released smart contract version **1.1.0** with **ERC-1271** support. The multisig account can now validate signatures on-chain, which lets it sign messages requested by connected dApps. dApp features are available for accounts on this version or later. See [dApps](../user-guide/dapps). **API** * Added callback resending: retry a previously failed callback from the **Callbacks** tab of an invoice or payout. See [Callbacks](../api-guide/callbacks). * Added the **Get account balances** endpoint that returns balances for all assets of the account in a single call. See [Account](../api-guide/account). * Added the **Get smart contract version** endpoint. See [Other](../api-guide/other). **SDK** * The TypeScript SDK now supports **Tron** networks (Mainnet and Shasta) in addition to EVM chains. Invoices, payouts, and claims flows work with a unified API surface across EVM and TVM deployments. ## February 3, 2026 [#february-3-2026] ### Initial release [#initial-release] An **account** represents a shared multisig wallet managed by a group of users. ## Account details [#account-details] To access account details, go to **Account** in the main menu. In the upper part of the page, you can find essential information about the account: **Total balance** The total value of all assets held by the account, converted to the base currency. This value reflects both collected and uncollected funds. *** **Uncollected balance** The total amount of funds that were received but not yet collected to the account base address, converted to the base currency. *** **Uncollected invoices** The number of invoices that currently have payments that haven't yet been collected. *** **Current nonce** The latest transaction nonce used by the account smart contract. This value shows how many transactions were already processed and helps avoid transaction conflicts. *** **Account address** The smart contract address representing the account on the selected blockchain network. This address is used as the main destination for incoming funds and can't be modified. *** **Account name** The label for the account that helps distinguish it from other accounts. This value can be modified anytime. The information below is divided into tabs. On this tab, you can view a list of all assets held on the account, including their balances and value in the base currency. The following information is provided about each asset: **Currency** The asset alphabetical code, logo, and full name. *** **Balance** The amount of the asset held on the account, in the asset units. *** **Balance in base currency** The value of the asset converted to the account base currency. On this tab, you can view and manage the members and signing policy of the account. ### Member cards [#member-cards] The upper part of the tab shows a set of member cards that represent wallets associated with the account. Each card provides the label assigned to the member and the underlying blockchain address. Members marked with the **eye icon** have read-only access to the account. ### Confirmation rules [#confirmation-rules] The lower part of the tab contains the **Confirmation rules** section, which defines who can approve transactions and how many approvals are required. **Signers** The list of addresses and names that have full control over the account. Signers can create, sign, execute, and decline transactions. Each row shows the signer label (if available) and the wallet address. *** **Required signatures** The number of signer approvals that must be collected before a transaction can be executed. The ratio, such as `1/3`, shows how many signatures are required out of the total number of signers. Transactions remain pending until the required number of signatures is collected. View [Manage signers and required signatures](#manage-signers-and-required-signatures) for step-by-step instructions. On this tab, you can manage integration and security settings for the account, including the callback secret and API keys. ### Callback secret [#callback-secret] The **Your callback secret** section provides the **Regenerate** action that issues a new secret. Regeneration invalidates the previous secret and updates the value used for verifying callbacks. ### API key management [#api-key-management] The **API key management** section lists API keys used to access the account through integrations. The table includes the following columns: **Name** The label assigned to the key.\ This value helps identify where the key is used. *** **Key** The shortened representation of the API key, for example `094j8...9h34a`.\ The full value is shown only when the key is created.\ For security reasons, it is not possible to restore the full key from this page. *** **Created at** The date and time when the key was created. *** **Revoked at** The date and time when the key was revoked.\ For active keys, the value is shown as `—`. View [Configure callback secret and API keys](#configure-callback-secret-and-api-keys) for step-by-step instructions. ## Common use cases [#common-use-cases] The **Account** page helps with daily monitoring and administration of the account. This section describes common scenarios step by step. ### Rename the account [#rename-the-account] You can modify the account name anytime. Go to **Account** in the main menu and select the required account in the header. Click the **pencil icon** next to the account name and enter a new value. In the **Edit account name** popup, enter the new account name, up to 32 characters long. Click **Save** to confirm changes. The changes are applied immediately. The smart contract address, confirmation rules, and accesses remain unchanged. ### Manage signers and required signatures [#manage-signers-and-required-signatures] Add new signers and adjust account settings that affect confirmation rules. Go to **Account** in the main menu and switch to the **Members** tab. Click **Edit** in the **Confirmation rules** section. **To add a new signer:** Click **Add signer** and enter a new signer address in the corresponding field. The system validates the address format and network before allowing you to proceed: * If the entered address has an invalid format or doesn't belong to the expected network, the `Invalid address format` error appears and the changes aren't saved. * If the entered address is already in the signer list, the `Address is already added` notification appears and the address isn't duplicated. **To remove a signer:** Click the **bin icon** in the corresponding signer row. Adjust the **Required signatures** value to set how many signatures are needed to execute transactions: * If there is only one signer, confirm that **Required signatures** is set to `1/1` by default and that editing is disabled. * If the account has more than one signer, click **Edit**, then adjust the **Required signatures** value in the `X/Y` format, where `Y` is the number of signers and `X` is less than or equal to `Y`. If you set `X` equal to `Y`, review the warning that explains the risk of losing funds if any single account becomes unavailable, then save the changes only if this configuration is acceptable. When signers are added or removed, the `Y` value in `Required signatures` updates to match the current signer list, and the editing control reflects the updated limits immediately. Click **Save**. The **Sign transaction** popup appears with the note that the action requires collecting a certain number of signatures before it can be completed. Review the changes and click **Sign**. The changes are processed according to the current confirmation rules. New rules will be applied once the transaction is properly confirmed. ### Configure a callback secret and API keys [#configure-a-callback-secret-and-api-keys] Set up technical integration with external systems through [callbacks](../get-started/key-terms#callback) and API access. Go to **Account** in the main menu and switch to the **Settings** tab. In the **Your callback secret** section, click **Regenerate** to issue a new callback secret, then update this value in your external systems. In the **API key management** section, click **Generate API key**. In the **Generate API key** popup, enter the name for the API key and click **Generate**. The newly generated key will be displayed in the **API key is generated** popup: make sure to copy it and store it securely, as it only reveals once in this popup. The new API key entry is added to the list where you can revoke it anytime. ### Create a new account [#create-a-new-account] Create a new multisig account and define its initial configuration. In the topbar, expand the **account select**. Select **Create new account**. In the **Create account** popup, click **Create**. If a popup appears with the text “Creating new account will discard all unsaved changes,” decide whether to continue and click **Proceed** to move on or **Cancel** to keep working with the current account. In the **Create new account** popup: * Enter the account name. * Add one or more members. * Specify the number of signatures required for transaction confirmation. Then click **Create account**. In the **Confirm new account** popup, verify the summary of **Account name**, **Members**, **Required signatures**, and then click **Confirm**. The changes are processed according to the configured confirmation rules. ### Disconnect the wallet [#disconnect-the-wallet] Log out from the current account and return to the login screen. In the topbar, click the **account select**. Select **Logout**. In the **Logout confirmation** modal, confirm the action. You'll be redirected to the login page with account selection. The **address book** is a list of saved receiver addresses that you can reuse across payouts and other operations.\ Saving addresses reduces the risk of copying incorrect addresses and speeds up everyday workflows. ## Address list [#address-list] On this page, you can view a list of all saved addresses for the account. The following information is provided about each address: **Name** The label assigned to the address. *** **Address** The full blockchain address saved in the address book. Icons next to the value let you copy the address or open it in the block explorer. *** **Actions** The available actions for each saved address: * **Edit**: Opens the edit modal where you can update the address and its name. * **Delete**: Removes the entry from the address book after confirmation. ## Common use cases [#common-use-cases] The **Address book** page helps you keep a curated list of trusted receivers.\ This section describes common scenarios step by step. ### Add a new address [#add-a-new-address] Save a frequently used receiver address. Go to **Address book** in the main menu. If no addresses exist, click **Add address** in the center of the page. If the table already contains entries, click **Add address** in the upper right corner. In the **Add address to address book** popup: 1. Enter the receiver **Address**. 2. In the **Address name** field, enter a clear label for the address. It can be any combination of letters and numbers convenient for you. Click **Save** to add the address to the address book. The newly added address appears in the table and becomes available when you select receivers for payouts. ### Edit an existing address [#edit-an-existing-address] Update an address or rename it. Go to **Address book** in the main menu. In the table, locate the address you want to change and click the **pencil icon**. In the **Edit address** popup, update the **Address** and/or **Address name** values. Click **Save** to apply the changes. The updated name and address appear in the address list and are used wherever the address book is referenced. ### Delete an address [#delete-an-address] Remove an address that is no longer needed. Go to **Address book** in the main menu. In the table, locate the entry you want to remove and click the **bin icon**. In the **Delete address from address book?** confirmation popup, review the message and click **Delete** to confirm or **Cancel** to keep the address. After deletion, the address no longer appears in the list and is not offered as a saved receiver. The **Apps** page is a catalog of integrated third-party applications that work directly with your account. Unlike external dApps that you connect through [WalletConnect](dapps), integrated apps run inside the B2BINPAY DeFi interface and route their on-chain actions through your account [queue](queue) for multisig approval. To open the catalog, go to **Apps** in the main menu. ## Availability [#availability] Each app card shows the app name, a short description, and tags that describe its category. An app is available only when both conditions are met: * The active network is **EVM-compatible**. On a TVM (TRON) account, EVM-only apps are disabled with the message *TVM network doesn't support this app. Switch to EVM account*. * The account is **deployed** on the selected network. If it isn't, the app is disabled with the message *To use the app, deploy the account on the selected network first*. When an app is unavailable, its card is greyed out and a tooltip explains why. To enable it, switch to a supported network or activate the account on the current network. ## CoW Swap [#cow-swap] **CoW Swap** is a decentralized exchange aggregator that provides MEV-protected token swaps through batch auctions. It is available for EVM-compatible accounts. Because every swap is performed by your multisig account, the swap and any required token approval don't execute immediately. Instead, they enter the [Queue](queue) as operations that the required number of signers must approve, the same way payouts and configuration changes do. ### Make a swap [#make-a-swap] ### Open CoW Swap [#open-cow-swap] On the **Apps** page, click the **CoW Swap** card. The CoW Swap widget opens inside the interface. ### Build the swap [#build-the-swap] In the widget, select the token to sell, the token to buy, and the amount. Review the quoted price, fees, and expiry, then confirm the swap. ### Approve in the queue [#approve-in-the-queue] The swap (and a token approval, if one is needed) is added to the account [queue](queue) as an operation. Go to the **Queue** page, collect the required signatures, and execute the operation. Once executed, CoW Swap settles the order on-chain and the resulting balances appear on your **Account** and **Transfers** pages. A swap depends on funds held by the account. Make sure the account holds enough of the token you want to sell, plus the network's native currency to cover execution fees. ## Cross-chain transfer [#cross-chain-transfer] **Cross-chain transfer** moves funds from your account on one network to a recipient on another network. Like a swap, it runs through the account [queue](queue) for multisig approval and shows a live quote before you confirm. Open the **Cross-chain transfer** card to start. For the full flow, see [Cross-chain transfers](cross-chain-transfers). A **claim** is an operation that collects funds from invoice deposit addresses and transfers them to your account.\ Claims can be executed for a single invoice or grouped into batch claims. On accounts using smart contract version 1.2.0 or later, only account signers can claim funds. Addresses that are not signers can no longer perform claims, which protects deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. ## Claim list [#claim-list] On this page, you can view all uncollected funds that are available for claiming, grouped by invoice and currency. The following information is provided about each claim: **ID** The unique system identifier of a claimable position (invoice and currency combination).\ This value is generated automatically and can't be modified. *** **Received at** The date and time when funds were first received to the invoice deposit address in this currency. *** **Last received at** The date and time when the most recent payment was received for this invoice and currency. *** **Currency** The currency currently held on the invoice deposit address. *** **Amount** The total uncollected amount for this invoice and currency.\ If multiple transfers with the same currency were received to the invoice, they are aggregated into a single amount. *** **Transactions** The number of uncollected transactions in this currency for the invoice. This is a link that opens the list of underlying transfers associated with this claim. *** **Invoice ID** The identifier of the invoice for which funds are to be claimed.\ This is a link to invoice details. *** **Claim** Executes a [single claim](#execute-a-single-claim) for this invoice and currency. ## Common use cases [#common-use-cases] The **Claims** page provides a consolidated view of uncollected funds and helps you control when claims are executed.\ This section describes common scenarios step by step. ### Execute a single claim [#execute-a-single-claim] Collect funds for a specific invoice and currency directly from the **Claims** page. Go to **Claims** in the main menu. Locate the row corresponding to the invoice and currency you want to collect and click **Claim**. In the **Sign claim** popup, review the details, and click **Sign**. After the claim is completed, it will disappear from the list. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. ### Create a batch claim [#create-a-batch-claim] Collect funds from several invoices at once. Go to **Claims** in the main menu. Click **Create batch claim** in the upper right corner. The button is active only when more than one claim that can be collected together is available. In the **Create batch claim** popup, select a currency, then click **Next step**. Mark the checkboxes of the claims you want to include in the batch, then click **Batch claim**. In the **Sign batch claim** modal, review the account address and the total amount being claimed, then click **Save**. In the **Sign claim** popup, review the details, and click **Sign**. After the batch claim is completed, all related claims will disappear from the list. On the **Transfers** page, a corresponding number of new transfers with the *Claim* type will appear, providing full transaction information. Once the transfers are assigned the *Executed* status, funds will be credited to the account address. The **Credits** page helps you track your balance and usage, understand pricing, and fund your account with crypto. The upper section contains the key balance and pricing information: **Credits balance** The current number of credits available on your account. This value updates after each top-up and whenever credits are spent. *** **Top up** The **+ Top up** action that opens the funding flow. *** **Credit price** The fixed credit-to-crypto rate shown on the page. *** **Credits used** The number of credits already spent within the selected time range. *** **What we charging for?** A link that opens the pricing rules and explains how credits are charged per operation. Below the balance section, the page is divided into two panels: **History of credits** The chart shows how your credit balance changes during the selected period. Use the date selector above the chart to switch the range. *** **Top-ups** A list of completed top-ups with their details. ## Common use cases [#common-use-cases] ### View credit balance and pricing [#view-credit-balance-and-pricing] Check your current credit balance, plan, and request pricing. Go to **Credits** in the main menu. On the **Credits** page: * View your **credit balance** and **used credits** in the upper part of the page. * View your **top-up history** in the lower part of the page. Click **What we charging for** in the upper part of the page to see how many credits are charged per each operation and how pricing is applied to your plan. ### Top up the credit balance [#top-up-the-credit-balance] Add more credits to your balance using cryptocurrency. Go to **Credits** in the main menu. Click **+ Top up** in the balance section (upper part of the page). In the **Top up credits** popup, select the payment currency and enter the amount you want to add. Review the auto-calculated number of credits, then confirm the payment, and follow the instructions on the payment page to send funds from your wallet. A **cross-chain transfer** moves funds from your account on one network to a recipient on another network, without leaving the B2BINPAY DeFi interface. Transfers are routed through the account [queue](queue) for multisig approval, the same way as payouts. You reach the feature from the [Apps](apps) catalog: open the **Cross-chain transfer** card on the **Apps** page. ## Availability [#availability] Cross-chain transfers are available only when the provider is enabled for your account and the current network has bridgeable assets. When the service is unavailable, the app card is disabled and a tooltip explains why. ## Make a cross-chain transfer [#make-a-cross-chain-transfer] ### Open the form [#open-the-form] On the **Apps** page, click the **Cross-chain transfer** card. ### Choose source and destination [#choose-source-and-destination] Select the currency to send from your account, the destination network, and the currency to receive on that network. Only assets and network pairs that can be bridged are offered. ### Enter the amount and recipient [#enter-the-amount-and-recipient] Enter the amount to send and the recipient address on the destination network. A quote is fetched automatically and refreshed as you type. It shows the amount that will arrive, the bridge fee, the route, and the estimated delivery time. Each quote has a countdown and refreshes automatically when it expires. ### Confirm [#confirm] Review the confirmation summary — source and destination networks, the next queue **Nonce**, recipient address, amounts, fee, and route — then confirm. Confirming does not send funds immediately. It creates an operation in the account [queue](queue) and assigns it the next nonce. ### Collect signatures [#collect-signatures] Go to the [Queue](queue) page and open the cross-chain transfer operation. The required number of account signers must sign it before it can run. See [Sign transactions](queue#sign-transactions). ### Execute [#execute] Once all required signatures are collected and the operation has the smallest nonce in the queue, execute it to send the transfer on-chain. See [Execute transactions](queue#execute-transactions). The bridge fee is paid in the network's native coin and is debited from the account balance in addition to the transfer amount. Make sure the account holds enough of both the currency you send and the native coin to cover the fee. ## Track a transfer [#track-a-transfer] After execution, the transfer is delivered across chains by the bridge. Open the operation details to follow its progress through the delivery states — from *Awaiting confirmation* and *Transfer initiated* to *Cross-chain delivery in progress*, and finally *Delivered* or *Delivery failed*. The details view also provides a link to the cross-chain explorer and the destination transaction hash once the funds arrive. The **dApps** feature lets you connect external decentralized applications to your B2BINPAY DeFi account through the **WalletConnect** protocol. Connected dApps can request transactions and message signatures, which are routed to the account queue for multisig approval. The **dApp connection** control is only visible when both conditions are met: * The current account is on an **EVM-compatible network** (the feature is not available for TVM networks such as Tron). * The account's smart contract version is **1.1.0 or later**. For earlier contract versions, upgrade the account to use dApps. ## Access the dApp panel [#access-the-dapp-panel] The dApp connection control is located in the header, next to the wallet selector. The button indicates the current state: * **No badge, no dot**: No active sessions and no pending messages. * **Green dot**: At least one active dApp session. * **Red badge**: Pending messages or transactions from connected dApps await approval in the queue. The badge shows the number of pending items. Click the button to open the **dApp** side panel, which contains the URI input field and the list of active sessions. ## Common use cases [#common-use-cases] ### Connect a dApp [#connect-a-dapp] Connect a new dApp to the current account using a WalletConnect URI. In the external dApp, choose **WalletConnect** as the connection method and copy the connection URI (for example, `wc:...`). In the B2BINPAY DeFi app, click the **dApp connection** button in the header. Paste the URI into the **WalletConnect URI** input and click **Connect**. In the **Session approval** popup, review: * The dApp **name**, **icon**, and **URL**. * The **verification status** — `VERIFIED`, `UNKNOWN`, or a warning if the dApp is flagged as malicious. * The list of **networks** the dApp requests access to. * The **connected account address**. Then click **Approve** to establish the session or **Reject** to cancel the request. The **Approve** button is disabled if the dApp requests unsupported WalletConnect methods or is flagged as malicious. In those cases, only **Reject** is available. ### Approve a dApp transaction request [#approve-a-dapp-transaction-request] When a connected dApp requests a transaction, a modal appears for your review. In the **Transaction approval** popup, review: * The **dApp** name and icon. * The **From** and **To** addresses. * The transaction **Value**. * The raw **Data** (hex calldata) — use the **Copy** icon to copy it. * The **Decoded data** section, when available — shows the function signature and parameter values. Click **Approve** to send the request to the queue as a dApp transaction, or **Reject** to decline. Open the **Queue** page to collect required signatures and execute the operation. See [Queue](queue) for details. ### Approve a dApp message signature request [#approve-a-dapp-message-signature-request] When a dApp requests a personal or typed-data signature, a separate modal appears. In the **Message signature** popup, review: * The **dApp** name and icon. * The **Message** contents. * The **Required signatures** count for the current account. * The **Address** and raw **Hex** under the collapsible details section. Click **Sign** to add the message to the queue for multisig signing, or **Reject** to decline. ### View and disconnect active sessions [#view-and-disconnect-active-sessions] Click the **dApp connection** button in the header to open the side panel. Under the URI input, review the list of active sessions with dApp names, icons, and session details. Click the **Disconnect** action next to a session to terminate it and confirm the action in the popup. Disconnecting does not cancel pending dApp transactions already in the queue — handle them on the **Queue** page. ## dApp-initiated transactions in the queue [#dapp-initiated-transactions-in-the-queue] Transactions created from a dApp request appear in the **Queue** list with the following characteristics: * The **Operation** column shows the **dApp name and icon** instead of a generic type label. * Clicking the dApp name link opens the dApp's URL in a new tab. * Canceling or deleting the operation from the queue sends a cancellation event back to the dApp. For the full queue workflow, see [Queue](queue). An **invoice** is a request for cryptocurrency payments that generates a unique deposit address for receiving funds. Funds received to this address must be [claimed](#claim-funds) to the account address (smart contract). ## Invoice list [#invoice-list] On this page, you can view a list of all invoices created for your accounts. The following information is provided about each invoice: **ID** The unique system identifier of an invoice.\ This is a link to invoice details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the invoice was created. *** **Updated at** The date and time of the most recent status change or payment receipt. *** **Currency** The payment currency or asset list. * If a single currency was selected, this field shows the asset symbol and name. * If more than one currencies were selected, this field shows the number of selected assets. * If no currency was specified, this field displays `—` and payers can pay the invoice in any supported currency. *** **Requested amount** The amount to be paid in the selected currency. * If a single payment currency was specified, this field shows the requested amount. * If no currency or more than one currencies were specified, this field displays `—`. The value can be specified when creating an invoice and can be modified later. *** **Paid amount** The total amount paid so far, in the payment currency. * If more than one currencies were specified, this field displays the amount converted to the account base currency. * If no payments were received, this field displays `—`. *** **Status** The current invoice status. Possible values: * **Created**: The invoice was created and is awaiting payments. * **Paid**: The invoice with the indicated amount was paid in full (for invoices with indicated amount). * **Unresolved**: The amount of an incoming transfer is greater than the invoice amount (for invoices with indicated amount). *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. This value can be specified when creating an invoice and can be modified anytime. ## Invoice details [#invoice-details] To access invoice details, click an invoice **ID** in the invoice list. In the upper part of the page, you can find essential information about the invoice — click the **chevron** icon to expand it: * The invoice identifier and current status. * The payment currency (if defined). * The requested amount (if specified). * The paid amount. * The created and updated timestamps. * The invoice address. * The link to the payment page. The information below is divided into tabs. On this tab, you can access and change invoice settings and advanced options. If the currency was selected for the invoice, the following fields are available: **Currency** The payment currency associated with the invoice. *** **Status** The current invoice status. *** **Requested amount** The invoice amount, in the payment currency. *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other invoice events. Can be changed anytime. *** **Payment page URL** The link that is displayed as a button on the payment page. Can be changed anytime. *** **Payment page button name** The custom name of a button displayed on the payment page. Can be changed anytime. On this tab, you can find a list of transfers associated with the invoice. **ID** The unique system identifier of a transfer.\ This is a link to transfer details. *** **Created at** The date and time when a transfer was received by B2BINPAY. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain transaction identifier, the same as the transaction hash.\ This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The transaction amount, in the payment currency. *** **Blockchain fee** The blockchain fee charged for this transfer, in the payment currency.\ The total fee reflects all claim attempts, including failed ones. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Operation ID** For invoices and payouts: The unique operation identifier in the system. This is a link to operation details. On this tab, you can view claim operations related to the invoice and trigger new claims. At the top of the tab, a set of cards may show uncollected balances per network or currency, including: * **Uncollected tx**: The number of transactions that were deposited but not yet claimed. * **Uncollected balance**: The total amount available to claim for this currency. Each card contains a **Claim** button that starts a [claim flow](#claim-funds) for that asset. On this tab, you can view a list of callbacks sent for the invoice. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. ## Common use cases [#common-use-cases] The **Invoices** page helps create payment requests, monitor their status, and claim collected funds.\ This section describes common scenarios step by step. ### Create a new invoice [#create-a-new-invoice] Create a new invoice and generate a payment page for your customers. Go to **Invoices** in the main menu. Click **Create invoice** in the upper‑right corner. Fill in the **Main details**: * From the **Payment currency** dropdown, select the asset you want to receive or leave the field empty if the payer should be able to pay in any supported currency. * In the **Amount** field, optionally enter the amount to be paid in the selected currency. If you leave this field empty, the invoice will not enforce a specific amount. Fill in the **Advanced options**: * In the **Tracking ID** field, optionally enter an invoice identifier to track the invoice-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about invoice events. * In the **Payment page URL** field, provide the link that should be displayed as a button on the payment page. * In the **Payment page button name**, specify the custom name of a button displayed on the payment page. Click **Create**. The newly created invoice will appear in the list. You can access and manage its settings anytime by clicking the invoice **ID**. ### View invoice details [#view-invoice-details] Track invoice-related transfers, callbacks, and claims. Go to **Invoices** in the main menu. In the invoice list, locate the required invoice and click its **ID** to open details. Switch to the **Transfers** tab to see all payments associated with the invoice, including **Status**. Switch to the **Claims** tab to review claim operations and their statuses or to see uncollected balances per currency. Switch to the **Callbacks** tab to review callback history. ### Claim funds [#claim-funds] Claim funds that were deposited to the invoice address but not yet collected to the account. Go to **Invoices** in the main menu and click the required invoice **ID**. Switch to the **Claims** tab and locate cards with uncollected transactions and a non‑zero uncollected balance. Click **Claim** on the card. In the **Sign claim** popup, review the details, and click **Sign**. Repeat for other claims. After the claim is completed, it will disappear from the **Claims** tab. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. You can also claim funds from the [Claims](claims) page, including batch claiming of several transactions at a time. The **Overview** page is the dashboard you see right after you sign in and select an account. It summarizes your account activity in one place and gives you quick shortcuts to the most common actions. To open it, go to **Overview** in the main menu. ## Select a time period [#select-a-time-period] A period selector at the top of the page controls the time range used for the activity cards and charts. You can choose: * **Last week** * **Last month** * **Last quarter** The totals, inflow and outflow figures, and the finance volume chart update to reflect the selected period. Balances and pending operations always show the current state, regardless of the period. ## Summary cards [#summary-cards] The upper part of the page shows three summary cards with the headline numbers for your account. * **Total balance**: The total value of your account across all assets, converted to your [base currency](../get-started/key-terms#base-currency), along with the **Uncollected funds** that are still waiting to be claimed from invoice addresses. Use the **Claim** action to collect those funds. * **Total invoices**: The number of invoices created in the selected period and the **Inflow** they generated. Use the **Invoice** action to create a new invoice. * **Total payouts**: The number of payouts in the selected period and the **Outflow** they represent. Use the **Payout** action to create a new payout. All amounts are shown in your base currency. ## Asset allocation and finance volume [#asset-allocation-and-finance-volume] The middle section gives you a more detailed view of where your funds are and how they move over time. * **Asset allocation**: A breakdown of your account balance by asset, showing each currency and its share of the total. If you have no assets yet, the card explains that assets appear automatically after you claim an invoice or receive a payment. * **Finance volume**: A chart of inflow and outflow over the selected period. You can switch between a bar chart and a line chart. The chart stays empty until you create your first invoice or payout. ## Status cards [#status-cards] The lower section helps you keep track of operations, credits, and network health. * **Network status**: The synchronization state of each supported network — **Synced**, **Syncing**, or **Unavailable** — together with the **Last block** processed for the network. Use this card to confirm that the app is up to date with the blockchain before you act on balances or operations. * **Operations in queue**: The number of multisig operations **Ready to execute** and the number **Waiting for sign**. Use the **Check** action to open the [Queue](queue) and sign or execute pending operations. * **Credit balance**: Your current **Credit balance**, the amount **Burnt** in the selected period, and the **Forecast expenses** per month. Use the **Top Up** action to add credits. For details, see [Credits](credits). The Overview reflects the network selected in the app header. Switch the network to see balances, activity, and pending operations for a different blockchain. A **payout** is an outgoing on‑chain transfer from your account.\ Payouts are created in the app and added to the queue with a specific nonce, signed by account members, and executed once the required signatures are collected. ## Payout list [#payout-list] On this page, you can view a list of all payouts created for the selected account and network. The following information is provided about each payout: **Payout ID** The unique system identifier of a payout.\ This is a link to payout details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the payout was created. *** **Updated at** The date and time of the most recent status change for the payout. *** **Amount** The payout amount, in the payment currency. *** **Currency** The payout currency. *** **Created by** The account name and address of the user who created the payout. *** **Receiver** The receiver’s address or saved contact name, shown in a short format. *** **Status** The current payout status. Possible values: * **Created**: The payout has been initialized in the system but has not yet been signed. * **Signed**: The transaction has received the required number of signatures. * **Sent**: The signed transaction has been sent to the blockchain and is awaiting confirmation. * **Executed**: The transaction has been successfully confirmed on the blockchain and the payout is considered complete. * **Failed**: The transaction failed during signing, sending, or blockchain confirmation. * **Canceled**: The transaction was replaced, rejected, or deleted by a user. *** **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. This value can be specified when creating a payout and can be modified anytime. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron** icon to expand it: * The payout identifier and current status. * The address and name of the user who created the payout. * The payout currency. * The payout amount in the payment currency. * The created and updated timestamps. * The receiver name and address in short format. * The number of collected and required signatures, for example `3/3`. The information below is divided into tabs. On this tab, you can view a list of account members that signed the payout. On this tab, you can view a list of callbacks sent for the payout. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. On this tab, you can access and change payout settings. **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other payout events. Can be changed anytime. ## Common use cases [#common-use-cases] The **Payouts** page helps create on‑chain withdrawals, coordinate signatures, and monitor payout callbacks.\ This section describes common scenarios step by step. ### Create a new payout [#create-a-new-payout] Create a new payout. Go to **Payouts** in the main menu. Click **Create payout** in the upper‑right corner. Fill in the **Receiver** info: * In the **Receiver address** field, enter the address where funds will be sent. You can select a receiver from the [Address book](address-book) (if added). Fill in the **Payment details**: * From the **Payment currency** dropdown, select an asset to be withdrawn. * In the **Amount** field, enter the payout amount in the selected currency. Fill in the **Advanced options**: * In the **Nonce** field, specify the transaction nonce number used in the queue for this payout.\ By default, the field is prefilled with the next number in the queue. - If you leave the value as is, the payout is added as the last transaction in the [queue](queue). - If you set a value higher than the latest nonce in the queue, the payout is added as a new transaction that will be executed after existing ones. - If you set the nonce to match an existing transaction, a replacement transaction is created and both transactions are treated as [conflicting](queue#handle-conflicting-transactions) in the queue. - If you try to set a nonce lower than the first transaction in the queue, the *Nonce cannot be lower than first transaction in the queue* error appears and the payout can't be created. * In the **Tracking ID** field, optionally enter a payout identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about payout events. Click **Create** and confirm the payout details. The newly created payout appears in the list with the *Created* status and is added to the [Queue](queue) with the specified nonce. ### View payout details [#view-payout-details] View full payout information, including signers and callbacks. Go to **Payouts** in the main menu. In the payout list, locate the required payout and click its **ID** to open details. In the upper part of the page, review the payout status, the number of collected and required signatures, and other details. On the **Signed by**, view the list of members who have already signed the payout. Switch to the **Callbacks** tab to review callback history. Switch to the **Settings** tab to view or adjust **Tracking ID** and **Callback URL**. The **Queue** is a list of multisig operations that were created for the account but are not yet fully executed. The number of new operations requiring your attention is displayed on the counter near the **Queue** menu item. Each operation uses a **nonce** and requires a certain number of signatures from account members.\ Transactions must be processed in order: an operation with a smaller nonce needs to be executed before any operation with a larger nonce. ## Queue list [#queue-list] The information on this page is divided into tabs. On this tab, you can view a list of operations that are still waiting for signatures or execution. The first block on the tab highlights the transaction that needs to be executed first.\ This block corresponds to the operation with the smallest **Nonce** in the queue. The following information is provided about each pending operation: **Nonce** The sequential number used by the smart contract to keep transactions in the correct order. The queue is sorted from the smallest nonce to the largest. *** **Created at** The time when the operation was added to the queue. The value is shown as relative time (for example, *5 minutes ago*) and can be viewed as a date and time in the details. *** **Operation** The type of the pending operation. Possible values: * **Payout** * **Multisig config change** * **Reject** * **Cross-chain transfer**: A transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **dApp transaction**: For operations initiated by an external dApp connected via WalletConnect, the column shows the dApp name and icon instead of the generic label. See [dApps](dapps). *** **Amount** For operations that change balances: the amount of the transaction. Amounts that reduce the balance are shown with a minus sign and include the currency, for example `-1,056.06 ETH`. For configuration operations, the value displays `—`. *** **Signatures** The number of collected signatures versus the required number, in the `X/Y` format (for example, `2/5` or `5/5`). *** **Action** The set of actions available for the current user and operation state. Possible values: * **Sign**: Available if the current user has not yet signed the operation and is allowed to sign it. * **Execute**: Available when all required signatures are collected and the operation has the smallest nonce in the queue. When an action is not available, the corresponding button is disabled or hidden. ### Operation details [#operation-details] Click the **chevron icon** to expand the operation details: **Created at** The date and time when an operation was created. *** **Created by** The account name and address of the user who created the operation. *** **Signed by** The list of accounts that already signed the operation, shown with names and addresses in the expanded view. *** **Action** Additional actions available for the current user and operation state. Possible values: * **Copy link**: Copy a direct link to the operation. The link can be shared with other signers to speed up collaboration. * **Reject**: Available when the operation can be replaced or canceled. On this tab, you can view a list of executed and failed operations. The table structure is similar to the **Pending** tab and additionally displays the **Status** column: all operations here are assigned a final status — *Success* or *Failed*. The history view helps trace which actions were executed, by whom, and with which result. ## Common use cases [#common-use-cases] The **Queue** page helps coordinate multisig actions between several accounts.\ This section describes common scenarios step by step. ### View the operation queue [#view-the-operation-queue] Review pending operations and see which transaction needs to be executed first. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. In the **This transaction needs to be executed first** block, review the first transaction with the smallest **Nonce**. Scroll down to the **Pending transactions** section to see all remaining operations in the queue, ordered by nonce from smallest to largest. If the queue is empty for the selected network, the *There are no transactions yet* message appears instead of the table. ### Sign transactions [#sign-transactions] Sign a pending operation so that it can eventually be executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation that requires your signature and verify that: * Not all required signatures are collected. * The **Sign** action is available, which confirms that you haven't yet signed it and you're authorized to. Then click **Sign**. In the **Sign transaction** popup, review and verify operation details before signing, and then click **Sign**. The **Sign** action for the corresponding operation will gray out signaling that you've already signed the operation. If your signature is the last required one, both **Sign** and **Execute** actions may be available, allowing you to sign and immediately [execute](#execute-transactions) the operation when conditions are met. ### Execute transactions [#execute-transactions] Execute a fully signed operation and send it to the blockchain. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to execute and verify that: * The required number of signatures is collected. * There are no other pending operations with a smaller **Nonce**. * The **Execute** action is available. Then click **Execute**. In the **Confirm transaction** popup, review the operation details and estimated fee, and then click **Execute**. The operation will display the *Executing* status for some time, and then will be moved from the *Pending* tab to the *History* tab. If your wallet lacks enough funds to cover the fee, the *Your connected wallet does not have enough funds to execute this transaction* error appears and the **Execute** button becomes disabled. ### Reject or replace transactions [#reject-or-replace-transactions] Reject or replace a queued transaction before it's executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to reject, expand the transaction row and click **Reject** if the option is available. Choose one of the available options in the popup: * **Replace with another transaction**: Propose a new transaction with the same nonce. Follow the creation flow in the opened transaction form or reuse an existing transaction from the queue; both the original and replacement transactions then appear as [conflicting](#handle-conflicting-transactions). * **Reject transaction**: Create an on‑chain cancellation transaction with the same nonce. Confirm the action in the **Reject transaction?** popup. After signing, a separate rejection transaction appears in the queue as [conflicting](#handle-conflicting-transactions) and can be executed instead of the original transaction. * **Delete from queue**: Remove the transaction locally (available when only one transaction with this nonce exists). Confirm your choice in the **Delete transaction?** popup. A new, empty transaction slot with the same nonce becomes available. ### Handle conflicting transactions [#handle-conflicting-transactions] Handle several transactions with the same nonce and execute only one of them. Go to **Queue** in the main menu. Identify groups of transactions marked as conflicting, indicated by a message *Conflicting transactions. Executing one will automatically replace the others.* Review the details of each conflicting transaction to decide which one should be executed. Execute the chosen transaction following the steps in [Execute transaction](#execute-transactions). After the chosen transaction is executed, check that **Execute** becomes unavailable for other conflicting transactions and that they disappear from the queue. ### Batch execution [#batch-execution] Execute several fully signed and sequential transactions in a single blockchain transaction. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Verify that: * There are multiple transactions in the queue. * All of them are fully signed. * Their nonces form a continuous sequence (for example: `5`, `6`, `7`). * The **Execute batch** button above the table is available. Then click **Execute batch**. In the **Batch execution** popup, review a list of transactions to be executed and their details and then click **Execute**. The executed transactions will be displayed on the *History* tab. ### View the queue history [#view-the-queue-history] Review the history of previously signed and executed operations. Go to **Queue** in the main menu. Switch to the **History** tab. Review the list of past operations. If needed, open the details for a specific operation to see its parameters and the list of signers. Use filters or sorting (where available) to focus on a particular period, operation type, or status, such as *Failed* operations that may require attention. **Staking** lets a TRON account freeze TRX to obtain **Energy** or **Bandwidth**, take part in TRON governance by voting for Super Representatives, and delegate resources to other addresses. Like every account action, staking operations are performed by your multisig account: each one enters the [Queue](queue) and must collect the required number of signatures before it executes. Energy and Bandwidth are renewable resources: TRON regenerates them over time. Use them to pay for your account's transactions without burning TRX, so processing on TRON costs you nothing while enough resource is available. ## Availability [#availability] Staking is available only when both conditions are met: * The active network is a **TVM (TRON)** network. * The account is **deployed** on that network and its smart contract version supports staking (version **1.2.1** or later). When staking is available, a **TRX Staking** group with the **Staking**, **Voting**, and **Delegation** items appears in the main menu. If the account isn't deployed on the selected network, a *No deployment in this network* placeholder is shown instead. The account balance shown on the **Account** and **Payouts** pages is the *spendable* amount. TRX that is staked, pending unstake, or waiting to be withdrawn is excluded, so it can't be spent by mistake. ## Staking [#staking] To open the page, go to **Staking** in the main menu. The upper part of the page shows four summary cards, each with its own action: * **Available**: The amount of TRX that can be staked. Use the **Stake** action to freeze TRX for Energy or Bandwidth. * **Staked**: The amount currently frozen. Use the **Unstake** action to begin releasing it. * **Pending unstake**: The amount that is unstaking and maturing before it can be withdrawn. Use **Cancel unstaking** to return it to the staked balance. * **To be withdrawn**: The matured amount ready to return to the account. Use the **Withdraw** action to collect it. Below the cards, a table lists staking operations with their status. Click a row to open the operation details. ### Stake TRX [#stake-trx] Freeze TRX to obtain Energy or Bandwidth. Go to **Staking** in the main menu and click **Stake** on the **Available** card. In the **Stake** popup, choose the resource to obtain — **Energy** or **Bandwidth**. Enter the amount of TRX to stake. The minimum is **1 TRX**. A preview shows the approximate amount of the resource you will receive at current network rates. Click **Stake**. The operation is added to the [Queue](queue), where the required number of signers must approve and execute it. ### Unstake TRX [#unstake-trx] Begin releasing staked TRX back to the account. Go to **Staking** in the main menu and click **Unstake** on the **Staked** card. Select the resource to release and enter the amount, at least **1 TRX**. The popup explains that unstaked TRX matures for a fixed number of days before it can be withdrawn. Click **Unstake** and approve the operation in the queue. The amount moves to the **Pending unstake** card. When it matures, it moves to **To be withdrawn**. While an amount is pending unstake, you can use **Cancel unstaking** to return it to the staked balance without waiting for the maturation period. ### Withdraw TRX [#withdraw-trx] Collect matured TRX back to the account balance. Go to **Staking** in the main menu and click **Withdraw** on the **To be withdrawn** card. Review the amount and click **Withdraw**, then approve the operation in the queue. Once executed, the withdrawn TRX is added back to the spendable account balance. ## Voting [#voting] The **Voting** page lets the account use its staking power to vote for TRON **Super Representatives** and claim voting rewards. To open it, go to **Voting** under **TRX Staking** in the main menu. The page shows three summary cards: * **Total** voting power and the amount **Available** to allocate, with the **Vote** action. * **Allocated** voting power, with the **Get Vote** action to obtain more voting power by staking. * **Claimable rewards**, with the **Claim** action. Below the cards, a table lists Super Representatives with your current votes. You can search and sort the list to find a specific representative. ### Vote for Super Representatives [#vote-for-super-representatives] Go to **Voting** in the main menu and click **Vote**. Allocate your available voting power across one or more Super Representatives. Confirm and approve the operation in the [Queue](queue). Voting power comes from staked TRX. If you don't have enough, use **Get Vote** to stake more TRX first. ## Delegation [#delegation] The **Delegation** page lets the account delegate its Energy or Bandwidth to another address and reclaim it later. To open it, go to **Delegation** under **TRX Staking** in the main menu. The page shows a delegation summary and a table of active delegations, each with the recipient address, amount, resource, and lock state. Use **Reclaim** in a row to return delegated resources to the account; the action is unavailable while a delegation is still locked. ### Delegate resources [#delegate-resources] Go to **Delegation** in the main menu and click **Delegate**. Enter the recipient address, the amount, and the resource to delegate — **Energy** or **Bandwidth**. The minimum is **1 TRX** of staked value. Confirm and approve the operation in the queue. **Transfers** are incoming or outgoing transactions made to or from your account. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your account. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically and can’t be modified. *** **Created at** The date and time when a transfer was created. *** **Operation** The transfer type. Possible values: * **Invoice**: The incoming payment associated with an invoice. * **Direct deposit**: The direct crediting of funds to an account address. * **Set account config**: The changing of an account configuration, such as adding/removing signers or modification of confirmation rules. * **Claim**: The claiming of funds from a deposit address to the account address. * **Payout**: The withdrawal of funds from an account. * **Cross-chain transfer**: The transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **Reject**: The operation rejection. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain identifier of a transaction, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The amount of a transfer, in the payment currency. For invoices, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. ## Transfer details [#transfer-details] To access transfer details, click a transfer **ID** in the transfer list. In the upper part of the page, you can find the essential information about the transfer — click the **chevron icon** to expand it: * The transfer identifier and current status. * The account address and name of a user who created the operation. * The payment currency. * The payment amount. * The date and time the transfer was created. * The TXID. This a link to the explorer. * The identifier of a related operation. This is a link to an invoice or payout. * The number of confirmations the transaction received on the blockchain. * The blockchain fee charged for transaction processing, in the payment currency. Below you can see a list of callbacks sent: **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values depend on the operation type (invoice or payout). *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. Bank withdrawals in fiat currencies are only available from Merchant wallets denominated in fiat currencies. To withdraw funds, you have to provide your bank details in advance. Consult your B2BINPAY manager about the procedure. Only users with the *Owner* role can create bank withdrawals. You can create a one-time withdrawal or regular withdrawal which is triggered every time when the wallet balance reaches a specific value. ## One-time withdrawals [#one-time-withdrawals] Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **One-time withdrawal** option and click **Proceed**. Select the bank details. In the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. Click **Submit** to create the withdrawal. After the withdrawal is created, it’s sent to the B2BINPAY Finance department for confirmation. Once confirmed and processed, the corresponding transfer will be assigned the *Confirmed* status. ## Regular withdrawals [#regular-withdrawals] Only one regular withdrawal can be connected to one wallet. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **Regular withdrawal when the amount is reached** option and click **Proceed**. Select the bank details. Select the withdrawal option: * **Fixed amount**: To withdraw funds immediately after the required amount is reached on the wallet. * **Changing amount**: To additionally specify the minimum amount that should be left on the wallet after the withdrawal. For fixed amount, in the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. For changing amount, specify the minimum non-reducible amount and minimum withdrawal amount. Click **Proceed** to create the withdrawal. After the withdrawal is created, you can see the **Regular withdrawal connected** tag near the corresponding wallet on the **Wallet management** > **Wallets** page. You can delete the regular withdrawal in the wallet settings. ## Deposits to Enterprise wallets [#deposits-to-enterprise-wallets] To create a deposit to your Enterprise wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited and click **Proceed**. Only Enterprise wallets are displayed in the list. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Address type** — for deposits to wallets denominated in BTC: an address format. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * the **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. ## Deposits to Merchant wallets [#deposits-to-merchant-wallets] To create a deposit to your Merchant wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited. Only Merchant wallets are displayed in the list. After you specified the wallet, a list of available payment currencies are displayed. Select the payment currency or activate the **Payer will choose currency by himself** toggle to allow your payers to select the payment currency. In this case, you’ll see a list of currencies available for payments. All payments will be credited in your wallet currency. If you specify the payment currency, below the currency list you’ll see the current exchange rate. Select the required option and click **Proceed**. If you select the payment currency, you can’t change this value after creating the deposit. If you don’t specify the payment currency, you can change this value later, until a payer selects the currency. 6\. If needed, specify the **Limits**. You can set: * the deposit amount in your wallet currency. You can change this value later. If you specify this value and the payment currency, the requested amount in the payment currency will be calculated automatically, according to the exchange rate displayed below. * the delta in your wallet currency. This value is only applicable if the requested amount is specified. You can change this value later. * the requested amount in the payment currency (only if you specified the payment currency). You can change this value later. If you specify this value, the requested amount in the wallet currency will be calculated automatically, according to the exchange rate displayed below. * the date and time when your deposit expires. You can change this value later anytime before the expiration time. You can change these values anytime. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Payout**. Select the type of a wallet: mark the **Enterprise wallet** or **Merchant wallet**, and then click **Proceed**. In the dropdown, select a wallet from which the payment amount will be debited. Only wallets of the selected type are available. For payouts from Merchant wallets, select the payment currency. If the payment currency differs from the wallet currency, the exchange rate is displayed. Enter the payment amount: * For Enterprise wallets, in the wallet currency. * For Merchant wallets, in the wallet or payment currency. Alternatively, you can select a percentage of your wallet balance to automatically calculate the payout amount. Possible options: 25%, 50%, 75%, or 100%. If needed, activate the toggles: * **Fee is included**: To deduct the blockchain fee from the payment amount, the remaining part will be credited to the receiver’s wallet. * **Commission is included**: To deduct the platform commission from the payment amount, the remaining part will be credited to the receiver’s wallet. If the toggles are inactive, the blockchain fee and platform commission are additionally debited from your wallet. If you selected **100%** in the previous step, the toggles are activated by default. The amount to be credited to the receiver’s wallet is calculated as *Available wallet balance* – (*Blockchain fee* + *Commission*). In the payout confirmation window, you'll see the **To be sent** amount which is the precise sum that will be credited to the receiver’s wallet. After making the payout, your wallet will have zero balance. For ETH, BSC, and TRX blockchains, the resulting balance may be positive due to the floating blockchain fee value. In the **Address** field, enter the destination address. You can save the entered address to your address book by activating the **Save to address book** toggle. Next time you can just pick it from the list by clicking **From address book**. For XRP and XLM, you can’t transfer funds within the same blockchain wallet. Choose the blockchain fee mode and click **Proceed**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. If needed, specify the **Advanced options** and click proceed. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. Click **Proceed** to create the payout. The newly created payout is now available in the payout list where you can monitor its status. Click the payout **ID** to access the details. If your payout got stuck on the blockchain due to low fee paid, refer to [How to speed up your payout by changing the blockchain fee](how-to-speed-up-your-payout-by-changing-the-blockchain-fee) to learn how to fix it. Internal transfers can be made between Merchant wallets denominated in the same currency and belonging to the same *Owner*. Such transfers are executed [off-chain](../../references/key-terms#off-chain-transaction) and aren't subject to any fees. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Internal transfer**. From the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets are available for selection. From the next dropdown, select a wallet to which funds should be transferred. Only Merchant wallets denominated in the same currency as the source wallet are available for selection. Enter the transfer amount. Alternatively, you can select a percentage of the source wallet balance to automatically calculate the transfer amount. Possible options: 25%, 50%, 75%, or 100%. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. The speed of the transaction processing depends on the blockchain fee selected when creating a payout: the lower the fee, the longer the transaction processing time. The following fee modes are available: * **Low**: The economy mode when speed doesn’t matter. * **Medium**: The optimal processing speed for a reasonable blockchain fee. * **High**: The priority transaction processing via high blockchain fees. * **Custom**: The customized fee value: you can specify your own blockchain fee value. Mind that your custom value can’t be two times lower than the *Low* value and three times higher than the *High* value. The blockchain fee can vary, therefore we suggest that you refer to the links containing blockchain gas[^1] fees in the table below for more precise information about blockchain fee values. | Blockchain | Links for reference | | --------------- | ------------------------------------------------------------------ | | BNB Smart Chain | [https://bscscan.com/gastracker](https://bscscan.com/gastracker) | | Ethereum | [https://etherscan.io/gastracker](https://etherscan.io/gastracker) | [^1]: Commission charged for processing token transactions in the Ethereum blockchain. If your payout got stuck on the blockchain due to low fee paid, it’s possible to speed up its processing using the **Replace by fee** option. Go to **Transfers**. Select the transfer you need to speed up: filter transfers by the *Payout* type and *Unconfirmed* status. Click the transfer **ID** to go to payout details. Click the **Replace by fee** button. If a payout can’t be replaced, the button isn’t displayed. Select the new blockchain fee value and click **OK**. The updated fee level should align with the blockchain's fees. The existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. ## Create Swap wallets [#create-swap-wallets] To swap currencies, you need to have Swap wallets denominated in these currencies. For example, if you want to swap USDT for EUR between your Merchant wallets, you need to create two Swap wallets: one denominated in USDT and another denominated in EUR. Refer to [Create a Swap wallet](../manage-your-wallets/how-to-create-a-wallet#swap-wallets) for step-by-step-instructions. ## Top up the source Swap wallet [#top-up-the-source-swap-wallet] Transfer the funds you want to exchange to the created Swap wallet. 1. Go to **Swaps** > **Wallets**. 2. Select the required wallet and click the **wallet icon (Funds)**. 3. In the **Top up** section, select an Enterprise or Merchant wallet from which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Create a swap operation [#create-a-swap-operation] Next, create a swap operation to exchange funds between your Swap wallets. 1. Go to **Swaps** > **Swap**. 2. Select a tab for the desired swap mode: * **No slippage**: No slippage will be applied, the swap will be processed at the shown price unless it changes significantly. * **Client's slippage**: Your specified slippage will be applied, the swap will be processed at the latest price unless the set **Slippage tolerance** is exceeded. 3. In the **From** section, select a source Swap wallet from which you want to swap funds. 4. In the **To** section, select a target Swap wallet to which you want to swap funds. 5. Enter a swap amount, in either the source (**From**) or target (**To**) currency. The equivalent amount in the other currency is calculated automatically and along with the actual exchange rate is displayed below. 6. If you selected the **Client's slippage** mode, in the **Slippage tolerance** field, specify the acceptable price deviation threshold, in percents, or select from the predefined options. 7. Click **Preview swap** and check operation details. 8. Click **Confirm** to create a swap. The newly created swap operation is now available on the **Swaps** > **History** page where you can monitor its status and related payments. ## Withdraw funds from your Swap wallet [#withdraw-funds-from-your-swap-wallet] Finally, withdraw the exchanged funds from your Swap wallet to your Merchant or Enterprise wallet denominated in the same currency. 1. Go to **Swaps** > **Wallets**. 2. Select a wallet from which you want to withdraw funds and click the **wallet icon (Funds)**. 3. In the **Withdraw** section, select an Enterprise or Merchant wallet to which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds to an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers to Enterprise wallets are credited after receiving enough confirmations on the blockchain. Only users with the *Owner* role can access Custody wallets. ## Top up your Custody wallet [#top-up-your-custody-wallet] To top up a wallet: Go to **Custody** > **Wallets**. Select a wallet that you want to top up and click the **Funds** button. Select **Top up funds** and click **Proceed**. From the dropdown, select a wallet from which funds should be transferred. You can select: * Any Merchant wallet. * An Enterprise wallet denominated in the same currency as the target Custody wallet. Enter the amount of transfer. The amount must be greater than or equal to the minimum transfer amount set for the target Custody wallet. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Custody** > **History** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Withdraw funds from your Custody wallet [#withdraw-funds-from-your-custody-wallet] Mind that to withdraw funds from your Custody wallet, you have to pass video verification. The Accumulated commission will be charged from the Custody wallet along with a withdrawal. To withdraw funds: Go to **Custody** > **Wallets**. Select a wallet from which you want to transfer funds and click the **Funds** button. Select **Withdraw funds** and click **Proceed**. To withdraw funds **to an Enterprise or Merchant wallet**: 1. Select the **Wallet** destination. 2. From the dropdown, select a wallet to which funds should be transferred. The target wallet must be denominated in the same currency as the source Custody wallet. To withdraw funds **to an external address**: 1. Select the **External address** destination. 2. From the dropdown, select a network. 3. Enter the destination address. Enter the amount of transfer. When transferring funds to **an Enterprise or Merchant wallet**, choose the blockchain fee mode. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. Activate the **Fee is included** toggle to deduct the blockchain fee from the transfer amount, the remaining part will be credited to the target wallet. For example, if the amount is 100 and the fee is 20, then 80 will be credited (*100 – 20*). If the toggle is inactive, the blockchain fee is additionally debited from the source wallet. Click **Proceed**. Optionally, specify the **Advanced options**. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the withdrawal-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Click **Proceed**. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. In the popup, check the withdrawal details and click **Confirm**. To process a withdrawal, you have to pass video verification. Click **Complete verification** to proceed. You can do it later on the **Custody** > **Requests** page. The newly created withdrawal is now available on the **Custody** > **Requests** page where you can monitor its status. Mind that the withdrawal may take up to 48 hours to complete after submitting and passing video verification. You can add an address to the whitelist, so that payouts made to such an address will not require approval, regardless of their amount or the role of the user who made such a payout. You can create a whitelist either for a specific wallet or for the entire blockchain. In the latter case, the whitelist will apply to all your wallets on that blockchain. The wallet-level whitelists have priority over the blockchain-level whitelists. Only users with the *Owner* role can whitelist payout addresses. To whitelist addresses, you must have 2FA enabled. ## Whitelist an address for a blockchain [#whitelist-an-address-for-a-blockchain] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To blockchain** tab, select a blockchain from the **Blockchain** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Blockchains** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. ## Whitelist an address for a wallet [#whitelist-an-address-for-a-wallet] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To wallet** tab, select a wallet from the **Wallet** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Wallets** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. You can also manage whitelisted addresses on the **Address whitelist** tab in the wallet details. Only users with the *Owner* role can create wallets. ## Enterprise wallets [#enterprise-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Enterprise wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If you select a token as the wallet currency, you’ll be additionally asked to select a [parent wallet](#user-content-fn-1)[^1]. For wallets denominated in ETH, TRX, BNB, XRP, or XLM, select a wallet from which the [Activation fee](#user-content-fn-2)[^2] will be deposited, or enable the **Activate wallet later** toggle. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Minimum transfer amount** — the minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount will be automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more comma-separated email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. Wallets denominated in ETH, TRX, BNB, XRP, or XLM require the [Activation fee](#user-content-fn-2)[^2]. If you enabled the **Activate wallet later** toggle while creating such a wallet, it will remain in the *In progress* status. Deposit the required amount of funds to the wallet to activate it. You can find the deposit address in the wallet details. ## Merchant wallets [#merchant-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Merchant wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Site URL** — a link to your landing page or any other resources. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. ## Swap wallets [#swap-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Swaps** > **Wallets**. Click **Add swap wallet**. Select a wallet currency and click **Confirm**. Swap wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. The newly created wallet is now available on the **Swaps** > **Wallets** page and can be topped up and used for swap operations. ## Custody wallets [#custody-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Custody** > **Wallets**. Click **Add custody wallet**. Select a wallet currency. Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. Click **Proceed**. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. Click **Confirm** to create the wallet. The newly created wallet is now available on the **Custody** > **Wallets** page and can be topped up. [^1]: Enterprise wallet to which a token wallet is linked. [^2]: A deposit to activate your wallet. For more details: [#activation-fee](../../references/key-terms#activation-fee "mention") You can generate a report on wallet balances and transactions for a specific time period, and download it as a CSV file. The report contains information about all your Enterprise and Merchant wallets existing in the system during the specified time period. A report on wallet balances contains information about wallet transactions and balances for the custom time period. To create a report: Click your user icon in the upper right corner of the page and select **Reports**. Click **Download report**. Click the **calendar icon** to pick up start and end dates of the reporting period. Click **Download** to start creating the report. Mind that the report generating may take some time. Once generated, it’ll be automatically downloaded to your computer as a zip-archive containing the report file in the CSV format. In the downloaded report, for each wallet all possible transfer types are listed, regardless of the actual amount of funds. Refer to [Transfer types](../../references/transfer-types) for more details about operations. You can grant access to your Enterprise and Merchant wallets to other members of your team. Only users with the *Owner* role can grant access to wallets. To grant access, you need to add a new user and assign them a user role. Access can be managed either centrally from your profile menu, where you can see a list of all users and the wallets they have access to, or from the wallet details, where you can see the users who have access to that specific wallet. This article is focused on adding users. If you need to revoke access, refer to [How to restrict access to your wallet](how-to-restrict-access-to-your-wallet). If you need to adjust user roles, refer to [How to manage user roles](how-to-manage-user-roles). ## From your profile menu [#from-your-profile-menu] ### Add a new user [#add-a-new-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, click **Add new user**. From the dropdown, select a wallet to which you want to share access. Enter the email address of a user to whom you want to grant access. Click **Add**. A new user will be added to the **Staff** tab. By default, users are assigned the *Read only* role. See [How to manage user roles](how-to-manage-user-roles) for step-by-step instructions on how to change it. ### Share access to an existing user [#share-access-to-an-existing-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user to whom you want to grant access. Click **Add wallet access**. From the **Wallet** dropdown, select a wallet to which you want to share access. From the **Role** dropdown, select a role that you want to assign. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Add**. The user now have access to the wallet according to the assigned role. ## From the wallet details [#from-the-wallet-details] To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to share access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, click **Invite user**. In the **Invite new user** popup, enter the email address of a user to whom you want to grant access and select a user role. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Confirm** to invite the user. The user will receive an email invitation with a link to activate access to the wallet. You can revoke access anytime in the wallet settings by deleting the user from the access list. You can manage access to your wallets by assigning different roles to users. Refer to [User roles](../../references/user-roles) for more details. You can change access for a single wallet or for multiple wallets at a time. Only users with the *Owner* role can assign user roles to other users. The *Owner* role can't be assigned or changed. ## For a single wallet [#for-a-single-wallet] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Hover over a required wallet and click the **pencil icon** that appears to the right. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the specific wallet. ## For multiple wallets [#for-multiple-wallets] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Mark the checkboxes of required wallets. Mark the top checkbox to select all wallets. From the **Action** menu above the wallet list, select **Edit access**. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the selected wallets. You can revoke access to your Enterprise and Merchant wallets from other members of your team. Only users with the *Owner* role can restrict access to wallets. To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to restrict access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, select a user and click the **pencil icon** to change a user role or the **bin icon** to revoke user access. Click **Confirm** to apply changes. For additional security measures, you can also limit access to the system by the IP white list. For step-by-step instructions, refer to [How to whitelist IP addresses](../manage-your-profile-and-system/how-to-whitelist-ip-addresses). You can set thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of the role of the user who created such payout. The thresholds can be applied to withdrawals made by specific users or user groups. Only users with the *Owner* role can set withdrawal thresholds. To set a threshold: Go to **Wallet management** > **Wallets**. Select a wallet for which you want to set thresholds and click its **ID** to open wallet details. Switch to the **Thresholds** tab. Enable the **Thresholds** toggle. In the **Approvers** section that appears, specify who can approve the payouts. You can select one or more user roles (the *Owner* role is selected by default and can be deselected), individual users, or both. Select a required option: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Click **Add new threshold**. To set a threshold for users, from the **User/User group** dropdown select **User**, and then select one or more emails. The threshold will be applied when the specified user will make a payout. To set a threshold for user groups, from the **User/User group** dropdown select **User group**, and then select one or more groups. The threshold will be applied when users from the specified groups will make a payout. In the **Number of confirmations** field, enter how many approvals the payout will require. The default value is 1. Enter a threshold amount. Payouts with amounts exceeding the specified value will require an approval. For the **Max sum of payout per timeframe** option, set a timeframe: * Select **Minute**, **Hour**, or **Day**. * Enter a value greater than 0 (zero). Click **Add**. The newly added threshold is now available in the list. When a payout exceeding a threshold amount is created, it appears on the **Events** page, where all assigned Approvers can review and confirm it. Once the required number of confirmations is received, the payout is processed. To change a threshold, hover over it and click the **pencil icon** to go to threshold settings. To remove a threshold, hover over it and click the **bin icon**, and then confirm the deletion. ## Obtain API credentials [#obtain-api-credentials] Only users with the *Owner* role can generate API credentials. To get access to API: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Manage API access** section, optionally whitelist IP addresses for API access: refer to [How to whitelist IP addresses](how-to-whitelist-ip-addresses#restrict-access-to-api) for step-by-step instructions. Enable the **Activate API user** toggle. In the **Your API access credentials** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated API key and secret are displayed in the popup. Use **Copy** buttons to copy values. Mind that the credentials only reveal once in this popup. They can’t be accessed after the popup is closed and have to be regenerated. Now you can access the system via the API. The new API user with the *Admin* role is automatically granted access to all your wallets. ## Security tips [#security-tips] If sharing your API keys with other persons to set up integrations: * Use password managers for secure credential sharing. * Whitelist IP addresses for API access. * Generate new credentials after the setup is complete. ## Obtain a callback secret [#obtain-a-callback-secret] Only users with the *Owner* role can generate callback secrets. To get a callback secret: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **Callback secret** tab. In the **Your callback secret** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated callback secret displayed in the popup. Use **Copy** button to copy the value. Mind that the callback secret only reveals once in this popup. It can’t be accessed after the popup is closed and has to be regenerated. Now you can use the callback secret for [deposit](../../api-guide/deposit-methods#callback-verification) and [payout](../../api-guide/payout-methods#callback-verification) callback verifications. To change your password, you must have access to your profile. If you forgot your password and can’t log in to the system, please click **Forgot password?** on the log in page and proceed with the password resetting procedure. If you suspect your account has been compromised, immediately contact your B2BINPAY manager. To change the password: Click your user icon in the upper right corner of the page and select **Settings**. In the **Password** section, click the **Change password** button. In the **Set new password** popup, enter your current password, then enter and repeat a new password. Mind that the password must meet the following requirements: * Latin characters, numbers, and special symbols are allowed. * The minimum length is 8 symbols. * At least one upper-case character must be used. Click **Confirm** to apply changes. Your password has been successfully changed. Use the Google Authenticator app for receiving *Payment system 2FA* verification codes. If you lost your device or forgot the secret code and can’t get access to your account, contact your B2BINPAY manager. Mind that in order to restore access, you’ll be asked to provide all the necessary documents to verify your identity. To enable 2FA: Click your user icon in the upper right corner of the page and select **Settings**. In the **Two-factor authentication** section, activate the **Google Authenticator** toggle. Download and install the Google Authenticator app from AppStore or Google Play, and then click **Proceed**. Scan the displayed QR code with Google Authenticator or enter the code manually, and then click **Proceed**. In the **Enable Google Authenticator** popup, enter your password and click **Confirm**. The 2FA is enabled. Next time you log in, you’ll be asked to enter a 2FA verification code provided via the selected method. Mind that 2FA codes are one-time and time-sensitive. You can add your personal account of the AML provider as an additional level of verification. If enabled, after successfully passing the default B2BINPAY AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. To enable custom AML check: Click your user icon in the upper right corner of the page and select **Settings**. In the **AML check** section, activate the toggle. In the popup: 1. Select an AML provider. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). 2. Enter your AML provider credentials: API key and API secret. 3. Specify **Risk for alert** to receive email notifications on suspicious transactions, and **Risk for block** to block them. The values from 0 (zero) to 100 are supported. 4. In the **Retries max** field, specify the maximum number of attempts to resend a request in case the AML provider doesn't respond. Click **Enable** to finish setup. The additional AML check is now enabled. All incoming transfers are now subject to two AML checks. You can disable custom AML check or edit credentials anytime in your profile. Use the partner program to earn a percentage of B2BINPAY commissions from clients who sign up using your referral link. This guide explains how to choose a wallet for rewards and generate your referral URL. Only users with the *Owner* role can configure the partner program. Before you start, make sure you have at least one **Merchant** wallet in USD. This wallet will be used to receive partner rewards. For details, refer to [How to create a wallet](../manage-your-wallets/how-to-create-a-wallet). To start a partner program: Go to **Partner program**. In the **How it works** section, click the **Terms & conditions** link to review the program settings. In the **Unique referral URL** section, click **Select wallet** and select your Merchant wallet is USD. Once the link is generated, use the **Copy** button to copy it to the clipboard. Share the copied URL with partners who want to join B2BINPAY. When an invited client signs up through your link, passes KYB checks, and starts processing eligible transactions, their commissions begin generating partner rewards for your legal entity according to the program settings. You can track invited clients, their statuses, and rewards on the **Partner program** page in the **Invited partners** table. You can limit access to your legal entity Web UI and API by whitelisting trusted IP addresses. We recommend that you use this option to protect your finances. Only users with the *Owner* role can whitelist IP addresses. ## Restrict access to Web UI [#restrict-access-to-web-ui] This setting will apply to all users under this particular legal entity, including the *Owner*. Enter IP addresses carefully, otherwise you risk losing access to the system. To let your users access the system only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **IP whitelist** tab. In the **Specify IP addresses** filed, click the **pencil icon** and add trusted IP addresses. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system Web UI is allowed only from the specified IPs. All users currently logged in from untrusted IP addresses will be logged out. ## Restrict access to API [#restrict-access-to-api] To let your users access the system API only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Whitelist IP access** field, click the **pencil icon** and add trusted IP addresses. Press **Enter** after each IP. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system API is allowed only from the specified IPs. On this page, you can view a list of balance operations on your Custody wallets. Only users with the *Owner* role can access this section. ## Operation list [#operation-list] The following information is provided about each operation: **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Operation** The transfer type. Possible values: * **Custody wallet withdrawal**: The withdrawal of funds from a Custody wallet to an Enterprise/Merchant wallet or to an external address. * **Custody wallet top up**: The deposit of funds to a Custody wallet from an Enterprise or Merchant wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the wallet currency. *** **Created at** The date and time when a transaction was created. Only users with the *Owner* role can access this section. **Requests** are orders to withdraw funds from your Custody wallets. Only users with the *Owner* role can access this section. For step-by-step instructions, refer to [Withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet#withdraw-funds-from-your-custody-wallet). ### Key points [#key-points] * Regardless of where the funds are withdrawn — to a Merchant or Enterprise wallet, or to an external address — video verification is required for any withdrawal request. * Once submitted, a withdrawal request may take up to 48 hours to complete. ## Request list [#request-list] The following information is provided about each request: **ID** The unique system identifier of a request. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Status** The current status of a request. Possible values: * **Created**: The withdrawal request was created, but video verification hasn't yet been passed. * **Approved**: The withdrawal request was approved by a Compliance officer. * **Declined**: The withdrawal request wasn't approved by a Compliance officer. *** **Created at** The date and time when a request was created. *** **Action** The buttons are available for the requests that haven't yet been reviewed by a Compliance officer. * **Cancel**: Click this button to cancel the request. * **Verification**: Click this button to proceed with video verification. **Custody wallets** are accounts with an additional level of security. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. * You can only create one Custody wallet per currency. * To withdraw funds from a Custody wallet, you must create a request, pass video verification, and receive approval from a Compliance officer. * Withdrawals from Custody wallets can be made to any external address as well as to Merchant or Enterprise wallets denominated in the same currency. * You can top up Custody wallets from your Merchant or Enterprise wallets. For Merchant wallets, conversion is possible. Enterprise wallets must be denominated in the same currency as the target Custody wallet. * Fees are applied for storing funds on Custody wallets. Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and for each withdrawal from the Custody wallet. ## Wallet list [#wallet-list] On this page, you can view a list of all your Custody wallets created in the system. Click the **%** button above the table to view the applied commission tiers. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance / Available for withdrawal** The current total balance and the balance available for financial operations. The available balance is calculated as *Balance* – *Accumulated commission*. *** **Accumulated commission** The fee for storing the funds accumulated to date. This value is calculated daily, according to the tiers that you can see by clicking the **%** button above the wallet. The commission is charged on the first day of each month and when withdrawing funds. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **Created at** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **Funds** button to top up or withdraw funds. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, type (`C` for Custody), and status. * The wallet currency. * The total balance. * The balance available for withdrawal (calculated as *Balance – Accumulated commission*). * The accumulated commission. * The total balance in conversion to USD. * The date and time when the wallet was created. ### Wallet settings [#wallet-settings] In this section, you can view and manage the following wallet settings: **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. The list can be changed anytime. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#custody-wallets) * [How to top up or withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet) On this page, you can view all swap and other balance operations related to your Swap wallets. The content of the page is divided into tabs: On this tab, you can view a history of swap operations between your Swap wallets. The following information is provided about each operation: **ID** The unique system identifier of a swap. This is a link to swap details. This value is generated automatically at the moment of swap creation and can’t be changed. *** **Status** The current status of a swap. Possible values: * **Success**: The swap has been successfully completed, balances of Swap wallets have been updated. * **Failed**: The swap hasn’t been completed due to some technical issues. *** **Wallet from** The identifier and currency of a debiting wallet. *** **Amount from** The swap amount, in the debiting wallet currency. *** **Wallet to** The identifier and currency of a crediting wallet. *** **Amount to** The swap amount, in the crediting wallet currency. *** **Pair** The currency pair. The first currency in the pair is the currency in which the swap amount was specified. *** **Rate** The exchange rate of the first currency in the pair to the second currency, valid at the moment of a swap operation. *** **Created** The date and time of swap creation. On this tab, you can view a history of swap-related transfers on your Swap wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The system identifier, type, label, and currency of a wallet to or from which the transfer was made. This is a link to wallet details. *** **Operation type** Possible values: * **Swap withdrawal**: The withdrawal of funds from a Swap wallet to an Enterprise or Merchant wallet. * **Swap top up**: The deposit of funds to a Swap wallet from an Enterprise or Merchant wallet. * **Swap charge**: The debiting of funds from a debiting Swap wallet. * **Swap enrolled**: The crediting of funds to a crediting Swap wallet. *** **Amount** The amount of a transfer without commissions, in the wallet currency. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Created** The date and time when a transaction was created. **Swaps** are exchange operations between your Swap wallets. For step-by-step instructions, refer to [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds). ### Key points [#key-points] * Swap operations are fast and convenient. * Swap operations are [off-chain](../../references/key-terms#off-chain-transaction), and hence don’t require [block confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Swap operations are possible only between your own Swap wallets denominated in different currencies. * You can exchange all [available currencies](../../references/currency-codes), including fiat, coins, and tokens. * Funds from your Swap wallets can be transferred to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, and vice versa. Refer to [Wallets](wallets) for more details. **Swap wallets** are your virtual wallets for swap operations. ### Key points [#key-points] * Swap wallets can be denominated either in crypto or in fiat currencies. * You can only create one wallet per currency. * Swap wallets aren’t linked to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, but you can top up your Swap wallets from your Enterprise or Merchant wallets. All balance operations are allowed only between wallets denominated in the same currency. For example, if you create a Swap wallet denominated in USD, you can top it up only from your Merchant wallet denominated in USD. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction), and hence require block [confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Balance operations between Swap and Enterprise/Merchant wallets are displayed on the **Wallet management** > **Transfers** page. Swap operations between Swap wallets are available on the **Swaps** > **History** page and aren’t displayed on the **Wallet management** > **Transfers** page. ## Wallet list [#wallet-list] On this page, you can view a list of all your Swap wallets created in the system. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance** The current balance available for financial operations. *** **Created** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **wallet icon** to top up or withdraw funds, and the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, the date and time when a wallet was created in the system. * The wallet currency. * The current balance. The following content of the page is divided into tabs: On this tab, you can access and manage wallet settings. **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. On this tab, you can grant access to your wallet to other users: * Click **Invite user** to grant them access to the wallet. * Click the **bin icon** near the added user to revoke access. Mind that no user roles are applicable to Swap wallets: all added users are granted full access to balance and swap operations. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#swap-wallets) * [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds) [TRX staking](../../references/key-terms#staking) is a process of freezing funds for a certain period of time to get resources and additional profit. ### Key points [#key-points] * When staking, you can “exchange” your funds for resources, such as bandwidth or energy, which allow you to save on blockchain fees. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are available immediately after staking and are replenished throughout the day. * When staked, the funds remain on your wallet but are locked and can’t be used for financial operations. * You can unstake funds at any time after staking, but keep in mind that the unstaking process takes 14 days on the blockchain. Until then your funds remain locked. Unstaking is limited to 32 pending transactions. * For each staked TRX, you receive one vote. You can give your votes to one or more [Super Representatives](../../references/key-terms#sr) to gain rewards for each voting round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-assign your votes at any time. * Staking is only available for wallet *Owners*. ## General information [#general-information] In the upper part of the page, you can review the conditions of the TRX staking: * **Term**: The minimum period for which funds are blocked. * **Min amount of funds to stake**: The minimum allowed amount of TRX that can be staked. * **Commission from the reward**: The commission amount that will be deduced from the reward amount. The withdrawabale amount is calculated as follows: *Amount to withdraw – (Amount to withdraw × Transaction fee/100%)*. ## Wallets [#wallets] In this section, you can view your wallets denominated in TRX. The following information is provided about each wallet: **Wallet** The information about your TRX wallet: the wallet identifier, type (always `E` for Enterprise), label (if set), and total balance. *** **Accumulated reward** The reward from staking, which can be withdrawn. *** **Available / Total votes** The amount of votes. The **Available votes** are votes that haven’t yet been distributed among SRs[^1]. The **Total votes** is the sum of distributed and undistributed votes. *** **Actions** The action buttons: * **Withdraw reward**: Clicking this button opens the **Withdraw reward** popup where you can review withdrawal details such as a target wallet, withdrawal amount, transaction fee, and so on. Mind that reward claiming is available only once in 24 hours. The button is inactive if the **Accumulated rewards** is 0 (zero) or the reward was claimed less than 24 hours ago. * **Get votes**: Clicking this button leads you to the **Resources** tab of the **Wallet details** where you can stake TRX to get votes. [^1]: Super Representatives. For more information, see [#sr](../../references/key-terms#sr "mention") **Callbacks** are `POST`-requests sent to your callback URL, to notify about transaction-related events in the system. For more information, see [Callback](../../references/key-terms#callback) ## Callback list [#callback-list] On this page, you can view a list of callbacks. The following information is provided about each callback: **ID** The unique system identifier of a callback. This is a link to callback details. *** **Time sent** The date and time when a callback was sent. *** **Type** The callback type. Possible values: * **Confirmation**: The transfer has received a required number of [block confirmations](../../references/key-terms#confirmation-block). * **Fail**: The transfer failed. * **No transfer**: The deposit has expired or the payout wasn't approved, no transfer was created. * **Request rejection**: The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. * **Block**: The deposit was blocked by an AML provider, the transfer was canceled. * **Cancel**: The payout was blocked by an AML provider, the transfer was canceled. * **User confirmation**: The transfer has received a number of [block confirmations](../../references/key-terms#confirmation-block) specified by a client to receive an additional callback. * **Manual**: The callback was resent manually. *** **URL** The callback URL specified when creating a deposit or payout. *** **Status** The current status of a callback. Possible values: * **New**: The callback was created but hasn't yet been sent. * **In progress**: The callback has been sent and awaits a response. * **Failed**: The callback was sent and a negative response from the client server was received. * **Sent**: The callback was sent and a response with the HTTP code `200` from the client server was received. *** **Attempts** The number of attempts to send a callback. *** **Transfer ID** The unique system identifier of a related transfer. This is a link to transfer details. *** **Action** In this column, you can click the **Resend** button to resend the callback. ## Callback details [#callback-details] To access callback details, click a callback **ID** the callback list. In the upper part of the page, you can find essential information about the callback — click the **chevron icon** to expand it: * The callback identifier and status. * The callback type. * The date and time when sent callback was sent. * The number of attempts to send the callback. * The identifier of a related transfer. * The callback URL along with the copy button. The information below is divided into tabs: On this tab, you can see the JSON payload of a callback. On this tab, you can see a response received (if any) from a client server. **Deposits** are invoices that you create to receive payments to your wallets. ### Key points [#key-points] * The system accepts payments only in cryptocurrencies. Fiat payments to [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies can be made via the B2BINPAY Finance department. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Each [on-chain](../../references/key-terms#on-chain-transaction) transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a deposit, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. The fee amount is selected by a payer. * Information about new transfers associated with a deposit can be sent to your system via a [callback](../../references/key-terms#callback). * Each deposit can be assigned a special identifier by which the related transactions can be tracked in an external system. * For each deposit, a payment page is automatically generated. It can be useful to send payment details to your payers. The exchange rate on the payment page is frozen for 15 minutes after its creation. * For Merchant wallets, it’s possible to set time limits to specify the sum or expiration time for a deposit as well as payment limits to address possible payment amount variations due to rate changes. ## Deposit list [#deposit-list] On this page, you can view a list of all deposits to your wallets. The following information is provided about each deposit: **ID** The unique system identifier of a deposit. This is a link to deposit details. This value is generated automatically at the moment of deposit creation and can’t be changed. *** **Created** The date and time when a deposit was created. *** **Updated** The date and time when the deposit status was last updated or payment received. *** **Wallet type** The type of a wallet to which deposit-related payments are made. *** **Wallet** The label or system identifier of a wallet to which deposit-related payments are made. This is a link to wallet details. *** **Address** The deposit address. This is a link to the explorer. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the address generated depending on the payment currency selected by the payer and can’t be changed. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the payment currency selected by the payer and can’t be changed. *** **Label** The tag or name assigned to a deposit for easier locating it in the system. This value is set when creating a deposit and can be changed anytime. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. This value is set when creating a deposit and can be changed anytime. *** **Status** *Available only for deposits to Merchant wallets.* The deposits to Enterprise wallets are always assigned the *Invoice* status. The current deposit status. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Requested amount** The requested amount, in the wallet currency (only for deposits with indicated amounts). This value is set when creating a deposit and can be changed anytime. *** **Requested rate** If the payment currency differs from the wallet currency, this is the current exchange rate of a payment currency to the wallet currency. This value is updated with each payment received or the deposit status updated. If the deposit currency wasn’t specified, this field is empty until a payer selects the payment currency. *** **Paid amount** The total amount of funds that have already been received to the deposit address, in the wallet currency. *** **Enrolled amount** The total amount credited, in the wallet currency. This value is calculated as *Paid amount – Total commission amount*. *** **Expired at** The date and time of deposit expiration (only for Merchant deposit with indicated expiration time). ## Deposit details [#deposit-details] To access deposit details, click a deposit **ID** in the deposit list. In the upper part of the page, you can find essential information about the deposit — click the **chevron icon** to expand it: * The deposit identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The deposit currency (if defined). * The deposit address (if the payment currency is specified). * The link to a payment page. * The paid amount in the wallet currency. * The enrolled amount in the wallet currency (*Paid amount – Total commission amount*). The information below is divided into tabs: On this tab, you can access and change deposit settings. The content on this tab differs for Enterprise and Merchant deposits. **Currency** The payment currency. Available only for deposits to Merchant wallets, if the payment currency wasn’t specified. *** **Status** The current deposit status. Available only for deposits to Merchant wallets. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Limits** *Available for deposits to Merchant wallets only.* The time and payment limits. **Requested amount in wallet currency** The deposit amount, in the wallet currency. *** **Delta** *Applicable for deposits to Merchant wallets with indicated amounts.* The payment delta, in the wallet currency. The delta can be useful to address possible rate changes. For example, you create a deposit for 100 USDT with the expiration time of 10 minutes without specifying the payment currency. This means that the payer can pay in any currency within 10 minutes. But the rate of the currency pair may change within the specified time. In order to minimize your risks, you can set the delta value, for example of 5 USDT, which means that you expect payment from 95 USDT to 105 USDT (depending on the rate) within 10 minutes. The delta can be also useful when the payment currency is the same as the wallet currency. For example, you create a deposit with the indicated amount of 0.1 BTC, and the payer sends 0.1 BTC minus the commission, and thus you don’t receive the full amount of the deposit and the deposit can’t be transferred to the *Paid* status. To avoid such situations, enter the delta value. Mind that the delta must be less than the requested amount. *** **Requested amount in payment currency** The deposit amount, in the payment currency. If the deposit currency wasn’t specified, this field is unavailable until a payer selects the payment currency. *** **Expired at** The date and time of the deposit expiration. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of a payment currency to the wallet currency. If the deposit currency wasn’t specified, this is the exchange rate to a base currency (USD). The exchange rates are automatically updated. Click the **refresh icon** to see the current value. **Advanced options** Additional deposit settings. **Label** The tag or name assigned to a deposit for easier locating it in the system. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. *** **Callback URL** The URL for callback notifications on new payments. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field received. *** **Payment page URL** The link that is displayed as a button on the payment page. *** **Payment page button name** The custom name of a button displayed on the payment page. On this tab, you can find a list of payments to your wallet associated with the deposit. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Currency** The payment currency. On this tab, you can view the deposit history. **Created** The date and time of an action. **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. **Reason** The action type. Possible values: * **Created**: The deposit has been created. * **Changed**: The deposit has been changed. * **Deleted**: The deposit has been deleted. **Comment** The description of the action. **Field name** The field that has been changed as a result of the action. **Old value** The previous state of the field. **Actual value** The new state of the field. **See also:** * [How to create a deposit](../../how-tos/manage-your-assets/how-to-create-a-deposit) **Events** are system notifications that require your attention or action. Some actions can only be performed by users with the *Owner* and *Admin* roles. ## Event list [#event-list] On this page, you can find a list of all events logged in the system. The number of new notifications is displayed on the counter near the **Events** menu item. The following information is provided about each event: **ID** The unique system identifier of an event. *** **Created** The date and time when an event was logged in the system. *** **Updated** The date and time when an event was last updated. *** **Type** The event type. Refer to the **Event types** section below for details. *** **Operation ID** For events related to deposits or payouts, this is the unique operation identifier in the system. This is a link to deposit or payout details. *** **Action** The action button(s) applicable for this event type. ## Event types [#event-types] In the table below, you can find descriptions of all system events. [^1]: A notification sent to a user’s callback URL when a new transaction occurs on the blockchain. For more information, see [#callback](../../references/key-terms#callback "mention") [^2]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^3]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^4]: A user-created token in certain blockchains. For more details, see [#custom-token](../../references/key-terms#custom-token "mention") **Payout** are payments, withdrawals, and transfers made from your wallets. ### Key points [#key-points] * The system supports payouts in crypto currencies. For [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies, the system supports [Bank withdrawal](../../references/key-terms#bank-withdrawal) in fiat currencies with various options: one-time withdrawals and regular withdrawals of a fixed or floating amount. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Payouts involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Payouts between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a payout, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. You can choose the fee amount when creating a payout. * Information about new transfers associated with a payout can be sent to your system via a [callback](../../references/key-terms#callback). * Each payout can be assigned a special identifier by which the related transactions can be tracked in an external system. * You can save frequently used addresses to the Address book to save up time when creating regular payouts. ## Payout list [#payout-list] On this page, you can view a list of all payout from your wallets. The following information is provided about each payout: **ID** The unique system identifier of a payout. This is a link to payout details. This value is generated automatically at the moment of payout creation and can’t be changed. *** **Created** The date and time when a payout was created. *** **Label** The tag or name assigned to a payout for easier locating it in the system. This value is set when creating a payout and can be changed anytime. *** **Wallet type** The type of a wallet from which the payout was made. *** **Wallet** The label or system identifier of a wallet from which the payout was made. This is a link to wallet details. *** **Receiver** The blockchain address (abridged) of a receiver’s wallet. This is a link to the explorer. *** **Receiver (full)** The blockchain address (full) of a receiver’s wallet. This is a link to the explorer. *** **Status** The current payout status. Possible values: * **Waiting for approval**: For a payout created by a user with the *Withdrawal with approval* role: the payout was created and awaits the approval. * **Approved**: The payout was approved. * **Canceled**: The payout was canceled. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. This value is set when creating a payout and can be changed anytime. *** **Amount** The payout amount, in the payment currency. *** **Charged amount** The payout amount, in the wallet currency, including commissions charged. *** **Updated** The date and time when the payout status was last updated. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron icon** to expand it: * The payout identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The payment currency. * The paid amount in the payment currency. * The total commission amount charged for payout processing. * The destination address. The information below is divided into tabs: On this tab, you can access and change payout settings. **Label** The tag or name assigned to a payout for easier locating it in the system. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. *** **Callback URL** The URL for callback notifications on new transactions. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field is received. *** **Receiver** The receiver type (natural or legal person) and name. *** **Address** The receiver’s address, as defined by postal services. On this tab, you can find a list of transactions associated with the payout. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Currency** The payment currency. On this tab, you can view the payout history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The payout has been created. * **Changed**: The payout has been changed. * **Deleted**: The payout has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. **See also:** * [How to create a payout](../../how-tos/manage-your-assets/how-to-create-a-payout) * [How to create a bank withdrawal](../../how-tos/manage-your-assets/how-to-create-a-bank-withdrawal) * [How to create an internal transfer](../../how-tos/manage-your-assets/how-to-create-an-internal-transfer) * [How to select the optimal blockchain fee](../../how-tos/manage-your-assets/how-to-select-the-optimal-blockchain-fee) * [How to speed up your payout by changing the blockchain fee](../../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) **Transfers** are incoming or outgoing transactions made to or from your wallets, such as deposits, payouts, activation fees, payments for custom tokens processing, and so on. For a full list of possible types, refer to [Transfer types](../../references/transfer-types). ### Key points [#key-points] * The list shows all transactions, including canceled, failed, and others. * In this section, you can’t create a new transaction. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the transaction currency always matches the wallet currency. For [Merchant wallets](../../references/key-terms#merchant-wallet), the transaction currency may differ from the wallet currency. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Some transactions between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. * Each deposit passes the [AML](../../references/key-terms#aml) check. The check is performed on the side of an AML provider connected using the B2BINPAY Back Office. If during the AML check a payment is considered suspicious (red), it’s assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. Additionally, [custom AML verification](../../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) can be enabled for incoming transfers. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Created** The date and time when a transfer was created. *** **Wallet type** The type of a wallet to or from which the transfer was made. *** **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **AML risk** The status of built-in AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Custom AML risk** If enabled, the status of custom AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The label or system identifier of a wallet to or from which the transfer was made. This is a link to wallet details. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The amount of a transfer, in the payment currency. For deposits, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Amount target** The total amount of a transfer, in the wallet currency. *** **Target currency** The wallet currency. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Operation ID** For deposits and payouts, this is the unique operation identifier in the system. This is a link to operation details. ## Transfer details [#transfer-details] To access transfer details, click a **Transfer ID** in the Transfer list. In the upper part of the page, you can find the essential information about the transfer: * The transfer identifier, current status, and AML check result. * The information about your wallet to or from which the transfer was made: the wallet identifier, type (`E` for Enterprise and `M` for Merchant), label (if set), and current balance. Below you can see the transfer details: **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **Created at** The date and time when a transfer was created. *** **Updated at** The date and time when a transfer status was last updated. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The total amount of a transfer, in the payment currency. *** **Amount target** The total amount of a transfer, in the wallet currency. This field is only visible if the payment currency differs from the wallet currency. *** **Commission** The B2BINPAY fee charged for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for transaction processing, in the payment currency. Applicable only for on-chain transactions. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Rate** The exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. This field is only visible if the payment currency differs from the wallet currency. *** **Callback** The callback status. Applicable only for deposits and payouts. Possible values: * **Not needed**: The *Confirmations needed* field wasn’t specified for an associated deposit or payout. * **Sent**: The callback is sent. * **Not sent**: The callback hasn’t yet been sent (not enough confirmations received yet). *** **Operation ID** The unique operation identifier in the system. Applicable only for deposits and payouts. This is a link to operation details. *** **Description** Any comment for an operation made via the B2BINPAY Back Office. *** **Replace by fee** This option is available for payouts that got stuck on the blockchain due to a low fee amount. It allows you to change the blockchain fee amount. As a result, the existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. **Wallets** are your B2BINPAY accounts denominated either in crypto or in fiat currency. ### Key points [#key-points] * B2BINPAY offers two types of wallets: [Enterprise](../../references/key-terms#enterprise-wallet) and [Merchant](../../references/key-terms#merchant-wallet). * Enterprise wallets can be denominated in any [crypto currency](../../references/currency-codes) supported by B2BINPAY. Fiat currencies aren’t supported for the Enterprise wallets. Such wallets have their own addresses. All transactions involving Enterprise wallets are executed [on-chain](../../references/key-terms#on-chain-transaction). * Merchant wallets are virtual wallets. These wallets don’t have their own addresses; instead, a deposit address is generated for each deposit made to such a wallet. The Merchant wallets can be denominated in fiat currencies and cryptocurrencies supported for Merchant wallets. Transactions between B2BINPAY Merchant wallets can be executed [off-chain](../../references/key-terms#off-chain-transaction). You can withdraw fiat funds from your fiat Merchant wallets using a [Bank withdrawal](../../references/key-terms#bank-withdrawal). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * The wallet currency is selected during the wallet creation and can’t be changed afterwards. * You can create numerous Enterprise and Merchant wallets. * You can grant access to your wallets to other users so that they can perform balance operations depending on assigned roles. * [Activation fee](../../references/key-terms#activation-fee) is required for Enterprise wallets denominated in ETH, XRP, XLM, or BNB currencies. You can activate such wallets by depositing funds from your Merchant wallets. * Wallets denominated in tokens require [parent wallets](../../references/key-terms#parent-wallet). The parent wallet must be an Enterprise wallet created in the same blockchain as the token. Commissions for token processing are deducted from the parent wallet. Each parent wallet can serve as the parent for a single token wallet, it’s not possible to link two token wallets to the same parent wallet. * Enterprise wallets in the ETH and BNB-BSC blockchains can be duplicated. For example, for your wallet in ETH, an identical wallet and contract in BNB-BSC can be created. This feature can be useful if clients mistakenly send funds to the wrong blockchain. Each wallet can only be duplicated once. * You can stake funds on TRX wallets to gain TRON blockchain resources and save on blockchain fees. ## Wallets list [#wallets-list] On this page, you can view a list of all your Enterprise and Merchant wallets created in the system. The following information is provided about each wallet: **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Wallet type** The type of a wallet: Enterprise or Merchant. This value was selected when creating a wallet and can’t be changed. *** **Balance** The balance available for financial operations. *** **Pending** The sum of all deposit- and payout-related transactions that haven’t yet received the required number of confirmation blocks or passed AML check. This value is positive for incoming and negative for outgoing transactions. This balance can’t currently be used for financial operations. *** **Status** The current status of a wallet. Possible values: * **Active**: The wallet has been activated (if required) and can be used. * **In progress**: The wallet is now being registered in the system or requires the activation and currently unavailable. * **Not active**: The wallet hasn’t been activated due to some technical or blockchain issues. *** **Action** In this column, you can click the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier and status. * The wallet currency. * For wallets denominated in tokens, the parent wallet. * The available balance. * The pending balance. * For Enterprise wallets, the wallet address; for wallets denominated in XRP, the address type is additionally available for selection: * `Address`: The deposit address; the destination tag should be additionally specified for sending funds. * `X-address`: The deposit address with the destination tag included in it. No need to specify the destination tag additionally. The following content of the page is divided into tabs: On this tab, you can access and change wallet settings. The content on this tab differs for Enterprise and Merchant wallets. **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Minimum transfer amount** *For Enterprise wallets only.* The minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount are automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. In this case, you can see a new transfer with the *Canceled* status on the **Wallet management** > **Transfers** page; the [callback](../../references/key-terms#callback) isn’t sent. You will also receive a notification on the **Events** page, where you can confirm and accept such transfers manually. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Customer support emails** The comma-separated list of your customer support email addresses. These emails are displayed on the Payment page, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. *** **Site URL** *For Merchant wallets only.* The link to your landing page or any other resources. *** **Regular withdrawals** *For Merchant wallets denominated in fiat currencies only.* In this section, you can create a one-time or regular bank withdrawal. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. *** **Duplication** *For Enterprise wallets in the ETH, BNB-BSC, MATIC, and AVAX blockchains only.* This option allows you to copy your wallet blockchain address and contract to another blockchain. This way you can prevent sending funds to a wrong blockchain by mistake on behalf of a sender. You can duplicate each wallet only once. *For Enterprise wallets denominated in TRX only.* On this tab, you can stake and unstake TRX, and overview your resources. *For Enterprise wallets denominated in TRX only.* On this tab, you can get votes for staked funds as well as distribute them among SRs[^1] to further gain rewards. On this tab, you can view a wallet history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The wallet has been created. * **Changed**: The wallet has been changed. * **Deleted**: The wallet has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. On this tab, you can whitelist addresses, so that payouts sent to these addresses don't require approvals. See [How to whitelist a payout address](../../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for more details. On this tab, you can limit withdrawal amounts. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of user roles. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. For each threshold, you can specify how many approvals are required and which user roles and/or specific users act as *Approvers*. For example, you can set fewer approvals for smaller payouts and more approvals for payouts with greater amounts. See [How to set withdrawal thresholds](../../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) for more details. On this tab, you can grant other users access to your wallet and manage permissions. A checkmark in the **Approver** column indicates that the user was added as an *Approver* on the **Thresholds** tab. See [How to grant access to your wallet](../../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) and [How to restrict access to your wallet](../../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) for more details on managing wallet access. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet) * [How to generate a report on wallet balances](../../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) [^1]: Super Representatives. For more details: [#sr](../../references/key-terms#sr "mention") Explore the interface basics, create your first wallet, and set up essential protection Explore the interface basics, create your first wallet, and set up essential protection Dive deeper in the product Web UI, features, and business logic behind it Dive deeper in the product Web UI, features, and business logic behind it Follow the step-by-step tutorials illustrating solutions to the most common tasks Follow the step-by-step tutorials illustrating solutions to the most common tasks Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses Get acquainted with key terms and catalogs of values which are found here and there Get acquainted with key terms and catalogs of values which are found here and there Identify and address common issues quickly and effectively with our guides Identify and address common issues quickly and effectively with our guides ## July 31, 2026 [#july-31-2026] ### New features [#new-features] #### Admin UI [#admin-ui] ##### Fee level selection for AML withdrawals [#fee-level-selection-for-aml-withdrawals] When withdrawing funds from a blocked transfer (**Transfer → Blocked → AML Withdrawal**), you now choose the blockchain fee level — **Recommended**, **Low**, or **Custom** — and see the fee amount with its fiat equivalent before confirming. Previously, only the withdrawal address could be set, and refunds sent with a low fee were sometimes rejected by the network. *** ### Improvements [#improvements] #### Admin UI [#admin-ui-1] ##### Safer forms and smoother sign-in [#safer-forms-and-smoother-sign-in] The Admin UI adopts several usability behaviors from the client interface. After signing in, you return to the page you originally tried to open instead of the home page. Create and edit forms — including wallets, deposits, notifications, transfers, refunds, and user creation — now warn about unsaved changes before you leave the page, and the cursor is placed in the first field automatically. *** ### Resolved issues [#resolved-issues] #### Client UI [#client-ui] * Fixed the read-only **Secret** field in callback settings accepting pasted text; the control for viewing the secret now keeps a stable size instead of expanding with scrollbars. ## July 29, 2026 [#july-29-2026] ### Improvements [#improvements-1] #### Admin UI [#admin-ui-2] ##### Faster commissions page [#faster-commissions-page] The default commissions page now loads faster and no longer creates noticeable database load on every visit. #### Client UI [#client-ui-1] ##### Toncoin becomes Gram [#toncoin-becomes-gram] Following the rebranding of The Open Network's native coin, **Toncoin (TON)** is renamed **Gram (GRAM)**, and the network's tokens follow the same pattern — for example, **USDT-TON** becomes **USDT-GRAM**. Only the currency names and tickers change — balances, wallets, and transfers are not affected. *** ### Resolved issues [#resolved-issues-1] #### Admin UI [#admin-ui-3] * Fixed the **Company**, **Wallet**, **Currency**, and **Blockchain wallet** filters on the finance transfers page showing *Error* for administrators with the **Finance read only** role. #### Client UI [#client-ui-2] * Fixed **Approve** and **Cancel** actions in **Events** staying available for payout approval requests whose auto-cancellation time had already passed. * Fixed expired payout approval requests being reactivated when the auto-cancellation timeout was increased — the deadline is now set when the request is created. * Fixed *Request Rejection* callbacks being sent with the *Unknown* type. * Fixed the email search in **Wallets → Thresholds** returning unfiltered results and breaking words across lines in the suggestion list. ## July 24, 2026 [#july-24-2026] ### New features [#new-features-1] #### Client UI [#client-ui-3] ##### Commissions tab with your full fee schedule [#commissions-tab-with-your-full-fee-schedule] Account owners now have a **Commissions** tab showing the commission ladder at a glance — your current turnover, commission tier, and rate — along with the full list of tiers, minimum blockchain fees for each network, and bank fees for deposits and payouts. *** ### Improvements [#improvements-2] #### Admin UI [#admin-ui-4] ##### Faster transfer lists [#faster-transfer-lists] Opening a client's list of transfers now takes under a second instead of tens of seconds, and pending AML compliance checks no longer create noticeable background load. ##### Neutral messages for unexpected server errors [#neutral-messages-for-unexpected-server-errors] When an unexpected server error occurs, the system returns a neutral message with a short error ID instead of internal technical details. Share this ID with support to have the issue traced quickly. *** ### Resolved issues [#resolved-issues-2] #### Admin UI [#admin-ui-5] * Fixed spurious *Can not lock transfer in node* incidents raised when a small deposit was canceled on networks without transfer-locking support — Solana, EVM-based networks, Tron, and Algorand. * Fixed Solana multi-address collections being rejected as a whole batch with an *InvalidPayoutParameters* error when the number of addresses exceeded node limits — addresses are now split automatically to fit. * Fixed transportation transfers getting stuck indefinitely when an address received more funds than expected during collection — extra incoming funds no longer block confirming transfers already completed on the blockchain. ## July 17, 2026 [#july-17-2026] ### New features [#new-features-2] #### Admin UI [#admin-ui-6] ##### Changed User and Legal Entity columns in Action Requests [#changed-user-and-legal-entity-columns-in-action-requests] The **Action Requests** list now shows a **Changed User** column — the account a request applies changes to — and a **Legal Entity Name** column, each with its own filter. The legal entity name also appears as a separate line in the request details, and the list can now be exported. #### Client UI [#client-ui-4] ##### Reworked approval flow for withdrawals [#reworked-approval-flow-for-withdrawals] Withdrawal approval requests for Enterprise and Merchant transfers in the same currency no longer expire after 15 minutes — the request stays valid until it is approved or rejected. For conversion payouts, the request now shows a countdown timer to automatic cancellation, visible both in the client interface and in the Admin UI. ##### Automatic callback on Callback URL changes [#automatic-callback-on-callback-url-changes] When you set or change the **Callback URL** of a deposit or withdrawal, a callback with the operation's current status is now sent automatically — no need to contact support to have it re-sent. Support staff can also update a deposit's **Callback URL** on your behalf. ##### Smoother sign-up, 2FA setup, and wallet access [#smoother-sign-up-2fa-setup-and-wallet-access] This release bundles several usability refinements. **One-time password entry at sign-up.** During registration, you now set your password once, after confirming your email address, instead of entering it several times. **Clear 2FA names.** Two-factor authentication entries in your authenticator app are now clearly named — *B2BinPay Auth 2FA* and *B2BinPay Ops 2FA* — and include your email address, so entries for different accounts are easy to tell apart. **Clearer error messages.** Messages now state exactly what to do — for example, *B2BinPay Ops 2FA must be enabled to process payouts* or *Accesses to wallets cannot be granted until user is activated*. **Wallet access for API users right after activation.** An API user can now be added to wallets as soon as it is activated, without having to sign in first. **Tidier lists.** The **Regular Withdrawal** column is hidden when bank withdrawals are not available, and identifiers now use a unified format — for example, *Wallet #888*. *** ### Improvements [#improvements-3] #### Admin UI [#admin-ui-7] ##### Faster lists and dashboard statistics [#faster-lists-and-dashboard-statistics] Heavily used list pages — blockchain wallets, addresses, deposits, and transfers — now load faster, and so do the deposits and payouts statistics on the dashboard. *** ### Resolved issues [#resolved-issues-3] #### Admin UI [#admin-ui-8] * Fixed a false *Collected amount mismatch* error: unrelated incoming funds on an address are now included in the expected collection amount, so transportation transfers no longer get stuck in *Need review*. * Fixed an AML check failure for withdrawals linked to transfers without an associated wallet, which prevented such withdrawals from being processed. * Fixed an issue where conversion payouts could expire automatically regardless of their status. ## July 10, 2026 [#july-10-2026] ### New features [#new-features-3] #### Admin UI [#admin-ui-9] ##### Invited by search matches legal entity names [#invited-by-search-matches-legal-entity-names] The **Invited by** search in the **Partner Program** now also matches legal entity names, so legal entities no longer drop out of the search results. ##### Role-aware data in lists and detail pages [#role-aware-data-in-lists-and-detail-pages] Lists and detail pages across the Admin UI now show data according to your role and permissions, so each administrator sees exactly what their access level allows. #### Client UI [#client-ui-5] ##### Sign-in opens the production environment [#sign-in-opens-the-production-environment] After you pass **KYB** verification, an interactive sign-in always opens the production environment instead of Sandbox. If you sign out from Sandbox and have several legal entities, the one you last opened is selected. ##### Inactive API users hidden from wallet access [#inactive-api-users-hidden-from-wallet-access] Wallet access rights now show only active **API users**. For a user whose API access is not yet activated, the **API access → Wallets** tab shows an empty list. ##### Refreshed interface visuals and 2FA setup [#refreshed-interface-visuals-and-2fa-setup] The interface gets a refreshed look aligned with the latest design system: dialog overlays are lighter in the dark theme, connecting **Google Authenticator** for two-factor authentication follows a new flow with the confirmation code entered directly in the dialog, and the **How it works** screens in **Staking** and **Wallets** feature refreshed, theme-aware illustrations. *** ### Improvements [#improvements-4] #### Client UI [#client-ui-6] ##### Smoother actions in the Events list [#smoother-actions-in-the-events-list] The **Actions** column in **Events** now keeps a stable width, so buttons no longer shift as you work. While an action is in progress, a spinner replaces the button, and repeated or conflicting actions are blocked; if an action fails, the row returns to its previous state. *** ### Resolved issues [#resolved-issues-4] #### Admin UI [#admin-ui-10] * Fixed transportation transfers being confirmed without verifying the collected amount against the deposits actually received on the node — a mismatch now raises an incident instead of silently overstating the **Locked in node** balance and causing false *insufficient funds* errors later. #### Client UI [#client-ui-7] * Fixed the **Apply** button in the date and time picker not appearing disabled when it was inactive. ## July 2, 2026 [#july-2-2026] ### New features [#new-features-4] #### Admin UI [#admin-ui-11] ##### Read-only admin pages for orders, payouts, and wallets [#read-only-admin-pages-for-orders-payouts-and-wallets] The Admin UI gains new read-only pages: **Orders** and **Payouts** under **Operations**, and **Blockchain Wallets**, **Global Wallets Balance History**, and **Global Wallets Staking** under **Wallets**. The **Payouts** and **Swap Wallets** sections are now available in read-only mode too — fuller visibility into operations and balances without changing any data. ##### USD volumes for transfers in Dealing [#usd-volumes-for-transfers-in-dealing] In **Trading → Orders**, transfers now carry the same USD-normalized base and quote volumes already shown for swaps, removing the manual rate calculations previously needed for some Merchant wallets. #### Client UI [#client-ui-8] ##### Initial deposit link for duplicated blockchain deposits [#initial-deposit-link-for-duplicated-blockchain-deposits] When a deposit sent on the wrong network is automatically re-created on the correct network, the resulting **Duplicated Blockchain deposit** event now links directly to the original deposit. Instead of tracing callback or tracking IDs by hand, open the event and follow the **Initial deposit** reference to the deposit details. Deposit details also gain **copy buttons** for the **Tracking ID** and **Callback URL** under **Advanced options**. *** ### Improvements [#improvements-5] #### Admin UI [#admin-ui-12] ##### Transfers list filters, columns, and links [#transfers-list-filters-columns-and-links] The Admin UI **Transfers** list gains a **Wallet Type** column, a filter by internal transfer type, and a filter by client or blockchain wallet ID. Global and blockchain wallets now have distinct labels, and each links through to its own page. ##### Audit log filtering by event type [#audit-log-filtering-by-event-type] Audit log tables now filter on the **Reason** column, so you can show only one event type — for example *Password changed* or *Payouts blocked* — across the brand, group, user, and legal-entity logs. ##### Localized operation log comments [#localized-operation-log-comments] Log **Comment** entries are now built from translatable parts (field name, reason, old and new values) instead of a fixed English string, so they display in the selected language across the Client Management and Wallets logs. ##### Multi-select currency filters [#multi-select-currency-filters] Currency filters now use the same multi-select control as the client interface, and long currency lists load in pages as you scroll instead of all at once — removing the brief freeze when opening the dropdown. Matches are ordered with exact matches first, then names starting with your query, then the rest. ##### Owner ID and Legal Entity columns in reports [#owner-id-and-legal-entity-columns-in-reports] The **Transfers** and **Wallets** reports now include **Owner ID** and, where applicable, **Legal Entity Name** columns in the exported files. *** ### Resolved issues [#resolved-issues-5] #### Admin UI [#admin-ui-13] * Fixed a duplicate **Label** column shown in the Admin UI Deposits list and its column configurator. * Fixed the wallet balance-at-date finance report failing to generate, which could leave an export hanging. ## June 26, 2026 [#june-26-2026] ### New features [#new-features-5] ##### Low balance notifications [#low-balance-notifications] You can now set a **balance threshold** for each wallet and be notified automatically when the wallet balance falls below it. Each wallet has its own threshold field, with the value denominated in the wallet currency. When the available balance drops below the configured value, a notification is sent so you can top up in time — helping you avoid situations where end-user withdrawals fail because of insufficient funds on the wallet. ##### Unconfirmed transaction callbacks [#unconfirmed-transaction-callbacks] The system now sends a callback as soon as an incoming transaction is detected on the blockchain, before it has gathered the number of confirmations required to become *Confirmed*. This lets you notify your end users that their payment has already been seen by the system and is simply awaiting confirmations, rather than lost or stuck on the network. The result is fewer support enquiries and a smoother payment experience. *** ### Improvements [#improvements-6] ##### Multi-select currency filters [#multi-select-currency-filters-1] The **Currency** filter has been upgraded from a single-select to a multi-select control, so you can now filter a list by several currencies at once instead of one at a time. The multi-select filter is available on the **Wallets**, **Deposits**, **Payouts**, and **Transfers** pages, as well as in the **Access list**, **Bank details**, **Custody**, and **Swaps** sections. ##### Wallet list card view refinements [#wallet-list-card-view-refinements] Following the card view introduced for transaction wallets in the previous release, the wallets list has been refined with a **sort selector** and an improved **Table / Cards** view toggle, so you can order and display your wallets exactly the way that works best for you. ##### Operation ID filter for Callbacks [#operation-id-filter-for-callbacks] The **Callbacks** list now includes an **Operation ID** filter. This makes it easier to track down a specific callback during investigations — including callbacks that have no associated transfer, such as the *Request rejection* and *No transfer* types. *** ### Resolved issues [#resolved-issues-6] * Fixed a false *insufficient fee* error (code 4009) that could appear when withdrawing certain tokens, such as USDT-TRX and USDT-BSC. * Fixed an issue where creating a custom token incorrectly required the **Balance shift amount** field to be filled in. * Fixed an issue where the daily *transfer growing total* report was not delivered to Report Subscriptions. ## May 23, 2026 [#may-23-2026] ### New features [#new-features-6] ##### Column-based table filters [#column-based-table-filters] Table filtering across the Web UI has been redesigned to match the standard data-handling experience you know from Excel and Google Sheets. Filters are now embedded directly into table columns instead of being grouped in the side panel. The side panel remains available only for filters that cannot be represented within a column (for example, complex multi-parameter filters). An always-active **Reset all filters** button has been added to clear all applied filters in one click, and the column configurator now uses an updated icon for clearer visual hierarchy. This change brings filtering closer to the tools you already use day-to-day, reduces the number of clicks needed to refine large lists, and provides a single consistent way to work with tables across the entire platform. ##### Repeat Payout for failed withdrawals [#repeat-payout-for-failed-withdrawals] A new **Repeat payout** button has been added for payouts that have failed and contain no successful transfers. Previously, a failed withdrawal could not be retried — you had to recreate it manually from scratch or contact support. The button appears on the payout details page when the payout has at least one failed transfer and no successful ones, and takes you to the payout creation form so you can submit a fresh attempt without re-entering all the details by hand. ##### Card layout for transaction wallets [#card-layout-for-transaction-wallets] The transaction wallets list now supports two display modes — the existing **Table view** and a new **Card view** that presents each wallet as a standalone card with all its key data: currency, label, ID, wallet type, balance, pending amount, and status. You can switch between views at any time using the toggle above the wallets list, choosing whichever layout works best for your current task. In addition, action buttons for **Deposit** and **Payout** are now available directly on each wallet entry — in both table and card views — allowing you to start the corresponding operation in one click without opening wallet details first. *** #### Improvements [#improvements-7] ##### IP whitelist enhancements [#ip-whitelist-enhancements] The IP whitelist functionality has been expanded to better support corporate clients and reduce accidental lockouts. **CIDR subnet support.** You can now whitelist entire IP ranges using CIDR notation (for example, `10.0.0.0/24`) instead of adding addresses one by one. Both IPv4 and IPv6 are supported, and you can freely combine single addresses, IPv4 subnets, and IPv6 subnets within a single whitelist. All existing whitelists continue to work without changes. When access is denied because of an IP restriction, the error message now includes the IP address you're connecting from, so you can quickly identify the issue and contact your administrator with the right information. **Self-lockout protection.** When you save a whitelist that does not include your current IP address, the system will now show a warning dialog with your current IP and ask you to confirm before applying the change. This helps prevent the most common cause of support requests — accidentally locking yourself out of the account. Your current IP address is also shown directly in the whitelist editor for reference. ##### Memo / Destination Tag emphasis on the Payment Page [#memo--destination-tag-emphasis-on-the-payment-page] For blockchains that require an additional parameter alongside the deposit address — **Ripple (XRP)**, **Stellar (XLM)**, and **The Open Network (TON)** — the Payment Page layout has been redesigned to make this requirement visually prominent for end users. This reduces the risk of payers submitting deposits without the required Memo / Destination Tag / Comment value, which previously led to unattributed deposits and additional load on Customer Support. ##### Additional columns in Events and Transfers tabs [#additional-columns-in-events-and-transfers-tabs] To make day-to-day account oversight faster and more accurate, two tabs have received new columns: * On the **Events** tab — **Amount** and **Tracking ID** columns. When reviewing payout requests submitted by users with the *Withdrawals with approval* role, you can now see the payout amount and Tracking ID directly in the events list and make approval or decline decisions without opening each request individually. * On the **Transfers** tab — a **Tracking ID** column, consistent with the same column already available on the Deposits and Payouts pages. This makes it easier to follow all transfers associated with a particular Tracking ID end-to-end. ##### Client UI unification [#client-ui-unification] A set of small but practical refinements has been applied across the Web UI to improve consistency and search ergonomics: * **Currency search** now matches both by alpha code and by full currency name, in every dropdown across the platform. * **Wallet search** now matches by ID, alpha code, currency name, and label. * The **Tag** input is now automatically disabled when an *x-address* is entered for Payouts, Custody Withdrawals, and Swap Withdrawals, preventing invalid combinations. * A **Commission is included** toggle has been added to Custody wallet withdrawals, matching the behavior already available for Enterprise wallets. * **Funds** and **Settings** controls in Swap wallets are now displayed as dedicated square buttons, in line with the rest of the wallet types. ## January 20, 2026 [#january-20-2026] ### New features [#new-features-7] #### Partner program [#partner-program] You can now launch a **Partner program** for your legal entity and earn from clients who join B2BINPAY through your referral link. For each invited client who signs up with your link, passes KYB, and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions. The new **Partner program** section in the left menu provides a dedicated dashboard to manage referrals and rewards. It shows your current percentage, total bonus, bonus for the previous month, and a detailed **Invited partners** list with registration dates, KYB status, and per‑client bonuses. Partner rewards are credited once per month based on B2BINPAY commissions from eligible transactions of referred clients. A new **Partner program** report is available in the **Reports** section. You can generate CSV or XLSX reports with bonuses per partner and for all referrals over a selected month or historical period, using the same data that powers the partner dashboard. #### Legal documents and contract management [#legal-documents-and-contract-management] A new **Legal documents** item has been added to the account menu. From this page, you can access and check the current version of your Terms & Conditions, as well as previous contract versions associated with your legal entity and jurisdiction. For new KYB requests, Terms & Conditions are now accepted as an offer agreement during the KYB initiation step instead of requiring a separate bilateral contract. #### Android app download [#android-app-download] The B2BINPAY Android app is now available directly from the Web UI. A new **Download Android app** section has been added to the account menu, redirecting you to the latest APK download location managed by the Android APK registry. *** ### Improvements [#improvements-8] #### Stronger password policy [#stronger-password-policy] Password rules have been tightened to improve account security. New passwords must contain at least twelve characters, including at least one uppercase letter, one lowercase letter, one digit, and one symbol, and must not contain spaces. You can no longer reuse your previous passwords when changing credentials. #### Withdrawal thresholds enhancements [#withdrawal-thresholds-enhancements] Withdrawal thresholds now give you more control over who approves payouts and how many approvals are required. For any Merchant or Enterprise wallet, you can set the number of required approvals and choose which roles or specific users act as *Approvers*. Approver status is shown in wallet access lists, and approvers can review and confirm payout requests on the **Events** page. This flexible setup can be used as a governance control layer for high‑value transactions when your policies require it. ## October 1, 2025 [#october-1-2025] ### New features [#new-features-8] #### Multi-authentication and social login support [#multi-authentication-and-social-login-support] **Google ID** and **Apple ID** can now be used for system authentication alongside the existing email login option, providing users with more convenient and secure access methods. #### Multi-entity user management [#multi-entity-user-management] The platform now supports advanced user management capabilities where a single user can be associated with multiple legal entities, each with distinct roles and permissions. Additionally, users can create their own sandboxes, automatically becoming *Owners* with the ability to initiate KYB processes for their businesses. #### BTC Testnet faucet [#btc-testnet-faucet] You can now utilize the Testnet faucet functionality to deposit test funds to your Sandbox wallets. Currently, the **BTC testnet faucet** is supported. #### Bank details management [#bank-details-management] A new **Bank details** section is now available in the **Profile menu**, allowing to store and manage multiple bank accounts (IBAN, SWIFT, IFSC, A/C No.) for fiat withdrawals. Each newly added bank record automatically triggers a Compliance review, and its status is clearly tracked as *Pending*, *Approved*, or *Declined*, ensuring only verified bank details are used for [bank withdrawals](references/key-terms#bank-withdrawal). #### New callback type [#new-callback-type] A new **Request rejection** callback type has been implemented that automatically handles failed payout approvals. This callback triggers when payouts requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — fail to receive confirmation within the specified timeframe or was manually cancelled by a user with proper rights. Your external system will now receive automatic notifications for these scenarios, eliminating the need for manual payout cancellation due to failed requests. #### Blockchain deposit recovery [#blockchain-deposit-recovery] For Ethereum-like blockchains, a common pool of addresses has been established. Now, when a deposit address is created on any ETH-like blockchain, the system instantly tracks activity associated with that address across all ETH-like blockchains. This feature eliminates the risk of missed transactions. #### New currency support [#new-currency-support] The platform now supports four additional cryptocurrencies: * RLUSD-ETH * USD1-BSC * SAFE-ETH * TRX-SOL *** ### Improvements [#improvements-9] #### Advanced swap operation controls [#advanced-swap-operation-controls] Two new swap operation settings have been introduced to provide greater control over trading execution. The **No slippage** setting implements an RFQ (Request for Quote) model with price updates every 5 seconds, executing swap requests only when price thresholds remain stable. The **Clients' slippage** setting allows users to specify acceptable price deviation percentages, executing trades at the latest price unless the configured slippage threshold is exceeded. Mode selection is available when creating a new swap operation. #### Staff access to Swap wallets [#staff-access-to-swap-wallets] Administrative staff can now be granted access to Swap wallets with full fund control capabilities without requiring specific user role assignments, streamlining operational management and providing greater flexibility in wallet administration. #### Streamlined legal entity selection [#streamlined-legal-entity-selection] The **Jurisdiction** dropdown has been replaced with a more intuitive **Legal entity** dropdown, significantly improving user experience when managing multiple legal entities within the same jurisdiction and providing clearer organizational structure. #### Enhanced pricing accuracy [#enhanced-pricing-accuracy] Deposit calculations now utilize VWAP (Volume Weighted Average Price) instead of Top-of-the-Book prices, providing more accurate and representative pricing that reflects actual market conditions and trading volumes. #### Centralized security management [#centralized-security-management] IP whitelist management has been restructured so that only *Owners* can configure and manage IP restrictions for all users within their organization, creating a more centralized and secure approach to access control. #### Optimized SOL transaction processing [#optimized-sol-transaction-processing] The SOL smart contract has been enhanced to support multiple transaction collections, allowing a single collection transaction to gather funds from up to 10 deposit addresses simultaneously. This optimization significantly reduces operational costs and improves transaction efficiency. #### Comprehensive localization enhancement [#comprehensive-localization-enhancement] The platform's internationalization capabilities have been substantially improved through integration with the [B2TRANSLATE](https://docs.b2translate.b2broker.com/) platform, providing support for additional languages while enhancing translation quality and consistency across the entire user interface. #### Currency naming clarification [#currency-naming-clarification] To prevent confusion with Binance's discontinued BUSD token, BUSD-T-BSC has been renamed to USDT-BSC throughout the interface, ensuring clear identification and reducing potential user errors in currency selection. ## August 1, 2025 [#august-1-2025] ### New features [#new-features-9] #### KYB verification system [#kyb-verification-system] We're excited to introduce **Know Your Business (KYB) verification**, a comprehensive business verification system that enables secure access to Coinsbuy production environment. This major enhancement transforms how businesses onboard and maintain compliance on our platform, providing a seamless path from testing to live operations. **Key features** * **Jurisdictions** The platform automatically detects jurisdictional requirements based on your country of incorporation, ensuring compliance with local regulations. To maintain ongoing compliance, the system implements periodic re-verification schedules that are clearly displayed in your dashboard. * **Streamlined verification process** We've partnered with [Sumsub](https://sumsub.com/), a leading verification provider, to deliver a secure and efficient KYB process. The system guides you through each verification step with clear instructions and contextual help. If additional documents are required, you can easily upload them through our secure interface. The process is designed to be flexible — you can exit at any point and resume where you left off, with all progress automatically saved. * **Status tracking & notifications** Real-time status updates keep you informed throughout the verification journey, from initial submission through final approval. Visual indicators appear throughout the platform when your attention is needed. You'll also receive email notifications for important status changes and document requests, ensuring you never miss critical updates. **Access & security** The KYB section is restricted to users with the Owner role, providing an additional layer of security for sensitive business verification processes. All document handling occurs through encrypted channels, and our compliance-first approach ensures we meet international regulatory standards. Production environment access is exclusively gated behind successful KYB approval, while the Sandbox environment remains freely available during the verification process. This clear separation ensures you can continue testing and integrating while completing your business verification. **How it works** You can initiate the KYB process any time after account creation, when you gain instant access to our Sandbox environment for testing and integration. When you're ready for production access, simply navigate to the KYB section and add your legal entity by providing basic business information. The system then guides you through verification with our Sumsub integration, which may include identity verification, document submission, and business legitimacy checks. If our verification partner requests additional information or documents, you'll see clear indicators and instructions for what's needed. Once your verification is approved, you immediately gain access to the production environment with full platform capabilities. #### Dual 2FA system [#dual-2fa-system] A new dual 2FA system with separate codes for authentication and operations has been implemented to strengthen account security. The system now uses two distinct 2FA codes: the **Authentication 2FA** that's mandatory for all users and required at every login, and the **Authorization 2FA for operations** that can be enabled in Profile Settings for sensitive actions like IP whitelist setup, API credentials generation, callback secret generation, and payout confirmation. This layered security approach provides enhanced protection by separating routine access from system operations, ensuring that even if one authentication method is compromised, your most sensitive account functions remain secure. #### API v3 [#api-v3] The new API v3 is designed to comply with the latest platform updates. Explore our new [API guide](api-guide/api-overview) and update your integrations accordingly, before the deprecated API v2 will be shut down on **December 1, 2025**. *** ### Improvements [#improvements-10] #### Payout enhancements [#payout-enhancements] Enterprise wallet withdrawals now feature a **Commission is included** toggle that's automatically enabled when selecting 100% of available funds, clearly indicating that the platform fees will be deducted from the payout amount. The payout confirmation window has been enhanced to display the **To be sent** amount, providing users with precise information about what the recipient will actually receive. #### Address whitelisting for Ripple-like blockchains [#address-whitelisting-for-ripple-like-blockchains] Ripple-like blockchains use an additional address tag to identify the recipient of a transaction. When whitelisting addresses on such blockchains, you can now specify the Address tag value along with the regular address. ## January 21, 2025 [#january-21-2025] ### New features [#new-features-10] #### Custody services [#custody-services] With this release, we're excited to introduce our new Custody services, designed to provide secure and efficient storage and management of funds. **Key features**: * **Secure storage**: Custody wallets ensure secure storage and are available only to users with the *Owner* role, requiring video verification for every withdrawal. * **Top ups**: Custody wallets can be topped up from your Merchant and Enterprise wallets. The transaction currency must match the currency of the Custody wallet. * **Withdrawals**: Withdrawals from Custody wallets can be made to Merchant and Enterprise wallets (without currency conversion), as well as to external addresses. * **Fees**: Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged monthly and with every withdrawal from the Custody wallet. Contact your manager to sign an additional agreement and enable the new **Custody** section in the main menu. #### Callbacks [#callbacks] All [callbacks](references/key-terms#callback) sent by the system can now be easily accessed and resent via the Web UI. Find the new **Callback** section under the **Wallet management** menu item. #### Internal transfers [#internal-transfers] A new payout type **Internal transfer** has been added, allowing you to transfer funds between Merchant wallets if they share the same currency and *Owner*. These transfers don't incur any fees since they're executed off-chain. You can find the new **Internal transfer** option on the **Wallet management** > **Payouts** page under the **Add new** menu. #### Custom AML check [#custom-aml-check] From now on, you can configure your own AML check, in addition to built-in verification provided by B2BINPAY. It can be useful if you need to carry out its own set of compliance procedures. The new **AML check** section has been added to the **Settings** page in your profile menu. #### Duplicated blockchain deposit event [#duplicated-blockchain-deposit-event] This newly added event type is triggered when a deposit is made in one currency but subsequently paid in another, resulting in its duplication on another blockchain. The duplicated deposit doesn't inherit the Tracking ID and Callback URL of the original deposit. With this event, you can manage these parameters to ensure proper tracking of duplicated deposits, eliminating the risk of their loss. #### New blockchain integrations [#new-blockchain-integrations] With this release, **The Open Network (TON)** blockchain has been integrated. Also, several new coins and stablecoins have been added: * ISO 1029 **TON** (The Open Network) * ISO 2032 **USDT-TON** (The Open Network) * ISO 2033 **NOT-TON** (The Open Network) * ISO 2034 **DOGS-TON** (The Open Network) * ISO 2035 **HMSTR-TON** (The Open Network) * ISO 2036 **FDUSD-ETH** (Ethereum) * ISO 2037 **FDUSD-BSC** (BNB Smart Chain) * ISO 2038 **CATI-TON** (The Open Network) * ISO 2039 **POL-ETH** (Ethereum) * ISO 2315 **BTCB-BSC** (BNB Smart Chain) *** ### Improvements [#improvements-11] * When creating a Bank withdrawal, you can now specify the **Amount to be withdrawn**, and the total amount including the commission will be calculated automatically. * The **Side collecting funds** transfers now always display the ID of the original deposit. * For security purposes, API credentials are now displayed only once when regenerated and will no longer be emailed to the *Owner*. * When logging in, users who haven't yet enabled IP whitelists will now see a popup reminding them to do so. Remember: IP whitelisting is effective in protecting your accounts and funds. Make sure you and your team members have it enabled. * An information icon has been added to the **Resources** tab in the wallet details, informing users of the 32 active unstaking transaction limit. When attempting to exceed this limit, a notification will appear. * The links to API docs and Release notes have been added to the Web interface. Access them at any time from your profile menu. *** ## Past releases [#past-releases] ### September, 2024 [#september-2024] #### New features [#new-features-11] ##### Enhanced security [#enhanced-security] With this release, several major updates have been made to improve security, among which are the following: * **Withdrawal thresholds** This new feature enables you to specify withdrawal thresholds that, when exceeded, will require *Owner*’s approval to make a payout. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to Approval request, but the approver must enter a 2FA code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Options can be used individually or in combination. Each option can be configured for individual users or user roles. Therefore, when limits are exceeded, approval requests will be triggered for payouts made by any user, not just those with the *Withdrawals with approval* role. All this gives you maximum flexibility in controlling your funds. Thresholds settings can be accessed on the new **Thresholds** tab in the wallet details. **Mind that** you need to have 2FA enabled to set thresholds. * **Address whitelists** This new option enables you to create and manage address whitelists. Payouts sent to whitelisted addresses will bypass restrictions related to thresholds or user roles. However, such payouts are still subject to our standard AML & KYC procedures. There are two options provided: * **Wallet-level whitelists**, considering payouts made from a specific wallet. * **Blockchain-level whitelists**, considering payouts made from any wallet in a specific blockchain. Click your profile icon in the upper-right page corner to access a newly added **Address whitelists** section. The section is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the newly added **Address whitelist** tab in the wallet details. **Mind that** you need to have 2FA enabled to whitelist addresses. * **Access list** The UI has been improved to easier manage access to your wallets. The API access in the profile menu has been replaced with a new Access list section, containing two tabs: * **Staff**: Here you can add new users to the system, assign roles, and grant or restrict access to specific wallets. * **API**: Here you can manage IP whitelists, API keys, and bulk grant or restrict access to their wallets. Other security improvements include: * **Login notifications**: Clients now receive an email notification upon logging in. * **Payout approval**: When approving a withdrawal, the Owner now sees an additional confirmation popup to prevent accidental approvals by mistake. * **2FA reminder**: Upon login, users who haven’t yet enabled 2FA will now see a popup urging them to complete the 2FA procedure. Remember: 2FA is essential for protecting your accounts and funds. Additionally, many new system features now require 2FA. Always ensure that you and your team members have it enabled. ##### New blockchain integrations [#new-blockchain-integrations-1] With this release, two new blockchains have been integrated: * Algorand * Solana Also, several new coins and stablecoins have been added: * ISO 1022 **ALGO** (Algorand) * ISO 2016 **USDC-ALGO** (Algorand) * ISO 2017 **USDT-ALGO** (Algorand) * ISO 1028 **SOL** (Solana) * ISO 2030 **USDT-SOL** (Solana) * ISO 2031 **USDC-SOL** (Solana) ##### Zendesk integration [#zendesk-integration] A new Helpdesk solution, **Zendesk**, has been integrated, providing AI support and knowledge base. Integration with SupportPal remains active in read-only mode, for ticket history. #### Improvements [#improvements-12] * The main enhancement in the current release is an **updated Enterprise commission model**, now focused on outbound transactions.This change better aligns with our clients’ business models and significantly reduces commissions. B2BINPAY now charges commissions on outgoing transactions from Enterprise wallets, rather than incoming ones. * The activation of Enterprise wallets denominated in ETH, TRX, BNB, XRP, or XLM has become user-managed. When creating such a wallet, you can now specify an Enterprise or Merchant wallet from which the activation fee should be charged. * A new **Target commission** field, displaying the commission amount converted to the wallet currency, has been added to the **Transfers** page and transfer details, as well as to the **Transactions** tab of the deposit details. * When creating a new deposit, you can now add a link that will be displayed as a button on the **Payment page**. You can specify a URL and a custom name for the button. *** ### May, 2024 [#may-2024] #### New features [#new-features-12] ##### TRX staking [#trx-staking] With this release, B2BINPAY introduces a new **TRX Staking** feature. This allows you to stake your Tron tokens to gain bandwidth or energy to save on blockchain fees. Along with the resources, for each staked TRX, you receive one vote. The votes you can distribute among SRs (Super Representatives) and further gain rewards from them. A new **Staking** > **TRX staking** item has been added to the main menu. On this page, you can overview the staking terms and monitor your rewards. The **Wallet details** page of your TRX wallets has been updated with the following two tabs: * **Resources**: Here you can overview available resources and perform staking-related operations: stake, unstable, and withdraw funds. * **Staking**: Here you can overview your total and available votes and give them to SRs, as well as monitor rounds and key performance indicators of the SRs. #### Improvements [#improvements-13] * Several more icons for currencies and tokens have been added. Icon sizes in QR codes on payment pages have been adjusted. * On the Sign up page, country flags have been added for all phone codes. * Internal logic of the procedure of enabling 2FA with Google Authenticator has been improved, to avoid situations when the 2FA code expires before the password is entered. * It has become possible to customize displayed rows in the mobile version. * Three new blockchains have been integrated: * Base (BASE) * Arbitrum (ARB) * Optimism (OP) * Several new stablecoins have been added: * USDT-OP * USDC-OP * USDCE-OP * USDT-ARB * USDC-ARB * USDCE-ARB * USDC-BASE * Several new tokens have been added: * ARB-ETH * OPTIMISM-OP *** ### February, 2024 [#february-2024] #### New features [#new-features-13] ##### Swaps [#swaps] With this release, B2BINPAY implements a new **Swap** functionality for the clients. This is a replacement for exchanges, but swaps are faster, more flexible and accurate thanks to VWAP. You can now perform currency exchange operations between your Swap wallets. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your Enterprise or Merchant wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. Swap operations are always off-chain. You can exchange all available currencies, including fiat, coins, and tokens. #### Improvements [#improvements-14] * Two new blockchains have been integrated: * Avalanche (AVAX) * Polygon (MATIC) * Several new tokens have been added: * PYUSD-ETH * USDC-AVAX * USDT-AVAX * USDC-MATIC * USDT-MATIC * The TerraUSD (ISO 2150, 2166) token has been renamed to TerraClassicUSD. * New options for wallet duplication have been added: AVAX and MATIC. In total, B2BINPAY now supports wallet duplication in 4 blockchains: * BNB-BSC (Binance Coin) * ETH (Ethereum) * AVAX (Avalanche) * MATIC (Polygon) * Charging of B2BINPAY commission is now displayed as a separate **Commission** transfer type, for more clarity. ### November 13, 2023 [#november-13-2023] #### New features [#new-features-14] ##### Unified Merchant and Enterprise users [#unified-merchant-and-enterprise-users] The Merchant and Enterprise users are no longer separated in B2BINPAY, meaning that a user can now create wallets of both types under the same user profile. ##### A new UI [#a-new-ui] A new B2BINPAY user interface is introduced with this release. The UI has been redesigned to create a more engaging and user-friendly experience. The key changes include the following: * the main menu is now displayed on the left * a new Wallet Management item has been added to the main menu, enabling you to create and manage both Merchant and Enterprise wallets * updated table layouts and icons * amended light and dark themes #### Improvements [#improvements-15] * The blockchain name is now displayed on the Payment page, enabling you to ensure that you send your funds to the correct blockchain for processing and preventing you from funds loss. * The length of phone numbers entered on the Sign up page is now validated, preventing extra or missing digits in phone numbers specified during registration. * The HelpDesk tickets for which there are unread messages in the chart are now marked with a red dot. * The HelpDesk work schedule has become available in the HelpDesk section. * The exchange rates marked as favorites on the Rates page are now available on all user devices. #### Resolved issues [#resolved-issues-7] * For payments in Binance Coin, it’s now possible to select the BNB Chain (BNB-DEX) blockchain that wasn’t previously displayed as an option on the Payment page. * Email addresses specified in Wallet Details are now validated to include only allowed characters. The entered email can be saved only after it’s validated. *** ### September 7, 2023 [#september-7-2023] #### New features [#new-features-15] ##### New currencies [#new-currencies] * Two new stablecoins have been added to the list of currencies in which Merchant wallets can be denominated: **TUSD** (ERC20, BEP20, TRC20) and **EUROC** (ERC20). * Two new stablecoins are now supported for Merchant transactions: **LUSD** (ERC20) and **FRAX** (ERC20, BEP20). * 79 new currencies (113 new tokens in different blockchains) have become available for Enterprise wallets. See the full list of available currencies [here](references/currency-codes). ##### Onboarding [#onboarding] More tours to guide you on using the app are now accessible by clicking your profile information. ##### Favourites [#favourites] On the **Rates** page, it is now possible to filter the results by your favourite pairs and sort them by coin, fiat, or token. #### Improvements [#improvements-16] * When creating a payout, the commission amount is now additionally displayed in the default currency (USD). You can enter a custom commission amount in the default or payout currency. * The 7-day expiration limit for merchant invoices has been removed. When creating or editing an invoice, you can now set any value in the **Expired at** field without any restrictions. * A new button has been added for deleting wallets with zero balances and no transactions. * For large reports, a new notification is now displayed, informing the client that the report will be sent to their email once generated. * The parent wallet is now visible when creating a new payout for tokens. * The QR code generator now supports double-image icons for tokens. * Enterprise clients can now sort the **Wallets** list by ID and currency. * For **Currency** dropdowns, grouping by currency type and filtering by group have been added. * For **Wallet** dropdowns, grouping by active state has been added. * The IP-whitelist management has been changed — now each IP address is added or removed separately. Popups are now displayed for entering passwords required to confirm adding or removing an IP address. * The counter has been added on the **Helpdesk** icon, showing the number of unread messages in tickets. A message is counted as “new“ if a user receives it while the app is open. After the page is reloaded, the counter resets. In the **Helpdesk** section, the tickets with unread messages are marked with a red marker. * Sorting by first letter in dropdowns has been fixed. *** ### May 30, 2023 [#may-30-2023] #### New features [#new-features-16] ##### Reports on wallet balances [#reports-on-wallet-balances] A new **Reports** feature has been implemented to provide you with the possibility to generate reports on your wallet balances for the custom time range. The feature is available for both Enterprise and Merchant users. ##### A notification counter for events [#a-notification-counter-for-events] A notification counter has been added near the **Events** tab displaying the number of new events in the main menu near the **Events** tab. #### Improvements [#improvements-17] * It has become possible to transfer funds within the same blockchain wallet. This option is available for both Enterprise and Merchant users in BTC, BCH, BSC, ADA, DASH, DOGE, ETH, LTC, OMNI, TRX, and ZCASH wallets. * It has become possible to add IP addresses in both IPv4 and IPv6 formats to the API whitelist in the **API access** section. * The number of tickets displayed in the HelpDesk ticket list has been increased up to 30. * The **Target currency** column has been added to the Transfer list for Merchant users. * The **Balance** and the **Pending** tabs have been added to the **Wallet info** tab both for Enterprise and Merchant users. * A limit has been added on the number of tickets created in the HelpDesk. Now you can create only 3 tickets within 5 minutes; when trying to create more than 3 tickets within the specified time, a message about reaching the ticket number limit is displayed.. * The **Registration number** and the **Company address** fields have been added to the sign up form. *** ### March 21, 2023 [#march-21-2023] #### Improvements [#improvements-18] * The design of the payment page has been renewed to offer a more user-friendly experience. * The calculation of balances has been improved. * The response speed of the API has been increased. ### December 28, 2022 [#december-28-2022] #### Improvements [#improvements-19] * The B2BINPAY operation speed has been increased for all operations. * The B2BINPAY interface as well as the mobile version of B2BINPAY have been redesigned and improved for a better user experience. * The Merchant model has been updated to support two types of Merchant users: * Merchant Crypto Settlement: users that can have only crypto wallets and pay reduced commissions for crypto processing. * Merchant Fiat Settlement: users that can have both crypto and fiat wallets and are able to send funds to their bank accounts. * Around 100 new tokens have been added to B2BINPAY. For a list of supported tokens, refer to [Currency codes](references/currency-codes). * The API response speed has been increased. *** ### November 16, 2022 [#november-16-2022] #### Improvements [#improvements-20] * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * It has become possible for Merchant users to set time limits to specify the expiration time for invoices as well as payment limits to hedge possible payment amount variations due to rate changes. * New **Cardano** blockchain has been added to the system. *** ### July 22, 2022 [#july-22-2022] #### New features [#new-features-17] ##### Customized field arrangement for Enterprise and Merchant users [#customized-field-arrangement-for-enterprise-and-merchant-users] A new tool has been implemented to help you arrange fields displayed on a page. With this tool, you can select the fields that you want to display and arrange them in a desired order on the Wallets, Transfers, Deposits, Invoices and Payouts pages. ##### HelpDesk implementation [#helpdesk-implementation] A HelpDesk option has been implemented. Using HelpDesk, you can create a ticket with a description of an issue you encountered with your B2BINPAY account and send it to our Support Team. #### Improvements [#improvements-21] * The display of Bank details for Merchant users has been improved: when creating a bank withdrawal, you can now see all the information related to bank details, not only their title. * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * In addition to the monthly payment for a custom token processing, one more option has been implemented: it has become possible to pay a specified percentage from the credited custom token amount. #### Resolved issues [#resolved-issues-8] * Fixed an issue that caused multiple wallet report downloads upon opening several tabs. * Fixed an issue due to which the transfer type was not displayed on the Transfers page. * Fixed an issue due to which a dialog window did not appear when trying to save updated information in the Wallet details. * Fixed an issue due to which the language in the table on the payment page was not changing. * Fixed an issue due to which incorrect values were displayed in the Currency filter on the Transfer page. * Fixed an issue due to which extraneous pagination options were displayed on the Rates page. * Fixed an issue due to which it was impossible to save an address to the address book when creating a new payout. * Fixed an issue due to which a warning that should be displayed when the sum of a payout exceeds the wallet balance did not appear. * Fixed an issue due to which fiat currencies were unavailable to Merchant users in the Currency filter on the Transfer page. * Fixed an issue due to which tips were not displayed on some pages. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-18] ##### A new Field name field in Logs [#a-new-field-name-field-in-logs] A new field, **Field Name**, has been added to the **Log** for all pages, both for Merchant and Enterprise users. It displays the name of the field whose value has been changed. ##### Currency filter for Merchant users [#currency-filter-for-merchant-users] With a new **Currency** filter on the **Wallet** page, it has become possible for Merchant users to filter their wallets list by currency. ##### Refund button for Merchant users [#refund-button-for-merchant-users] A new **Refund** button has been added to the **Invoice details** page for Merchant users. This button can be used to return funds to the payer. ##### List of support emails for Merchant users [#list-of-support-emails-for-merchant-users] A new **Custom support emails** field has been added to the **Create wallet** and **Edit wallet** pages of the Merchant user accounts. This is a list of email addresses to which requests from payers will be sent. ##### New dialog window for the Create new bank withdrawal window [#new-dialog-window-for-the-create-new-bank-withdrawal-window] A new dialog window has been implemented. It appears upon clicking the **Create new bank withdrawal** button after deleting a regular withdrawal or editing its data. ##### New AML provider integration [#new-aml-provider-integration] A new AML provider, **Chainanalysis KYT**, has been integrated. #### Improvements [#improvements-22] * The AML system logic has been improved: * Repeated checks in case of delay on a provider’s side are now performed with a short delay. * In case of a failure on a provider’s side to perform the final check, no additional checks are attempted. An email notification is sent to Compliance. * A long delay (up to 1 hour) is not used anymore. * A commission for the bank withdrawal for Merchant users is now calculated as follows: a fixed percentage of the withdrawal + a fixed amount in the withdrawal currency (but not less than the minimum commission amount). For example: 2.00% + 30 USD (the minimum commission is 100 USD). The percentage, fixed amount and minimum commission values are configured via the B2BINPAY Back Office. Additionally, the commission amount is now displayed under the Amount field on the withdrawal creation form. * The **Payment page** for Merchant users has been improved for a better user experience. Among other improvements, tags have been added to all currencies, while token icons and the search field have been updated, and cryptocurrencies have been divided into the following categories: Coins, Stablecoins, Others. #### Resolved issues [#resolved-issues-9] * Fixed an issue that caused incorrect filtration in the Amount to field on the Exchange page. * Fixed an issue that caused an incorrect display of the commission currency on the Create exchange page. * Fixed an issue due to which the language in the calendar widget did not change. ### December 28, 2021 [#december-28-2021] #### New features [#new-features-19] ##### Replace by Fee option [#replace-by-fee-option] A new **Replace by Fee** option has become available for Enterprise users. You can speed up the execution of your payout that has stuck due to the low fee by clicking the **Replace** button and selecting a higher fee on the Transfer Details page. ##### Freeze funds on Tron blockchain [#freeze-funds-on-tron-blockchain] For Enterprise users, it has become possible to freeze a certain amount of TRX currency in order to restore Tron blockchain resources such as bandwidth points and energy. In 72 hours, you can unfreeze the frozen amount and it will be returned to your wallet in full. #### Improvements [#improvements-23] * A new **System** initiator that represents the doer of the action in the system has been added to the Log subsection of the Wallets, Deposits and Payout sections both for Enterprise and Merchant users. * The **All** checkbox has been changed to the **All sum** switch in the **Create payout** form both for Enterprise and Merchant users. Now it is possible to select the whole wallet amount, the fee will be automatically included in the payout amount. #### Resolved issues [#resolved-issues-10] * Fixed an issue due to which blocked transaction was displayed as a confirmed one on the payment page. * Fixed an issue due to which changes in the wallet details of the Merchant users were not displayed in logs. * Fixed an issue due to which the icons for some currencies were missed on the invoice payment page. * Fixed an issue due to which the payout amount in tokens was incorrectly calculated for Merchant users. * Fixed an issue due to which the link in the TXID field for XMR currencies of the Transfers page led to the incorrect page. * Fixed an issue due to which the Minimal transfer amount field was not filled automatically. * Fixed an issue due to which values in the Old value and Actual value fields on the Payout details page for Merchant uses were absent. * Fixed an issue due to which the rates were not updated when creating payouts for Merchant users. * Fixed an issue due to which the links in the TXID field of the Deposits and Transfers pages were absent. * Fixed an issue due to which after the payout creation the commissions section was not displayed. * Fixed an issue that caused the amount discrepancy on the Create Exchange page and in the modal window. * Fixed an issue that caused an error when restoring the password. * Fixed an issue that caused an infinite loader to appear in the Add wallet to API window in the Access list section. * Fixed an issue that caused an eternal loader to appear when adding white list API in the API Access section. * Fixed an issue due to which the ID link on the deposit payment page led to the incorrect page. * Fixed an issue that restricted the number of adding wallets to 10 in the Access List. * Fixed an issue that caused troubles with verification when registering in the system. * Fixed an issue due to which it was impossible to get access to the API Access menu for Merchant users. * Fixed an issue due to which the From address book button was not available on the payout creation form. *** ### November 16, 2021 [#november-16-2021] #### New features [#new-features-20] * New currencies are added. The currencies are available for Enterprise users only. * New Monero XMR currency is added. It is available both for Enterprise and Merchant users. #### Improvements [#improvements-24] * The limitation for number of requests without prior authentication to the endpoint is now limited to 70 requests per 1 minute. *** ### October 21, 2021 [#october-21-2021] #### New features [#new-features-21] ##### Risk status [#risk-status] A new **Risk status** tag is added to the Transfer details page. This field indicates the status of the AML verification of the transfer: * the tag is orange if the AML is successful * blue if AML is pending * red if AML failed * grey if AML is unavailable Tags are displayed now for token wallets on the Wallets, Deposits, Payouts and Exchanges pages. #### Improvements [#improvements-25] * Merchant users can now specify Tag and Tag type fields when creating a payout with XLM and XRP currencies. * When clicking on the Exchange button on the Wallets list page, you are redirected to the Creating Exchange page with the selected wallet already filled in the From field. * The payment page for tokens now has 2 links: one link for the payment address and the other link for the contract. #### Resolved issues [#resolved-issues-11] * Fixed an issue which caused redirecting to the Wallet Details instead of Log when clicking on the Log button at the Access List section. * Fixed an issue that enabled funds withdrawal from a fiat wallet to a crypto wallet for Merchant users. * Fixed an issue due to which the link to the explorer was absent on the Deposit payment page. * Fixed an issue due to which on the Transfers page an Unknown type transfers were displayed when selecting the Side collecting funds in the Type filter. * Fixed an issue due to which the payment currencies and “No currencies available” message were displayed simultaneously on the Payment page. * Fixed an issue due to which the Payouts commission was not recalculated in the payout currency. * Fixed an issue due to which it was possible to create a token payout when there was not enough funds on the parent wallet. * Fixed an issue that caused multiple notifications for one operation on a wallet. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-22] * Integration with Tron blockchain is added, as well as new currencies such as Tron, USDT-TRX, USDC-TRX. * New Merchant User role is added. * New Bank Withdrawal feature is added to the Payout tab, which allows withdrawing fiat funds immediately or creating a conditional schedule. Bank Withdrawal is available for fiat wallets and for Merchant users only. * New ETH and BSC tokens are added. #### Improvements [#improvements-26] * New risk status field is added to the Transfer Object, so that clients can check transfer AML status. * DASH integration is updated. Latest version of DASH allows you to create multiple wallets per node. * Unverified users now can log in to a private area and pass verification later. #### Resolved issues [#resolved-issues-12] * Fixed an issue which caused wrong error code for API when obtaining token more than 15 times within 1 minute. * Fixed an issue which caused an error when navigating to the Payouts and Deposits tabs. * Fixed an issue which caused a false check of fee and payout amount when validating token payouts. * Fixed an issue due to which it was impossible to create a token payout with the sufficient amount of funds. * Fixed an issue which caused troubles with changing password or enabling 2FA. * Fixed an issue due to which it was impossible to create a deposit with a number of confirmation blocks from 13 to 20. * Fixed an issue which caused multiple callback notifications in the Event section when creating a payout with callback. *** ### August 04, 2021 [#august-04-2021] #### Improvements [#improvements-27] * Reworked the logic of the Exchange process. Now rates are recalculated if the transaction takes more than 15 minutes, and the final amount is updated according to the current quote. Also the notification about the rate change is sent. * Lowered minimal activation amount for BSC to 0.025 BNB. #### Resolved issues [#resolved-issues-13] * Fixed an issue due to which it was possible to set the amount less than the Minimal transfer amount when creating an exchange. * Fixed an issue due to which BEP20 was not displayed in the list of token types. * Fixed an issue due to which the Export button worked incorrectly. *** ### July 07, 2021 [#july-07-2021] #### New features [#new-features-23] ##### User verification by phone number [#user-verification-by-phone-number] Added a new verification step — verification of the user's phone number, which follows the email verification step and is mandatory. #### Improvements [#improvements-28] * Added filter by tokens. To filter by currency, a user can now select the tokens and custom tokens on the Wallets, Transfers, Deposits, and Payouts pages. * Reworked the logic of the Exchange page. Now wallets with 0 balance are displayed at the end of the list. * Updated Select all funds switch on the Exchange page. #### Resolved issues [#resolved-issues-14] * Fixed an issue due to which when exchanging, the transfer amount was not validated and could be indicated less than the available funds on the wallet. * Fixed an issue due to which the exchange became unavailable after rates update. * Fixed an issue due to which it was possible to create a custom token with alpha code of the existing currency. * Fixed an issue which caused 500 error when filtering deposits and payouts. *** ### June 22, 2021 [#june-22-2021] #### New features [#new-features-24] ##### Binance smart chain support\*\* [#binance-smart-chain-support] Now it is possible to create wallets in BSC. ##### Duplicating wallets [#duplicating-wallets] It is now possible to generate the same addresses in two different currencies. This may be useful when the payer is sending money on the wrong blockchain. For example, instead of paying 10 ETH to the A1 address, 10 BSC were sent to the A1 address. The option is available for wallets that support duplication in the Wallet Settings section. ##### Duplicating deposits [#duplicating-deposits] After duplicating a wallet when creating a deposit on one wallet, it becomes possible to clone it to a second wallet, if that second wallet is a clone of the first one. The option is available on the Create a Deposit page, when choosing duplicate in the address type and selecting the required deposit ID from the list. ##### New transfer type [#new-transfer-type] Side collecting funds on wallet is the amount of deposit that was previously canceled because of a small amount and then debited to your wallet along with another valid transfer. ##### New stablecoins support [#new-stablecoins-support] New stablecoins were added: PAX, DAI, TUSD, BUSD. #### Improvements [#improvements-29] * For BNB-BSC wallets, a notification has been added about the need to top-up the balance to activate the wallet. * Invoice updates. For all tokens, the link is now generated not by the token currency, but by the parent currency. #### Updating nodes [#updating-nodes] * DASH node was updated to version 16.1.1. #### Resolved issues [#resolved-issues-15] * Fixed an issue that caused incorrect login when saving credentials in the browser. * Fixed an issue due to which the Stellar icon did not change when switching theme from dark to light. *** ### April 19, 2021 [#april-19-2021] * **Integration with Ethereum and ERC-20 tokens has been made**. Now you can exchange and create wallets, deposits, withdrawals using new currency. The system collects tokens from deposit addresses in one place via smart contract. That significantly reduces the costs of token processing for the client. Integration with Ethereum also includes the possibility of replacing a payout by fee from the personal area in case it's stuck due to low blockchain fee. * **Working with ERC-20 tokens is available to all enterprises**. Through the client's office, you can add your token, pay processing fee from any of your wallets and start accepting tokens after confirmation of payment on the blockchain. The owner can specify any alpha code for custom token so that it is displayed on the payment pages. From your personal account at any time you can change the payment wallet or refuse to pay next month. * **The registration form is now unified for all types of clients** and contains fields where the user needs to enter information about himself in full. This will help our sales team and account managers to get in touch with the client faster and prepare everything to start working with the payment system. Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/api-overview) for updated descriptions. ## General information [#general-information] The B2BINPAY API is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. All methods are private. All requests except for [Obtain token](authentication#obtain-token) and [Refresh token](authentication#refresh-token) should contain HTTP header: `Authorization: Bearer `. According to [JSON API Specification](https://jsonapi.org/format/), all requests should contain HTTP header: `Content-Type: application/vnd.api+json`. ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/authentication) for updated descriptions. ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token` #### Request example [#request-example] ```sh curl --request POST \ --url [base]/token/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "login": "", "password": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'login': '', 'password': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'login' => '', 'password' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } }, "meta": { "time": "2020-12-29T05:27:11.925654Z", "sign": "bcd6519ce27fed2ce9efe49cd09b387f050c0122c96..." } } ``` #### Response codes [#response-codes] *** ## Refresh token [#refresh-token] Once you receive a new key pair using your refresh token, the previous refresh token can no longer be used. A refresh token that is found to be invalid while not being expired must be rendered suspicious. ### Request [#request-1] `POST` `[base]/token/refresh/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/token/refresh/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "refresh": "" } } }' ``` ```python import requests url = '[base]/token/refresh/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'refresh': '', }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/refresh/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'refresh' => 'Your refresh token', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] The response body is the same as for [Obtain token](authentication#obtain-token) request, but without `meta` fields. #### Response body example [#response-body-example] ```json { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } } ``` #### Response codes [#response-codes-1] *** ## Auth verification [#auth-verification] Refer to the example below for a sign verification instance. ```javascript // "crypto-js": "4.0.0" is installed as a dependency const SHA256 = require("crypto-js/sha256"); const hmacSHA256 = require('crypto-js/hmac-sha256'); // set API user login and password const login = 'Your API key'; const password = 'Your API secret'; // parse /api/token/ response payload const authResponse = JSON.parse("{\n" + " \"data\": {\n" + " \"type\": \"auth-token\",\n" + " \"id\": \"0\",\n" + " \"attributes\": {\n" + " \"refresh\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUz\",\n" + " \"access\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI\",\n" + " \"access_expired_at\": \"2020-08-24T13:50:12.192479+03:00\",\n" + " \"refresh_expired_at\": \"2020-08-24T19:33:33.192479+03:00\",\n" + " \"is_2fa_confirmed\": false\n" + " }\n" + " },\n" + " \"meta\": {\n" + " \"time\": \"2020-08-24T10:33:33.192479Z\",\n" + " \"sign\": \"e70adec551e26b560049e42aa0993ae42cac4e03fbbb300320d8be\"\n" + " }\n" + "}"); // prepare data for hash check const message = authResponse['meta']['time'] + authResponse['data']['attributes']['refresh']; const responseSign = authResponse['meta']['sign']; const secret = SHA256(login + password); const calculatedSign = hmacSHA256(message, secret).toString(); // print result if (responseSign === calculatedSign) { console.log('Verified'); } else { console.log('Invalid sign'); } ``` ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/deposit-methods) for updated descriptions. ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2147483647 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/payout-methods) for updated descriptions. ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-2] `POST` `[base]/payout/calculate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-2] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-2] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-3] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-3] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-3] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-3] #### Response body example [#response-body-example-1] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## Main menu [#main-menu] Use the main menu displayed on the left to navigate across platform pages and access the Helpdesk. Use the **Collapse**/**Expand** button to adjust the main menu display. Main menu ## Topbar options [#topbar-options] In the upper part of the page, you can see a topbar that provides access to the following functions: * the **Legal entity** dropdown — to switch between Sandbox and Production environments as well as different legal entities where you hold membership. Access permissions vary across legal entities based on your assigned user roles within each organization. Through this dropdown, users can also create new Sandbox environments to initiate KYB processes for their own businesses. * the **Dark/Light theme** switch — to adjust the B2BINPAY Web UI to your preferences. * the **Language** dropdown — to select a preferred language for the B2BINPAY Web UI. * the **Notifications** page — to view and manage system notifications. * the **User profile** icon — to access the **Profile menu** (see below). Topbar ## Profile menu [#profile-menu] ### Custom tokens [#custom-tokens] On this page, you can view a list of your [custom tokens](../references/key-terms#custom-token) and their settings. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. ### Testnet faucet [#testnet-faucet] On this page, you can deposit test funds to your Sandbox wallets for testing purposes. See [Set up integrations](quick-start-guide#step-5-set-up-integrations) for more details on using Sandbox. ### Logins and sessions [#logins-and-sessions] On this page, you can find a log of user sessions, which includes the user email and location, along with the device fingerprint data and exact date and time of each login. The *Owner* sees all sessions of all users. ### Access list [#access-list] Only users with the *Owner* role can access this section. On this page, you can manage user access to your wallets, API credentials, and IP whitelists. The page is divided into two tabs: On this tab, you can add new users to your legal entity, assign roles, and grant or restrict access to specific wallets. See the following guides for step-by-step instructions: * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) In the wallet details, you can find the **Access rights** tab featuring a list of users who have access to this particular wallet. On this tab, you can manage API access, as well as bulk grant or restrict API access to your wallets. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-api-credentials) *Available on Production environments only.* On this tab, you can manage IP whitelists for your legal entity to allow access it from trusted IPs only. This setting will apply to all users under this particular legal entity, including the *Owner*. See the following guides for step-by-step instructions: * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) On this tab, you can generate the Callback secret for callback verification. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) ### Address whitelist [#address-whitelist] On this page, you can create and manage address whitelists for blockchains and wallets. The page is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the **Address whitelist** tab in the wallet details. See [How to whitelist a payout address](../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for step-by-step instructions. ### Bank details [#bank-details] On this page, you can add and manage your bank details saved for [bank withdrawals](../references/key-terms#bank-withdrawal). The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. ### Reports [#reports] On this page, you can generate and download wallet reports. See [How to generate a report on wallet balances](../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) for step-by-step instructions. ### Settings [#settings] On this page, you can configure your profile and system access. See the following guides for step-by-step instructions: * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [How to enable additional AML check](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) ### Legal documents [#legal-documents] On this page, you can view and manage legal documents such as policies and contract agreements. When contract terms and conditions change, the *Owner* of the legal entity sees a notification on their next sign‑in. A modal window opens and requires them to read and accept the new terms. The *Owner* can also initiate unilateral contract termination by clicking **Terminate** next to the latest contract version. After initiation, your account remains available for withdrawals until the termination is processed by the B2BINPAY Compliance team. ## Configuring columns [#configuring-columns] Information on most pages and tabs is presented in tables and you can configure columns to display. If a display setting is available for a given page, you may see the **Configure columns** button above the table. Click it to display the column list: * Mark or unmark column checkboxes to display or hide them; the column checkboxes highlighted in grey can’t be disabled. * Drag and drop the columns to adjust their order in the table. Configuring columns ## Quick search [#quick-search] On some pages, you can perform a **quick search** by a certain parameter, such as wallet label or currency. To perform the quick search, start typing a desired value in the quick search field displayed above the table. Only the records containing the entered value are displayed on the page. ## Sorting [#sorting] Information in tables can be sorted by certain parameters. By default, page data is sorted by creation date in descending order. You can sort the page data by other fields. To find out whether you can sort table data by a particular field, hover over a corresponding column header. If sorting by this field is supported, you will see an arrow next to it indicating the available sorting options: * Arrow inactive — sorting by this field is disabled. * Up arrow (active) — descending sorting by this field is enabled (you can click the arrow to enable ascending sorting). * Down arrow (active) — ascending sorting by this field is enabled (you can click the arrow to enable descending sorting). You can sort table data only by a single field at a time. Sorting ## Filters [#filters] The **funnel icon** displayed on some pages indicates that you can specify custom **search filters**. You can click this icon to open a filter popup and enter desired values. The set of available filtering parameters varies for different pages. The displayed input corresponds to a parameter type: it can be text, number, date, selector, and so on. Typically, two values are required for filtering by a time interval: the start date and the end date. You can enter these values manually or select them using the calendar tool. To enable filtering, click the **Apply** button. To disable filtering, click **Reset**. On some pages, you can choose among predefined **quick filters** to filter data by a specific parameter, such as a wallet or currency type. To enable these filters, use the corresponding buttons displayed above data tables. Filtering ## Pagination [#pagination] Most of the pages support **pagination** and display data on multiple pages. You can instantly **Jump to** a specific page or use the left and right arrows to switch to the previous or next page. You can also specify the number of rows displayed on each page. Pagination ## Copying values [#copying-values] On some pages, the option to copy certain values to the clipboard is provided. Copying values ## Export data [#export-data] On some pages, the data export option is provided. You can download the page data in the CSV or XLSX format. The exported file matches the filtering and sorting settings applied to the page. Exporting data ## Step 1: Understand the wallet types [#step-1-understand-the-wallet-types] B2BINPAY offers two distinct wallet types: **Enterprise** and **Merchant**. Both can be created under a single account. Understanding these wallet types is essential, as their differences determine the functionality, workflow and the fees involved. Watch our video to explore our Enterprise (Wallet as a Service) and Merchant (Crypto Payment Processing) solutions and discover which solution best fits your needs. **References:** * [B2BINPAY Pricing](https://b2binpay.com/en/fees-crypto-payment-processing) *** ## Step 2: Sign up and pass KYB verification [#step-2-sign-up-and-pass-kyb-verification] To start using B2BINPAY, you need to create an account and complete the Know Your Business (KYB) verification process. ## Create your account [#create-your-account] 1. **Fill out the registration form** with your: * Full name * Email address * Phone number 2. **Create a secure password** that meets our security requirements. 3. **Set up 2FA** to receive *Authentication 2FA codes*: follow instruction on the screen. 4. **Verify your email address** by either: * Clicking the verification link sent to your email, or * Entering the verification code from the email. You now have access to our **Sandbox environment** — a secure testing environment where you can safely integrate B2BINPAY with your systems without any financial risk. Never send real money to Sandbox deposit addresses. This will result in **permanent and irreversible loss** of your funds. ## Submit your KYB request [#submit-your-kyb-request] 1. Navigate to **KYB** in the main menu. 2. Click **Add new legal entity**. 3. Fill out the required information: * **Legal entity name** — Your company's official registered name. * **Country of incorporation** — Where your business is legally registered. * **Business type** — Select the category that best describes your business. * **UBO residency** — Country where the Ultimate Beneficial Owner resides. 4. Review and accept the **Terms and conditions**. 5. Click **Create** to submit your request. Once submitted, you'll be directed to begin the KYB verification process. ## Complete the verification process [#complete-the-verification-process] Follow the on-screen instructions provided by our KYB verification provider. Once finished, the status of your request will change to *Pending*. You can safely exit and return to complete the verification later. Your progress will be automatically saved, the status of your request will change to *In progress*. ## Submit additional documents (if required) [#submit-additional-documents-if-required] Some applications may require additional supporting documents. **If documents are needed:** * A red notification badge will appear on the **KYB** menu item. * Your application status will change to *Action required*. Once your KYB request changes the status to *Approved*, you can begin using B2BINPAY production environment: switch to it using the dropdown in the topbar. **Next steps:** 1. Update your integration to use production base URLs. 2. Replace Sandbox API credentials with your production credentials. 3. Start processing real transactions. **Remember:** Never use Sandbox addresses for live transactions. *** ## Step 3: Start using your B2BINPAY [#step-3-start-using-your-b2binpay] Once your account is activated, you can begin working with B2BINPAY. Setting up your account involves the following steps: 1. **Configure essential security**: Ensure your account is secure. 2. **Create your first wallet**: Set up your initial wallet to start receiving payments. 3. **Enable API access**: Allow integration with other systems. 4. **Share wallet access**: Provide access to team members as needed. For a detailed walkthrough, watch our setup video. **References:** * [Enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [Whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) * [Create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) * [Access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [Grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [Manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) *** ## Step 4: Ensure security [#step-4-ensure-security] B2BINPAY readily supports KYC and AML procedures, enabling you to verify the identity of your clients and ensure compliance with anti-money laundering regulations. Other security features include 2FA, whitelists, thresholds, robust notifications, and logging systems. Keep in mind that the security of your accounts is your own responsibility. Watch our video to learn about B2BINPAY security features. ### Follow best practices to protect your finances [#follow-best-practices-to-protect-your-finances] Follow the guidelines below to better protect your account. #### Use strong passwords and 2FA [#use-strong-passwords-and-2fa] Make sure that you and all of your team members: * Use strong passwords that include uppercase and lowercase letters, numbers, and special symbols. * Use password managers for storing passwords. * Never share passwords with anyone. * Have IP whitelists enabled. **References:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) #### Enable notifications [#enable-notifications] Add your email as a notification address in the settings of all your wallets to make sure that you will be notified about any transactions. This way, you are able to detect suspicious transactions and intervene as quickly as possible. **References:** * [How to create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) #### Take special care when managing access permissions [#take-special-care-when-managing-access-permissions] Make sure that your users are granted only those permissions that are necessary for completing their tasks. Such permissions include access to wallets and availability of various kinds of transactions. In particular, you can assign the *Withdrawals with approval* role to all users, so that no funds withdrawal can be made unless it’s explicitly approved by you. **References:** * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) #### Enable withdrawal thresholds [#enable-withdrawal-thresholds] Specify thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require the approval of the *Owner*, regardless of the role of the user who created such payout. **References:** * [How to set withdrawal thresholds](../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) #### Generate new API credentials after integration is complete [#generate-new-api-credentials-after-integration-is-complete] When sharing your API keys with developers, generate new keys and reset IP access to API after the setup is complete. **References:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Take immediate actions if you account security has been compromised [#take-immediate-actions-if-you-account-security-has-been-compromised] Do the following if you come to suspect that someone has obtained access to your account. ### Change your password as soon as possible [#change-your-password-as-soon-as-possible] Please note that changing the system password may take time. Note that you must enter a 2FA code to confirm the password change. **References:** * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) ### Reset access permissions and IP whitelists [#reset-access-permissions-and-ip-whitelists] Revoke all accesses to your wallets or at least temporarily assign the *Read only* or *Withdrawals with approval* role to all users. In this case, any further transactions on these wallets can be made only after your approval. In addition, restrict access to the B2BINPAY API by removing non-trusted IPs from the whitelists. **References:** * [How to restrict access to your wallet](../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Immediately inform your account manager [#immediately-inform-your-account-manager] And follow the provided instructions. *** ## Step 5: Set up integrations [#step-5-set-up-integrations] B2BINPAY is designed to integrate seamlessly into various external systems to streamline and automate payment processes, such as creating deposit addresses, fetching exchange rates, processing withdrawals, and so on. To ensure a secure and comprehensive testing experience, B2BINPAY provides a Sandbox environment. This allows you to experiment with the platform features safely, understand the system logic, test interactions, set up integrations without any risk, and tailor them to your specific scenarios. You get access to Sandbox immediately after signing up to the system. B2BINPAY provides you with the Testnet faucet: using it, you can receive test funds to your Sandbox wallet to test system functions — payouts, deposits, transfers, and other features. Currently, the **BTC** testnet faucet is supported. To receive test funds: Create a BTC wallet in the Sandbox environment. Access the wallet details and copy the wallet address. Click your **profile icon** in the upper right page corner and select **Testnet faucet**. In the **Address** field, paste your wallet address. In the **Amount** field, enter the amount to deposit. Amount limits are specified under the field. Click **Send deposit**. Simulate transaction confirmations by clicking the **Generate blocks** button several times. Now, as your wallet is topped up, you can proceed with testing the financial operations in B2BINPAY and configuring integrations with external systems. Never use Sandbox deposit addresses on Production environments. This will result in **irreversible loss** of funds. **See also:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) *** ## Step 6: Use Helpdesk to get assistance [#step-6-use-helpdesk-to-get-assistance] Click **Helpdesk** in the main menu to access our Support Team platform where you can get quick help from the online chat bot or report any issues related to the B2BINPAY operation. We provide multi-lingual support, you can find the working hours of corresponding teams in the right part of the **Helpdesk** page. Check our [Troubleshooting articles](../troubleshooting/no-active-account) where you can find solutions for most common issues. *** ## Step 7: Learn about other B2BINPAY features [#step-7-learn-about-other-b2binpay-features] Watch our video to learn about other B2BINPAY features that you can use. ## Important announcement [#important-announcement] We announce the release of the new API version **v3** on June 1, 2025. This version introduces the following significant changes: * New [base URLs](#base-urls) * New [Authentication](authentication) procedure * New [Callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) and modifications in the callback verification method for [deposits](deposit-methods#callback-verification) and [payouts](payout-methods#callback-verification) **Action required:** We strongly encourage you to review the changes and update your integrations **before December 1, 2025**, as the old API version will be shut down after this date. Please ensure all updates are completed before the deadline to avoid any service disruptions. **Deprecated API notice:** The previous version of the API guide has been moved to a [separate section](../api-guide-v2-deprecated/api-overview) and is now marked as deprecated. Before you start working with the B2BINPAY API, you need to enable API access to the system. Refer to [How to access the API](../how-tos/manage-your-profile-and-system/how-to-access-api) for step-by-step instructions. ## General information [#general-information] The B2BINPAY API v3 is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. Except for [Authentication](authentication), all requests must contain the following HTTP headers: * `Authorization: Bearer {YOUR_ACCESS_TOKEN}`: Used to authenticate your request. * `Content-Type: application/vnd.api+json`: Required according to [JSON API Specification](https://jsonapi.org/format/). ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token/` #### Request example [#request-example] ```sh curl --location '{base_url}/token/' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "client_id": "", "client_secret": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'client_id': '', 'client_secret': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'client_id' => '', 'client_secret' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "access": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjMy...", "expires_in": 3599, "token_type": "Bearer" } } } ``` #### Response codes [#response-codes] ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message`. The `message` composition depends on whether the callback includes a transfer: * **With a transfer** — concatenate `transfer.status`, `transfer.amount`, `deposit.tracking_id`, and `meta.time`. * **Without a transfer** (deposit status change only) — concatenate `deposit.status`, `deposit.tracking_id` (if non-empty), and `meta.time`. Refer to the examples below for callback verification examples. ```php ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2592000 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Validate payout [#validate-payout] Validates a payout request without creating it. The endpoint runs the same validation pipeline as [Create payout](payout-methods#create-payout), checking the address, currency, fee, balance, commissions, `tracking_id` uniqueness, wallet activity, and target wallet or deposit resolution. On success, the response contains the resulting `total_amount` that would be debited from the source wallet. The endpoint has no side effects and doesn't require the `Idempotency-Key` header. ### Request [#request-2] `POST` `[base]/payout/validate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url [base]/payout/validate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/validate/" payload = json.dumps({ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": False, "is_commission_included": False, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $body = '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/validate/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains the total amount that would be debited from the source wallet if the payout was created. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-validation", "id": "0", "attributes": { "total_amount": "0.05000550" } } } ``` #### Response codes [#response-codes-2] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-3] `POST` `[base]/payout/calculate/` #### Request example [#request-example-3] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-3] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example-1] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-3] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message` (the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields). Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the payout itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this payout. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-4] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-4] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-4] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-4] #### Response body example [#response-body-example-2] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## 2FA [#2fa] The Two-Factor Authentication is an additional method of authentication that adds one more layer of security to your account. It assumes that, when signing in, in addition to your credentials, you also enter a unique one-time and time-limited confirmation code. B2BINPAY supports 2FA with the **Google Authenticator** app (it's free). B2BINPAY requires two different 2FA codes: * **Authentication 2FA**: This one is mandatory for all users upon registration. It must be entered each time you log in. * **Authorization 2FA for operations**: This one is enabled in the **Profile menu** > **Settings** section. It's required for the following sensitive system actions: * IP whitelist setup * API credentials generation * Callback secret generation * Payout confirmation *** ## Activation fee [#activation-fee] This is a deposit that you have to make to your wallets denominated in specific currencies in order to activate them. After the wallet that require confirmation is created, you'll receive a message on the **Notifications** page indicating the required deposit amount. Once deposited, the fee amount is frozen on the wallet and the wallet is assigned the *Active* status. You can use your Merchant wallets to deposit the required amount of funds. Refer also to [Blockchain fee](#blockchain-fee) and [Commission](#commission) to learn about other commission types. *** ## AML [#aml] Anti-Money Laundering is certain regulations and laws that prevent illegal movement and laundering of funds. ### Default AML check [#default-aml-check] B2BINPAY provides a built-in obligatory AML check for all incoming transfers. The check is performed on the side of a connected AML provider. During AML verification, the incoming transfer amount is displayed in the wallet as *Pending* and can't be used for financial operations. If the check is successful, the incoming transfer amount is enrolled to the wallet balance. If a transaction is considered suspicious, it's assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. ### Additional AML check [#additional-aml-check] You can add your personal account of the AML provider as an additional level of verification. Find the step-by-step instruction [here](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check). If enabled, after successfully passing the default AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). *** ## Bank withdrawal [#bank-withdrawal] This is a withdrawal of fiat funds from your [Merchant wallet](#merchant-wallet) denominated in the same fiat currency to your bank account. B2BINPAY provides three types of bank withdrawals: * **One-time withdrawal**: A single withdrawal of a fixed amount. * **Regular withdrawal with a fixed amount**: A withdrawal that is triggered every time when the wallet balance reaches the specified amount plus the commission amount. * **Regular withdrawal with a changing amount**: A withdrawal where you additionally specify the minimum amount that should be left on your wallet after the withdrawal. This withdrawal is triggered every time when the wallet balance reaches the amount calculated as *Withdrawal amount* + *Leftover amount* + *B2BINPAY commission amount*. To enable bank withdrawals, submit your banking details in advance on the **Bank details** page available under your **Profile menu**. The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. *** ## Blockchain fee [#blockchain-fee] This is a blockchain commission for [on-chain transactions](#on-chain-transaction). These fees are essential for the network's operation, as they compensate miners or validators who secure and maintain the blockchain. Each network dictates its own fee structure, which can vary based on network traffic. During peak times, fees may rise due to increased demand for transaction processing. When sending funds, you can select from possible blockchain fee levels: low, medium, high, or custom. A higher fee typically results in faster processing. These values are pre-calculated by B2BINPAY at the moment of payout creation based on the current blockchain fee records. Refer also to [Commission](#commission) and [Activation fee](#activation-fee) to learn about other commission types that can be charged. *** ## Callback [#callback] This is an asynchronous notification about changing statuses of deposits and payouts, sent by B2BINPAY to your server. You can use callbacks to make changes in your system and notify your payers, or just track the transactions. To handle incoming `POST`-requests from a callback URL in your application: * Define a route, such as `/payment/callback`. * Create an endpoint to process incoming data, such as validating transactions and updating your database accordingly. To receive callbacks, specify the **Callback URL** when creating a new [deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) or [payout](../how-tos/manage-your-assets/how-to-create-a-payout) via the Web interface, or when sending the [Create deposit](../api-guide/deposit-methods#create-deposit) or [Create payout](../api-guide/payout-methods#create-payout) requests via the API. *** ### Callback types [#callback-types] The following callbacks can be sent for transactions: **Confirmation** The transfer has received a required number of [block confirmations](#confirmation-block). This number is determined in the currency settings in the B2BINPAY Back Office. For example, the required number of confirmations for a currency is set to `3`. It means that this callback will be sent after receiving three confirmations. You can use the [Get currency](../api-guide/currency-methods#get-currency) method to receive the required number of confirmations configured for a currency. **Fail** The transfer failed. **No transfer** The deposit has expired or the payout wasn't approved, no transfer was created. **Request rejection** The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. **Block** The deposit was blocked by an AML provider, the transfer was canceled. **Cancel** The payout was blocked by an AML provider, the transfer was canceled. **User confirmation** The transfer has received a number of block confirmations specified by a client. See [Additional callback](#additional-callback) below. **Manual** The callback is resent manually. See [Resending callbacks](#resending-callbacks) below. ### Additional callback [#additional-callback] By default, a callback is sent after a transaction achieves a specified number of block confirmations on the blockchain. This number is determined in the currency settings in the B2BINPAY Back Office. To trigger an additional callback, you can set a different number of confirmations when creating a deposit or payout via the Web UI or API. For example: * Default confirmation requirement: 3 blocks * Specified for a particular deposit or payout: 1 block In this case, the callback will be sent twice: after 1 confirmation and again after 3 confirmations. ### Callback processing [#callback-processing] The callback is sent to your server if the deposit/payout includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. The callback body depends on the callback type. For additional callback structure examples, see [Deposit callback](../api-guide/deposit-methods#callback-body-example) and [Payout callback](../api-guide/payout-methods#callback-body-example). You can check that the callback was sent by B2BINPAY. Refer to [Deposit callback verification](../api-guide/deposit-methods#callback-verification) and [Payout callback verification](../api-guide/payout-methods#callback-verification) for details. After processing the payload, your server should respond with the HTTP `200` response code without a body. ### Resending callbacks [#resending-callbacks] If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Events** page in the Web UI. *** ## Coin [#coin] This is a cryptocurrency that operates independently in its own blockchain. Coins act as native currencies within their specific financial systems and can only be transferred between participants in their respective networks. **Key points**: * Operate on their own independent blockchain. * Can be mined or earned through validation activities like staking or proof-of-work. * Serve as native currencies within their blockchain ecosystem. * Used primarily for transactions, payments, and storing value. **Example**: * **TRX**: The Tron coin operating on the Tron blockchain that can be transferred between participants within the Tron network. *** ## Commission [#commission] This is a commission charged by B2BINPAY for its services. Detailed descriptions of each commission type are provided below. Refer also to [Activation fee](#activation-fee) and [Blockchain fee](#blockchain-fee) to learn about other commission types that can be charged. ### Commissions for transaction processing [#commissions-for-transaction-processing] These are fees charged for handling transfers: deposits and payouts. Their amount depends on: * **Wallet type**: Generally, B2BINPAY charges commissions for incoming transactions for [Merchant wallets](#merchant-wallet), and for outgoing transactions for [Enterprise wallets](#enterprise-wallet). This approach is determined by the internal logic of the wallets and the B2BINPAY services involved in providing these wallets. * **Transaction currency**: Different cryptocurrencies have different commission rates applied. * **Overall transaction volume**: Generally, higher transaction volumes are rewarded with lower commission rates. Once you reach a designated threshold, the applicable commission rate is fixed for the rest of the month. **Note** that previously charged commissions aren't recalculated. Visit [our website](https://b2binpay.com/en/fees-crypto-payment-processing) to view applicable commission rates. ### Commissions for custom token processing [#commissions-for-custom-token-processing] These are fees for maintaining of [custom tokens](#custom-token). They're charged on a monthly basis from the parent wallet. ### Commissions for Custody services [#commissions-for-custody-services] These are fees for storing funds on [Custody wallets](#custody-wallet). The accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and with each withdrawal from the Custody wallet. *** ## Confirmation block [#confirmation-block] This is a process of transaction confirmation on the blockchain. A transaction is being verified on the blockchain and the blocks are added to the transaction thus confirming it. Until the required amount of blocks is received, the corresponding transfer in B2BINPAY is assigned the *Unconfirmed* status. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). *** ## Custody wallet [#custody-wallet] This is an account designed for secure storage, available only to users with the *Owner* role and requiring video verification for withdrawal of funds. Custody wallets can be topped up from your [Merchant](#merchant-wallet) and [Enterprise](#enterprise-wallet) wallets. Enterprise wallets must match the currency of the Custody wallet. Withdrawals form Custody wallets can be made to Merchant and Enterprise wallets denominated in the same currency, as well as to external addresses. B2BINPAY charges commissions for storing funds on Custody wallets, their amount is calculated based on the tier percentage of stored funds. You can find information about applied tiers on the **Custody** > **Wallets** page. The accumulated commission is calculated daily for each Custody wallet. The commission is charged monthly and with every withdrawal from the Custody wallet. *** ## Custom token [#custom-token] This is a token created by a B2BINPAY user on the Ethereum, Binance Smart Chain, or Tron blockchains. B2BINPAY charges a fixed commission for custom token processing, which is applied on a monthly basis. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. *** ## Deposit [#deposit] This is an invoice that you create in B2BINPAY to receive payments from other people. Deposits can be made to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the deposits to Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The deposits to Merchant wallets can be made in any currency, including the option when payers select the payment currency themselves. Payments from other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For the deposits to Merchant wallets, you can also specify various time and amount limits. You can enable [callback](#callback) sending for any deposit to be notified about new deposit-related transactions. Deposits shouldn't be confused with [direct deposits](#direct-deposit). *** ## Destination tag [#destination-tag] This is a special identifier used for transactions in XRP. It's used to indicate the recipient of the payment. The absence of the destination tag or incorrect destination tag results in payment rejection or irreversible loss of funds. The destination tag for Stellar-based currencies (*memo*) can be applied both to deposits and withdrawals. You can indicate the following memo types: * `MEMO_TEXT`: A string encoded using either ASCII or UTF-8; maximum length is 28 bytes. * `MEMO_ID`: A 64-bit unsigned integer. *** ## Direct deposit [#direct-deposit] This is a crediting of funds to your own wallet. Direct deposits should not be confused with [deposits](#deposit). *** ## Enterprise wallet [#enterprise-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds in cryptocurrencies. Enterprise wallets support transactions in the same currencies in which they're denominated. All transactions involving Enterprise wallets are [on-chain](#on-chain-transaction). *** ## KYC [#kyc] The Know Your Customer or Know Your Client are standards for financial institutions obliging them to verify a client's identity before carrying out financial transactions. The aim of KYC is to better understand the clientele, monitor financial transactions, reduce client risks, and prevent bribery and corruption. B2BINPAY provides a built-in obligatory KYC check of all new clients. After signing up for B2BINPAY, you'll be asked to provide certain information and documents verifying your identity to complete the KYC procedure. *** ## Merchant wallet [#merchant-wallet] This is a B2BINPAY account enabling you to send, receive, and store funds either in fiat or in cryptocurrencies. Merchant wallets support transactions in various currencies that may differ from the currency in which the wallet is denominated. Transactions between B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). *** ## Minimum transfer amount [#minimum-transfer-amount] This is a threshold set for incoming transfers to a wallet, that is, the minimum deposit amount that can be made to your wallet. Payments below this minimum are automatically rejected to ensure economic viability, particularly when [blockchain fee](#blockchain-fee) might exceed the transaction amount. You can find information about minimum allowed deposits [here](https://b2binpay.com/en/available-currencies). For Enterprise wallets, the **Minimum transfer amount** can be customized; for Merchant wallets, it's defined in the system settings. *** ## Off-chain transaction [#off-chain-transaction] This is a transaction between [Merchant wallets](#merchant-wallet) within B2BINPAY. Such transactions aren't recorded on the blockchain, don't require [blockchain confirmations](#confirmation-block), and therefore, don't incur [blockchain fees](#blockchain-fee). This method offers a cost-effective and rapid solution to transfer funds within the ecosystem. However, for payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## On-chain transaction [#on-chain-transaction] This is a transaction processed on the blockchain. Such transactions are recorded on the blockchain, require [blockchain confirmations](#confirmation-block), and therefore, incur [blockchain fees](#blockchain-fee). All transactions involving [Enterprise wallets](#enterprise-wallet) are always on-chain. For payouts made from Merchant wallets, you can enable the `force_blockchain` setting to forcibly process the transaction on-chain, if it's important for your business and compliance processes. This setting is available when creating a payout via the API. *** ## Parent wallet [#parent-wallet] This is an [Enterprise wallet](#enterprise-wallet) to which a wallet denominated in [tokens](#token) is linked. The parent wallet must be created in the same blockchain as the token. Each parent wallet can serve as the parent for a single token wallet, it's not possible to link two token wallets to the same parent wallet. The B2BINPAY commission for token processing is charged from the parent wallet. Therefore it's important to maintain the minimum required amount of funds on the wallet to process transactions. The required amounts are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) *** ## Payout [#payout] This is a payment, withdrawal, or transfer made from your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets. All the payouts from Enterprise wallets must match the wallet currency and are always [on-chain](#on-chain-transaction). The payouts from Merchant wallets can be made in any currency, payments to other B2BINPAY Merchant wallets can be [off-chain](#off-chain-transaction). For Merchant wallets denominated in fiat currencies, B2BINPAY also supports [bank withdrawals](#bank-withdrawal). *** ## Stablecoin [#stablecoin] This is a cryptocurrency, the market value of which is pegged to a reference asset, such as fiat currency, precious metal, and so on. Stablecoins combine the efficiency and security of blockchain technology with the stability of traditional finance, making them attractive for trading, savings, or payments. **Key points**: * Bridge digital assets with the traditional financial ecosystem. * While aren't guaranteed to maintain complete stability, they tend to be less volatile than popular cryptocurrencies. * Based on the "underlying" asset, can be categorized into various types, such as fiat-collateralized, crypto-collateralized, commodity-collateralized, algorithmic. **Example**: * **USDT**: The Tether stablecoin backed by the U.S. dollar at 1:1 ratio. *** ## Staking [#staking] Staking is a process of locking up crypto assets for a certain period of time to support the operation of the blockchain. In exchange for staking your crypto, you earn more crypto and/or save on commissions. At the moment, B2BINPAY supports **TRX staking**. You can stake TRX in exchange for resources: **bandwidth** or **energy**. The resources allow you to save on the blockchain fee. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are replenished throughout the day. Along with the resources, you also receive 1 vote for each TRX staked. You can distribute the votes among [SRs](#sr) and gain additional profit in return: the process is split into rounds, during which SRs generate profit that they can further distribute as rewards among their voters. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. Once in 24 hours the accumulated reward can be claimed and withdrawn to your TRX wallet, with a 10% commission is deducted from the reward. You can re-distribute your votes at any time, this will take effect from the next round. The resources and votes are available immediately after staking. You can unstake your funds anytime, but remember that the unstaking process takes 14 days on the blockchain. So you'll be able to withdraw TRX to your wallet after 14 days, until then they remain locked. You can cancel the unstaking request anytime during this period. When unstaking, all distributed votes are automatically canceled, the resources are no longer available. *** ## SR [#sr] In [TRX staking](#staking), this is a Super Representative to whom you may give your votes. They serve as blockchain "partners", supporting its operation and generating profit, which they can further distribute as rewards among their voters. When deciding on which SR to vote for, you can rely on the following key performance indicators displayed by B2BINPAY for each SR: * **Current votes**: The total number of votes cast for the SR. * **Reward distribution**: The proportion of rewards distributed to voters to all rewards gained by the SR. * **Productivity**: The percentage of successfully validated blocks. * **Expected APR**: The expected annual percentage rate. The APR may change at any time and the estimated profit may differ from the actual profit received. Mind that reward distribution is up to the SR and can't be guaranteed by B2BINPAY. The process is divided into rounds. You can gain profit for each round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-distribute your votes to SRs at any time, this will take effect from the next round. The list of 27 SRs available for voting is provided by the Tron blockchain and is valid for a certain period of time. After that, a redistribution of positions in the list may occur. Keep in mind that if an SR is no longer ranked in the top 27, they can no longer generate and distribute rewards. The votes given to such SRs aren't automatically canceled, if you want to recall your votes, you have to do it manually. *** ## Swap [#swap] This is a currency exchange operation between your [Swap wallets](#swap-wallet). Swap operations are always [off-chain](#off-chain-transaction). You can exchange all available currencies, including fiat, coins, and tokens. *** ## Swap wallet [#swap-wallet] This is a B2BINPAY account enabling you to [swap](#swap) currencies. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your [Enterprise](#enterprise-wallet) or [Merchant](#merchant-wallet) wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. *** ## Token [#token] This is a digital asset that operates on an existing blockchain. Unlike [coins](#coin), which have their own blockchains, tokens are issued on established third-party blockchains, such as Ethereum, Tron, or BNB Smart Chain. Companies often issue tokens during Initial Coin Offerings (ICOs) or other token sale events. Tokens can represent assets, utilities, or even voting rights within a specific project. **Key points**: * Issued on top of existing blockchains. * Non-mineable and created through smart contracts. * Represent assets, utilities, or rights within a particular project. * Offer a wider range of functionalities compared to coins. **Example**: * **USDT-TRX**: The Tether (USDT) token issued on the Tron blockchain that can be used within the Tron network. *** ## Tracking ID [#tracking-id] This is a unique identifier that you can assign to your deposits and payouts. Its primary purpose is to help identify specific transactions in B2BINPAY and external systems. This identifier can be composed of any combination of numbers and letters, chosen by you for ease of reference. For each payout, the **Tracking ID** must be unique within the wallet, whereas you can reuse the same identifier across multiple deposits. The **Tracking ID** can be specified when creating deposits and payouts via both the Web UI and API, and can be utilized in callbacks sent by the system. It helps both businesses and customers track transactions and quickly locate and address issues in case of any discrepancies. *** ## Transfer [#transfer] This is any crediting or debiting of funds registered on the wallet. For more information on operation types, refer to [Transfer types](transfer-types). *** ## TXID [#txid] This is a transaction identifier, or transaction hash, which is a unique identifier assigned to each blockchain transaction. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. The example of a TXID: `f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e1`. B2BINPAY logs TXIDs for all transactions registered in the system. You can find them on the **Transfers** page and in **Transactions** tabs of deposit and payout details. Each TXID links to a blockchain explorer — a public tool for tracking transactions. In this documentation, you can also find a list of [block explorers](block-explorer-list). *** ## User role [#user-role] This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. For more information, refer to [User roles](user-roles). *** ## Wallet [#wallet] This is an account of a B2BINPAY user. B2BINPAY supports four wallet types for various purposes: * [Enterprise wallet](#enterprise-wallet) * [Merchant wallet](#merchant-wallet) * [Swap wallet](#swap-wallet) * [Custody wallet](#custody-wallet) In the **Operation type** column, you can find codes corresponding to the `op_type` field value of the [Transfer object](../api-guide/transfer-methods#transfer-object). The **In/Out** column indicates whether the transfer is incoming or outgoing. The **Fiat/Crypto** column indicates which types of currency are supported for the transfer: crypto, fiat, or both. ## UUID tools [#uuid-tools] Here you can find a list of UUID tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/uuid](https://www.npmjs.com/package/uuid) * **PHP**: [https://packagist.org/packages/ramsey/uuid](https://packagist.org/packages/ramsey/uuid) * **Java**: [https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html](https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html) * **Ruby**: [https://www.rubydoc.info/gems/uuid/2.3.8/UUID](https://www.rubydoc.info/gems/uuid/2.3.8/UUID) * **Python**: [https://docs.python.org/3/library/uuid.html](https://docs.python.org/3/library/uuid.html) * **C#**: [https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid](https://learn.microsoft.com/en-us/dotnet/api/system.guid.newguid) ## HMAC tools [#hmac-tools] Here you can find a list of HMAC tools for the most popular programming languages: * **JavaScript**: [https://www.npmjs.com/package/crypto-js](https://www.npmjs.com/package/crypto-js) * **PHP**: [https://www.php.net/manual/ru/function.hash-hmac.php](https://www.php.net/manual/ru/function.hash-hmac.php) * **Python**: [https://docs.python.org/3/library/hmac.html](https://docs.python.org/3/library/hmac.html) ## Reference information [#reference-information] * [JSON API Specification](https://jsonapi.org/format/) * [FIAT currency codes](https://en.wikipedia.org/wiki/ISO_4217) * [Bitcoin Wiki](https://en.bitcoinwiki.org/wiki/Main_Page) * [HMAC algorithm description](https://wikipedia.org/wiki/HMAC) User access to B2BINPAY is restricted according to user roles. The default roles include: * **Owner**: A a user with this role has the maximum permissions and can’t be assigned any other roles. This user has Web UI and API access. Only one user can be assigned this role. * **Admin**: A user has access to the API. * **Withdrawals with approval**: A user has access to the Web UI, can make deposits and payouts, but the payouts require confirmation from the *Owner*. * **Read only**: A user has access to the Web UI and can view information on wallets and transactions, but can’t perform any actions such as creating new deposits or payouts. The first user registered in B2BINPAY is automatically assigned the *Owner* and *Admin* roles. Users with these roles can invite other users to B2BINPAY and manage their access permissions. After registration, the *Owner* also receives the API keys to the email. ## Security [#security] ## Enterprise and Merchant wallets [#enterprise-and-merchant-wallets] ## Transfers [#transfers] ## Deposits [#deposits] ## Payouts [#payouts] ## Callbacks [#callbacks] ## Custody wallets [#custody-wallets] ## Staking [#staking] ## Swaps [#swaps] ## Helpdesk [#helpdesk] ## API [#api] [^1]: This is a set of permissions assigned to a user, enabling to perform certain actions in B2BINPAY. ## Problem [#problem] * The incoming transfer is assigned the *Canceled* status. * I need to collect funds from the canceled transfer. * I encountered the *Transfer amount is less than required minimum* event. ## Possible reasons [#possible-reasons] This issue may occur if the amount of the incoming transfer is less than the [Minimum transfer amount](../references/key-terms#minimum-transfer-amount) set for your wallet. In this case, the transfer is automatically assigned the *Canceled* status. The funds stay on the deposit address and can't be used until further action is taken. ## Solution [#solution] When you detect a canceled transfer, it can be resolved through the **Side collecting funds** process. Here are the possible ways to do it. ### Initiate another transfer exceeding the minimum amount [#initiate-another-transfer-exceeding-the-minimum-amount] Request your payer to make another deposit to the same wallet address. Ensure this deposit amount is equal to or exceeds the wallet's **Minimum transfer amount**. Upon receiving the new transfer, the system will automatically recover the previously canceled deposit through the **Side collecting funds** process: * The status of the canceled transfer will update to *Failed*. * A new transfer of the **Side collecting funds on wallet** type will be created, which includes the ID of the original canceled deposit. * The funds of both deposits will then be credited to your wallet. ## Understand Smart Contract logic [#understand-smart-contract-logic] The underlying smart contract includes programmed instructions that only permit the collection of transfers meeting or exceeding the specified minimum amount. If the new transfer doesn't meet this requirement, it will also remain stuck in the *Canceled* status, even if the total of incoming transfers surpasses the minimum transfer amount. ## Important consideration [#important-consideration] Note that while the first deposit failed, it still will be credited to your wallet along with the next successful transfer. Therefore, as a merchant, you are responsible for manually refunding any differences to the payer. Instead of requesting a new transfer from your payer, you can wait until a larger transfer arrives to your wallet address. When this happens, the system will automatically process the previously canceled deposit just as described above. ### For Enterprise wallets only: Manually accept the canceled transfer [#for-enterprise-wallets-only-manually-accept-the-canceled-transfer] If a deposit to your Enterprise wallet is less than the **Minimum transfer amount** set for the wallet, you have an additional option to accept it manually. 1. Locate the deposit on the **Wallet management** > **Events** page. You can filter it by the *Transfer amount is less than required minimum* event type. 2. Click **Confirm anyway** to accept the deposit. Be cautious when accepting deposits below the required minimum amount. Confirming each deposit incurs [blockchain fees](../references/key-terms#blockchain-fee) charged from your wallet. If the deposit amount is less than these costs, accepting it may not be economically reasonable. Once confirmed, the system will automatically process the previously canceled deposit using the **Side collecting funds** process described above. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Events](../user-guide/wallet-management/events) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit) ## Problem [#problem] I can't pass 2FA because I encounter the **Wrong 2FA code** error. ## Possible reasons [#possible-reasons] This issue may occur due to time discrepancies between your device and Google Authenticator, or browser-related problems. ## Solution [#solution] Here are several steps that can help you resolve most common 2FA issues. ### Verify the 2FA code [#verify-the-2fa-code] **Multiple accounts**: If you manage multiple accounts, ensure you're using the correct 6-digit code associated with this specific account. ### Synchronize device time settings [#synchronize-device-time-settings] By ensuring your device's time is accurately synchronized, you can reduce the likelihood of encountering the error during the 2FA process. **For Windows**: 1. Right-click the time display in the taskbar and select **Adjust date/time**. 2. Ensure that **Set time automatically** is enabled. 3. Click **Sync now** under **Synchronize your clock**. **For macOS**: 1. Go to **System settings** > **General** and select **Date & Time**. 2. Ensure that **Set date and time automatically** is checked. 3. If adjustments are needed, click the **lock icon** to make changes. **For Android**: 1. Go to **Settings**. 2. Scroll to **System** and select **Date & Time**. 3. Ensure that **Set time automatically** and **Set time zone automatically** are enabled. **For iPhone**: 1. Go to **Settings**. 2. Go to **General** and select **Date & Time**. 3. Enable the **Set automatically** toggle. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the 2FA process. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Delete browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Use Incognito/Private browsing mode [#use-incognitoprivate-browsing-mode] This mode disables extensions and uses default settings, which can help identify browser-related issues. **For Google Chrome**: * Press `Ctrl + Shift + N` to open an incognito window. **For Mozilla Firefox**: * Press `Ctrl + Shift + P` to open a private browsing window. ### Check the Internet connection [#check-the-internet-connection] A stable internet connection is important for 2FA processes. 1. Ensure you're connected to a reliable network. 2. Avoid using VPNs or proxies during the authentication process, as they can cause synchronization issues. ### Remove and re-add the account in Google Authenticator [#remove-and-re-add-the-account-in-google-authenticator] If none of the above worked, try deleting and re-adding your account in Google Authenticator. 1. **If you can access your profile settings in B2BINPAY**, disable the 2FA temporarily. 2. Open Google Authenticator and delete the existing 2FA entry for your account. 3. Re-enable 2FA on your account and scan the new QR code to add it back to Google Authenticator. 4. Test logging in with the new code. If the problem persists, contact the Support Team for further assistance. **See also:** * [Profile menu](../get-started/explore-the-web-interface#profile-menu) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) ## Problem [#problem] I can't login to the system because I encounter the **You IP is not whitelisted** error. ## Possible reasons [#possible-reasons] This issue may occur due to the IP address from which you're trying to access the system not being whitelisted. ## Solution [#solution] Here are several steps that can help you resolve most common IP-related issues. ### Check IP configuration [#check-ip-configuration] Verify if your current IP address is included in the list of whitelisted IPs. To identify your IP address, use resources like [http://ifconfig.net/](http://ifconfig.net/). ### Update the whitelist [#update-the-whitelist] If your IP is not on the list and **if you can access your profile settings**, add your IP address to the list. ### Use a VPN [#use-a-vpn] If accessing a whitelist isn't possible, consider using a VPN or proxy server that routes traffic through a whitelisted IP address. Make sure the VPN service is secure and trustworthy. ### Dynamic IP consideration [#dynamic-ip-consideration] If your Internet provider assigns dynamic IP addresses, your public IP might change frequently. Ensure your current IP address is granted access. Mind that the system doesn't support whitelisting of dynamic IP addresses. ### Firewall and security software [#firewall-and-security-software] Check any firewalls or security software that might be affecting network settings and ensure they aren't blocking your access. If the problem persists, contact the Support Team for further assistance. **See also:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) ## Problem [#problem] * The payer sent me funds, but I didn't receive the payment. * I can't find the incoming transaction in the external systems. ## Possible reasons [#possible-reasons] These issues may occur due to: * The transaction still being processed on the blockchain. * Wrong deposit address. * Missing callback details. ## Solution [#solution] Here are several ways that can help you verify the transaction. ### Check for transfers [#check-for-transfers] Go to the **Wallet management** > **Transfers** page and filter transfers by [TXID](../references/key-terms#txid). Double check the TXID was accurately obtained or provided. * If the transfer is found and assigned the *Confirmed* status, it means that it has been successfully processed and credited to your wallet. * If the transfer is found but assigned the *Unconfirmed* status, it means that the transaction hasn't yet received enough block confirmations on the blockchain, please wait. Once the required number of confirmation blocks received, the transfer status in B2BINPAY will change to *Confirmed*, and the deposit amount will be credited to your wallet. The confirmation time may vary based on the blockchain used, fees paid, and network load. Use [block explorers](../references/block-explorer-list) to check if the transaction has received enough confirmations on the blockchain. You can find the required number of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If the transaction is confirmed on the blockchain, but in B2BINPAY the transfer remains unconfirmed for an extended period, there might be a technical issue. Contact the Support Team for further assistance: provide the TXID and transfer ID. ### Check the deposit address [#check-the-deposit-address] If no transfer is found, verify if the deposit address is associated with the system. Go to the **Wallet management** > **Deposits** page and filter deposits by the address. * If the deposit is located but no transfers were credited, contact the Support Team for further assistance. Provide the TXID, address, and deposit ID. * If no deposit is located, it indicates that the address is not within the system, and such deposits can't be credited. ### Check for callback issues [#check-for-callback-issues] Even if the transfer is found and confirmed in B2BINPAY, it still can be missing in the external systems due to [callback](../references/key-terms#callback) issues. 1. Go to the **Wallet management** > **Deposits** page, find the required deposit and click its **ID** to access the details. In the **Advanced options** on the **Settings** tab, verify that the **Tracking ID** and **Callback URL** are correctly specified. Adjust them if needed. Missing these details can cause callback issues, leading to unrecorded transactions in the external system. 2. Ensure the server handling callbacks is correctly configured and functioning. 3. Go to the **Wallet management** > **Callbacks** page, locate the corresponding callback, and click the **Resend** button. * **Unsupported blockchains**: Transactions can only be credited if the blockchain is supported by the system. Transactions on unsupported networks can't be recovered. * **Unsupported tokens**: Funds can be reversed, contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/transfers) * [Deposits](../user-guide/wallet-management/deposits) * [Callbacks](../user-guide/wallet-management/callbacks) ## Problem [#problem] I can't log in to my account because I encounter the **No active account found with the given credentials** error. ## Possible reasons [#possible-reasons] This issue may occur due to entering incorrect credentials when trying to log in. ## Solution [#solution] Here are several steps that can help you resolve most common login issues. ### Check the credentials [#check-the-credentials] Make sure that you enter the correct credentials. ### Check the keyboard layout [#check-the-keyboard-layout] Ensure your keyboard layout matches your usual settings, especially if special characters are involved. ### Check CapsLock [#check-capslock] Check if the CapsLock key is active, as it may alter the input. ### Clear browser cache and cookies [#clear-browser-cache-and-cookies] Sometimes, cached data can interfere with the login process. Clear your browser's cache and cookies and try again. **For Google Chrome**: 1. Click the three dots in the upper-right corner and select **Settings**. 2. Go to **Privacy and security** and click **Clear browsing data**. 3. Choose **Cookies and other site data** and **Cached images and files**, then click **Clear data**. **For Mozilla Firefox**: 1. Click the three lines in the upper-right corner and select **Settings**. 2. Go to **Privacy & Security** and scroll to **Cookies and site data**. 3. Click **Clear data**, select both options, and confirm. ### Account lockout [#account-lockout] After multiple failed login attempts, your account may be locked. Wait for about a minute to be able to try again. ### Reset password [#reset-password] If none of the above worked, click the **Forgot password** link to reset it. If the problem persists, contact the Support Team for further assistance. ## Problem [#problem] * The outgoing transfer is stuck in the *Unconfirmed* status. * I encountered the *Insufficient funds on parent wallet* event. ## Possible reasons [#possible-reasons] These issues may occur due to: * The fee amount being to low (for payouts). * The [parent wallet](../references/key-terms#parent-wallet) lacks funds for accepting payment in tokens (for deposits). ## Solution [#solution] ### Stuck payouts [#stuck-payouts] The confirmation time for a transaction varies depending on the blockchain used, paid fees, and network load. For example, Bitcoin transactions typically take around 10 minutes to confirm, while Ethereum transactions are confirmed in about 12 seconds. You can find the required numbers of block confirmations for different currencies [here](https://b2binpay.com/en/available-currencies). If a transaction remains at zero confirmations for a long time, it may indicate the transaction fee was too low. In such cases, you can either wait for network fees to decrease, or resubmit the transaction with a higher fee to accelerate processing. For details, refer to [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee). ### Insufficient funds on parent wallet [#insufficient-funds-on-parent-wallet] When receiving payments to your token wallet, commissions are deducted from the linked parent wallet. If the parent wallet lacks sufficient funds to cover these commissions, the payment will not be processed until it's replenished. Here are several steps that can help you handle it. ### Identify the parent wallet [#identify-the-parent-wallet] 1. Locate the transfer on the **Wallet management** > **Events** page. You can filter events by the **Insufficient funds on parent wallet** type to identify all unconfirmed transfers. 2. Click the deposit ID in the **Operation ID** column to access the deposit details. 3. In the deposit details, find the information about your token wallet to which the deposit was made and click its **ID** to access the wallet details. 4. In the token wallet details, find the link to its parent wallet and click it to access the details. ### Check the minimum required balance [#check-the-minimum-required-balance] Compare the parent wallet current balance against the required minimum amounts for transaction processing. The necessary amounts for various blockchains are as follows: * 75 TRX (Tron) * 0.0009 BNB (Binance Smart Chain) * 0.01 ETH to 0.05 ETH (Ethereum) ### Top up the parent wallet [#top-up-the-parent-wallet] 1. In the wallet details of the parent wallet, find the **Wallet address** and copy it. 2. Make a direct deposit to the parent wallet. Make sure your deposit amount is enough to cover the minimum required amount. ### Retry the transfer [#retry-the-transfer] 1. Check the deposit status on the **Wallet management** > **Transfers** page. You can identify it by filtering transfers by the **Direct deposit to wallet address** type. The status should update to *Confirmed*. 2. Once the deposit is successfully credited to your parent wallet, go back to the **Wallet management** > **Events page**. 3. Click the **Retry** button for the corresponding event to process the transaction. If after successful replenishing of the parent wallet the **Retry** button is unavailable (grayed out), contact the Support Team for further assistance. **See also:** * [Transfers](../user-guide/wallet-management/deposits) * [Events](../user-guide/wallet-management/events) * [How to speed up your payout by changing the blockchain fee](../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) ## Problem [#problem] * My deposit is assigned the *Unresolved* status. * I need to collect funds from the unresolved deposit. * I encountered the *Overpaid deposit* or *Transfer to expired deposit* events. ## Possible reasons [#possible-reasons] This issue may occur with the deposits that have set limits (amount or expiration date) due to: * **Overpaid deposit**: The amount of an incoming transfer exceeds the specified deposit amount. * **Overdue deposit**: The incoming transfer is received after the specified expiration date. ## Solution [#solution] Here are several steps that can help you handle the unresolved deposit. ### Find out why the deposit is unresolved [#find-out-why-the-deposit-is-unresolved] Check if the deposit is unresolved because it's overpaid or overdue. 1. Locate the deposit in the list on the **Deposits** page. You can filter it by the *Unresolved* status. 2. Click the deposit **ID** to access deposit details. 3. In the **Limits** section on the **Settings** tab, check the specified **Requested amount** and **Expired at**. 4. On the **Transactions** tab, locate the related transfer. Check its amount and creation time against the set limits. ### Adjust the deposit limits [#adjust-the-deposit-limits] **For overpaid deposits**: Adjust the **Delta** to match the overpaid amount. For example, if the requested amount is 10 USDT and the payer sent 15 USDT, set the Delta to 5 USDT. **For overdue deposits**: Change the **Expired at** to match the time of the transaction. You can also extend the time limit to give payers another chance to send a payment within the new timeframe. An overdue deposit's status changes to *Canceled* and payers won't be able to see the address on the Payment page. ### Manually change the deposit status [#manually-change-the-deposit-status] Once all the requirements are met, change the deposit status from *Unresolved* to **Paid** if you want to collect funds and "close" the deposit, or to **Invoice** if you want to extend the deposit's lifetime. In the latter case, the Payment page remains active and can be used for sending funds. The above information is only applicable to deposits with set limits made to Merchant wallets. Deposits without limits or made to Enterprise wallets are always assigned the *Invoice* status, manual status changing is unavailable. The status can't be changed to *Paid* if the limit requirements are unmet. Attempting this may result in errors such as *Change of deposit status is prohibited*. **See also:** * [Deposits](../user-guide/wallet-management/deposits) * [How to create a deposit](../how-tos/manage-your-assets/how-to-create-a-deposit#deposits-to-merchant-wallets) **Know Your Business (KYB)** is a verification process that confirms the authenticity and legitimacy of your business entity. This process verifies that your company is: * Legally registered and operating. * Compliant with regulatory requirements. * Protected against corporate fraud and illegal activities. **KYB verification is mandatory** to access B2BINPAY production environment and begin processing real transactions. B2BINPAY uses [Sumsub](https://sumsub.com/) as our trusted KYB verification provider to ensure secure and compliant business verification. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Until KYB verification is completed, you can only use the Sandbox environment. * Verification must be renewed periodically to maintain compliance. * You'll see a red notification badge on the KYB menu item when: * KYB verification hasn't been initiated yet. * Additional documents are requested by the verification provider. ## Legal entity list [#legal-entity-list] On this page, you can view a list of all your legal entities registered in the system and their statuses. The following information is provided about each entity: **Legal entity name** The official business name, as specified during KYB. *** **Country of incorporation** The country where your business is legally registered and incorporated, as specified during KYB. *** **Jurisdiction** Automatically determined based on your country of incorporation. This affects which regulatory requirements apply to your business. *** **Status** The current status of your KYB verification request. Possible values: * **In progress**: You've started but haven't completed the KYB verification process. * **Pending**: Your application is being reviewed by our verification provider. * **Approved**: Verification successful — you can access production features. * **Declined**: Verification was rejected — you may submit a new application with a different entity. * **Cancelled by client**: You cancelled the verification process. * **Action required**: Additional documents or information needed — **respond promptly to avoid delays**. *** **KYB start date** The date and time when the KYB process was initiated for this entity. *** **Next KYB date** *For approved entities only.* The date and time when your next periodic re-verification is due to maintain compliance. *** **Available actions** Depending on your entity's current status, the following options are available: * **Cancel**: *(Available for: In progress status)* * Stop the current verification process. * **Check**: *(Available for: In progress, Pending, Action required status)* * View verification progress. * Continue incomplete verification. * Submit additional required documents. The **partner program** is a referral program that lets you earn additional revenue when new clients sign up to B2BINPAY through your unique referral link. For each invited client who passes KYB and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions for a limited period defined in the partner program settings. Rewards are credited once per month and credited to the wallet you selected for receiving partner rewards. On this page, you can manage your referral link and monitor the rewards you earn from invited clients. ### Key points [#key-points] * The partner program issues a unique referral URL for each legal entity, to share with potential clients. * Rewards are calculated as a percentage of B2BINPAY commissions on eligible transactions of referred clients. * Rewards are credited once per month for the previous period. * Partner rewards are limited by the partner program settings, including the percentage and program lifetime. ## Access the Partner program page [#access-the-partner-program-page] To open the partner dashboard: * In the left menu, go to **Partner Program**. The page shows three main blocks: * **Unique referral URL** — your personal referral link and copy action. * **How it works** — a short explanation of the referral flow and terms. * **Overview** — your current percentage, invited and active partners, and accumulated rewards. Below these blocks, you see the **Invited partners** table with detailed information about each referral. ## Unique referral URL [#unique-referral-url] This is the unique referral identifier assigned to your legal entity. Share this link with partners who want to sign up for B2BINPAY. When a new client completes onboarding using your link and passes KYC and KYB checks, their commissions may start generating rewards for you, depending on the partner program configuration. To get your referral link, first select or create a Merchant wallet in USD, to which you will receive your partner rewards. ## Overview panel [#overview-panel] This block summarizes the key partner metrics for your legal entity: **Invited/Active partners** Displays how many clients you have invited in total and how many of them are currently active and generating rewards. *** **Current percentage** Displays the percentage of B2BINPAY commissions that you receive from eligible transactions of your active referred clients. *** **Total bonus** Displays the total amount of partner program rewards accumulated for all referred clients over the entire program lifetime. *** **Reward for previous month** Displays the amount of rewards calculated for the previous reporting month. ## Terms and conditions [#terms-and-conditions] You can find the settings of the partner program by clicking the **Terms and conditions** link in the **How it works** block. ## Invited partners list [#invited-partners-list] The following information is provided about each client who registered using your referral link: **ID** The internal identifier of the referred client. *** **Partner** The email address of the referred client and, when KYB is approved, the legal entity name. *** **Registered date** The date when the referred client’s legal entity was registered in the production environment. This date is also used to calculate the referral program validity period together with the configured time limit. *** **Status** The current status of the referred client. Possible values: * **In progress**: The client has started onboarding but has not yet passed KYB. * **Active**: The client has passed KYB and currently generates rewards according to the partner program rules. * **Inactive**: The referral no longer generates rewards as the program time limit expires, or the referred client's KYB fails. *** **Bonus for previous month** The amount of partner program reward calculated for this referred client for the previous month. *** **Total bonus** The total accumulated reward amount for this referred client over the lifetime of the partner program. *** **Expired at** The date when the referral stops generating partner rewards. After this date, new commissions paid by this client no longer increase your partner bonus. **See also:** * [How to launch a partner program](../how-tos/manage-your-profile-and-system/how-to-launch-a-partner-program) **Rates** are the current exchange rates for currency conversion used for different financial operations. On this page, you can find a list of all currency pairs available in B2BINPAY. By default, B2BINPAY obtains prices from [B2CONNECT Liquidity Hub](https://b2broker.com/products/b2connect/) (if you haven’t connected another liquidity provider when setting up the system). The rates are updated every 20 seconds. If the price cell is highlighted in green, the value has increased since the previous update; in red — decreased. No highlighting means that the value hasn’t changed. Above the table, you can see **quick filters**: * **Favorites**: To display currency pairs added to *Favorites*. To add a currency pair to *Favorites*, click the **star icon** near it. * **All** (default): To display all available currency pairs. * **Fiat**: To display currency pairs where one or both currencies are fiat. * **Tokens**: To display currency pairs where one or both currencies are tokens. * **Coins**: To display currency pairs where one or both currencies are coins. Next to quick filters, you can see the **Decimal places** option. Use it to adjust the number of digits after a decimal separator in prices to be displayed (by default, 8). Available values are in the range from 0 to 18, but the actual number of digits is limited by the number specified in currency settings, refer to [Currency codes](../references/currency-codes). The **B2BINPAY DeFi API** allows you to integrate B2BINPAY DeFi app features into your own systems. You can manage accounts, create invoices, monitor transactions, and inspect callbacks using a unified REST interface. Before you start working with the B2BINPAY DeFi API, you need to generate API keys required for request authentication. Refer to [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for step-by-step instructions. B2BINPAY DeFi charges credits for using API: access the **Credits** page to view the detailed pricing. Refer to [View credit balance and pricing](../user-guide/credits#view-credit-balance-and-pricing) and [Top up the credit balance](../user-guide/credits#top-up-the-credit-balance) for step-by-step instructions. ## General information [#general-information] * **Base URL**: `https://api.defi.b2binpay.com/api/v1`. * **Format**: All endpoints use JSON for requests and responses. ## Required headers [#required-headers] * `x-api-key: {Your API key}` — required for all endpoints. * `Accept: application/json` — required for all endpoints. * `Content-Type: application/json` — required for requests with a body. ## HTTP response codes [#http-response-codes] * `2xx` — success (`200 OK`, `201 Created`). * `400` — validation error (`Invalid input`). * `401` — `Invalid or missing token` or `Invalid or expired token`. * `403` — permission issues (for example, *You are not a member of this account or deployment*). * `404` — resource not found (transaction, invoice, account, etc.). * `409` — conflicts (for example, invoice with the same tracking ID already exists). * `503` — service unavailable (for example, failing health check). ## Deployment ID [#deployment-id] To obtain the `deploymentId` parameter value which is used in many API calls, use the `GET [base]/api/v1/accounts/{accountId}` method. Refer to [Account methods](account) for details. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. A **callback** is an outbound HTTP webhook that B2BINPAY DeFi sends to your system when an invoice- or payout-related event occurs. When such an event happens, the app sends a `POST` request with a JSON body to the callback URL you configured, so you can react to payments and operations in real time. To inspect delivered callbacks or resend a failed one, open the **Callbacks** tab of the relevant invoice or payout in the app. Callback inspection and resending are not part of the API key surface. ## Callback payload [#callback-payload] Every callback body uses the same top-level structure: **`id`** `string · UUID` The unique callback identifier, in the UUID format. **`type`** `string` The callback type. Invoice-related types: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. Payout-related types: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **`operation_id`** `string · UUID` The identifier of the original operation: `invoiceId` for invoice-related callback types, `payoutId` for payout-related callback types. **`operation_type`** `string` The original operation type: `invoice` or `payout`. **`timestamp`** `string` The date and time the callback was generated, in ISO 8601 format (UTC). Updated with each callback resend attempt. **`data`** `object` The callback-specific payload. Always includes the original operation object (`invoice` or `payout`). May include transactions, claims, and other associated objects. Below you can find examples of payloads for different callback types. ```json { "id": "f7f2a2f4-2a8a-48cb-9c7a-6b5f2c1b1a33", "type": "INVOICE_CREATED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:00:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "dd08d1b9-0a1e-4e0b-9c8e-7a6f5e4d3c2b", "type": "INVOICE_DEPOSIT_RECEIVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:05:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "PENDING", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345670, "confirmations": 0, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:05:00Z", "isClaimed": false } } } ``` ```json { "id": "3f5a2a2b-4c1d-49d2-8e8a-9f3b0b0a1a22", "type": "INVOICE_DEPOSIT_CONFIRMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:10:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "CREATED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "transaction": { "id": "9af6d8b1-6a2b-4c47-9c56-3a34a2e5d3d7", "direction": "IN", "chainId": 1, "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "150.00", "status": "EXECUTED", "fromAddress": "0xaaaa...aaaa", "toAddress": "0x1234567890123456789012345678901234567890", "blockNumber": 12345678, "blockchainFee": "0.001", "confirmations": 12, "createdAt": "2025-08-22T10:05:00Z", "updatedAt": "2025-08-22T10:10:00Z", "confirmedAt": "2025-08-22T10:10:00Z", "isClaimed": false } } } ``` ```json { "id": "d2a5ee9c-6d9a-4f6a-a6a7-6efaf0a5b6f7", "type": "INVOICE_PAID", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:12:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "150.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "a8a4c8b7-3a4b-4f74-9e3d-bb3b0f9d0c9a", "type": "INVOICE_UNRESOLVED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:15:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "160.00", "status": "UNRESOLVED", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" } } } ``` ```json { "id": "b1f2c3d4-e5f6-47a8-9123-4567890abcde", "type": "INVOICE_CLAIMED", "operation_id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "operation_type": "invoice", "timestamp": "2025-08-22T10:20:00Z", "data": { "invoice": { "id": "93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "invoiceAddress": "0x1234567890123456789012345678901234567890", "requestedAmount": "150.00", "paidAmount": "0.00", "status": "PAID", "trackingId": "INV-2024-0001", "callbackUrl": "https://merchant.example.com/webhook/invoice", "paymentPageButtonUrl": "https://example.com/invoice/pay", "paymentPageButtonText": "Pay Invoice", "paymentPageUrl": "https://frontend.example.com/pay/93c75c47-40c3-4e2a-a65f-0f8fd48f6d83", "createdAt": "2025-08-22T10:00:00Z", "updatedAt": "2025-08-22T10:00:00Z" }, "claim": { "id": "123e4567-e89b-12d3-a456-426614174000", "status": "PENDING", "chainId": 1, "currencyId": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "amount": "300.00", "fromAddress": "0x1234567890123456789012345678901234567890", "toAddress": "0x9876543210987654321098765432109876543210", "txHash": "0x5555666677778888999900001111222233334444555566667777888899990000", "linkedTransfers": [ "001e4567-e89b-12d3-a456-426614174000", "002e4567-e89b-12d3-a456-426614174000" ], "createdAt": "2024-01-01T00:00:00.000Z", "ethAmount": 0.5, "tokenAmount": 100 } } } ``` ```json { "id": "0c9d8e7f-6a5b-4c3d-9e0f-1a2b3c4d5e6f", "type": "PAYOUT_CREATED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:30:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CREATED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ```json { "id": "92f13f4b-5c7d-4f3a-912a-37b7e6a23f90", "type": "PAYOUT_SENT", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:33:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "SENT", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "e7a89cde-1f23-45ab-9876-12c34d5678ef", "direction": "OUT", "chainId": 1, "txHash": "0xaaaabbbbccccddddeeeeffff1111222233334444555566667777888899990000", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "PENDING", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": null, "confirmations": 0, "createdAt": "2025-08-22T10:33:00Z" } } } ``` ```json { "id": "2e4f6a8c-0b1d-4f2a-93c7-3d2e1f0a9b8c", "type": "PAYOUT_EXECUTED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:37:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "EXECUTED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "transaction": { "id": "def56789-1234-4abc-5678-901234567890", "direction": "OUT", "chainId": 1, "txHash": "0xaaaa...bbbb", "currencyId": "1-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00", "status": "EXECUTED", "fromAddress": "0xteamWallet...", "toAddress": "0xmerchantWallet...", "blockNumber": 23456789, "confirmations": 15, "createdAt": "2025-08-22T10:35:00Z", "confirmedAt": "2025-08-22T10:37:00Z" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_FAILED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "FAILED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } }, "error": { "code": "INSUFFICIENT_FUNDS", "message": "Account balance at execution time was insufficient" } } } ``` ```json { "id": "6a7b8c9d-0e1f-4a2b-93c7-5d6e7f8a9b0c", "type": "PAYOUT_CANCELLED", "operation_id": "abc12345-6789-4def-9012-34567890abcd", "operation_type": "payout", "timestamp": "2025-08-22T10:40:00Z", "data": { "payout": { "id": "123e4567-e89b-12d3-a456-426614174000", "amount": "100.50", "toAddress": "0x9876543210987654321098765432109876543210", "trackingId": "INV-2024-0001", "callbackUrl": "https://example.com/webhook/invoice", "nonce": "42", "status": "CANCELLED", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z", "currency": { "id": "1-0xdac17f958d2ee523a2206206994597c13d831ec7", "symbol": "USDT", "name": "Tether USD", "chainId": 1, "address": "0xdac17f958d2ee523a2206206994597c13d831ec7" } } } } ``` ## Callback verification [#callback-verification] Each callback request is signed to confirm that it was sent by the B2BINPAY DeFi API and was not modified in transit. The signature is provided in the `X-CALLBACK-SIGNATURE` HTTP header, that contains an HMAC-SHA256 hash of the raw JSON payload and your [callback secret](../get-started/key-terms#callback-secret). ### Verification steps [#verification-steps] ### Read the raw request body [#read-the-raw-request-body] Capture the exact HTTP body bytes as received: * Do not re-serialize the JSON before verification. * Use `JSON.stringify(payload)` **without custom replacers/spacing** (no pretty print). * Ensure numbers and booleans stay as JSON primitives (do not stringify them). * Timestamps must be in the UTC ISO 8601 format, for example: `2025-08-22T10:10:00Z`. ### Read the signature header [#read-the-signature-header] Get the value of the `X-CALLBACK-SIGNATURE` header. → If the header is missing, reject the request (HTTP code `400`). ### Compute the expected signature [#compute-the-expected-signature] Use HMAC with SHA-256: * Key: `callback_secret` (UTF-8) * Message: raw request body bytes (UTF-8) * Output: hex string ### Compare signatures [#compare-signatures] Compare the received signature with the computed one using a constant-time comparison. ### Accept or reject [#accept-or-reject] * If signatures match → process the callback (HTTP code `200`). * If they do not match → reject the request (HTTP code `401`). ```js // Express.js handler example import crypto from 'node:crypto'; import express from 'express'; const app = express(); // Capture the raw HTTP request body. // This preserves the exact byte sequence used to generate the HMAC signature. app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } })); // Computes an HMAC-SHA256 signature (hex) over the raw request body. function computeHmacHex(rawBodyBuffer, secret) { return crypto .createHmac('sha256', Buffer.from(secret, 'utf8')) .update(rawBodyBuffer) // IMPORTANT: use the raw body bytes, not a re-stringified JSON object. .digest('hex'); } app.post('/webhook/invoice', (req, res) => { // Read the signature provided by the sender. const provided = req.get('X-CALLBACK-SIGNATURE'); if (!provided) { return res.status(400).send('Missing X-CALLBACK-SIGNATURE'); } // Shared callback secret (account-specific). const secret = process.env.CALLBACK_SECRET; // Recompute the expected signature from the raw request body. const expected = computeHmacHex(req.rawBody, secret); // Compare signatures using a constant-time algorithm to prevent timing attacks. const ok = crypto.timingSafeEqual( Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8') ); if (!ok) { return res.status(401).send('Invalid signature'); } // (Optional) Apply replay protection here: // - Reject callbacks with duplicate IDs. // - Reject callbacks with stale timestamps. // At this point, the callback is verified and can be safely processed. const { type, operation_type, operation_id, data, timestamp } = req.body; // ... Your business logic ... // Acknowledge receipt so the sender does not retry. return res.sendStatus(200); }); app.listen(3000, () => { console.log('Callback receiver listening on port 3000'); }); ``` The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. This section groups endpoints that do not belong to a specific resource area. ## Smart contract versions [#smart-contract-versions] Use this endpoint to retrieve metadata for a given smart contract version, such as the version string and supported features. The `versionId` value is returned by account-related endpoints as part of the deployment information. Use these methods to list, inspect, and manage queue operations for a deployment, including multisig configuration changes, rejects, and signatures. *** ## Sign a queue operation with a private key (EIP-712) [#sign-a-queue-operation-with-a-private-key-eip-712] Queue operations are signed using EIP‑712 typed data. The signature is created off‑chain with a raw private key, without a wallet UI, and authorizes execution of a multisig operation on‑chain. ### What is signed [#what-is-signed] Only the following data is signed: ```solidity Execute { Call[] calls; uint256 nonce; } ``` No other fields from the queue operation are included in the signature. ### Input data sources [#input-data-sources] #### From queue operation (API) [#from-queue-operation-api] To build the signed payload, load the queue operation from the API: * `GET /api/v1/deployments/{deploymentId}/operations` * `GET /api/v1/deployments/{deploymentId}/operations/{operationId}` From the queue operation object, use only: ```json { "nonce": "1", "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ] } ``` When building the typed data: * Treat `nonce` as `uint256`. * Treat `value` as `uint256`. * Treat `data` as a hex‑encoded `bytes` value (the literal `"0x"` is valid for empty data). #### From deployment and network [#from-deployment-and-network] The EIP‑712 domain uses deployment and network data: * `name` — always `MultiSigWallet`. * `version` — current smart contract version. * `chainId` — blockchain chain ID of the deployment. * `verifyingContract` — address of the multisig contract. You can obtain `verifyingContract` from the account: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` Use the value from the `account.contract` field for the multisig contract address. ### EIP-712 typed data structure [#eip-712-typed-data-structure] The exact typed data that is signed has the following structure: ```json { "domain": { "name": "MultiSigWallet", "version": "1.0.0", "chainId": "11155111", "verifyingContract": "0x71db8821df07d95f35d7c3bef22987397a965060" }, "primaryType": "Execute", "types": { "EIP712Domain": [ { "name": "name", "type": "string" }, { "name": "version", "type": "string" }, { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ], "Execute": [ { "name": "calls", "type": "Call[]" }, { "name": "nonce", "type": "uint256" } ], "Call": [ { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" }, { "name": "data", "type": "bytes" } ] }, "message": { "calls": [ { "to": "0xf127e5b7666f51aa346f374213113298014f5969", "value": "100000000000000", "data": "0x" } ], "nonce": "1" } } ``` Use this structure as a template. Do not change field names, types, or their order when building the typed data object. ### Signing algorithm [#signing-algorithm] #### Step 1. Build EIP-712 typed data [#step-1-build-eip-712-typed-data] * Use the structure shown above with `domain`, `types`, `primaryType`, and `message`. * Encode all numeric values (`chainId`, `nonce`, `value`) as `uint256`. #### Step 2. Compute the EIP-712 digest [#step-2-compute-the-eip-712-digest] The digest is computed as: ```text keccak256( "\x19\x01" || hashDomain(domain) || hashStruct(Execute(message)) ) ``` Standard EIP‑712 libraries perform this step automatically when you sign typed data. #### Step 3. Sign the digest with a private key [#step-3-sign-the-digest-with-a-private-key] Sign the digest using ECDSA over `secp256k1`: ```text signature = sign(digest, privateKey) ``` The resulting signature has the format: ```text 0x{r}{s}{v} ``` Where: * `r` — 32 bytes. * `s` — 32 bytes. * `v` — 1 byte. ### Example signature [#example-signature] Example of a valid signature value: ```text 0xf8d5a66ed464b5d39bf2b3f6c45932c901467b84bdfc4d534a24dcc532569bf3\ 27b3f19289912d223f69aceeab7a61edbffb1fc26d755e1db53f68263cbe03491b ``` ### Submit the signature to the API [#submit-the-signature-to-the-api] After computing the signature, submit it using the `Sign operation` endpoint: ```http POST /api/v1/deployments/{deploymentId}/operations/{operationId}/sign x-api-key: {your-api-key} Content-Type: application/json Accept: application/json { "signature": "0x..." } ``` On success, the API returns the updated signature status for the operation. If the same signer submits another signature for the same operation, the API returns a conflict error. ### Common errors when signing [#common-errors-when-signing] Common issues when building or submitting signatures include: * `Invalid signature` — incorrect domain (`chainId` or `verifyingContract` do not match the deployment). * `Invalid signature` — wrong data types in the message (for example, `nonce` passed as a string instead of `uint256` in the typed data). * `Invalid signature` — `calls` array order does not match the operation in the queue. * `You have already signed this operation` — the same address already submitted a signature. * `canSign = false` in the operation — the signer address is not an approver or is not allowed to sign. ### Summary [#summary] * Extract `calls[]` and `nonce` from the queue operation. * Build the EIP‑712 `Execute` typed data (`domain`, `types`, `message`). * Sign the EIP‑712 digest with a private key. * Submit the resulting signature to the B2BINPAY DeFi API. ## Execute a READY queue operation with a private key [#execute-a-ready-queue-operation-with-a-private-key] When a queue operation reaches the `READY` status and `canExecute = true`, you execute it by sending a regular Ethereum transaction to the deployed `MultiSigWallet` contract and calling: ```solidity function execute(Operation[] operations) external returns (bytes[][] results); struct Operation { Call[] calls; bytes signatures; // packed signatures bytes32 id; } struct Call { address to; uint256 value; bytes data; } ``` ### Preconditions [#preconditions] The queue operation must satisfy all of the following: * `status = "READY"`. * `canExecute = true`. * `signaturesCollected >= signaturesRequired`. * The `signatures` array in the API response contains at least the threshold number of signatures. ### Required inputs [#required-inputs] #### From API (queue operation) [#from-api-queue-operation] * `executeOperationId` — used as `Operation.id`. * `calls[]` — used as `Operation.calls`. * `signatures[]` — used to build packed bytes for `Operation.signatures`. #### From deployment and network [#from-deployment-and-network-1] * `verifyingContract` — multisig contract address for the deployment: * `GET /api/v1/accounts` * `GET /api/v1/accounts/{accountId}` * use `account.contract`. * `chainId` — chain ID of the network where the multisig is deployed. * `rpcUrl` — RPC endpoint for sending the transaction. * `executorPrivateKey` — private key of the externally owned account (EOA) that sends the transaction. ### Build Operation.calls [#build-operationcalls] Convert each API call object into the Solidity `Call` struct: * `to` → `Call.to`. * `value` (decimal string) → `Call.value` (`uint256`). * `data` (hex string) → `Call.data` (`bytes`). Keep the order of `calls` exactly the same as in the queue operation and in the EIP‑712 signing step. ### Build Operation.signatures (packed bytes) [#build-operationsignatures-packed-bytes] In the API response, signatures are returned as separate entries: ```json "signatures": [ { "user": "0x...", "sign": "0x<65 bytes>" } ] ``` The contract expects a single `bytes` value: ```solidity bytes signatures; // NOT bytes[] ``` #### Signature format [#signature-format] Each signature is a standard 65‑byte ECDSA signature: ```text r (32 bytes) || s (32 bytes) || v (1 byte) ``` For example: ```text 0xf8d5...3491b ``` #### Packing rule [#packing-rule] Build `Operation.signatures` as: ```text packedSignatures = sig1 || sig2 || ... || sigN ``` Sort signatures by signer address in ascending alphabetical order before concatenation. ### Build the operations array [#build-the-operations-array] Even if you execute a single queue operation, you must pass an array with one element: ```solidity operations = [ Operation({ calls: [...], signatures: packedSignatures, id: executeOperationId }) ]; ``` ### ABI-encode execute(operations) [#abi-encode-executeoperations] Encode the function call data for: ```solidity execute((Call[] calls, bytes signatures, bytes32 id)[] operations) ``` This produces the transaction `data` field that you send to the multisig contract. ### Build, sign, and broadcast the Ethereum transaction [#build-sign-and-broadcast-the-ethereum-transaction] #### Transaction fields [#transaction-fields] Set the transaction fields as follows: * `to` — multisig contract address (`verifyingContract`). * `data` — ABI‑encoded `execute(operations)` call. * `value` — `0`. * `chainId` — correct chain ID (for example, Sepolia `11155111`). * Gas parameters — EIP‑1559 fields (`maxFeePerGas`, `maxPriorityFeePerGas`) appropriate for the network. * `nonce` — EOA nonce of the executor account (this is not the multisig queue nonce). #### Sign [#sign] Sign the transaction with `executorPrivateKey` using ECDSA (`secp256k1`). #### Broadcast [#broadcast] Send the raw signed transaction through the RPC endpoint, for example using `eth_sendRawTransaction`. The result is a `txHash`. ### Expected on-chain result [#expected-on-chain-result] If the transaction succeeds: * The contract verifies the packed signatures internally (for example, via `checkSignatures(hash, signatures)`). * All `calls` are executed in order. * An `ExecuteSuccess(nonce, digest, id)` event is emitted. * The function returns operation and call‑level results as `bytes[][] results`. The backend then updates the queue operation: * `status` changes to `EXECUTED`. * `txHash` is populated with the resulting on‑chain transaction hash. ### Common reverts and errors [#common-reverts-and-errors] Common revert classes when executing operations include: * `InsufficientSignatures(signatures, threshold)` — packed signatures contain fewer signatures than the required threshold. * `InvalidSignature(owner)` — signature bytes, signed digest, or ordering are incorrect for at least one signer. * `DuplicateSignature(owner)` — the same signer appears more than once in the packed signatures. * `FailedCall` — one of the internal calls reverted. * `InsufficientBalance(balance, needed)` — the multisig contract lacks enough ETH for the `value` transfers. * `ReentrancyGuardReentrantCall` — a reentrancy attempt was detected during execution. ## Main menu [#main-menu] Use the main menu on the left to navigate across platform pages. At the bottom of the menu, you can access: * **Helpdesk**: Open the support portal in a new tab. * **Collapse/Expand**: Hide or show the main menu labels to save horizontal space. Main menu Eligible accounts (for example, accounts that have topped up credits) also see a floating **support chat** launcher. Click it to start a live conversation with the B2BINPAY support team directly from the app, without leaving the page. ## Header options [#header-options] At the top of each page, the header provides access to the following global controls: * (1) **Account selector**: Shows the current account's name and address. Use the dropdown to switch between accounts or create a new one. * (2) **Wallet selector**: Displays the connected wallet. The dropdown provides access to profile‑level options: * **Profile settings**: Here you can select and manage the base currency for your account. * **Log out**: To disconnect the wallet. * (3) **Network selector**: Shows the active blockchain network. Use the dropdown to switch to another supported network. * (4) **Theme switch**: Toggles between light and dark themes of the interface. * (5) **Language selector**: Use the dropdown to select a preferred language for the Web UI. * **dApp connection**: Opens the WalletConnect side panel for connecting external dApps. The button shows a green dot when at least one dApp session is active. Visible only for accounts with smart contract version 1.1.0 or later. See [dApps](../user-guide/dapps). Header ## Column configuration [#column-configuration] On pages that show tables, you can configure which columns are visible and in what order. If column configuration is available, a **Configure columns** control is shown above the table: * Mark or unmark checkboxes to show or hide specific columns. Columns highlighted in grey are always visible and can't be hidden. * Drag and drop column names to change their order in the table. Column configuration ## Table header controls [#table-header-controls] Most tables in the B2BINPAY DeFi share the same header controls for searching, sorting, and filtering data. ### Quick search [#quick-search] Some columns provide a quick search field: click the **magnifying glass** icon and start typing a value to filter records that contain the entered text in that column. Quick search ### Sorting [#sorting] Columns that support sorting display the arrow icons next to the header: * **Arrows inactive**: Sorting by this column is currently disabled. * **Up arrow active**: Data is sorted in ascending order (smallest values first). * **Down arrow active**: Data is sorted in descending order (largest values first). Only one column can be used for sorting at a time. Sorting ### Filters and date ranges [#filters-and-date-ranges] The (1) **funnel** icon displayed next to the column header indicates that filters are available: click the icon to open a filter panel and specify filtering parameters. To apply filters, click **Apply**. To clear them, click **Reset**. The (2) **calendar** icon opens the date picker with predefined values (for example: *Today*, *Yesterday*, *Last 7 days*, and so on) and possibility to select a custom date or date range. Filters ## Pagination [#pagination] Most pages support pagination to split data into multiple pages and help you work efficiently with long lists. At the bottom of the page, you can: * Navigate between pages using the **previous/next** arrows or the numbered page selector. * Use **Jump to** to quickly move to a specific page. * Choose how many rows are displayed per page. Pagination ## Copying values [#copying-values] Certain fields feature the **copy** icon that copies the underlying value to your clipboard. Click the icon next to the value you need; a short confirmation appears when the value is copied. Copying values ## Account [#account] An **account** is a shared multi‑signature wallet. Technically, it's a smart contract deployed for a specific account and network. Each account is managed collectively by a group of users. Each operation on such account requires certain independent [signatures](#signature) to approve the operation before it's executed. In the B2BINPAY DeFi app, each account has: * A list of [Signers](#signer). * A [Required signatures](#required-signatures) threshold. Refer also to [Queue](#queue). *** ## Address [#address] An **address** is a unique blockchain identifier used for deposits, payouts, or transaction execution.\ Depending on context, an address can represent: * An **invoice address** (deposit address) created by the smart contracts. * A **wallet address** belonging to a signer or payout receiver. Refer also to [Deposit address](#deposit-address), [Invoice](#invoice), and [Payout](#payout). *** ## Address book [#address-book] The **address book** is a list of saved receiver addresses and labels. Saved entries can be reused when creating payouts or other operations, which reduces manual input and the risk of sending funds to an incorrect address. Refer also to [Payout](#payout). *** ## API key [#api-key] An **API key** is a credential used to access B2BINPAY DeFi API app programmatically.\ Each key is associated with a specific account. API keys are managed on the **Settings** tab of the **Account** page. Refer also to [API service](#api-service) and [Callback secret](#callback-secret). *** ## API service [#api-service] The **API service** exposes B2BINPAY DeFi REST APIs for working with entities such as invoices, payouts, and so on. Refer also to [API guide](../api-guide/api-overview). *** ## Base currency [#base-currency] The **base currency** is the currency used for presenting balances, totals, and some reports in the B2BINPAY DeFi app.\ It doesn't change the underlying blockchain currency of deposits and payouts; it only affects how values are displayed and settled in the UI. The base currency is selected on the **Profile settings** page. *** ## Balance [#balance] The **balance** of an account or asset is the aggregated value of all relevant transactions.\ Primary balance types include: * **Total balance**: Reflects all executed transactions for the account across assets, converted to the base currency. * **Uncollected balance**: Reflects deposits received on invoice addresses but not yet claimed to the account wallet. * **Balance by asset**: Shows per‑token and per‑network balances for the account. Refer also to [Deposit](#deposit), [Claim](#claim), and [Base currency](#base-currency). *** ## Batch claim [#batch-claim] A **batch claim** is an operation that collects funds from multiple invoice deposit addresses in a single claim transaction for a given currency.\ Batch claims reduce on‑chain fees by aggregating several claims into one transaction, where supported by smart contracts. Batch claims are initiated from the **Claims** page when more than one uncollected claim exists for the selected currency. Refer also to [Claim](#claim) and [Invoice](#invoice). *** ## Batch execution [#batch-execution] **Batch execution** is the process of executing several fully signed queue operations in a single on‑chain transaction.\ Batch execution is available only when: * The selected operations are fully signed. * Their nonce values form a continuous sequence (for example, `5`, `6`, `7`). Batch execution is initiated from the **Queue** page with the **Execute batch** action. Refer also to [Queue](#queue), [Nonce](#nonce), and [Payout](#payout). *** ## Blockchain [#blockchain] A **blockchain** is a specific network environment. Each network is identified by its `chainId` and has its own set of assets, contracts, and block explorers. The selected network in the app header determines which balances, queue operations, and transactions are shown. *** ## Callback [#callback] A **callback** is an HTTP notification that the B2BINPAY DeFi app sends to a client system when an invoice- or payout-related event occurs. **Invoice-related callback types:** * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. **Payout-related callback types:** * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_CONFIRMED`: The payout transaction reached the required number of confirmations. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. * `PAYOUT_CANCELLED`: The payout was canceled before it was executed. **Retry policy:** If a callback delivery fails, the system retries it a limited number of times (by default, up to three attempts) at short, regular intervals. If every attempt fails, the callback is marked as failed and can be resent manually. For details, payload examples, and callback verification, see [Callbacks](../api-guide/callbacks). Refer also to [Callback secret](#callback-secret), [Invoice](#invoice), and [Payout](#payout). *** ## Callback secret [#callback-secret] The **callback secret** is a value used to sign callbacks so that the receiving system can verify their authenticity.\ Rotating the callback secret invalidates the previous value and is recommended when credentials are updated or exposed. The callback secret is managed on the **Settings** tab of the **Account** page. See [Configure a callback secret and API keys](../user-guide/account#configure-a-callback-secret-and-api-keys) for more details. Refer also to [Callback](#callback) and [API key](#api-key). *** ## Claim (collection) [#claim-collection] A **claim** (or **collection**) is an operation that transfers funds from an invoice deposit address to the account wallet. When withdrawing a token from an invoice address, the native currency is always withdrawn as well. Claims can be created for a single invoice and currency or grouped into [Batch claims](#batch-claim). * On the **Invoices** page, claims are initiated from the **Claims** tab of a specific invoice. * On the **Claims** page, claims are initiated from aggregated entries that represent uncollected funds for an invoice and currency. Refer also to [Deposit](#deposit), [Invoice](#invoice), and [Transfer](#transfer). *** ## Currency [#currency] A **currency** is a cryptocurrency (coin, stablecoin, or token) supported by the system. Refer also to [Blockchain](#blockchain) and [Balance](#balance). *** ## dApp [#dapp] A **dApp** (decentralized application) is an external application that connects to a B2BINPAY DeFi account through the [WalletConnect](#walletconnect) protocol. Connected dApps can request transactions and message signatures, which are routed to the account [queue](#queue) for multisig approval. dApps are available for [EVM-compatible](#blockchain) accounts with smart contract version 1.1.0 or later. Refer also to [WalletConnect](#walletconnect) and [Queue](#queue). *** ## Deposit [#deposit] A **deposit** is an incoming transaction to an invoice or directly to an account. Deposits increase the uncollected balance of an invoice or account until a [Claim](#claim) or payout moves the funds. Refer also to [Deposit address](#deposit-address) and [Transfer](#transfer). *** ## Deposit address [#deposit-address] A **deposit address** is a blockchain address generated by the smart contracts for receiving payments.\ Each deposit address is bound to the wallet (public address): * Funds can be collected only to the owner’s wallet or account. * The smart contract can't direct funds to arbitrary third‑party addresses. In invoices, the deposit address is represented by a smart contract and managed by the [multisig](#multisig) wallet. Deposit addresses are typically created through [Invoices](#invoice). *** ## Invoice [#invoice] An **invoice** is a request for cryptocurrency payment that generates a unique deposit address for receiving funds. The invoice address is represented by a smart contract and managed by the [multisig](#multisig) wallet.\ Invoice activity is tracked across the **Settings**, **Transfers**, **Claims**, and **Callbacks** tabs on the invoice details page. Refer also to [Deposit address](#deposit-address), [Claim](#claim), and [Transfer](#transfer).\ For detailed workflows, see [Invoices](../user-guide/invoices). *** ## Multisig [#multisig] **Multisig** (multi‑signature) is the security model behind every account. Instead of a single private key, an account is controlled by a group of [signers](#signer), and sensitive actions require approval from a minimum number of them before they can run on‑chain. In the B2BINPAY DeFi app, the multisig model defines: * Who can approve operations — the list of [signers](#signer). * How many approvals each operation needs — the [required signatures](#required-signatures) threshold. This means no single person can move funds or change account settings alone, which keeps control distributed across your team. Refer also to [Account](#account), [Signer](#signer), [Required signatures](#required-signatures), and [Threshold](#threshold). *** ## Network [#network] The **network** is the blockchain environment on which an account operates. Switching the network in the app header changes: * Which balances are shown. * Which queue operations, invoices, and transfers are visible. Refer also to [Blockchain](#blockchain). *** ## Nonce [#nonce] A **nonce** is the sequential identifier that defines the order of operations executed by a smart contract. In the B2BINPAY DeFi app: * Each queue operation (for example, a payout or configuration change) has a nonce. * Operations must be executed in nonce order; the item with the smallest nonce is processed first. * Creating a payout with a nonce that matches an existing one creates a conflicting or replacement operation. Nonce values are visible in the **Queue** and can be adjusted when creating certain operations such as payouts. Refer also to [Queue](#queue), [Batch execution](#batch-execution), and [Operation](#operation). *** ## Operation [#operation] An **operation** is an action that requires multisig approval before execution.\ Examples include: * Account configuration changes (for example, signers and thresholds). * Payouts and other asset transfers. Each operation has a [nonce](#nonce) and requires one or more [operation signatures](#operation-signature). Refer also to [Queue](#queue) and [Payout](#payout). *** ## Operation signature [#operation-signature] An **operation signature** is a digital signature added by a signer to authorize a specific operation.\ Multiple signatures can be attached to the same operation until the [threshold](#threshold) is met and the operation becomes executable. Refer also to [Signature](#signature), [Signer](#signer), and [Operation](#operation). *** ## Payout [#payout] A **payout** is an outgoing on‑chain transfer from the account to an external receiver address.\ Payouts: * Are created in the **Payouts** section by specifying a receiver address, currency, amount, and optional callback settings. * Enter the [Queue](#queue) and must be signed by the required number of signers. For details, see [Payouts](../user-guide/payouts). *** ## Queue [#queue] The **queue** is an ordered list of operations waiting for signatures or execution.\ Typical queue items include: * Payouts. * Configuration changes (for example, confirmation rules). * Reject (if you need to cancel an operation in the middle of a queue). Queue items are processed in the [nonce](#nonce) order. The **Queue** page exposes: * Pending operations that need signatures or execution. * History of executed or failed operations. * Tools for signing, executing, rejecting, or replacing operations. For detailed workflows, see [Queue](../user-guide/queue). *** ## Read‑only access [#readonly-access] **Read‑only access** is a restricted mode in which an account or user can view data but can't perform sensitive actions. Read‑only users cannot: * Create, sign, or execute operations. * Add or disconnect accounts. * Change required signatures or other critical settings. Read‑only states may apply to accounts that were removed from configuration on a given network but still exist elsewhere. *** ## Required signatures [#required-signatures] The **required signatures** value defines how many signers must approve an operation before it can be executed, expressed as `X/Y`, where: * `Y` is the total number of signers. * `X` is the minimum number required to execute an operation. The setting is configured on the **Members** tab of the **Account** page. Refer also to [Multisig](#multisig), [Signer](#signer), and [Threshold](#threshold). *** ## Signature [#signature] A **signature** is a cryptographic proof generated when a user signs a message or transaction with their private key.\ In B2BINPAY DeFi it's used for: * Authentication and login flows (for example, SIWE and EIP‑712 signatures). * Approving multisig operations and transactions. Refer also to [Operation signature](#operation-signature) and [Wallet authentication](#wallet-authentication). *** ## Signer [#signer] A **signer** is an account that has permission to approve and execute operations for an account. Signers can: * Create operations (such as payouts or configuration changes). * Sign queue items. * Execute fully signed operations. The list of signers for an account is managed on the **Members** tab of the **Account** page. Refer also to [Required signatures](#required-signatures) and [Multisig](#multisig). *** ## Threshold [#threshold] The **threshold** is another name for the number of [Required signatures](#required-signatures) needed to execute a multisig operation.\ It's defined when the account is created and can later be updated through configuration operations. Refer also to [Multisig](#multisig). *** ## Transaction [#transaction] A **transaction** is a blockchain record representing the execution of a call on a network. Each blockchain transaction is assigned a unique **TXID** which is a transaction identifier, or transaction hash. It stores transaction details, such as the sender's and receiver's addresses, amount, and time, all encrypted into a unique alphanumeric string. Each TXID links to a blockchain explorer — a public tool for tracking transactions. *** ## Transfer [#transfer] A **transfer** is a record of an on‑chain transaction tracked by the B2BINPAY DeFi app.\ Transfers can represent: * Incoming deposits to invoices. * Claims collecting funds from deposit addresses to the account. * Payouts and other outgoing operations. For details, see [Transfers](../user-guide/transfers). *** ## User [#user] A **user** represents a wallet address interacting with the B2BINPAY DeFi app. Users authenticate by signing messages and may belong to one or more [accounts](#account) as signers or viewers. Refer also to [Wallet authentication](#wallet-authentication) and [Signer](#signer). *** ## Wallet authentication [#wallet-authentication] **Wallet authentication** is the login mechanism based on external wallets. Instead of passwords, the B2BINPAY DeFi app: * Generates a message. * Asks the user to sign it. * Verifies the signature to confirm wallet ownership. Refer also to [Signature](#signature) and [User](#user). *** ## WalletConnect [#walletconnect] **WalletConnect** is an open protocol for linking external [dApps](#dapp) to a wallet session. In the B2BINPAY DeFi app, users paste a WalletConnect URI from a dApp to establish a session; subsequent dApp transaction and signature requests are delivered to the account [queue](#queue) for multisig approval. Refer also to [dApp](#dapp). The **B2BINPAY DeFi app** connects your non‑custodial wallet to smart‑contract infrastructure on EVM‑ and TVM-compatible networks. ## How it works [#how-it-works] * **Generate invoices**: Create deposit addresses for supported assets and track incoming payments in real time. * **Collect funds**: Move funds from invoice (deposit) addresses to your account smart‑contract address when you are ready. * **Approve payouts**: Create payout operations, collect signatures from account signers, and execute transactions on‑chain once the required threshold is reached. * **Manage access and rules**: Add or remove signers and adjust confirmation thresholds through multisig operations, with all changes recorded on‑chain. ## Key features [#key-features] * **Multisig accounts** Collaborate safely by managing funds through smart‑contract accounts that require multiple signatures for sensitive actions. Configure signer lists and signature thresholds per account to match your internal approval policies. * **Invoice generation** Accept crypto payments via automatically generated deposit addresses, with support for both single‑currency and multi‑currency invoices. Track each invoice in real time from creation to payment and collection. * **Fund collection** Pull funds from invoice (deposit) addresses to your main account address, either per invoice or in batches, helping you optimize network fees while keeping deposit flows and main balances clearly separated. * **Approval queue** Have all important actions — payouts, account configuration changes, signer updates — added to an operations queue where they can be reviewed, signed, and executed only after the required approvals are collected. * **API access** Use the same capabilities programmatically via the B2BINPAY DeFi API: create invoices, monitor deposits, trigger fund collections, manage payouts, and track transaction and operation statuses from your backend systems. * **Security and transparency** Benefit from a non‑custodial design where B2BINPAY DeFi never stores private keys, all transactions are signed in your wallet, and smart contracts provide on‑chain logging of operations. Multisig approvals and per‑network deployments keep control distributed across your accounts and networks. ## Set up your account [#set-up-your-account] ### Connect your wallet [#connect-your-wallet] 1. Open the B2BINPAY DeFi login page. 2. From the **Network** select in the topbar, select your network. 3. Click **Connect wallet** and follow the instructions. 4. In your wallet, select the account you want to use and approve the connection. 5. Review the signature request that the app sends to your wallet, then sign it. The app verifies the signature to confirm that you control the selected address. If the signature verification fails, reconnect the correct wallet or repeat the signature request and sign again. ### Create an account [#create-an-account] 1. Click **Create**. 2. In the **Create new account** form: 1. Enter the account name. 2. Add one or more signers or do it later. 3. Select the number of signatures required for operation confirmation (based on the number of added signers). 4. Click **Create account** and confirm the action. You'll be redirected to the **Account** page. ### Activate your account [#activate-your-account] If you see the *Your account is not activated yet* message: 1. Click **Activate** and confirm the action. 2. Confirm the transaction in your wallet. Once the account is successfully activated, in the upper part of the **Account** page, you'll see your account balances and information. ### Select a base currency for the account [#select-a-base-currency-for-the-account] The base currency is used to display account balances, including conversions from other currencies/tokens. You can manage and change your base currency at any time in your profile settings. 1. Click the **wallet selector** in the topbar and select **Profile settings**. 2. From the **Select base currency** dropdown, select the base currency for your account. The new base currency will be applied across the account. ### Make a direct deposit to the account address (optional) [#make-a-direct-deposit-to-the-account-address-optional] Fund the account directly from an external wallet. 1. Go to **Account** in the main menu. 2. In the upper part of the page, locate the **Account address** field and click the **copy** icon to copy the account address to your clipboard. 3. In your external wallet, paste the copied address as the receiver and select the token and network that match your account configuration. 4. Send a test transfer with a small amount first. After the transaction is confirmed on‑chain, the **Transfers** page shows the new incoming transfer with the *Direct deposit* type and the balances are updated accordingly on the **Account** page. ### Add account users and configure confirmation rules [#add-account-users-and-configure-confirmation-rules] Invite additional users and adjust how many signatures are required for transaction confirmation. 1. Go to **Account** in the main menu and switch to the **Members** tab. 2. In the **Confirmation rules** section, click **Edit**. 3. To add a new user to the account, enter their public address in the **Add signer** field. The app validates the address format and network: 1. If the address format or network is invalid, an error explains that the address is invalid. 2. If the address is already added as a signer, a message explains that the address is already in the list. 4. Adjust **Required signatures** to define how many signers must approve each transaction. Consider adding more than one signer for production environments so that payouts and configuration changes require multiple approvals. 5. Click **Save** and sign the corresponding configuration transaction in your wallet if prompted. The updated list of signers and required signatures appears in the **Confirmation rules** section. ## Next steps [#next-steps] Now, as you're all set up, you can: * Create invoices to generate deposit addresses and accept payments. * Use the **Queue** page to track pending multisig actions. * Configure callbacks and API keys to integrate B2BINPAY DeFi API app with your systems. ## July 1, 2026 [#july-1-2026] ### Cross-chain transfers, TRX staking, and in-app support [#cross-chain-transfers-trx-staking-and-in-app-support] **Cross-chain transfers** * Added **Cross-chain transfers**: move funds from your account on one network to a recipient on another network without leaving the interface. Transfers use a live quote that shows the amount received, bridge fee, route, and estimated delivery time, and run through the account queue for multisig approval. Track delivery progress and open the cross-chain explorer from the operation details. See [Cross-chain transfers](../user-guide/cross-chain-transfers). **TRX staking** * Added **TRX staking** for TRON accounts: freeze TRX to obtain Energy or Bandwidth, unstake and withdraw matured TRX, vote for Super Representatives, and delegate resources to other addresses. All staking operations run through the account queue. The account balance now shows the spendable amount, excluding staked, unstaking, and pending-withdrawal TRX. See [Staking](../user-guide/staking). **Support** * Added an in-app **support chat**. Eligible accounts (for example, accounts that have topped up credits) get a live chat launcher that connects you with the B2BINPAY support team directly from the app, tied to your connected account. The launcher appears without a reload right after you become eligible. **Smart contracts** * Released smart contract version **1.2.1** for TRON, adding staking support. ## June 1, 2026 [#june-1-2026] ### Overview dashboard and integrated apps [#overview-dashboard-and-integrated-apps] **Overview** * Added the **Overview** dashboard, the landing page you see after signing in. It summarizes your total balance and uncollected funds, invoice and payout activity, asset allocation, finance volume, pending queue operations, credit balance, and per-network status. Use the period selector to switch between the last week, month, and quarter. See [Overview](../user-guide/overview). **Apps** * Added the **Apps** page, a catalog of integrated applications that work directly through your multisig account. See [Apps](../user-guide/apps). * Added **CoW Swap**: MEV-protected token swaps for EVM-compatible accounts. Each swap runs through the account queue for multisig approval, the same way as payouts. See [Apps](../user-guide/apps). **Smart contracts** * Released smart contract version **1.2.0**. On accounts using this version, only account signers can claim funds from invoice deposit addresses. Addresses that are not signers can no longer perform claims, which adds an extra layer of protection for deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. See [Claims](../user-guide/claims). ## April 17, 2026 [#april-17-2026] ### dApp integration, API enhancements, and Tron support [#dapp-integration-api-enhancements-and-tron-support] **dApps** * Added support for connecting external dApps through the **WalletConnect** protocol. Use the new **dApp** control in the header to connect dApps, review incoming transaction and message requests, and track active sessions. See [dApps](../user-guide/dapps). * Queue operations initiated by connected dApps now show the dApp name and icon in the queue list and details. See [Queue](../user-guide/queue). * The header displays a live indicator when at least one dApp session is active and a badge when pending dApp requests require approval. **Smart contracts** * Released smart contract version **1.1.0** with **ERC-1271** support. The multisig account can now validate signatures on-chain, which lets it sign messages requested by connected dApps. dApp features are available for accounts on this version or later. See [dApps](../user-guide/dapps). **API** * Added callback resending: retry a previously failed callback from the **Callbacks** tab of an invoice or payout. See [Callbacks](../api-guide/callbacks). * Added the **Get account balances** endpoint that returns balances for all assets of the account in a single call. See [Account](../api-guide/account). * Added the **Get smart contract version** endpoint. See [Other](../api-guide/other). **SDK** * The TypeScript SDK now supports **Tron** networks (Mainnet and Shasta) in addition to EVM chains. Invoices, payouts, and claims flows work with a unified API surface across EVM and TVM deployments. ## February 3, 2026 [#february-3-2026] ### Initial release [#initial-release] An **account** represents a shared multisig wallet managed by a group of users. ## Account details [#account-details] To access account details, go to **Account** in the main menu. In the upper part of the page, you can find essential information about the account: **Total balance** The total value of all assets held by the account, converted to the base currency. This value reflects both collected and uncollected funds. *** **Uncollected balance** The total amount of funds that were received but not yet collected to the account base address, converted to the base currency. *** **Uncollected invoices** The number of invoices that currently have payments that haven't yet been collected. *** **Current nonce** The latest transaction nonce used by the account smart contract. This value shows how many transactions were already processed and helps avoid transaction conflicts. *** **Account address** The smart contract address representing the account on the selected blockchain network. This address is used as the main destination for incoming funds and can't be modified. *** **Account name** The label for the account that helps distinguish it from other accounts. This value can be modified anytime. The information below is divided into tabs. On this tab, you can view a list of all assets held on the account, including their balances and value in the base currency. The following information is provided about each asset: **Currency** The asset alphabetical code, logo, and full name. *** **Balance** The amount of the asset held on the account, in the asset units. *** **Balance in base currency** The value of the asset converted to the account base currency. On this tab, you can view and manage the members and signing policy of the account. ### Member cards [#member-cards] The upper part of the tab shows a set of member cards that represent wallets associated with the account. Each card provides the label assigned to the member and the underlying blockchain address. Members marked with the **eye icon** have read-only access to the account. ### Confirmation rules [#confirmation-rules] The lower part of the tab contains the **Confirmation rules** section, which defines who can approve transactions and how many approvals are required. **Signers** The list of addresses and names that have full control over the account. Signers can create, sign, execute, and decline transactions. Each row shows the signer label (if available) and the wallet address. *** **Required signatures** The number of signer approvals that must be collected before a transaction can be executed. The ratio, such as `1/3`, shows how many signatures are required out of the total number of signers. Transactions remain pending until the required number of signatures is collected. View [Manage signers and required signatures](#manage-signers-and-required-signatures) for step-by-step instructions. On this tab, you can manage integration and security settings for the account, including the callback secret and API keys. ### Callback secret [#callback-secret] The **Your callback secret** section provides the **Regenerate** action that issues a new secret. Regeneration invalidates the previous secret and updates the value used for verifying callbacks. ### API key management [#api-key-management] The **API key management** section lists API keys used to access the account through integrations. The table includes the following columns: **Name** The label assigned to the key.\ This value helps identify where the key is used. *** **Key** The shortened representation of the API key, for example `094j8...9h34a`.\ The full value is shown only when the key is created.\ For security reasons, it is not possible to restore the full key from this page. *** **Created at** The date and time when the key was created. *** **Revoked at** The date and time when the key was revoked.\ For active keys, the value is shown as `—`. View [Configure callback secret and API keys](#configure-callback-secret-and-api-keys) for step-by-step instructions. ## Common use cases [#common-use-cases] The **Account** page helps with daily monitoring and administration of the account. This section describes common scenarios step by step. ### Rename the account [#rename-the-account] You can modify the account name anytime. Go to **Account** in the main menu and select the required account in the header. Click the **pencil icon** next to the account name and enter a new value. In the **Edit account name** popup, enter the new account name, up to 32 characters long. Click **Save** to confirm changes. The changes are applied immediately. The smart contract address, confirmation rules, and accesses remain unchanged. ### Manage signers and required signatures [#manage-signers-and-required-signatures] Add new signers and adjust account settings that affect confirmation rules. Go to **Account** in the main menu and switch to the **Members** tab. Click **Edit** in the **Confirmation rules** section. **To add a new signer:** Click **Add signer** and enter a new signer address in the corresponding field. The system validates the address format and network before allowing you to proceed: * If the entered address has an invalid format or doesn't belong to the expected network, the `Invalid address format` error appears and the changes aren't saved. * If the entered address is already in the signer list, the `Address is already added` notification appears and the address isn't duplicated. **To remove a signer:** Click the **bin icon** in the corresponding signer row. Adjust the **Required signatures** value to set how many signatures are needed to execute transactions: * If there is only one signer, confirm that **Required signatures** is set to `1/1` by default and that editing is disabled. * If the account has more than one signer, click **Edit**, then adjust the **Required signatures** value in the `X/Y` format, where `Y` is the number of signers and `X` is less than or equal to `Y`. If you set `X` equal to `Y`, review the warning that explains the risk of losing funds if any single account becomes unavailable, then save the changes only if this configuration is acceptable. When signers are added or removed, the `Y` value in `Required signatures` updates to match the current signer list, and the editing control reflects the updated limits immediately. Click **Save**. The **Sign transaction** popup appears with the note that the action requires collecting a certain number of signatures before it can be completed. Review the changes and click **Sign**. The changes are processed according to the current confirmation rules. New rules will be applied once the transaction is properly confirmed. ### Configure a callback secret and API keys [#configure-a-callback-secret-and-api-keys] Set up technical integration with external systems through [callbacks](../get-started/key-terms#callback) and API access. Go to **Account** in the main menu and switch to the **Settings** tab. In the **Your callback secret** section, click **Regenerate** to issue a new callback secret, then update this value in your external systems. In the **API key management** section, click **Generate API key**. In the **Generate API key** popup, enter the name for the API key and click **Generate**. The newly generated key will be displayed in the **API key is generated** popup: make sure to copy it and store it securely, as it only reveals once in this popup. The new API key entry is added to the list where you can revoke it anytime. ### Create a new account [#create-a-new-account] Create a new multisig account and define its initial configuration. In the topbar, expand the **account select**. Select **Create new account**. In the **Create account** popup, click **Create**. If a popup appears with the text “Creating new account will discard all unsaved changes,” decide whether to continue and click **Proceed** to move on or **Cancel** to keep working with the current account. In the **Create new account** popup: * Enter the account name. * Add one or more members. * Specify the number of signatures required for transaction confirmation. Then click **Create account**. In the **Confirm new account** popup, verify the summary of **Account name**, **Members**, **Required signatures**, and then click **Confirm**. The changes are processed according to the configured confirmation rules. ### Disconnect the wallet [#disconnect-the-wallet] Log out from the current account and return to the login screen. In the topbar, click the **account select**. Select **Logout**. In the **Logout confirmation** modal, confirm the action. You'll be redirected to the login page with account selection. The **address book** is a list of saved receiver addresses that you can reuse across payouts and other operations.\ Saving addresses reduces the risk of copying incorrect addresses and speeds up everyday workflows. ## Address list [#address-list] On this page, you can view a list of all saved addresses for the account. The following information is provided about each address: **Name** The label assigned to the address. *** **Address** The full blockchain address saved in the address book. Icons next to the value let you copy the address or open it in the block explorer. *** **Actions** The available actions for each saved address: * **Edit**: Opens the edit modal where you can update the address and its name. * **Delete**: Removes the entry from the address book after confirmation. ## Common use cases [#common-use-cases] The **Address book** page helps you keep a curated list of trusted receivers.\ This section describes common scenarios step by step. ### Add a new address [#add-a-new-address] Save a frequently used receiver address. Go to **Address book** in the main menu. If no addresses exist, click **Add address** in the center of the page. If the table already contains entries, click **Add address** in the upper right corner. In the **Add address to address book** popup: 1. Enter the receiver **Address**. 2. In the **Address name** field, enter a clear label for the address. It can be any combination of letters and numbers convenient for you. Click **Save** to add the address to the address book. The newly added address appears in the table and becomes available when you select receivers for payouts. ### Edit an existing address [#edit-an-existing-address] Update an address or rename it. Go to **Address book** in the main menu. In the table, locate the address you want to change and click the **pencil icon**. In the **Edit address** popup, update the **Address** and/or **Address name** values. Click **Save** to apply the changes. The updated name and address appear in the address list and are used wherever the address book is referenced. ### Delete an address [#delete-an-address] Remove an address that is no longer needed. Go to **Address book** in the main menu. In the table, locate the entry you want to remove and click the **bin icon**. In the **Delete address from address book?** confirmation popup, review the message and click **Delete** to confirm or **Cancel** to keep the address. After deletion, the address no longer appears in the list and is not offered as a saved receiver. The **Apps** page is a catalog of integrated third-party applications that work directly with your account. Unlike external dApps that you connect through [WalletConnect](dapps), integrated apps run inside the B2BINPAY DeFi interface and route their on-chain actions through your account [queue](queue) for multisig approval. To open the catalog, go to **Apps** in the main menu. ## Availability [#availability] Each app card shows the app name, a short description, and tags that describe its category. An app is available only when both conditions are met: * The active network is **EVM-compatible**. On a TVM (TRON) account, EVM-only apps are disabled with the message *TVM network doesn't support this app. Switch to EVM account*. * The account is **deployed** on the selected network. If it isn't, the app is disabled with the message *To use the app, deploy the account on the selected network first*. When an app is unavailable, its card is greyed out and a tooltip explains why. To enable it, switch to a supported network or activate the account on the current network. ## CoW Swap [#cow-swap] **CoW Swap** is a decentralized exchange aggregator that provides MEV-protected token swaps through batch auctions. It is available for EVM-compatible accounts. Because every swap is performed by your multisig account, the swap and any required token approval don't execute immediately. Instead, they enter the [Queue](queue) as operations that the required number of signers must approve, the same way payouts and configuration changes do. ### Make a swap [#make-a-swap] ### Open CoW Swap [#open-cow-swap] On the **Apps** page, click the **CoW Swap** card. The CoW Swap widget opens inside the interface. ### Build the swap [#build-the-swap] In the widget, select the token to sell, the token to buy, and the amount. Review the quoted price, fees, and expiry, then confirm the swap. ### Approve in the queue [#approve-in-the-queue] The swap (and a token approval, if one is needed) is added to the account [queue](queue) as an operation. Go to the **Queue** page, collect the required signatures, and execute the operation. Once executed, CoW Swap settles the order on-chain and the resulting balances appear on your **Account** and **Transfers** pages. A swap depends on funds held by the account. Make sure the account holds enough of the token you want to sell, plus the network's native currency to cover execution fees. ## Cross-chain transfer [#cross-chain-transfer] **Cross-chain transfer** moves funds from your account on one network to a recipient on another network. Like a swap, it runs through the account [queue](queue) for multisig approval and shows a live quote before you confirm. Open the **Cross-chain transfer** card to start. For the full flow, see [Cross-chain transfers](cross-chain-transfers). A **claim** is an operation that collects funds from invoice deposit addresses and transfers them to your account.\ Claims can be executed for a single invoice or grouped into batch claims. On accounts using smart contract version 1.2.0 or later, only account signers can claim funds. Addresses that are not signers can no longer perform claims, which protects deposited funds. A future release will add a configurable claim whitelist so you can control which addresses are allowed to claim. ## Claim list [#claim-list] On this page, you can view all uncollected funds that are available for claiming, grouped by invoice and currency. The following information is provided about each claim: **ID** The unique system identifier of a claimable position (invoice and currency combination).\ This value is generated automatically and can't be modified. *** **Received at** The date and time when funds were first received to the invoice deposit address in this currency. *** **Last received at** The date and time when the most recent payment was received for this invoice and currency. *** **Currency** The currency currently held on the invoice deposit address. *** **Amount** The total uncollected amount for this invoice and currency.\ If multiple transfers with the same currency were received to the invoice, they are aggregated into a single amount. *** **Transactions** The number of uncollected transactions in this currency for the invoice. This is a link that opens the list of underlying transfers associated with this claim. *** **Invoice ID** The identifier of the invoice for which funds are to be claimed.\ This is a link to invoice details. *** **Claim** Executes a [single claim](#execute-a-single-claim) for this invoice and currency. ## Common use cases [#common-use-cases] The **Claims** page provides a consolidated view of uncollected funds and helps you control when claims are executed.\ This section describes common scenarios step by step. ### Execute a single claim [#execute-a-single-claim] Collect funds for a specific invoice and currency directly from the **Claims** page. Go to **Claims** in the main menu. Locate the row corresponding to the invoice and currency you want to collect and click **Claim**. In the **Sign claim** popup, review the details, and click **Sign**. After the claim is completed, it will disappear from the list. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. ### Create a batch claim [#create-a-batch-claim] Collect funds from several invoices at once. Go to **Claims** in the main menu. Click **Create batch claim** in the upper right corner. The button is active only when more than one claim that can be collected together is available. In the **Create batch claim** popup, select a currency, then click **Next step**. Mark the checkboxes of the claims you want to include in the batch, then click **Batch claim**. In the **Sign batch claim** modal, review the account address and the total amount being claimed, then click **Save**. In the **Sign claim** popup, review the details, and click **Sign**. After the batch claim is completed, all related claims will disappear from the list. On the **Transfers** page, a corresponding number of new transfers with the *Claim* type will appear, providing full transaction information. Once the transfers are assigned the *Executed* status, funds will be credited to the account address. The **Credits** page helps you track your balance and usage, understand pricing, and fund your account with crypto. The upper section contains the key balance and pricing information: **Credits balance** The current number of credits available on your account. This value updates after each top-up and whenever credits are spent. *** **Top up** The **+ Top up** action that opens the funding flow. *** **Credit price** The fixed credit-to-crypto rate shown on the page. *** **Credits used** The number of credits already spent within the selected time range. *** **What we charging for?** A link that opens the pricing rules and explains how credits are charged per operation. Below the balance section, the page is divided into two panels: **History of credits** The chart shows how your credit balance changes during the selected period. Use the date selector above the chart to switch the range. *** **Top-ups** A list of completed top-ups with their details. ## Common use cases [#common-use-cases] ### View credit balance and pricing [#view-credit-balance-and-pricing] Check your current credit balance, plan, and request pricing. Go to **Credits** in the main menu. On the **Credits** page: * View your **credit balance** and **used credits** in the upper part of the page. * View your **top-up history** in the lower part of the page. Click **What we charging for** in the upper part of the page to see how many credits are charged per each operation and how pricing is applied to your plan. ### Top up the credit balance [#top-up-the-credit-balance] Add more credits to your balance using cryptocurrency. Go to **Credits** in the main menu. Click **+ Top up** in the balance section (upper part of the page). In the **Top up credits** popup, select the payment currency and enter the amount you want to add. Review the auto-calculated number of credits, then confirm the payment, and follow the instructions on the payment page to send funds from your wallet. A **cross-chain transfer** moves funds from your account on one network to a recipient on another network, without leaving the B2BINPAY DeFi interface. Transfers are routed through the account [queue](queue) for multisig approval, the same way as payouts. You reach the feature from the [Apps](apps) catalog: open the **Cross-chain transfer** card on the **Apps** page. ## Availability [#availability] Cross-chain transfers are available only when the provider is enabled for your account and the current network has bridgeable assets. When the service is unavailable, the app card is disabled and a tooltip explains why. ## Make a cross-chain transfer [#make-a-cross-chain-transfer] ### Open the form [#open-the-form] On the **Apps** page, click the **Cross-chain transfer** card. ### Choose source and destination [#choose-source-and-destination] Select the currency to send from your account, the destination network, and the currency to receive on that network. Only assets and network pairs that can be bridged are offered. ### Enter the amount and recipient [#enter-the-amount-and-recipient] Enter the amount to send and the recipient address on the destination network. A quote is fetched automatically and refreshed as you type. It shows the amount that will arrive, the bridge fee, the route, and the estimated delivery time. Each quote has a countdown and refreshes automatically when it expires. ### Confirm [#confirm] Review the confirmation summary — source and destination networks, the next queue **Nonce**, recipient address, amounts, fee, and route — then confirm. Confirming does not send funds immediately. It creates an operation in the account [queue](queue) and assigns it the next nonce. ### Collect signatures [#collect-signatures] Go to the [Queue](queue) page and open the cross-chain transfer operation. The required number of account signers must sign it before it can run. See [Sign transactions](queue#sign-transactions). ### Execute [#execute] Once all required signatures are collected and the operation has the smallest nonce in the queue, execute it to send the transfer on-chain. See [Execute transactions](queue#execute-transactions). The bridge fee is paid in the network's native coin and is debited from the account balance in addition to the transfer amount. Make sure the account holds enough of both the currency you send and the native coin to cover the fee. ## Track a transfer [#track-a-transfer] After execution, the transfer is delivered across chains by the bridge. Open the operation details to follow its progress through the delivery states — from *Awaiting confirmation* and *Transfer initiated* to *Cross-chain delivery in progress*, and finally *Delivered* or *Delivery failed*. The details view also provides a link to the cross-chain explorer and the destination transaction hash once the funds arrive. The **dApps** feature lets you connect external decentralized applications to your B2BINPAY DeFi account through the **WalletConnect** protocol. Connected dApps can request transactions and message signatures, which are routed to the account queue for multisig approval. The **dApp connection** control is only visible when both conditions are met: * The current account is on an **EVM-compatible network** (the feature is not available for TVM networks such as Tron). * The account's smart contract version is **1.1.0 or later**. For earlier contract versions, upgrade the account to use dApps. ## Access the dApp panel [#access-the-dapp-panel] The dApp connection control is located in the header, next to the wallet selector. The button indicates the current state: * **No badge, no dot**: No active sessions and no pending messages. * **Green dot**: At least one active dApp session. * **Red badge**: Pending messages or transactions from connected dApps await approval in the queue. The badge shows the number of pending items. Click the button to open the **dApp** side panel, which contains the URI input field and the list of active sessions. ## Common use cases [#common-use-cases] ### Connect a dApp [#connect-a-dapp] Connect a new dApp to the current account using a WalletConnect URI. In the external dApp, choose **WalletConnect** as the connection method and copy the connection URI (for example, `wc:...`). In the B2BINPAY DeFi app, click the **dApp connection** button in the header. Paste the URI into the **WalletConnect URI** input and click **Connect**. In the **Session approval** popup, review: * The dApp **name**, **icon**, and **URL**. * The **verification status** — `VERIFIED`, `UNKNOWN`, or a warning if the dApp is flagged as malicious. * The list of **networks** the dApp requests access to. * The **connected account address**. Then click **Approve** to establish the session or **Reject** to cancel the request. The **Approve** button is disabled if the dApp requests unsupported WalletConnect methods or is flagged as malicious. In those cases, only **Reject** is available. ### Approve a dApp transaction request [#approve-a-dapp-transaction-request] When a connected dApp requests a transaction, a modal appears for your review. In the **Transaction approval** popup, review: * The **dApp** name and icon. * The **From** and **To** addresses. * The transaction **Value**. * The raw **Data** (hex calldata) — use the **Copy** icon to copy it. * The **Decoded data** section, when available — shows the function signature and parameter values. Click **Approve** to send the request to the queue as a dApp transaction, or **Reject** to decline. Open the **Queue** page to collect required signatures and execute the operation. See [Queue](queue) for details. ### Approve a dApp message signature request [#approve-a-dapp-message-signature-request] When a dApp requests a personal or typed-data signature, a separate modal appears. In the **Message signature** popup, review: * The **dApp** name and icon. * The **Message** contents. * The **Required signatures** count for the current account. * The **Address** and raw **Hex** under the collapsible details section. Click **Sign** to add the message to the queue for multisig signing, or **Reject** to decline. ### View and disconnect active sessions [#view-and-disconnect-active-sessions] Click the **dApp connection** button in the header to open the side panel. Under the URI input, review the list of active sessions with dApp names, icons, and session details. Click the **Disconnect** action next to a session to terminate it and confirm the action in the popup. Disconnecting does not cancel pending dApp transactions already in the queue — handle them on the **Queue** page. ## dApp-initiated transactions in the queue [#dapp-initiated-transactions-in-the-queue] Transactions created from a dApp request appear in the **Queue** list with the following characteristics: * The **Operation** column shows the **dApp name and icon** instead of a generic type label. * Clicking the dApp name link opens the dApp's URL in a new tab. * Canceling or deleting the operation from the queue sends a cancellation event back to the dApp. For the full queue workflow, see [Queue](queue). An **invoice** is a request for cryptocurrency payments that generates a unique deposit address for receiving funds. Funds received to this address must be [claimed](#claim-funds) to the account address (smart contract). ## Invoice list [#invoice-list] On this page, you can view a list of all invoices created for your accounts. The following information is provided about each invoice: **ID** The unique system identifier of an invoice.\ This is a link to invoice details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the invoice was created. *** **Updated at** The date and time of the most recent status change or payment receipt. *** **Currency** The payment currency or asset list. * If a single currency was selected, this field shows the asset symbol and name. * If more than one currencies were selected, this field shows the number of selected assets. * If no currency was specified, this field displays `—` and payers can pay the invoice in any supported currency. *** **Requested amount** The amount to be paid in the selected currency. * If a single payment currency was specified, this field shows the requested amount. * If no currency or more than one currencies were specified, this field displays `—`. The value can be specified when creating an invoice and can be modified later. *** **Paid amount** The total amount paid so far, in the payment currency. * If more than one currencies were specified, this field displays the amount converted to the account base currency. * If no payments were received, this field displays `—`. *** **Status** The current invoice status. Possible values: * **Created**: The invoice was created and is awaiting payments. * **Paid**: The invoice with the indicated amount was paid in full (for invoices with indicated amount). * **Unresolved**: The amount of an incoming transfer is greater than the invoice amount (for invoices with indicated amount). *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. This value can be specified when creating an invoice and can be modified anytime. ## Invoice details [#invoice-details] To access invoice details, click an invoice **ID** in the invoice list. In the upper part of the page, you can find essential information about the invoice — click the **chevron** icon to expand it: * The invoice identifier and current status. * The payment currency (if defined). * The requested amount (if specified). * The paid amount. * The created and updated timestamps. * The invoice address. * The link to the payment page. The information below is divided into tabs. On this tab, you can access and change invoice settings and advanced options. If the currency was selected for the invoice, the following fields are available: **Currency** The payment currency associated with the invoice. *** **Status** The current invoice status. *** **Requested amount** The invoice amount, in the payment currency. *** **Tracking ID** The user‑provided identifier assigned to the invoice for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other invoice events. Can be changed anytime. *** **Payment page URL** The link that is displayed as a button on the payment page. Can be changed anytime. *** **Payment page button name** The custom name of a button displayed on the payment page. Can be changed anytime. On this tab, you can find a list of transfers associated with the invoice. **ID** The unique system identifier of a transfer.\ This is a link to transfer details. *** **Created at** The date and time when a transfer was received by B2BINPAY. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain transaction identifier, the same as the transaction hash.\ This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The transaction amount, in the payment currency. *** **Blockchain fee** The blockchain fee charged for this transfer, in the payment currency.\ The total fee reflects all claim attempts, including failed ones. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Operation ID** For invoices and payouts: The unique operation identifier in the system. This is a link to operation details. On this tab, you can view claim operations related to the invoice and trigger new claims. At the top of the tab, a set of cards may show uncollected balances per network or currency, including: * **Uncollected tx**: The number of transactions that were deposited but not yet claimed. * **Uncollected balance**: The total amount available to claim for this currency. Each card contains a **Claim** button that starts a [claim flow](#claim-funds) for that asset. On this tab, you can view a list of callbacks sent for the invoice. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `INVOICE_CREATED`: The invoice was created. * `INVOICE_DEPOSIT_RECEIVED`: An incoming deposit transaction was detected on the invoice address. * `INVOICE_DEPOSIT_CONFIRMED`: The incoming transaction has reached the required number of confirmations. * `INVOICE_PAID`: The paid amount is equal to the requested amount and the invoice status changes to **Paid** (for invoices with an indicated amount). * `INVOICE_UNRESOLVED`: The paid amount is greater than the requested amount and the invoice status changes to **Unresolved** (for invoices with an indicated amount). * `INVOICE_CLAIMED`: Funds from the invoice address have been claimed to the account multisig wallet. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. ## Common use cases [#common-use-cases] The **Invoices** page helps create payment requests, monitor their status, and claim collected funds.\ This section describes common scenarios step by step. ### Create a new invoice [#create-a-new-invoice] Create a new invoice and generate a payment page for your customers. Go to **Invoices** in the main menu. Click **Create invoice** in the upper‑right corner. Fill in the **Main details**: * From the **Payment currency** dropdown, select the asset you want to receive or leave the field empty if the payer should be able to pay in any supported currency. * In the **Amount** field, optionally enter the amount to be paid in the selected currency. If you leave this field empty, the invoice will not enforce a specific amount. Fill in the **Advanced options**: * In the **Tracking ID** field, optionally enter an invoice identifier to track the invoice-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about invoice events. * In the **Payment page URL** field, provide the link that should be displayed as a button on the payment page. * In the **Payment page button name**, specify the custom name of a button displayed on the payment page. Click **Create**. The newly created invoice will appear in the list. You can access and manage its settings anytime by clicking the invoice **ID**. ### View invoice details [#view-invoice-details] Track invoice-related transfers, callbacks, and claims. Go to **Invoices** in the main menu. In the invoice list, locate the required invoice and click its **ID** to open details. Switch to the **Transfers** tab to see all payments associated with the invoice, including **Status**. Switch to the **Claims** tab to review claim operations and their statuses or to see uncollected balances per currency. Switch to the **Callbacks** tab to review callback history. ### Claim funds [#claim-funds] Claim funds that were deposited to the invoice address but not yet collected to the account. Go to **Invoices** in the main menu and click the required invoice **ID**. Switch to the **Claims** tab and locate cards with uncollected transactions and a non‑zero uncollected balance. Click **Claim** on the card. In the **Sign claim** popup, review the details, and click **Sign**. Repeat for other claims. After the claim is completed, it will disappear from the **Claims** tab. On the **Transfers** page, a new transfer with the *Claim* type will appear, providing full transaction information. Once the transfer is assigned the *Executed* status, funds will be credited to the account address. You can also claim funds from the [Claims](claims) page, including batch claiming of several transactions at a time. The **Overview** page is the dashboard you see right after you sign in and select an account. It summarizes your account activity in one place and gives you quick shortcuts to the most common actions. To open it, go to **Overview** in the main menu. ## Select a time period [#select-a-time-period] A period selector at the top of the page controls the time range used for the activity cards and charts. You can choose: * **Last week** * **Last month** * **Last quarter** The totals, inflow and outflow figures, and the finance volume chart update to reflect the selected period. Balances and pending operations always show the current state, regardless of the period. ## Summary cards [#summary-cards] The upper part of the page shows three summary cards with the headline numbers for your account. * **Total balance**: The total value of your account across all assets, converted to your [base currency](../get-started/key-terms#base-currency), along with the **Uncollected funds** that are still waiting to be claimed from invoice addresses. Use the **Claim** action to collect those funds. * **Total invoices**: The number of invoices created in the selected period and the **Inflow** they generated. Use the **Invoice** action to create a new invoice. * **Total payouts**: The number of payouts in the selected period and the **Outflow** they represent. Use the **Payout** action to create a new payout. All amounts are shown in your base currency. ## Asset allocation and finance volume [#asset-allocation-and-finance-volume] The middle section gives you a more detailed view of where your funds are and how they move over time. * **Asset allocation**: A breakdown of your account balance by asset, showing each currency and its share of the total. If you have no assets yet, the card explains that assets appear automatically after you claim an invoice or receive a payment. * **Finance volume**: A chart of inflow and outflow over the selected period. You can switch between a bar chart and a line chart. The chart stays empty until you create your first invoice or payout. ## Status cards [#status-cards] The lower section helps you keep track of operations, credits, and network health. * **Network status**: The synchronization state of each supported network — **Synced**, **Syncing**, or **Unavailable** — together with the **Last block** processed for the network. Use this card to confirm that the app is up to date with the blockchain before you act on balances or operations. * **Operations in queue**: The number of multisig operations **Ready to execute** and the number **Waiting for sign**. Use the **Check** action to open the [Queue](queue) and sign or execute pending operations. * **Credit balance**: Your current **Credit balance**, the amount **Burnt** in the selected period, and the **Forecast expenses** per month. Use the **Top Up** action to add credits. For details, see [Credits](credits). The Overview reflects the network selected in the app header. Switch the network to see balances, activity, and pending operations for a different blockchain. A **payout** is an outgoing on‑chain transfer from your account.\ Payouts are created in the app and added to the queue with a specific nonce, signed by account members, and executed once the required signatures are collected. ## Payout list [#payout-list] On this page, you can view a list of all payouts created for the selected account and network. The following information is provided about each payout: **Payout ID** The unique system identifier of a payout.\ This is a link to payout details. This value is generated automatically and can't be modified. *** **Created at** The date and time when the payout was created. *** **Updated at** The date and time of the most recent status change for the payout. *** **Amount** The payout amount, in the payment currency. *** **Currency** The payout currency. *** **Created by** The account name and address of the user who created the payout. *** **Receiver** The receiver’s address or saved contact name, shown in a short format. *** **Status** The current payout status. Possible values: * **Created**: The payout has been initialized in the system but has not yet been signed. * **Signed**: The transaction has received the required number of signatures. * **Sent**: The signed transaction has been sent to the blockchain and is awaiting confirmation. * **Executed**: The transaction has been successfully confirmed on the blockchain and the payout is considered complete. * **Failed**: The transaction failed during signing, sending, or blockchain confirmation. * **Canceled**: The transaction was replaced, rejected, or deleted by a user. *** **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. This value can be specified when creating a payout and can be modified anytime. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron** icon to expand it: * The payout identifier and current status. * The address and name of the user who created the payout. * The payout currency. * The payout amount in the payment currency. * The created and updated timestamps. * The receiver name and address in short format. * The number of collected and required signatures, for example `3/3`. The information below is divided into tabs. On this tab, you can view a list of account members that signed the payout. On this tab, you can view a list of callbacks sent for the payout. **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values: * `PAYOUT_CREATED`: The payout was created. * `PAYOUT_SENT`: The payout transaction was sent to the blockchain. * `PAYOUT_EXECUTED`: The payout transaction was mined to a block and executed successfully. * `PAYOUT_FAILED`: The payout transaction failed in the blockchain. *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. On this tab, you can access and change payout settings. **Tracking ID** The user‑provided identifier assigned to the payout for easier locating related payments in external systems. Can be changed anytime. *** **Callback URL** The URL for callback notifications on new payments and other payout events. Can be changed anytime. ## Common use cases [#common-use-cases] The **Payouts** page helps create on‑chain withdrawals, coordinate signatures, and monitor payout callbacks.\ This section describes common scenarios step by step. ### Create a new payout [#create-a-new-payout] Create a new payout. Go to **Payouts** in the main menu. Click **Create payout** in the upper‑right corner. Fill in the **Receiver** info: * In the **Receiver address** field, enter the address where funds will be sent. You can select a receiver from the [Address book](address-book) (if added). Fill in the **Payment details**: * From the **Payment currency** dropdown, select an asset to be withdrawn. * In the **Amount** field, enter the payout amount in the selected currency. Fill in the **Advanced options**: * In the **Nonce** field, specify the transaction nonce number used in the queue for this payout.\ By default, the field is prefilled with the next number in the queue. - If you leave the value as is, the payout is added as the last transaction in the [queue](queue). - If you set a value higher than the latest nonce in the queue, the payout is added as a new transaction that will be executed after existing ones. - If you set the nonce to match an existing transaction, a replacement transaction is created and both transactions are treated as [conflicting](queue#handle-conflicting-transactions) in the queue. - If you try to set a nonce lower than the first transaction in the queue, the *Nonce cannot be lower than first transaction in the queue* error appears and the payout can't be created. * In the **Tracking ID** field, optionally enter a payout identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * In the **Callback URL** field, optionally specify a URL for receiving callback notifications about payout events. Click **Create** and confirm the payout details. The newly created payout appears in the list with the *Created* status and is added to the [Queue](queue) with the specified nonce. ### View payout details [#view-payout-details] View full payout information, including signers and callbacks. Go to **Payouts** in the main menu. In the payout list, locate the required payout and click its **ID** to open details. In the upper part of the page, review the payout status, the number of collected and required signatures, and other details. On the **Signed by**, view the list of members who have already signed the payout. Switch to the **Callbacks** tab to review callback history. Switch to the **Settings** tab to view or adjust **Tracking ID** and **Callback URL**. The **Queue** is a list of multisig operations that were created for the account but are not yet fully executed. The number of new operations requiring your attention is displayed on the counter near the **Queue** menu item. Each operation uses a **nonce** and requires a certain number of signatures from account members.\ Transactions must be processed in order: an operation with a smaller nonce needs to be executed before any operation with a larger nonce. ## Queue list [#queue-list] The information on this page is divided into tabs. On this tab, you can view a list of operations that are still waiting for signatures or execution. The first block on the tab highlights the transaction that needs to be executed first.\ This block corresponds to the operation with the smallest **Nonce** in the queue. The following information is provided about each pending operation: **Nonce** The sequential number used by the smart contract to keep transactions in the correct order. The queue is sorted from the smallest nonce to the largest. *** **Created at** The time when the operation was added to the queue. The value is shown as relative time (for example, *5 minutes ago*) and can be viewed as a date and time in the details. *** **Operation** The type of the pending operation. Possible values: * **Payout** * **Multisig config change** * **Reject** * **Cross-chain transfer**: A transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **dApp transaction**: For operations initiated by an external dApp connected via WalletConnect, the column shows the dApp name and icon instead of the generic label. See [dApps](dapps). *** **Amount** For operations that change balances: the amount of the transaction. Amounts that reduce the balance are shown with a minus sign and include the currency, for example `-1,056.06 ETH`. For configuration operations, the value displays `—`. *** **Signatures** The number of collected signatures versus the required number, in the `X/Y` format (for example, `2/5` or `5/5`). *** **Action** The set of actions available for the current user and operation state. Possible values: * **Sign**: Available if the current user has not yet signed the operation and is allowed to sign it. * **Execute**: Available when all required signatures are collected and the operation has the smallest nonce in the queue. When an action is not available, the corresponding button is disabled or hidden. ### Operation details [#operation-details] Click the **chevron icon** to expand the operation details: **Created at** The date and time when an operation was created. *** **Created by** The account name and address of the user who created the operation. *** **Signed by** The list of accounts that already signed the operation, shown with names and addresses in the expanded view. *** **Action** Additional actions available for the current user and operation state. Possible values: * **Copy link**: Copy a direct link to the operation. The link can be shared with other signers to speed up collaboration. * **Reject**: Available when the operation can be replaced or canceled. On this tab, you can view a list of executed and failed operations. The table structure is similar to the **Pending** tab and additionally displays the **Status** column: all operations here are assigned a final status — *Success* or *Failed*. The history view helps trace which actions were executed, by whom, and with which result. ## Common use cases [#common-use-cases] The **Queue** page helps coordinate multisig actions between several accounts.\ This section describes common scenarios step by step. ### View the operation queue [#view-the-operation-queue] Review pending operations and see which transaction needs to be executed first. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. In the **This transaction needs to be executed first** block, review the first transaction with the smallest **Nonce**. Scroll down to the **Pending transactions** section to see all remaining operations in the queue, ordered by nonce from smallest to largest. If the queue is empty for the selected network, the *There are no transactions yet* message appears instead of the table. ### Sign transactions [#sign-transactions] Sign a pending operation so that it can eventually be executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation that requires your signature and verify that: * Not all required signatures are collected. * The **Sign** action is available, which confirms that you haven't yet signed it and you're authorized to. Then click **Sign**. In the **Sign transaction** popup, review and verify operation details before signing, and then click **Sign**. The **Sign** action for the corresponding operation will gray out signaling that you've already signed the operation. If your signature is the last required one, both **Sign** and **Execute** actions may be available, allowing you to sign and immediately [execute](#execute-transactions) the operation when conditions are met. ### Execute transactions [#execute-transactions] Execute a fully signed operation and send it to the blockchain. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to execute and verify that: * The required number of signatures is collected. * There are no other pending operations with a smaller **Nonce**. * The **Execute** action is available. Then click **Execute**. In the **Confirm transaction** popup, review the operation details and estimated fee, and then click **Execute**. The operation will display the *Executing* status for some time, and then will be moved from the *Pending* tab to the *History* tab. If your wallet lacks enough funds to cover the fee, the *Your connected wallet does not have enough funds to execute this transaction* error appears and the **Execute** button becomes disabled. ### Reject or replace transactions [#reject-or-replace-transactions] Reject or replace a queued transaction before it's executed. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Locate the operation you want to reject, expand the transaction row and click **Reject** if the option is available. Choose one of the available options in the popup: * **Replace with another transaction**: Propose a new transaction with the same nonce. Follow the creation flow in the opened transaction form or reuse an existing transaction from the queue; both the original and replacement transactions then appear as [conflicting](#handle-conflicting-transactions). * **Reject transaction**: Create an on‑chain cancellation transaction with the same nonce. Confirm the action in the **Reject transaction?** popup. After signing, a separate rejection transaction appears in the queue as [conflicting](#handle-conflicting-transactions) and can be executed instead of the original transaction. * **Delete from queue**: Remove the transaction locally (available when only one transaction with this nonce exists). Confirm your choice in the **Delete transaction?** popup. A new, empty transaction slot with the same nonce becomes available. ### Handle conflicting transactions [#handle-conflicting-transactions] Handle several transactions with the same nonce and execute only one of them. Go to **Queue** in the main menu. Identify groups of transactions marked as conflicting, indicated by a message *Conflicting transactions. Executing one will automatically replace the others.* Review the details of each conflicting transaction to decide which one should be executed. Execute the chosen transaction following the steps in [Execute transaction](#execute-transactions). After the chosen transaction is executed, check that **Execute** becomes unavailable for other conflicting transactions and that they disappear from the queue. ### Batch execution [#batch-execution] Execute several fully signed and sequential transactions in a single blockchain transaction. Go to **Queue** in the main menu and make sure the **Pending** tab is selected. Verify that: * There are multiple transactions in the queue. * All of them are fully signed. * Their nonces form a continuous sequence (for example: `5`, `6`, `7`). * The **Execute batch** button above the table is available. Then click **Execute batch**. In the **Batch execution** popup, review a list of transactions to be executed and their details and then click **Execute**. The executed transactions will be displayed on the *History* tab. ### View the queue history [#view-the-queue-history] Review the history of previously signed and executed operations. Go to **Queue** in the main menu. Switch to the **History** tab. Review the list of past operations. If needed, open the details for a specific operation to see its parameters and the list of signers. Use filters or sorting (where available) to focus on a particular period, operation type, or status, such as *Failed* operations that may require attention. **Staking** lets a TRON account freeze TRX to obtain **Energy** or **Bandwidth**, take part in TRON governance by voting for Super Representatives, and delegate resources to other addresses. Like every account action, staking operations are performed by your multisig account: each one enters the [Queue](queue) and must collect the required number of signatures before it executes. Energy and Bandwidth are renewable resources: TRON regenerates them over time. Use them to pay for your account's transactions without burning TRX, so processing on TRON costs you nothing while enough resource is available. ## Availability [#availability] Staking is available only when both conditions are met: * The active network is a **TVM (TRON)** network. * The account is **deployed** on that network and its smart contract version supports staking (version **1.2.1** or later). When staking is available, a **TRX Staking** group with the **Staking**, **Voting**, and **Delegation** items appears in the main menu. If the account isn't deployed on the selected network, a *No deployment in this network* placeholder is shown instead. The account balance shown on the **Account** and **Payouts** pages is the *spendable* amount. TRX that is staked, pending unstake, or waiting to be withdrawn is excluded, so it can't be spent by mistake. ## Staking [#staking] To open the page, go to **Staking** in the main menu. The upper part of the page shows four summary cards, each with its own action: * **Available**: The amount of TRX that can be staked. Use the **Stake** action to freeze TRX for Energy or Bandwidth. * **Staked**: The amount currently frozen. Use the **Unstake** action to begin releasing it. * **Pending unstake**: The amount that is unstaking and maturing before it can be withdrawn. Use **Cancel unstaking** to return it to the staked balance. * **To be withdrawn**: The matured amount ready to return to the account. Use the **Withdraw** action to collect it. Below the cards, a table lists staking operations with their status. Click a row to open the operation details. ### Stake TRX [#stake-trx] Freeze TRX to obtain Energy or Bandwidth. Go to **Staking** in the main menu and click **Stake** on the **Available** card. In the **Stake** popup, choose the resource to obtain — **Energy** or **Bandwidth**. Enter the amount of TRX to stake. The minimum is **1 TRX**. A preview shows the approximate amount of the resource you will receive at current network rates. Click **Stake**. The operation is added to the [Queue](queue), where the required number of signers must approve and execute it. ### Unstake TRX [#unstake-trx] Begin releasing staked TRX back to the account. Go to **Staking** in the main menu and click **Unstake** on the **Staked** card. Select the resource to release and enter the amount, at least **1 TRX**. The popup explains that unstaked TRX matures for a fixed number of days before it can be withdrawn. Click **Unstake** and approve the operation in the queue. The amount moves to the **Pending unstake** card. When it matures, it moves to **To be withdrawn**. While an amount is pending unstake, you can use **Cancel unstaking** to return it to the staked balance without waiting for the maturation period. ### Withdraw TRX [#withdraw-trx] Collect matured TRX back to the account balance. Go to **Staking** in the main menu and click **Withdraw** on the **To be withdrawn** card. Review the amount and click **Withdraw**, then approve the operation in the queue. Once executed, the withdrawn TRX is added back to the spendable account balance. ## Voting [#voting] The **Voting** page lets the account use its staking power to vote for TRON **Super Representatives** and claim voting rewards. To open it, go to **Voting** under **TRX Staking** in the main menu. The page shows three summary cards: * **Total** voting power and the amount **Available** to allocate, with the **Vote** action. * **Allocated** voting power, with the **Get Vote** action to obtain more voting power by staking. * **Claimable rewards**, with the **Claim** action. Below the cards, a table lists Super Representatives with your current votes. You can search and sort the list to find a specific representative. ### Vote for Super Representatives [#vote-for-super-representatives] Go to **Voting** in the main menu and click **Vote**. Allocate your available voting power across one or more Super Representatives. Confirm and approve the operation in the [Queue](queue). Voting power comes from staked TRX. If you don't have enough, use **Get Vote** to stake more TRX first. ## Delegation [#delegation] The **Delegation** page lets the account delegate its Energy or Bandwidth to another address and reclaim it later. To open it, go to **Delegation** under **TRX Staking** in the main menu. The page shows a delegation summary and a table of active delegations, each with the recipient address, amount, resource, and lock state. Use **Reclaim** in a row to return delegated resources to the account; the action is unavailable while a delegation is still locked. ### Delegate resources [#delegate-resources] Go to **Delegation** in the main menu and click **Delegate**. Enter the recipient address, the amount, and the resource to delegate — **Energy** or **Bandwidth**. The minimum is **1 TRX** of staked value. Confirm and approve the operation in the queue. **Transfers** are incoming or outgoing transactions made to or from your account. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your account. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically and can’t be modified. *** **Created at** The date and time when a transfer was created. *** **Operation** The transfer type. Possible values: * **Invoice**: The incoming payment associated with an invoice. * **Direct deposit**: The direct crediting of funds to an account address. * **Set account config**: The changing of an account configuration, such as adding/removing signers or modification of confirmation rules. * **Claim**: The claiming of funds from a deposit address to the account address. * **Payout**: The withdrawal of funds from an account. * **Cross-chain transfer**: The transfer of funds to another network. See [Cross-chain transfers](cross-chain-transfers). * **Staking operation**: A TRON staking action, such as stake, unstake, withdraw, vote, or delegate. See [Staking](staking). * **Reject**: The operation rejection. *** **Status** The current status of a transfer. Possible values: * **Pending**: The transaction has been detected by B2BINPAY DeFi and is currently in the queue for processing. The status will be changed soon. * **Executed**: The transaction has been mined to a block. The status will be changed soon. * **Confirmed**: The required number of block confirmations has been received and the transaction is completed. This is a final status. * **Failed**: The transaction has failed on the blockchain. This is a final status. *** **TXID** The blockchain identifier of a transaction, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. *** **Amount** The amount of a transfer, in the payment currency. For invoices, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. ## Transfer details [#transfer-details] To access transfer details, click a transfer **ID** in the transfer list. In the upper part of the page, you can find the essential information about the transfer — click the **chevron icon** to expand it: * The transfer identifier and current status. * The account address and name of a user who created the operation. * The payment currency. * The payment amount. * The date and time the transfer was created. * The TXID. This a link to the explorer. * The identifier of a related operation. This is a link to an invoice or payout. * The number of confirmations the transaction received on the blockchain. * The blockchain fee charged for transaction processing, in the payment currency. Below you can see a list of callbacks sent: **Callback URL** The URL for callback notifications. *** **Type** The callback type. Possible values depend on the operation type (invoice or payout). *** **Created at** The date and time the callback was sent. *** **Status** The callback sending status. Possible values: * **200 (success)**: The callback was delivered and acknowledged by the target endpoint. * **3XX / 4XX / 5XX (failed)**: The callback was not accepted by the endpoint. Bank withdrawals in fiat currencies are only available from Merchant wallets denominated in fiat currencies. To withdraw funds, you have to provide your bank details in advance. Consult your B2BINPAY manager about the procedure. Only users with the *Owner* role can create bank withdrawals. You can create a one-time withdrawal or regular withdrawal which is triggered every time when the wallet balance reaches a specific value. ## One-time withdrawals [#one-time-withdrawals] Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **One-time withdrawal** option and click **Proceed**. Select the bank details. In the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. Click **Submit** to create the withdrawal. After the withdrawal is created, it’s sent to the B2BINPAY Finance department for confirmation. Once confirmed and processed, the corresponding transfer will be assigned the *Confirmed* status. ## Regular withdrawals [#regular-withdrawals] Only one regular withdrawal can be connected to one wallet. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Bank withdrawal**. In the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets denominated in fiat currencies are available. Select a withdrawal type: mark the **Regular withdrawal when the amount is reached** option and click **Proceed**. Select the bank details. Select the withdrawal option: * **Fixed amount**: To withdraw funds immediately after the required amount is reached on the wallet. * **Changing amount**: To additionally specify the minimum amount that should be left on the wallet after the withdrawal. For fixed amount, in the **Amount to be withdrawn** field, enter the withdrawal amount. It must be more than or equal to the minimum allowed value specified in the system settings. In the **Amount** field, the total amount is automatically calculated as *Amount + Commission amount*. For changing amount, specify the minimum non-reducible amount and minimum withdrawal amount. Click **Proceed** to create the withdrawal. After the withdrawal is created, you can see the **Regular withdrawal connected** tag near the corresponding wallet on the **Wallet management** > **Wallets** page. You can delete the regular withdrawal in the wallet settings. ## Deposits to Enterprise wallets [#deposits-to-enterprise-wallets] To create a deposit to your Enterprise wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited and click **Proceed**. Only Enterprise wallets are displayed in the list. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Address type** — for deposits to wallets denominated in BTC: an address format. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * the **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. ## Deposits to Merchant wallets [#deposits-to-merchant-wallets] To create a deposit to your Merchant wallet: Go to **Wallet management** > **Deposits**. Click **Create new deposit**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. In the dropdown, select a wallet to which payments should be credited. Only Merchant wallets are displayed in the list. After you specified the wallet, a list of available payment currencies are displayed. Select the payment currency or activate the **Payer will choose currency by himself** toggle to allow your payers to select the payment currency. In this case, you’ll see a list of currencies available for payments. All payments will be credited in your wallet currency. If you specify the payment currency, below the currency list you’ll see the current exchange rate. Select the required option and click **Proceed**. If you select the payment currency, you can’t change this value after creating the deposit. If you don’t specify the payment currency, you can change this value later, until a payer selects the currency. 6\. If needed, specify the **Limits**. You can set: * the deposit amount in your wallet currency. You can change this value later. If you specify this value and the payment currency, the requested amount in the payment currency will be calculated automatically, according to the exchange rate displayed below. * the delta in your wallet currency. This value is only applicable if the requested amount is specified. You can change this value later. * the requested amount in the payment currency (only if you specified the payment currency). You can change this value later. If you specify this value, the requested amount in the wallet currency will be calculated automatically, according to the exchange rate displayed below. * the date and time when your deposit expires. You can change this value later anytime before the expiration time. You can change these values anytime. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your deposit. This label is displayed in the deposit list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the deposit-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. * **Callback URL** — a URL to send callbacks about new transactions. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency * `#DID#` — the deposit identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. * **Payment page URL** — the link that is displayed as a button on the payment page. * the **Payment page button name** — the custom name of a button displayed on the payment page. You can change these values anytime. Click **Proceed** to create the deposit. The newly created deposit is now available in the deposit list where you can monitor its status and related payments. Click the deposit **ID** to access the details, where you can change specified values and get the link to the payment page, that you can send to your payers. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Payout**. Select the type of a wallet: mark the **Enterprise wallet** or **Merchant wallet**, and then click **Proceed**. In the dropdown, select a wallet from which the payment amount will be debited. Only wallets of the selected type are available. For payouts from Merchant wallets, select the payment currency. If the payment currency differs from the wallet currency, the exchange rate is displayed. Enter the payment amount: * For Enterprise wallets, in the wallet currency. * For Merchant wallets, in the wallet or payment currency. Alternatively, you can select a percentage of your wallet balance to automatically calculate the payout amount. Possible options: 25%, 50%, 75%, or 100%. If needed, activate the toggles: * **Fee is included**: To deduct the blockchain fee from the payment amount, the remaining part will be credited to the receiver’s wallet. * **Commission is included**: To deduct the platform commission from the payment amount, the remaining part will be credited to the receiver’s wallet. If the toggles are inactive, the blockchain fee and platform commission are additionally debited from your wallet. If you selected **100%** in the previous step, the toggles are activated by default. The amount to be credited to the receiver’s wallet is calculated as *Available wallet balance* – (*Blockchain fee* + *Commission*). In the payout confirmation window, you'll see the **To be sent** amount which is the precise sum that will be credited to the receiver’s wallet. After making the payout, your wallet will have zero balance. For ETH, BSC, and TRX blockchains, the resulting balance may be positive due to the floating blockchain fee value. In the **Address** field, enter the destination address. You can save the entered address to your address book by activating the **Save to address book** toggle. Next time you can just pick it from the list by clicking **From address book**. For XRP and XLM, you can’t transfer funds within the same blockchain wallet. Choose the blockchain fee mode and click **Proceed**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. If needed, specify the **Advanced options** and click proceed. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the payout-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. Click **Proceed** to create the payout. The newly created payout is now available in the payout list where you can monitor its status. Click the payout **ID** to access the details. If your payout got stuck on the blockchain due to low fee paid, refer to [How to speed up your payout by changing the blockchain fee](how-to-speed-up-your-payout-by-changing-the-blockchain-fee) to learn how to fix it. Internal transfers can be made between Merchant wallets denominated in the same currency and belonging to the same *Owner*. Such transfers are executed [off-chain](../../references/key-terms#off-chain-transaction) and aren't subject to any fees. Go to **Wallet management** > **Payouts**. Click **Add new** above the table and select **Internal transfer**. From the dropdown, select a wallet from which funds should be withdrawn. Only Merchant wallets are available for selection. From the next dropdown, select a wallet to which funds should be transferred. Only Merchant wallets denominated in the same currency as the source wallet are available for selection. Enter the transfer amount. Alternatively, you can select a percentage of the source wallet balance to automatically calculate the transfer amount. Possible options: 25%, 50%, 75%, or 100%. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. The speed of the transaction processing depends on the blockchain fee selected when creating a payout: the lower the fee, the longer the transaction processing time. The following fee modes are available: * **Low**: The economy mode when speed doesn’t matter. * **Medium**: The optimal processing speed for a reasonable blockchain fee. * **High**: The priority transaction processing via high blockchain fees. * **Custom**: The customized fee value: you can specify your own blockchain fee value. Mind that your custom value can’t be two times lower than the *Low* value and three times higher than the *High* value. The blockchain fee can vary, therefore we suggest that you refer to the links containing blockchain gas[^1] fees in the table below for more precise information about blockchain fee values. | Blockchain | Links for reference | | --------------- | ------------------------------------------------------------------ | | BNB Smart Chain | [https://bscscan.com/gastracker](https://bscscan.com/gastracker) | | Ethereum | [https://etherscan.io/gastracker](https://etherscan.io/gastracker) | [^1]: Commission charged for processing token transactions in the Ethereum blockchain. If your payout got stuck on the blockchain due to low fee paid, it’s possible to speed up its processing using the **Replace by fee** option. Go to **Transfers**. Select the transfer you need to speed up: filter transfers by the *Payout* type and *Unconfirmed* status. Click the transfer **ID** to go to payout details. Click the **Replace by fee** button. If a payout can’t be replaced, the button isn’t displayed. Select the new blockchain fee value and click **OK**. The updated fee level should align with the blockchain's fees. The existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. ## Create Swap wallets [#create-swap-wallets] To swap currencies, you need to have Swap wallets denominated in these currencies. For example, if you want to swap USDT for EUR between your Merchant wallets, you need to create two Swap wallets: one denominated in USDT and another denominated in EUR. Refer to [Create a Swap wallet](../manage-your-wallets/how-to-create-a-wallet#swap-wallets) for step-by-step-instructions. ## Top up the source Swap wallet [#top-up-the-source-swap-wallet] Transfer the funds you want to exchange to the created Swap wallet. 1. Go to **Swaps** > **Wallets**. 2. Select the required wallet and click the **wallet icon (Funds)**. 3. In the **Top up** section, select an Enterprise or Merchant wallet from which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Create a swap operation [#create-a-swap-operation] Next, create a swap operation to exchange funds between your Swap wallets. 1. Go to **Swaps** > **Swap**. 2. Select a tab for the desired swap mode: * **No slippage**: No slippage will be applied, the swap will be processed at the shown price unless it changes significantly. * **Client's slippage**: Your specified slippage will be applied, the swap will be processed at the latest price unless the set **Slippage tolerance** is exceeded. 3. In the **From** section, select a source Swap wallet from which you want to swap funds. 4. In the **To** section, select a target Swap wallet to which you want to swap funds. 5. Enter a swap amount, in either the source (**From**) or target (**To**) currency. The equivalent amount in the other currency is calculated automatically and along with the actual exchange rate is displayed below. 6. If you selected the **Client's slippage** mode, in the **Slippage tolerance** field, specify the acceptable price deviation threshold, in percents, or select from the predefined options. 7. Click **Preview swap** and check operation details. 8. Click **Confirm** to create a swap. The newly created swap operation is now available on the **Swaps** > **History** page where you can monitor its status and related payments. ## Withdraw funds from your Swap wallet [#withdraw-funds-from-your-swap-wallet] Finally, withdraw the exchanged funds from your Swap wallet to your Merchant or Enterprise wallet denominated in the same currency. 1. Go to **Swaps** > **Wallets**. 2. Select a wallet from which you want to withdraw funds and click the **wallet icon (Funds)**. 3. In the **Withdraw** section, select an Enterprise or Merchant wallet to which you want to transfer funds. Only wallets denominated in the same currency as your Swap wallet are available for selection. 4. Enter the amount of transfer. 5. If you transfer funds to an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. 6. Click **Confirm** to transfer funds. The newly created transfer is now available on the **Wallet management** > **Transfers** page where you can monitor its status. Transfers to Enterprise wallets are credited after receiving enough confirmations on the blockchain. Only users with the *Owner* role can access Custody wallets. ## Top up your Custody wallet [#top-up-your-custody-wallet] To top up a wallet: Go to **Custody** > **Wallets**. Select a wallet that you want to top up and click the **Funds** button. Select **Top up funds** and click **Proceed**. From the dropdown, select a wallet from which funds should be transferred. You can select: * Any Merchant wallet. * An Enterprise wallet denominated in the same currency as the target Custody wallet. Enter the amount of transfer. The amount must be greater than or equal to the minimum transfer amount set for the target Custody wallet. If you transfer funds from an Enterprise wallet, select the **Fee mode**. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) for more information. Click **Proceed**. In the popup, check the transfer details and click **Confirm** to create the transfer. The newly created transfer is now available on the **Custody** > **History** page where you can monitor its status. Transfers from Enterprise wallets are credited after receiving enough confirmations on the blockchain. ## Withdraw funds from your Custody wallet [#withdraw-funds-from-your-custody-wallet] Mind that to withdraw funds from your Custody wallet, you have to pass video verification. The Accumulated commission will be charged from the Custody wallet along with a withdrawal. To withdraw funds: Go to **Custody** > **Wallets**. Select a wallet from which you want to transfer funds and click the **Funds** button. Select **Withdraw funds** and click **Proceed**. To withdraw funds **to an Enterprise or Merchant wallet**: 1. Select the **Wallet** destination. 2. From the dropdown, select a wallet to which funds should be transferred. The target wallet must be denominated in the same currency as the source Custody wallet. To withdraw funds **to an external address**: 1. Select the **External address** destination. 2. From the dropdown, select a network. 3. Enter the destination address. Enter the amount of transfer. When transferring funds to **an Enterprise or Merchant wallet**, choose the blockchain fee mode. Refer to [How to select the optimal blockchain fee](how-to-select-the-optimal-blockchain-fee) to learn more about fee modes. Activate the **Fee is included** toggle to deduct the blockchain fee from the transfer amount, the remaining part will be credited to the target wallet. For example, if the amount is 100 and the fee is 20, then 80 will be credited (*100 – 20*). If the toggle is inactive, the blockchain fee is additionally debited from the source wallet. Click **Proceed**. Optionally, specify the **Advanced options**. You can set: * **Label** — a tag or name of your payout. This label is displayed in the payout list and can be used for a quick search. It can be any name convenient for you. * **Tracking ID** — an identifier to track the withdrawal-related transactions in external systems. It can be any combination of numbers and letters, chosen by you for ease of reference. This value must be unique within the wallet. * **Callback URL** — a URL to send a callback. You can add parameters to the URL: they can be useful for easier parsing of the callback body in external systems. In the final callback URL, the parameters are automatically replaced with the actual values. To add, click the **templates** link under the field or type them manually. The following templates are available: * `#PID#` — the payment identifier * `#TRID#` — the tracking identifier * `#WID#` — the wallet identifier * `#TXID#` — the blockchain transaction identifier * `#CISO#` — the currency code, as per ISO * `#CUR#` — the alphabetic code of a currency `#DID#` — the payout identifier * **Required block confirmations** — the number of confirmations needed to receive an additional callback. If this field isn’t empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. You can change these values anytime. When creating a payout in XRP and XLM currencies, the additional **Tag** and **Tag type** fields appear in the form. Click **Proceed**. Fill in the information about a payment receiver: 1. Select the natural or legal person. 2. Enter the name of a receiver. 3. Enter the address of a receiver, as defined by postal services. In the popup, check the withdrawal details and click **Confirm**. To process a withdrawal, you have to pass video verification. Click **Complete verification** to proceed. You can do it later on the **Custody** > **Requests** page. The newly created withdrawal is now available on the **Custody** > **Requests** page where you can monitor its status. Mind that the withdrawal may take up to 48 hours to complete after submitting and passing video verification. You can add an address to the whitelist, so that payouts made to such an address will not require approval, regardless of their amount or the role of the user who made such a payout. You can create a whitelist either for a specific wallet or for the entire blockchain. In the latter case, the whitelist will apply to all your wallets on that blockchain. The wallet-level whitelists have priority over the blockchain-level whitelists. Only users with the *Owner* role can whitelist payout addresses. To whitelist addresses, you must have 2FA enabled. ## Whitelist an address for a blockchain [#whitelist-an-address-for-a-blockchain] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To blockchain** tab, select a blockchain from the **Blockchain** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Blockchains** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. ## Whitelist an address for a wallet [#whitelist-an-address-for-a-wallet] To whitelist a payout address: Click your **profile icon** in the upper-right corner of the page and select **Address whitelist**. Click **Add address**. On the **To wallet** tab, select a wallet from the **Wallet** dropdown. In the **Address(es)** field, add one or more payout addresses that you want to whitelist. Click **Add**. The newly added payout address is now available on the **Wallets** tab. To remove an address from the whitelist, hover over it and click the **bin icon** that appears in the **Action** column, and then confirm the deletion. To delete multiple addresses at a time, mark the corresponding checkboxes and click **Delete all**. Mark the top checkbox to select and delete all addresses. You can also manage whitelisted addresses on the **Address whitelist** tab in the wallet details. Only users with the *Owner* role can create wallets. ## Enterprise wallets [#enterprise-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Enterprise wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Enterprise wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If you select a token as the wallet currency, you’ll be additionally asked to select a [parent wallet](#user-content-fn-1)[^1]. For wallets denominated in ETH, TRX, BNB, XRP, or XLM, select a wallet from which the [Activation fee](#user-content-fn-2)[^2] will be deposited, or enable the **Activate wallet later** toggle. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Minimum transfer amount** — the minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount will be automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more comma-separated email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. Wallets denominated in ETH, TRX, BNB, XRP, or XLM require the [Activation fee](#user-content-fn-2)[^2]. If you enabled the **Activate wallet later** toggle while creating such a wallet, it will remain in the *In progress* status. Deposit the required amount of funds to the wallet to activate it. You can find the deposit address in the wallet details. ## Merchant wallets [#merchant-wallets] To create a wallet: Go to **Wallet management** > **Wallets**. Click **Add wallet**. Select the type of a wallet: mark the **Merchant wallet** and click **Proceed**. Mind that you can’t change the wallet type after creation. Select a wallet currency and click **Proceed**. Merchant wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Site URL** — a link to your landing page or any other resources. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. * **Customer support emails** — one or more email addresses of your customer support service. These emails will be displayed on Payment pages, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. You can change these values anytime. Click **Proceed** to create the wallet. The newly created wallet is now available in the wallet list and is assigned the **In progress** status for several minutes. This is required for the wallet to be registered in the system. Wait until the status changes to **Active** to start using your wallet. ## Swap wallets [#swap-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Swaps** > **Wallets**. Click **Add swap wallet**. Select a wallet currency and click **Confirm**. Swap wallets can be denominated either in fiat or in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. The newly created wallet is now available on the **Swaps** > **Wallets** page and can be topped up and used for swap operations. ## Custody wallets [#custody-wallets] You can only create one Swap wallet per currency. To create a wallet: Go to **Custody** > **Wallets**. Click **Add custody wallet**. Select a wallet currency. Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. Mind that you can’t change the wallet currency after creation. Click **Proceed**. If needed, specify the **Advanced options**. You can set: * **Label** — a tag or name of your wallet. This label will be displayed in the wallet list and can be used for a quick search. It can be any name convenient for you. * **Notification addresses** — one or more comma-separated email addresses to which notifications about new transactions should be sent. Click **Confirm** to create the wallet. The newly created wallet is now available on the **Custody** > **Wallets** page and can be topped up. [^1]: Enterprise wallet to which a token wallet is linked. [^2]: A deposit to activate your wallet. For more details: [#activation-fee](../../references/key-terms#activation-fee "mention") You can generate a report on wallet balances and transactions for a specific time period, and download it as a CSV file. The report contains information about all your Enterprise and Merchant wallets existing in the system during the specified time period. A report on wallet balances contains information about wallet transactions and balances for the custom time period. To create a report: Click your user icon in the upper right corner of the page and select **Reports**. Click **Download report**. Click the **calendar icon** to pick up start and end dates of the reporting period. Click **Download** to start creating the report. Mind that the report generating may take some time. Once generated, it’ll be automatically downloaded to your computer as a zip-archive containing the report file in the CSV format. In the downloaded report, for each wallet all possible transfer types are listed, regardless of the actual amount of funds. Refer to [Transfer types](../../references/transfer-types) for more details about operations. You can grant access to your Enterprise and Merchant wallets to other members of your team. Only users with the *Owner* role can grant access to wallets. To grant access, you need to add a new user and assign them a user role. Access can be managed either centrally from your profile menu, where you can see a list of all users and the wallets they have access to, or from the wallet details, where you can see the users who have access to that specific wallet. This article is focused on adding users. If you need to revoke access, refer to [How to restrict access to your wallet](how-to-restrict-access-to-your-wallet). If you need to adjust user roles, refer to [How to manage user roles](how-to-manage-user-roles). ## From your profile menu [#from-your-profile-menu] ### Add a new user [#add-a-new-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, click **Add new user**. From the dropdown, select a wallet to which you want to share access. Enter the email address of a user to whom you want to grant access. Click **Add**. A new user will be added to the **Staff** tab. By default, users are assigned the *Read only* role. See [How to manage user roles](how-to-manage-user-roles) for step-by-step instructions on how to change it. ### Share access to an existing user [#share-access-to-an-existing-user] To grant access: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user to whom you want to grant access. Click **Add wallet access**. From the **Wallet** dropdown, select a wallet to which you want to share access. From the **Role** dropdown, select a role that you want to assign. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Add**. The user now have access to the wallet according to the assigned role. ## From the wallet details [#from-the-wallet-details] To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to share access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, click **Invite user**. In the **Invite new user** popup, enter the email address of a user to whom you want to grant access and select a user role. You can change the role anytime. Refer to [User roles](../../references/user-roles) for more details. Click **Confirm** to invite the user. The user will receive an email invitation with a link to activate access to the wallet. You can revoke access anytime in the wallet settings by deleting the user from the access list. You can manage access to your wallets by assigning different roles to users. Refer to [User roles](../../references/user-roles) for more details. You can change access for a single wallet or for multiple wallets at a time. Only users with the *Owner* role can assign user roles to other users. The *Owner* role can't be assigned or changed. ## For a single wallet [#for-a-single-wallet] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Hover over a required wallet and click the **pencil icon** that appears to the right. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the specific wallet. ## For multiple wallets [#for-multiple-wallets] To change a user role: Click your **profile icon** in the upper right page corner and select **Access list**. On the **Staff** tab, select a user whose role you want to change. Mark the checkboxes of required wallets. Mark the top checkbox to select all wallets. From the **Action** menu above the wallet list, select **Edit access**. In the popup, select a new option from the **Role** dropdown. Click **Save**. A user is now assigned a new role to access the selected wallets. You can revoke access to your Enterprise and Merchant wallets from other members of your team. Only users with the *Owner* role can restrict access to wallets. To grant access: Go to **Wallet management** > **Wallets**. Select a wallet to which you want to restrict access and click the **gear icon** to navigate to wallet details. On the **Access rights** tab, select a user and click the **pencil icon** to change a user role or the **bin icon** to revoke user access. Click **Confirm** to apply changes. For additional security measures, you can also limit access to the system by the IP white list. For step-by-step instructions, refer to [How to whitelist IP addresses](../manage-your-profile-and-system/how-to-whitelist-ip-addresses). You can set thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of the role of the user who created such payout. The thresholds can be applied to withdrawals made by specific users or user groups. Only users with the *Owner* role can set withdrawal thresholds. To set a threshold: Go to **Wallet management** > **Wallets**. Select a wallet for which you want to set thresholds and click its **ID** to open wallet details. Switch to the **Thresholds** tab. Enable the **Thresholds** toggle. In the **Approvers** section that appears, specify who can approve the payouts. You can select one or more user roles (the *Owner* role is selected by default and can be deselected), individual users, or both. Select a required option: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Click **Add new threshold**. To set a threshold for users, from the **User/User group** dropdown select **User**, and then select one or more emails. The threshold will be applied when the specified user will make a payout. To set a threshold for user groups, from the **User/User group** dropdown select **User group**, and then select one or more groups. The threshold will be applied when users from the specified groups will make a payout. In the **Number of confirmations** field, enter how many approvals the payout will require. The default value is 1. Enter a threshold amount. Payouts with amounts exceeding the specified value will require an approval. For the **Max sum of payout per timeframe** option, set a timeframe: * Select **Minute**, **Hour**, or **Day**. * Enter a value greater than 0 (zero). Click **Add**. The newly added threshold is now available in the list. When a payout exceeding a threshold amount is created, it appears on the **Events** page, where all assigned Approvers can review and confirm it. Once the required number of confirmations is received, the payout is processed. To change a threshold, hover over it and click the **pencil icon** to go to threshold settings. To remove a threshold, hover over it and click the **bin icon**, and then confirm the deletion. ## Obtain API credentials [#obtain-api-credentials] Only users with the *Owner* role can generate API credentials. To get access to API: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Manage API access** section, optionally whitelist IP addresses for API access: refer to [How to whitelist IP addresses](how-to-whitelist-ip-addresses#restrict-access-to-api) for step-by-step instructions. Enable the **Activate API user** toggle. In the **Your API access credentials** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated API key and secret are displayed in the popup. Use **Copy** buttons to copy values. Mind that the credentials only reveal once in this popup. They can’t be accessed after the popup is closed and have to be regenerated. Now you can access the system via the API. The new API user with the *Admin* role is automatically granted access to all your wallets. ## Security tips [#security-tips] If sharing your API keys with other persons to set up integrations: * Use password managers for secure credential sharing. * Whitelist IP addresses for API access. * Generate new credentials after the setup is complete. ## Obtain a callback secret [#obtain-a-callback-secret] Only users with the *Owner* role can generate callback secrets. To get a callback secret: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **Callback secret** tab. In the **Your callback secret** section, click the **Regenerate** button. In the confirmation popup, enter your password, and then the *Authorization 2FA for operations* code to confirm the operation. The newly generated callback secret displayed in the popup. Use **Copy** button to copy the value. Mind that the callback secret only reveals once in this popup. It can’t be accessed after the popup is closed and has to be regenerated. Now you can use the callback secret for [deposit](../../api-guide/deposit-methods#callback-verification) and [payout](../../api-guide/payout-methods#callback-verification) callback verifications. To change your password, you must have access to your profile. If you forgot your password and can’t log in to the system, please click **Forgot password?** on the log in page and proceed with the password resetting procedure. If you suspect your account has been compromised, immediately contact your B2BINPAY manager. To change the password: Click your user icon in the upper right corner of the page and select **Settings**. In the **Password** section, click the **Change password** button. In the **Set new password** popup, enter your current password, then enter and repeat a new password. Mind that the password must meet the following requirements: * Latin characters, numbers, and special symbols are allowed. * The minimum length is 8 symbols. * At least one upper-case character must be used. Click **Confirm** to apply changes. Your password has been successfully changed. Use the Google Authenticator app for receiving *Payment system 2FA* verification codes. If you lost your device or forgot the secret code and can’t get access to your account, contact your B2BINPAY manager. Mind that in order to restore access, you’ll be asked to provide all the necessary documents to verify your identity. To enable 2FA: Click your user icon in the upper right corner of the page and select **Settings**. In the **Two-factor authentication** section, activate the **Google Authenticator** toggle. Download and install the Google Authenticator app from AppStore or Google Play, and then click **Proceed**. Scan the displayed QR code with Google Authenticator or enter the code manually, and then click **Proceed**. In the **Enable Google Authenticator** popup, enter your password and click **Confirm**. The 2FA is enabled. Next time you log in, you’ll be asked to enter a 2FA verification code provided via the selected method. Mind that 2FA codes are one-time and time-sensitive. You can add your personal account of the AML provider as an additional level of verification. If enabled, after successfully passing the default B2BINPAY AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. To enable custom AML check: Click your user icon in the upper right corner of the page and select **Settings**. In the **AML check** section, activate the toggle. In the popup: 1. Select an AML provider. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). 2. Enter your AML provider credentials: API key and API secret. 3. Specify **Risk for alert** to receive email notifications on suspicious transactions, and **Risk for block** to block them. The values from 0 (zero) to 100 are supported. 4. In the **Retries max** field, specify the maximum number of attempts to resend a request in case the AML provider doesn't respond. Click **Enable** to finish setup. The additional AML check is now enabled. All incoming transfers are now subject to two AML checks. You can disable custom AML check or edit credentials anytime in your profile. Use the partner program to earn a percentage of B2BINPAY commissions from clients who sign up using your referral link. This guide explains how to choose a wallet for rewards and generate your referral URL. Only users with the *Owner* role can configure the partner program. Before you start, make sure you have at least one **Merchant** wallet in USD. This wallet will be used to receive partner rewards. For details, refer to [How to create a wallet](../manage-your-wallets/how-to-create-a-wallet). To start a partner program: Go to **Partner program**. In the **How it works** section, click the **Terms & conditions** link to review the program settings. In the **Unique referral URL** section, click **Select wallet** and select your Merchant wallet is USD. Once the link is generated, use the **Copy** button to copy it to the clipboard. Share the copied URL with partners who want to join B2BINPAY. When an invited client signs up through your link, passes KYB checks, and starts processing eligible transactions, their commissions begin generating partner rewards for your legal entity according to the program settings. You can track invited clients, their statuses, and rewards on the **Partner program** page in the **Invited partners** table. You can limit access to your legal entity Web UI and API by whitelisting trusted IP addresses. We recommend that you use this option to protect your finances. Only users with the *Owner* role can whitelist IP addresses. ## Restrict access to Web UI [#restrict-access-to-web-ui] This setting will apply to all users under this particular legal entity, including the *Owner*. Enter IP addresses carefully, otherwise you risk losing access to the system. To let your users access the system only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **IP whitelist** tab. In the **Specify IP addresses** filed, click the **pencil icon** and add trusted IP addresses. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system Web UI is allowed only from the specified IPs. All users currently logged in from untrusted IP addresses will be logged out. ## Restrict access to API [#restrict-access-to-api] To let your users access the system API only from the trusted IP addresses: Click your user icon in the upper right corner of the page and select **Access list**. Switch to the **API** tab. In the **Whitelist IP access** field, click the **pencil icon** and add trusted IP addresses. Press **Enter** after each IP. Both `IPv4` and `IPv6` formats are supported. You can list individual IP addresses or define a subnet mask (such as the one used to assign your company IPs). Only static IP addresses can be included in the whitelist, dynamic IPs are not supported. Click the **check mark icon** to apply changes. In the confirmation popup, enter your *Authorization 2FA for operations* code and click **Confirm**. Now access to the system API is allowed only from the specified IPs. On this page, you can view a list of balance operations on your Custody wallets. Only users with the *Owner* role can access this section. ## Operation list [#operation-list] The following information is provided about each operation: **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Operation** The transfer type. Possible values: * **Custody wallet withdrawal**: The withdrawal of funds from a Custody wallet to an Enterprise/Merchant wallet or to an external address. * **Custody wallet top up**: The deposit of funds to a Custody wallet from an Enterprise or Merchant wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the wallet currency. *** **Created at** The date and time when a transaction was created. Only users with the *Owner* role can access this section. **Requests** are orders to withdraw funds from your Custody wallets. Only users with the *Owner* role can access this section. For step-by-step instructions, refer to [Withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet#withdraw-funds-from-your-custody-wallet). ### Key points [#key-points] * Regardless of where the funds are withdrawn — to a Merchant or Enterprise wallet, or to an external address — video verification is required for any withdrawal request. * Once submitted, a withdrawal request may take up to 48 hours to complete. ## Request list [#request-list] The following information is provided about each request: **ID** The unique system identifier of a request. *** **Custody wallet** The unique system identifier, type (`C` for Custody), and currency of a wallet. *** **Amount** The transfer amount, in the wallet currency. *** **Status** The current status of a request. Possible values: * **Created**: The withdrawal request was created, but video verification hasn't yet been passed. * **Approved**: The withdrawal request was approved by a Compliance officer. * **Declined**: The withdrawal request wasn't approved by a Compliance officer. *** **Created at** The date and time when a request was created. *** **Action** The buttons are available for the requests that haven't yet been reviewed by a Compliance officer. * **Cancel**: Click this button to cancel the request. * **Verification**: Click this button to proceed with video verification. **Custody wallets** are accounts with an additional level of security. Only users with the *Owner* role can access this section. ### Key points [#key-points] * Custody wallets can be denominated in cryptocurrencies: coins, stable coins, and tokens. Available currencies are specified in the system settings. * You can only create one Custody wallet per currency. * To withdraw funds from a Custody wallet, you must create a request, pass video verification, and receive approval from a Compliance officer. * Withdrawals from Custody wallets can be made to any external address as well as to Merchant or Enterprise wallets denominated in the same currency. * You can top up Custody wallets from your Merchant or Enterprise wallets. For Merchant wallets, conversion is possible. Enterprise wallets must be denominated in the same currency as the target Custody wallet. * Fees are applied for storing funds on Custody wallets. Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged on the first of each month and for each withdrawal from the Custody wallet. ## Wallet list [#wallet-list] On this page, you can view a list of all your Custody wallets created in the system. Click the **%** button above the table to view the applied commission tiers. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance / Available for withdrawal** The current total balance and the balance available for financial operations. The available balance is calculated as *Balance* – *Accumulated commission*. *** **Accumulated commission** The fee for storing the funds accumulated to date. This value is calculated daily, according to the tiers that you can see by clicking the **%** button above the wallet. The commission is charged on the first day of each month and when withdrawing funds. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **Created at** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **Funds** button to top up or withdraw funds. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, type (`C` for Custody), and status. * The wallet currency. * The total balance. * The balance available for withdrawal (calculated as *Balance – Accumulated commission*). * The accumulated commission. * The total balance in conversion to USD. * The date and time when the wallet was created. ### Wallet settings [#wallet-settings] In this section, you can view and manage the following wallet settings: **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. The list can be changed anytime. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#custody-wallets) * [How to top up or withdraw funds from your Custody wallet](../../how-tos/manage-your-assets/how-to-top-up-or-withdraw-funds-from-your-custody-wallet) On this page, you can view all swap and other balance operations related to your Swap wallets. The content of the page is divided into tabs: On this tab, you can view a history of swap operations between your Swap wallets. The following information is provided about each operation: **ID** The unique system identifier of a swap. This is a link to swap details. This value is generated automatically at the moment of swap creation and can’t be changed. *** **Status** The current status of a swap. Possible values: * **Success**: The swap has been successfully completed, balances of Swap wallets have been updated. * **Failed**: The swap hasn’t been completed due to some technical issues. *** **Wallet from** The identifier and currency of a debiting wallet. *** **Amount from** The swap amount, in the debiting wallet currency. *** **Wallet to** The identifier and currency of a crediting wallet. *** **Amount to** The swap amount, in the crediting wallet currency. *** **Pair** The currency pair. The first currency in the pair is the currency in which the swap amount was specified. *** **Rate** The exchange rate of the first currency in the pair to the second currency, valid at the moment of a swap operation. *** **Created** The date and time of swap creation. On this tab, you can view a history of swap-related transfers on your Swap wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The system identifier, type, label, and currency of a wallet to or from which the transfer was made. This is a link to wallet details. *** **Operation type** Possible values: * **Swap withdrawal**: The withdrawal of funds from a Swap wallet to an Enterprise or Merchant wallet. * **Swap top up**: The deposit of funds to a Swap wallet from an Enterprise or Merchant wallet. * **Swap charge**: The debiting of funds from a debiting Swap wallet. * **Swap enrolled**: The crediting of funds to a crediting Swap wallet. *** **Amount** The amount of a transfer without commissions, in the wallet currency. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Created** The date and time when a transaction was created. **Swaps** are exchange operations between your Swap wallets. For step-by-step instructions, refer to [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds). ### Key points [#key-points] * Swap operations are fast and convenient. * Swap operations are [off-chain](../../references/key-terms#off-chain-transaction), and hence don’t require [block confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Swap operations are possible only between your own Swap wallets denominated in different currencies. * You can exchange all [available currencies](../../references/currency-codes), including fiat, coins, and tokens. * Funds from your Swap wallets can be transferred to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, and vice versa. Refer to [Wallets](wallets) for more details. **Swap wallets** are your virtual wallets for swap operations. ### Key points [#key-points] * Swap wallets can be denominated either in crypto or in fiat currencies. * You can only create one wallet per currency. * Swap wallets aren’t linked to your [Enterprise](../../references/key-terms#enterprise-wallet) or [Merchant](../../references/key-terms#merchant-wallet) wallets, but you can top up your Swap wallets from your Enterprise or Merchant wallets. All balance operations are allowed only between wallets denominated in the same currency. For example, if you create a Swap wallet denominated in USD, you can top it up only from your Merchant wallet denominated in USD. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction), and hence require block [confirmations](../../references/key-terms#confirmation-block) and [blockchain fees](../../references/key-terms#blockchain-fee) for their processing. * Balance operations between Swap and Enterprise/Merchant wallets are displayed on the **Wallet management** > **Transfers** page. Swap operations between Swap wallets are available on the **Swaps** > **History** page and aren’t displayed on the **Wallet management** > **Transfers** page. ## Wallet list [#wallet-list] On this page, you can view a list of all your Swap wallets created in the system. The following information is provided about each wallet: **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Balance** The current balance available for financial operations. *** **Created** The date and time when a wallet was created in the system. *** **Action** In this column, you can click the **wallet icon** to top up or withdraw funds, and the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier, the date and time when a wallet was created in the system. * The wallet currency. * The current balance. The following content of the page is divided into tabs: On this tab, you can access and manage wallet settings. **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. On this tab, you can grant access to your wallet to other users: * Click **Invite user** to grant them access to the wallet. * Click the **bin icon** near the added user to revoke access. Mind that no user roles are applicable to Swap wallets: all added users are granted full access to balance and swap operations. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet#swap-wallets) * [How to swap funds](../../how-tos/manage-your-assets/how-to-swap-funds) [TRX staking](../../references/key-terms#staking) is a process of freezing funds for a certain period of time to get resources and additional profit. ### Key points [#key-points] * When staking, you can “exchange” your funds for resources, such as bandwidth or energy, which allow you to save on blockchain fees. Bandwidth is spent on TRX transfers and TRC-10 tokens, as well as partially on interacting with smart contracts. Energy is spent on interacting with smart contracts and transferring TRC-20 tokens. The resources are available immediately after staking and are replenished throughout the day. * When staked, the funds remain on your wallet but are locked and can’t be used for financial operations. * You can unstake funds at any time after staking, but keep in mind that the unstaking process takes 14 days on the blockchain. Until then your funds remain locked. Unstaking is limited to 32 pending transactions. * For each staked TRX, you receive one vote. You can give your votes to one or more [Super Representatives](../../references/key-terms#sr) to gain rewards for each voting round. The accumulated reward can be claimed and withdrawn to your TRX wallet once in 24 hours, with a 10% commission is deducted from the reward. You can re-assign your votes at any time. * Staking is only available for wallet *Owners*. ## General information [#general-information] In the upper part of the page, you can review the conditions of the TRX staking: * **Term**: The minimum period for which funds are blocked. * **Min amount of funds to stake**: The minimum allowed amount of TRX that can be staked. * **Commission from the reward**: The commission amount that will be deduced from the reward amount. The withdrawabale amount is calculated as follows: *Amount to withdraw – (Amount to withdraw × Transaction fee/100%)*. ## Wallets [#wallets] In this section, you can view your wallets denominated in TRX. The following information is provided about each wallet: **Wallet** The information about your TRX wallet: the wallet identifier, type (always `E` for Enterprise), label (if set), and total balance. *** **Accumulated reward** The reward from staking, which can be withdrawn. *** **Available / Total votes** The amount of votes. The **Available votes** are votes that haven’t yet been distributed among SRs[^1]. The **Total votes** is the sum of distributed and undistributed votes. *** **Actions** The action buttons: * **Withdraw reward**: Clicking this button opens the **Withdraw reward** popup where you can review withdrawal details such as a target wallet, withdrawal amount, transaction fee, and so on. Mind that reward claiming is available only once in 24 hours. The button is inactive if the **Accumulated rewards** is 0 (zero) or the reward was claimed less than 24 hours ago. * **Get votes**: Clicking this button leads you to the **Resources** tab of the **Wallet details** where you can stake TRX to get votes. [^1]: Super Representatives. For more information, see [#sr](../../references/key-terms#sr "mention") **Callbacks** are `POST`-requests sent to your callback URL, to notify about transaction-related events in the system. For more information, see [Callback](../../references/key-terms#callback) ## Callback list [#callback-list] On this page, you can view a list of callbacks. The following information is provided about each callback: **ID** The unique system identifier of a callback. This is a link to callback details. *** **Time sent** The date and time when a callback was sent. *** **Type** The callback type. Possible values: * **Confirmation**: The transfer has received a required number of [block confirmations](../../references/key-terms#confirmation-block). * **Fail**: The transfer failed. * **No transfer**: The deposit has expired or the payout wasn't approved, no transfer was created. * **Request rejection**: The payout requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — has failed to receive confirmation from the *Owner* within the specified timeframe or was manually cancelled by a user with proper access rights. * **Block**: The deposit was blocked by an AML provider, the transfer was canceled. * **Cancel**: The payout was blocked by an AML provider, the transfer was canceled. * **User confirmation**: The transfer has received a number of [block confirmations](../../references/key-terms#confirmation-block) specified by a client to receive an additional callback. * **Manual**: The callback was resent manually. *** **URL** The callback URL specified when creating a deposit or payout. *** **Status** The current status of a callback. Possible values: * **New**: The callback was created but hasn't yet been sent. * **In progress**: The callback has been sent and awaits a response. * **Failed**: The callback was sent and a negative response from the client server was received. * **Sent**: The callback was sent and a response with the HTTP code `200` from the client server was received. *** **Attempts** The number of attempts to send a callback. *** **Transfer ID** The unique system identifier of a related transfer. This is a link to transfer details. *** **Action** In this column, you can click the **Resend** button to resend the callback. ## Callback details [#callback-details] To access callback details, click a callback **ID** the callback list. In the upper part of the page, you can find essential information about the callback — click the **chevron icon** to expand it: * The callback identifier and status. * The callback type. * The date and time when sent callback was sent. * The number of attempts to send the callback. * The identifier of a related transfer. * The callback URL along with the copy button. The information below is divided into tabs: On this tab, you can see the JSON payload of a callback. On this tab, you can see a response received (if any) from a client server. **Deposits** are invoices that you create to receive payments to your wallets. ### Key points [#key-points] * The system accepts payments only in cryptocurrencies. Fiat payments to [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies can be made via the B2BINPAY Finance department. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Each [on-chain](../../references/key-terms#on-chain-transaction) transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a deposit, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. The fee amount is selected by a payer. * Information about new transfers associated with a deposit can be sent to your system via a [callback](../../references/key-terms#callback). * Each deposit can be assigned a special identifier by which the related transactions can be tracked in an external system. * For each deposit, a payment page is automatically generated. It can be useful to send payment details to your payers. The exchange rate on the payment page is frozen for 15 minutes after its creation. * For Merchant wallets, it’s possible to set time limits to specify the sum or expiration time for a deposit as well as payment limits to address possible payment amount variations due to rate changes. ## Deposit list [#deposit-list] On this page, you can view a list of all deposits to your wallets. The following information is provided about each deposit: **ID** The unique system identifier of a deposit. This is a link to deposit details. This value is generated automatically at the moment of deposit creation and can’t be changed. *** **Created** The date and time when a deposit was created. *** **Updated** The date and time when the deposit status was last updated or payment received. *** **Wallet type** The type of a wallet to which deposit-related payments are made. *** **Wallet** The label or system identifier of a wallet to which deposit-related payments are made. This is a link to wallet details. *** **Address** The deposit address. This is a link to the explorer. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the address generated depending on the payment currency selected by the payer and can’t be changed. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. For deposits to Merchant wallets, if the payment currency wasn’t specified, this field is empty until a payer selects the payment currency. After that, this field is filled in with the payment currency selected by the payer and can’t be changed. *** **Label** The tag or name assigned to a deposit for easier locating it in the system. This value is set when creating a deposit and can be changed anytime. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. This value is set when creating a deposit and can be changed anytime. *** **Status** *Available only for deposits to Merchant wallets.* The deposits to Enterprise wallets are always assigned the *Invoice* status. The current deposit status. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Requested amount** The requested amount, in the wallet currency (only for deposits with indicated amounts). This value is set when creating a deposit and can be changed anytime. *** **Requested rate** If the payment currency differs from the wallet currency, this is the current exchange rate of a payment currency to the wallet currency. This value is updated with each payment received or the deposit status updated. If the deposit currency wasn’t specified, this field is empty until a payer selects the payment currency. *** **Paid amount** The total amount of funds that have already been received to the deposit address, in the wallet currency. *** **Enrolled amount** The total amount credited, in the wallet currency. This value is calculated as *Paid amount – Total commission amount*. *** **Expired at** The date and time of deposit expiration (only for Merchant deposit with indicated expiration time). ## Deposit details [#deposit-details] To access deposit details, click a deposit **ID** in the deposit list. In the upper part of the page, you can find essential information about the deposit — click the **chevron icon** to expand it: * The deposit identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The deposit currency (if defined). * The deposit address (if the payment currency is specified). * The link to a payment page. * The paid amount in the wallet currency. * The enrolled amount in the wallet currency (*Paid amount – Total commission amount*). The information below is divided into tabs: On this tab, you can access and change deposit settings. The content on this tab differs for Enterprise and Merchant deposits. **Currency** The payment currency. Available only for deposits to Merchant wallets, if the payment currency wasn’t specified. *** **Status** The current deposit status. Available only for deposits to Merchant wallets. Possible values: * **Invoice**: The deposit has just been created or hasn’t yet been paid in full (for deposits with indicated amounts). * **Paid**: The deposit with the indicated amount was paid in full. * **Canceled**: The deposit was canceled by a user or expired with no payments received. A deposit in any status can be canceled by a user. * **Unresolved**: The deposit requires actions from the user. This status is possible in the following cases: * If the amount of an incoming transfer is greater than the deposit amount. * If a payment is received after the specified expiration date. * If a payment is received for a deposit assigned the *Paid* or *Canceled* status. *** **Limits** *Available for deposits to Merchant wallets only.* The time and payment limits. **Requested amount in wallet currency** The deposit amount, in the wallet currency. *** **Delta** *Applicable for deposits to Merchant wallets with indicated amounts.* The payment delta, in the wallet currency. The delta can be useful to address possible rate changes. For example, you create a deposit for 100 USDT with the expiration time of 10 minutes without specifying the payment currency. This means that the payer can pay in any currency within 10 minutes. But the rate of the currency pair may change within the specified time. In order to minimize your risks, you can set the delta value, for example of 5 USDT, which means that you expect payment from 95 USDT to 105 USDT (depending on the rate) within 10 minutes. The delta can be also useful when the payment currency is the same as the wallet currency. For example, you create a deposit with the indicated amount of 0.1 BTC, and the payer sends 0.1 BTC minus the commission, and thus you don’t receive the full amount of the deposit and the deposit can’t be transferred to the *Paid* status. To avoid such situations, enter the delta value. Mind that the delta must be less than the requested amount. *** **Requested amount in payment currency** The deposit amount, in the payment currency. If the deposit currency wasn’t specified, this field is unavailable until a payer selects the payment currency. *** **Expired at** The date and time of the deposit expiration. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of a payment currency to the wallet currency. If the deposit currency wasn’t specified, this is the exchange rate to a base currency (USD). The exchange rates are automatically updated. Click the **refresh icon** to see the current value. **Advanced options** Additional deposit settings. **Label** The tag or name assigned to a deposit for easier locating it in the system. *** **Tracking ID** The user-provided identifier assigned to a deposit for easier locating related payments in external systems. *** **Callback URL** The URL for callback notifications on new payments. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field received. *** **Payment page URL** The link that is displayed as a button on the payment page. *** **Payment page button name** The custom name of a button displayed on the payment page. On this tab, you can find a list of payments to your wallet associated with the deposit. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Currency** The payment currency. On this tab, you can view the deposit history. **Created** The date and time of an action. **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. **Reason** The action type. Possible values: * **Created**: The deposit has been created. * **Changed**: The deposit has been changed. * **Deleted**: The deposit has been deleted. **Comment** The description of the action. **Field name** The field that has been changed as a result of the action. **Old value** The previous state of the field. **Actual value** The new state of the field. **See also:** * [How to create a deposit](../../how-tos/manage-your-assets/how-to-create-a-deposit) **Events** are system notifications that require your attention or action. Some actions can only be performed by users with the *Owner* and *Admin* roles. ## Event list [#event-list] On this page, you can find a list of all events logged in the system. The number of new notifications is displayed on the counter near the **Events** menu item. The following information is provided about each event: **ID** The unique system identifier of an event. *** **Created** The date and time when an event was logged in the system. *** **Updated** The date and time when an event was last updated. *** **Type** The event type. Refer to the **Event types** section below for details. *** **Operation ID** For events related to deposits or payouts, this is the unique operation identifier in the system. This is a link to deposit or payout details. *** **Action** The action button(s) applicable for this event type. ## Event types [#event-types] In the table below, you can find descriptions of all system events. [^1]: A notification sent to a user’s callback URL when a new transaction occurs on the blockchain. For more information, see [#callback](../../references/key-terms#callback "mention") [^2]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^3]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../../references/key-terms#parent-wallet "mention") [^4]: A user-created token in certain blockchains. For more details, see [#custom-token](../../references/key-terms#custom-token "mention") **Payout** are payments, withdrawals, and transfers made from your wallets. ### Key points [#key-points] * The system supports payouts in crypto currencies. For [Merchant wallets](../../references/key-terms#merchant-wallet) denominated in fiat currencies, the system supports [Bank withdrawal](../../references/key-terms#bank-withdrawal) in fiat currencies with various options: one-time withdrawals and regular withdrawals of a fixed or floating amount. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the payment currency must always match the wallet currency. For Merchant wallets, the payment currency may differ from the wallet currency. * Payouts involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Payouts between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. When creating a payout, you can overwrite this setting by specifying the *Required block confirmations* value. In this case, the payment is assigned the *Confirmed* status once the specified number is achieved. * The processing speed of a transaction on the blockchain depends on the [blockchain fee](../../references/key-terms#blockchain-fee) amount. You can choose the fee amount when creating a payout. * Information about new transfers associated with a payout can be sent to your system via a [callback](../../references/key-terms#callback). * Each payout can be assigned a special identifier by which the related transactions can be tracked in an external system. * You can save frequently used addresses to the Address book to save up time when creating regular payouts. ## Payout list [#payout-list] On this page, you can view a list of all payout from your wallets. The following information is provided about each payout: **ID** The unique system identifier of a payout. This is a link to payout details. This value is generated automatically at the moment of payout creation and can’t be changed. *** **Created** The date and time when a payout was created. *** **Label** The tag or name assigned to a payout for easier locating it in the system. This value is set when creating a payout and can be changed anytime. *** **Wallet type** The type of a wallet from which the payout was made. *** **Wallet** The label or system identifier of a wallet from which the payout was made. This is a link to wallet details. *** **Receiver** The blockchain address (abridged) of a receiver’s wallet. This is a link to the explorer. *** **Receiver (full)** The blockchain address (full) of a receiver’s wallet. This is a link to the explorer. *** **Status** The current payout status. Possible values: * **Waiting for approval**: For a payout created by a user with the *Withdrawal with approval* role: the payout was created and awaits the approval. * **Approved**: The payout was approved. * **Canceled**: The payout was canceled. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. This value is set when creating a payout and can be changed anytime. *** **Amount** The payout amount, in the payment currency. *** **Charged amount** The payout amount, in the wallet currency, including commissions charged. *** **Updated** The date and time when the payout status was last updated. ## Payout details [#payout-details] To access payout details, click a payout **ID** in the payout list. In the upper part of the page, you can find essential information about the payout — click the **chevron icon** to expand it: * The payout identifier, label (if set), and current status. * The information about your wallet: the wallet identifier, label (if set), type (`E` for Enterprise and `M` for Merchant), and current balance. * The payment currency. * The paid amount in the payment currency. * The total commission amount charged for payout processing. * The destination address. The information below is divided into tabs: On this tab, you can access and change payout settings. **Label** The tag or name assigned to a payout for easier locating it in the system. *** **Tracking ID** The unique user-provided identifier assigned to a payout for easier locating it in external systems. *** **Callback URL** The URL for callback notifications on new transactions. *** **Required block confirmations for callback** The number of confirmations needed to receive an additional callback. If this field is not empty, two callbacks are sent: upon receiving the number of confirmations specified here and upon receiving the number of confirmations specified in the system settings. The corresponding transaction is assigned the *Confirmed* status as soon as the number of confirmations specified in this field is received. *** **Receiver** The receiver type (natural or legal person) and name. *** **Address** The receiver’s address, as defined by postal services. On this tab, you can find a list of transactions associated with the payout. **ID** The unique system identifier of a transfer. This is a link to transfer details. *** **Created** The date and time when a transaction was received by B2BINPAY. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Amount** The transaction amount, in the payment currency. *** **Amount target** The transaction amount, in the wallet currency. *** **Rate target** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Currency** The payment currency. On this tab, you can view the payout history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The payout has been created. * **Changed**: The payout has been changed. * **Deleted**: The payout has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. **See also:** * [How to create a payout](../../how-tos/manage-your-assets/how-to-create-a-payout) * [How to create a bank withdrawal](../../how-tos/manage-your-assets/how-to-create-a-bank-withdrawal) * [How to create an internal transfer](../../how-tos/manage-your-assets/how-to-create-an-internal-transfer) * [How to select the optimal blockchain fee](../../how-tos/manage-your-assets/how-to-select-the-optimal-blockchain-fee) * [How to speed up your payout by changing the blockchain fee](../../how-tos/manage-your-assets/how-to-speed-up-your-payout-by-changing-the-blockchain-fee) **Transfers** are incoming or outgoing transactions made to or from your wallets, such as deposits, payouts, activation fees, payments for custom tokens processing, and so on. For a full list of possible types, refer to [Transfer types](../../references/transfer-types). ### Key points [#key-points] * The list shows all transactions, including canceled, failed, and others. * In this section, you can’t create a new transaction. * For [Enterprise wallets](../../references/key-terms#enterprise-wallet), the transaction currency always matches the wallet currency. For [Merchant wallets](../../references/key-terms#merchant-wallet), the transaction currency may differ from the wallet currency. * Transactions involving Enterprise wallets are always [on-chain](../../references/key-terms#on-chain-transaction). Some transactions between B2BINPAY Merchant wallets can be [off-chain](../../references/key-terms#off-chain-transaction). * Each on-chain transaction requires a certain number of blockchain [confirmations](../../references/key-terms#confirmation-block). This number is specified for each currency in the B2BINPAY Back Office. Until the required number of confirmations is received, the transfer is assigned the *Unconfirmed* status. * Each deposit passes the [AML](../../references/key-terms#aml) check. The check is performed on the side of an AML provider connected using the B2BINPAY Back Office. If during the AML check a payment is considered suspicious (red), it’s assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. Additionally, [custom AML verification](../../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) can be enabled for incoming transfers. ## Transfer list [#transfer-list] On this page, you can find a list of all transfers made to or from your wallets. The following information is provided about each transfer: **ID** The unique system identifier of a transfer. This is a link to transfer details. This value is generated automatically at the moment of transfer creation and can’t be changed. *** **Created** The date and time when a transfer was created. *** **Wallet type** The type of a wallet to or from which the transfer was made. *** **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **AML risk** The status of built-in AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Custom AML risk** If enabled, the status of custom AML verification of an incoming transfer. Possible values: * **Checked**: The transfer has successfully passed the AML check. * **Pending**: The AML check is in progress. * **Failed**: The AML check has failed, the transfer has been marked as red. * **Unavailable**: The AML check is unavailable for this transfer type. *** **Status** The current status of a transfer. Possible values: * **Canceled**: The transfer was canceled due to security reasons or a transfer amount being too small. * **Blocked**: The transfer was considered suspicious during the AML check and is temporarily blocked until further Compliance verification. * **Failed**: The transfer has failed on the blockchain. * **Created**: The transfer has been created and is currently in the queue for processing, the status will be changed soon. * **Unconfirmed**: The transfer hasn’t yet received the required number of block confirmations. * **Confirmed**: The required number of block confirmations has been received and the transfer is completed. *** **Wallet** The label or system identifier of a wallet to or from which the transfer was made. This is a link to wallet details. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The amount of a transfer, in the payment currency. For deposits, this is the deposit amount with the B2BINPAY commission included. For payouts, this is the amount that will be credited to a receiver’s wallet. *** **Commission** The fee charged by B2BINPAY for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for processing an on-chain transaction, in the payment currency. *** **Confirmations** The current number of received confirmations on the blockchain. *** **Amount target** The total amount of a transfer, in the wallet currency. *** **Target currency** The wallet currency. *** **Rate** If the payment currency differs from the wallet currency, this is the exchange rate of the payment currency to the wallet currency, valid at the moment of transaction execution. If the payment currency is the same as the wallet currency, this value is equal to `1`. *** **Operation ID** For deposits and payouts, this is the unique operation identifier in the system. This is a link to operation details. ## Transfer details [#transfer-details] To access transfer details, click a **Transfer ID** in the Transfer list. In the upper part of the page, you can find the essential information about the transfer: * The transfer identifier, current status, and AML check result. * The information about your wallet to or from which the transfer was made: the wallet identifier, type (`E` for Enterprise and `M` for Merchant), label (if set), and current balance. Below you can see the transfer details: **Type** The transfer purpose. Refer to [Transfer types](../../references/transfer-types) for more details. *** **Created at** The date and time when a transfer was created. *** **Updated at** The date and time when a transfer status was last updated. *** **TXID** The blockchain transaction identifier, the same as the transaction hash. This is a link to the explorer. *** **Currency** The payment currency. For Enterprise wallets, always the same as the wallet currency. For Merchant wallets, may differ from the wallet currency. *** **Amount** The total amount of a transfer, in the payment currency. *** **Amount target** The total amount of a transfer, in the wallet currency. This field is only visible if the payment currency differs from the wallet currency. *** **Commission** The B2BINPAY fee charged for transaction processing, in the payment currency. *** **Target commission** The fee charged by B2BINPAY for transaction processing, in the wallet currency. *** **Blockchain fee** The blockchain fee charged for transaction processing, in the payment currency. Applicable only for on-chain transactions. *** **Confirmations** The current number of received confirmations on the blockchain. Applicable only for on-chain transactions. *** **Rate** The exchange rate of the payment currency to the wallet currency, valid at the moment of the transaction execution. This field is only visible if the payment currency differs from the wallet currency. *** **Callback** The callback status. Applicable only for deposits and payouts. Possible values: * **Not needed**: The *Confirmations needed* field wasn’t specified for an associated deposit or payout. * **Sent**: The callback is sent. * **Not sent**: The callback hasn’t yet been sent (not enough confirmations received yet). *** **Operation ID** The unique operation identifier in the system. Applicable only for deposits and payouts. This is a link to operation details. *** **Description** Any comment for an operation made via the B2BINPAY Back Office. *** **Replace by fee** This option is available for payouts that got stuck on the blockchain due to a low fee amount. It allows you to change the blockchain fee amount. As a result, the existing payout will be assigned the *Failed* status, and a new payout will be created, with the new fee value. **Wallets** are your B2BINPAY accounts denominated either in crypto or in fiat currency. ### Key points [#key-points] * B2BINPAY offers two types of wallets: [Enterprise](../../references/key-terms#enterprise-wallet) and [Merchant](../../references/key-terms#merchant-wallet). * Enterprise wallets can be denominated in any [crypto currency](../../references/currency-codes) supported by B2BINPAY. Fiat currencies aren’t supported for the Enterprise wallets. Such wallets have their own addresses. All transactions involving Enterprise wallets are executed [on-chain](../../references/key-terms#on-chain-transaction). * Merchant wallets are virtual wallets. These wallets don’t have their own addresses; instead, a deposit address is generated for each deposit made to such a wallet. The Merchant wallets can be denominated in fiat currencies and cryptocurrencies supported for Merchant wallets. Transactions between B2BINPAY Merchant wallets can be executed [off-chain](../../references/key-terms#off-chain-transaction). You can withdraw fiat funds from your fiat Merchant wallets using a [Bank withdrawal](../../references/key-terms#bank-withdrawal). * Internal transfers are possible between Merchant wallets denominated in the same currency and belonging to the same *Owner*. The internal transfers are executed off-chain, no commission is charged. * The wallet currency is selected during the wallet creation and can’t be changed afterwards. * You can create numerous Enterprise and Merchant wallets. * You can grant access to your wallets to other users so that they can perform balance operations depending on assigned roles. * [Activation fee](../../references/key-terms#activation-fee) is required for Enterprise wallets denominated in ETH, XRP, XLM, or BNB currencies. You can activate such wallets by depositing funds from your Merchant wallets. * Wallets denominated in tokens require [parent wallets](../../references/key-terms#parent-wallet). The parent wallet must be an Enterprise wallet created in the same blockchain as the token. Commissions for token processing are deducted from the parent wallet. Each parent wallet can serve as the parent for a single token wallet, it’s not possible to link two token wallets to the same parent wallet. * Enterprise wallets in the ETH and BNB-BSC blockchains can be duplicated. For example, for your wallet in ETH, an identical wallet and contract in BNB-BSC can be created. This feature can be useful if clients mistakenly send funds to the wrong blockchain. Each wallet can only be duplicated once. * You can stake funds on TRX wallets to gain TRON blockchain resources and save on blockchain fees. ## Wallets list [#wallets-list] On this page, you can view a list of all your Enterprise and Merchant wallets created in the system. The following information is provided about each wallet: **Currency** The wallet currency. This value was selected when creating a wallet and can’t be changed. *** **Label** The tag or name assigned to a wallet for easier locating it in the system. *** **ID** The unique system identifier of a wallet. This is a link to wallet details. This value was generated automatically when creating a wallet and can’t be changed. *** **Wallet type** The type of a wallet: Enterprise or Merchant. This value was selected when creating a wallet and can’t be changed. *** **Balance** The balance available for financial operations. *** **Pending** The sum of all deposit- and payout-related transactions that haven’t yet received the required number of confirmation blocks or passed AML check. This value is positive for incoming and negative for outgoing transactions. This balance can’t currently be used for financial operations. *** **Status** The current status of a wallet. Possible values: * **Active**: The wallet has been activated (if required) and can be used. * **In progress**: The wallet is now being registered in the system or requires the activation and currently unavailable. * **Not active**: The wallet hasn’t been activated due to some technical or blockchain issues. *** **Action** In this column, you can click the **gear icon** to navigate to the Wallet details page. ## Wallet details [#wallet-details] To access wallet details, click a wallet **ID** or the **gear icon** in the wallet list. In the upper part of the page, you can find essential information about your wallet — click the **chevron icon** to expand it: * The wallet identifier and status. * The wallet currency. * For wallets denominated in tokens, the parent wallet. * The available balance. * The pending balance. * For Enterprise wallets, the wallet address; for wallets denominated in XRP, the address type is additionally available for selection: * `Address`: The deposit address; the destination tag should be additionally specified for sending funds. * `X-address`: The deposit address with the destination tag included in it. No need to specify the destination tag additionally. The following content of the page is divided into tabs: On this tab, you can access and change wallet settings. The content on this tab differs for Enterprise and Merchant wallets. **Label** The tag or name assigned to a wallet for easier locating it in the system. This value is set when creating a wallet and can be changed anytime. *** **Minimum transfer amount** *For Enterprise wallets only.* The minimum amount of the incoming transfer, in the wallet currency. Payments below the specified amount are automatically rejected. This can be useful if the transaction blockchain fee exceeds the transaction amount. In this case, you can see a new transfer with the *Canceled* status on the **Wallet management** > **Transfers** page; the [callback](../../references/key-terms#callback) isn’t sent. You will also receive a notification on the **Events** page, where you can confirm and accept such transfers manually. *** **Notification addresses** The comma-separated list of email addresses to which notifications about new transactions are sent. *** **Customer support emails** The comma-separated list of your customer support email addresses. These emails are displayed on the Payment page, so that your clients and payers can send help requests. It's recommended to specify this value, as if it isn't specified, such requests will be sent to B2BINPAY customer support which may result in increased processing time. *** **Site URL** *For Merchant wallets only.* The link to your landing page or any other resources. *** **Regular withdrawals** *For Merchant wallets denominated in fiat currencies only.* In this section, you can create a one-time or regular bank withdrawal. *** **Delete wallet** This section is available only for the wallet *Owner*. Here you can delete your wallet. Mind that only wallets with zero balances can be deleted. For wallets with non-zero balances, you first need to transfer funds to other wallets. *** **Duplication** *For Enterprise wallets in the ETH, BNB-BSC, MATIC, and AVAX blockchains only.* This option allows you to copy your wallet blockchain address and contract to another blockchain. This way you can prevent sending funds to a wrong blockchain by mistake on behalf of a sender. You can duplicate each wallet only once. *For Enterprise wallets denominated in TRX only.* On this tab, you can stake and unstake TRX, and overview your resources. *For Enterprise wallets denominated in TRX only.* On this tab, you can get votes for staked funds as well as distribute them among SRs[^1] to further gain rewards. On this tab, you can view a wallet history. **Created** The date and time of an action. *** **Initiator** The performer of an action. Possible values: * **System**: System actions, such as wallet creation or status changing. * **API**: Actions performed via the API. * **Email address**: Actions performed by a specific user via the user interface. *** **Reason** The action type. Possible values: * **Created**: The wallet has been created. * **Changed**: The wallet has been changed. * **Deleted**: The wallet has been deleted. *** **Comment** The description of the action. *** **Field name** The field that has been changed as a result of the action. *** **Old value** The previous state of the field. *** **Actual value** The new state of the field. On this tab, you can whitelist addresses, so that payouts sent to these addresses don't require approvals. See [How to whitelist a payout address](../../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for more details. On this tab, you can limit withdrawal amounts. Withdrawals with the amounts exceeding the specified values will require an approval, regardless of user roles. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to **Approval request**, but the approver must enter the *Authorization 2FA for operations* code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. For each threshold, you can specify how many approvals are required and which user roles and/or specific users act as *Approvers*. For example, you can set fewer approvals for smaller payouts and more approvals for payouts with greater amounts. See [How to set withdrawal thresholds](../../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) for more details. On this tab, you can grant other users access to your wallet and manage permissions. A checkmark in the **Approver** column indicates that the user was added as an *Approver* on the **Thresholds** tab. See [How to grant access to your wallet](../../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) and [How to restrict access to your wallet](../../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) for more details on managing wallet access. **See also:** * [How to create a wallet](../../how-tos/manage-your-wallets/how-to-create-a-wallet) * [How to generate a report on wallet balances](../../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) [^1]: Super Representatives. For more details: [#sr](../../references/key-terms#sr "mention") Explore the interface basics, create your first wallet, and set up essential protection Explore the interface basics, create your first wallet, and set up essential protection Dive deeper in the product Web UI, features, and business logic behind it Dive deeper in the product Web UI, features, and business logic behind it Follow the step-by-step tutorials illustrating solutions to the most common tasks Follow the step-by-step tutorials illustrating solutions to the most common tasks Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses Get acquainted with key terms and catalogs of values which are found here and there Get acquainted with key terms and catalogs of values which are found here and there Identify and address common issues quickly and effectively with our guides Identify and address common issues quickly and effectively with our guides ## July 31, 2026 [#july-31-2026] ### New features [#new-features] #### Admin UI [#admin-ui] ##### Fee level selection for AML withdrawals [#fee-level-selection-for-aml-withdrawals] When withdrawing funds from a blocked transfer (**Transfer → Blocked → AML Withdrawal**), you now choose the blockchain fee level — **Recommended**, **Low**, or **Custom** — and see the fee amount with its fiat equivalent before confirming. Previously, only the withdrawal address could be set, and refunds sent with a low fee were sometimes rejected by the network. *** ### Improvements [#improvements] #### Admin UI [#admin-ui-1] ##### Safer forms and smoother sign-in [#safer-forms-and-smoother-sign-in] The Admin UI adopts several usability behaviors from the client interface. After signing in, you return to the page you originally tried to open instead of the home page. Create and edit forms — including wallets, deposits, notifications, transfers, refunds, and user creation — now warn about unsaved changes before you leave the page, and the cursor is placed in the first field automatically. *** ### Resolved issues [#resolved-issues] #### Client UI [#client-ui] * Fixed the read-only **Secret** field in callback settings accepting pasted text; the control for viewing the secret now keeps a stable size instead of expanding with scrollbars. ## July 29, 2026 [#july-29-2026] ### Improvements [#improvements-1] #### Admin UI [#admin-ui-2] ##### Faster commissions page [#faster-commissions-page] The default commissions page now loads faster and no longer creates noticeable database load on every visit. #### Client UI [#client-ui-1] ##### Toncoin becomes Gram [#toncoin-becomes-gram] Following the rebranding of The Open Network's native coin, **Toncoin (TON)** is renamed **Gram (GRAM)**, and the network's tokens follow the same pattern — for example, **USDT-TON** becomes **USDT-GRAM**. Only the currency names and tickers change — balances, wallets, and transfers are not affected. *** ### Resolved issues [#resolved-issues-1] #### Admin UI [#admin-ui-3] * Fixed the **Company**, **Wallet**, **Currency**, and **Blockchain wallet** filters on the finance transfers page showing *Error* for administrators with the **Finance read only** role. #### Client UI [#client-ui-2] * Fixed **Approve** and **Cancel** actions in **Events** staying available for payout approval requests whose auto-cancellation time had already passed. * Fixed expired payout approval requests being reactivated when the auto-cancellation timeout was increased — the deadline is now set when the request is created. * Fixed *Request Rejection* callbacks being sent with the *Unknown* type. * Fixed the email search in **Wallets → Thresholds** returning unfiltered results and breaking words across lines in the suggestion list. ## July 24, 2026 [#july-24-2026] ### New features [#new-features-1] #### Client UI [#client-ui-3] ##### Commissions tab with your full fee schedule [#commissions-tab-with-your-full-fee-schedule] Account owners now have a **Commissions** tab showing the commission ladder at a glance — your current turnover, commission tier, and rate — along with the full list of tiers, minimum blockchain fees for each network, and bank fees for deposits and payouts. *** ### Improvements [#improvements-2] #### Admin UI [#admin-ui-4] ##### Faster transfer lists [#faster-transfer-lists] Opening a client's list of transfers now takes under a second instead of tens of seconds, and pending AML compliance checks no longer create noticeable background load. ##### Neutral messages for unexpected server errors [#neutral-messages-for-unexpected-server-errors] When an unexpected server error occurs, the system returns a neutral message with a short error ID instead of internal technical details. Share this ID with support to have the issue traced quickly. *** ### Resolved issues [#resolved-issues-2] #### Admin UI [#admin-ui-5] * Fixed spurious *Can not lock transfer in node* incidents raised when a small deposit was canceled on networks without transfer-locking support — Solana, EVM-based networks, Tron, and Algorand. * Fixed Solana multi-address collections being rejected as a whole batch with an *InvalidPayoutParameters* error when the number of addresses exceeded node limits — addresses are now split automatically to fit. * Fixed transportation transfers getting stuck indefinitely when an address received more funds than expected during collection — extra incoming funds no longer block confirming transfers already completed on the blockchain. ## July 17, 2026 [#july-17-2026] ### New features [#new-features-2] #### Admin UI [#admin-ui-6] ##### Changed User and Legal Entity columns in Action Requests [#changed-user-and-legal-entity-columns-in-action-requests] The **Action Requests** list now shows a **Changed User** column — the account a request applies changes to — and a **Legal Entity Name** column, each with its own filter. The legal entity name also appears as a separate line in the request details, and the list can now be exported. #### Client UI [#client-ui-4] ##### Reworked approval flow for withdrawals [#reworked-approval-flow-for-withdrawals] Withdrawal approval requests for Enterprise and Merchant transfers in the same currency no longer expire after 15 minutes — the request stays valid until it is approved or rejected. For conversion payouts, the request now shows a countdown timer to automatic cancellation, visible both in the client interface and in the Admin UI. ##### Automatic callback on Callback URL changes [#automatic-callback-on-callback-url-changes] When you set or change the **Callback URL** of a deposit or withdrawal, a callback with the operation's current status is now sent automatically — no need to contact support to have it re-sent. Support staff can also update a deposit's **Callback URL** on your behalf. ##### Smoother sign-up, 2FA setup, and wallet access [#smoother-sign-up-2fa-setup-and-wallet-access] This release bundles several usability refinements. **One-time password entry at sign-up.** During registration, you now set your password once, after confirming your email address, instead of entering it several times. **Clear 2FA names.** Two-factor authentication entries in your authenticator app are now clearly named — *B2BinPay Auth 2FA* and *B2BinPay Ops 2FA* — and include your email address, so entries for different accounts are easy to tell apart. **Clearer error messages.** Messages now state exactly what to do — for example, *B2BinPay Ops 2FA must be enabled to process payouts* or *Accesses to wallets cannot be granted until user is activated*. **Wallet access for API users right after activation.** An API user can now be added to wallets as soon as it is activated, without having to sign in first. **Tidier lists.** The **Regular Withdrawal** column is hidden when bank withdrawals are not available, and identifiers now use a unified format — for example, *Wallet #888*. *** ### Improvements [#improvements-3] #### Admin UI [#admin-ui-7] ##### Faster lists and dashboard statistics [#faster-lists-and-dashboard-statistics] Heavily used list pages — blockchain wallets, addresses, deposits, and transfers — now load faster, and so do the deposits and payouts statistics on the dashboard. *** ### Resolved issues [#resolved-issues-3] #### Admin UI [#admin-ui-8] * Fixed a false *Collected amount mismatch* error: unrelated incoming funds on an address are now included in the expected collection amount, so transportation transfers no longer get stuck in *Need review*. * Fixed an AML check failure for withdrawals linked to transfers without an associated wallet, which prevented such withdrawals from being processed. * Fixed an issue where conversion payouts could expire automatically regardless of their status. ## July 10, 2026 [#july-10-2026] ### New features [#new-features-3] #### Admin UI [#admin-ui-9] ##### Invited by search matches legal entity names [#invited-by-search-matches-legal-entity-names] The **Invited by** search in the **Partner Program** now also matches legal entity names, so legal entities no longer drop out of the search results. ##### Role-aware data in lists and detail pages [#role-aware-data-in-lists-and-detail-pages] Lists and detail pages across the Admin UI now show data according to your role and permissions, so each administrator sees exactly what their access level allows. #### Client UI [#client-ui-5] ##### Sign-in opens the production environment [#sign-in-opens-the-production-environment] After you pass **KYB** verification, an interactive sign-in always opens the production environment instead of Sandbox. If you sign out from Sandbox and have several legal entities, the one you last opened is selected. ##### Inactive API users hidden from wallet access [#inactive-api-users-hidden-from-wallet-access] Wallet access rights now show only active **API users**. For a user whose API access is not yet activated, the **API access → Wallets** tab shows an empty list. ##### Refreshed interface visuals and 2FA setup [#refreshed-interface-visuals-and-2fa-setup] The interface gets a refreshed look aligned with the latest design system: dialog overlays are lighter in the dark theme, connecting **Google Authenticator** for two-factor authentication follows a new flow with the confirmation code entered directly in the dialog, and the **How it works** screens in **Staking** and **Wallets** feature refreshed, theme-aware illustrations. *** ### Improvements [#improvements-4] #### Client UI [#client-ui-6] ##### Smoother actions in the Events list [#smoother-actions-in-the-events-list] The **Actions** column in **Events** now keeps a stable width, so buttons no longer shift as you work. While an action is in progress, a spinner replaces the button, and repeated or conflicting actions are blocked; if an action fails, the row returns to its previous state. *** ### Resolved issues [#resolved-issues-4] #### Admin UI [#admin-ui-10] * Fixed transportation transfers being confirmed without verifying the collected amount against the deposits actually received on the node — a mismatch now raises an incident instead of silently overstating the **Locked in node** balance and causing false *insufficient funds* errors later. #### Client UI [#client-ui-7] * Fixed the **Apply** button in the date and time picker not appearing disabled when it was inactive. ## July 2, 2026 [#july-2-2026] ### New features [#new-features-4] #### Admin UI [#admin-ui-11] ##### Read-only admin pages for orders, payouts, and wallets [#read-only-admin-pages-for-orders-payouts-and-wallets] The Admin UI gains new read-only pages: **Orders** and **Payouts** under **Operations**, and **Blockchain Wallets**, **Global Wallets Balance History**, and **Global Wallets Staking** under **Wallets**. The **Payouts** and **Swap Wallets** sections are now available in read-only mode too — fuller visibility into operations and balances without changing any data. ##### USD volumes for transfers in Dealing [#usd-volumes-for-transfers-in-dealing] In **Trading → Orders**, transfers now carry the same USD-normalized base and quote volumes already shown for swaps, removing the manual rate calculations previously needed for some Merchant wallets. #### Client UI [#client-ui-8] ##### Initial deposit link for duplicated blockchain deposits [#initial-deposit-link-for-duplicated-blockchain-deposits] When a deposit sent on the wrong network is automatically re-created on the correct network, the resulting **Duplicated Blockchain deposit** event now links directly to the original deposit. Instead of tracing callback or tracking IDs by hand, open the event and follow the **Initial deposit** reference to the deposit details. Deposit details also gain **copy buttons** for the **Tracking ID** and **Callback URL** under **Advanced options**. *** ### Improvements [#improvements-5] #### Admin UI [#admin-ui-12] ##### Transfers list filters, columns, and links [#transfers-list-filters-columns-and-links] The Admin UI **Transfers** list gains a **Wallet Type** column, a filter by internal transfer type, and a filter by client or blockchain wallet ID. Global and blockchain wallets now have distinct labels, and each links through to its own page. ##### Audit log filtering by event type [#audit-log-filtering-by-event-type] Audit log tables now filter on the **Reason** column, so you can show only one event type — for example *Password changed* or *Payouts blocked* — across the brand, group, user, and legal-entity logs. ##### Localized operation log comments [#localized-operation-log-comments] Log **Comment** entries are now built from translatable parts (field name, reason, old and new values) instead of a fixed English string, so they display in the selected language across the Client Management and Wallets logs. ##### Multi-select currency filters [#multi-select-currency-filters] Currency filters now use the same multi-select control as the client interface, and long currency lists load in pages as you scroll instead of all at once — removing the brief freeze when opening the dropdown. Matches are ordered with exact matches first, then names starting with your query, then the rest. ##### Owner ID and Legal Entity columns in reports [#owner-id-and-legal-entity-columns-in-reports] The **Transfers** and **Wallets** reports now include **Owner ID** and, where applicable, **Legal Entity Name** columns in the exported files. *** ### Resolved issues [#resolved-issues-5] #### Admin UI [#admin-ui-13] * Fixed a duplicate **Label** column shown in the Admin UI Deposits list and its column configurator. * Fixed the wallet balance-at-date finance report failing to generate, which could leave an export hanging. ## June 26, 2026 [#june-26-2026] ### New features [#new-features-5] ##### Low balance notifications [#low-balance-notifications] You can now set a **balance threshold** for each wallet and be notified automatically when the wallet balance falls below it. Each wallet has its own threshold field, with the value denominated in the wallet currency. When the available balance drops below the configured value, a notification is sent so you can top up in time — helping you avoid situations where end-user withdrawals fail because of insufficient funds on the wallet. ##### Unconfirmed transaction callbacks [#unconfirmed-transaction-callbacks] The system now sends a callback as soon as an incoming transaction is detected on the blockchain, before it has gathered the number of confirmations required to become *Confirmed*. This lets you notify your end users that their payment has already been seen by the system and is simply awaiting confirmations, rather than lost or stuck on the network. The result is fewer support enquiries and a smoother payment experience. *** ### Improvements [#improvements-6] ##### Multi-select currency filters [#multi-select-currency-filters-1] The **Currency** filter has been upgraded from a single-select to a multi-select control, so you can now filter a list by several currencies at once instead of one at a time. The multi-select filter is available on the **Wallets**, **Deposits**, **Payouts**, and **Transfers** pages, as well as in the **Access list**, **Bank details**, **Custody**, and **Swaps** sections. ##### Wallet list card view refinements [#wallet-list-card-view-refinements] Following the card view introduced for transaction wallets in the previous release, the wallets list has been refined with a **sort selector** and an improved **Table / Cards** view toggle, so you can order and display your wallets exactly the way that works best for you. ##### Operation ID filter for Callbacks [#operation-id-filter-for-callbacks] The **Callbacks** list now includes an **Operation ID** filter. This makes it easier to track down a specific callback during investigations — including callbacks that have no associated transfer, such as the *Request rejection* and *No transfer* types. *** ### Resolved issues [#resolved-issues-6] * Fixed a false *insufficient fee* error (code 4009) that could appear when withdrawing certain tokens, such as USDT-TRX and USDT-BSC. * Fixed an issue where creating a custom token incorrectly required the **Balance shift amount** field to be filled in. * Fixed an issue where the daily *transfer growing total* report was not delivered to Report Subscriptions. ## May 23, 2026 [#may-23-2026] ### New features [#new-features-6] ##### Column-based table filters [#column-based-table-filters] Table filtering across the Web UI has been redesigned to match the standard data-handling experience you know from Excel and Google Sheets. Filters are now embedded directly into table columns instead of being grouped in the side panel. The side panel remains available only for filters that cannot be represented within a column (for example, complex multi-parameter filters). An always-active **Reset all filters** button has been added to clear all applied filters in one click, and the column configurator now uses an updated icon for clearer visual hierarchy. This change brings filtering closer to the tools you already use day-to-day, reduces the number of clicks needed to refine large lists, and provides a single consistent way to work with tables across the entire platform. ##### Repeat Payout for failed withdrawals [#repeat-payout-for-failed-withdrawals] A new **Repeat payout** button has been added for payouts that have failed and contain no successful transfers. Previously, a failed withdrawal could not be retried — you had to recreate it manually from scratch or contact support. The button appears on the payout details page when the payout has at least one failed transfer and no successful ones, and takes you to the payout creation form so you can submit a fresh attempt without re-entering all the details by hand. ##### Card layout for transaction wallets [#card-layout-for-transaction-wallets] The transaction wallets list now supports two display modes — the existing **Table view** and a new **Card view** that presents each wallet as a standalone card with all its key data: currency, label, ID, wallet type, balance, pending amount, and status. You can switch between views at any time using the toggle above the wallets list, choosing whichever layout works best for your current task. In addition, action buttons for **Deposit** and **Payout** are now available directly on each wallet entry — in both table and card views — allowing you to start the corresponding operation in one click without opening wallet details first. *** #### Improvements [#improvements-7] ##### IP whitelist enhancements [#ip-whitelist-enhancements] The IP whitelist functionality has been expanded to better support corporate clients and reduce accidental lockouts. **CIDR subnet support.** You can now whitelist entire IP ranges using CIDR notation (for example, `10.0.0.0/24`) instead of adding addresses one by one. Both IPv4 and IPv6 are supported, and you can freely combine single addresses, IPv4 subnets, and IPv6 subnets within a single whitelist. All existing whitelists continue to work without changes. When access is denied because of an IP restriction, the error message now includes the IP address you're connecting from, so you can quickly identify the issue and contact your administrator with the right information. **Self-lockout protection.** When you save a whitelist that does not include your current IP address, the system will now show a warning dialog with your current IP and ask you to confirm before applying the change. This helps prevent the most common cause of support requests — accidentally locking yourself out of the account. Your current IP address is also shown directly in the whitelist editor for reference. ##### Memo / Destination Tag emphasis on the Payment Page [#memo--destination-tag-emphasis-on-the-payment-page] For blockchains that require an additional parameter alongside the deposit address — **Ripple (XRP)**, **Stellar (XLM)**, and **The Open Network (TON)** — the Payment Page layout has been redesigned to make this requirement visually prominent for end users. This reduces the risk of payers submitting deposits without the required Memo / Destination Tag / Comment value, which previously led to unattributed deposits and additional load on Customer Support. ##### Additional columns in Events and Transfers tabs [#additional-columns-in-events-and-transfers-tabs] To make day-to-day account oversight faster and more accurate, two tabs have received new columns: * On the **Events** tab — **Amount** and **Tracking ID** columns. When reviewing payout requests submitted by users with the *Withdrawals with approval* role, you can now see the payout amount and Tracking ID directly in the events list and make approval or decline decisions without opening each request individually. * On the **Transfers** tab — a **Tracking ID** column, consistent with the same column already available on the Deposits and Payouts pages. This makes it easier to follow all transfers associated with a particular Tracking ID end-to-end. ##### Client UI unification [#client-ui-unification] A set of small but practical refinements has been applied across the Web UI to improve consistency and search ergonomics: * **Currency search** now matches both by alpha code and by full currency name, in every dropdown across the platform. * **Wallet search** now matches by ID, alpha code, currency name, and label. * The **Tag** input is now automatically disabled when an *x-address* is entered for Payouts, Custody Withdrawals, and Swap Withdrawals, preventing invalid combinations. * A **Commission is included** toggle has been added to Custody wallet withdrawals, matching the behavior already available for Enterprise wallets. * **Funds** and **Settings** controls in Swap wallets are now displayed as dedicated square buttons, in line with the rest of the wallet types. ## January 20, 2026 [#january-20-2026] ### New features [#new-features-7] #### Partner program [#partner-program] You can now launch a **Partner program** for your legal entity and earn from clients who join B2BINPAY through your referral link. For each invited client who signs up with your link, passes KYB, and processes eligible transactions, you receive a fixed percentage of B2BINPAY commissions. The new **Partner program** section in the left menu provides a dedicated dashboard to manage referrals and rewards. It shows your current percentage, total bonus, bonus for the previous month, and a detailed **Invited partners** list with registration dates, KYB status, and per‑client bonuses. Partner rewards are credited once per month based on B2BINPAY commissions from eligible transactions of referred clients. A new **Partner program** report is available in the **Reports** section. You can generate CSV or XLSX reports with bonuses per partner and for all referrals over a selected month or historical period, using the same data that powers the partner dashboard. #### Legal documents and contract management [#legal-documents-and-contract-management] A new **Legal documents** item has been added to the account menu. From this page, you can access and check the current version of your Terms & Conditions, as well as previous contract versions associated with your legal entity and jurisdiction. For new KYB requests, Terms & Conditions are now accepted as an offer agreement during the KYB initiation step instead of requiring a separate bilateral contract. #### Android app download [#android-app-download] The B2BINPAY Android app is now available directly from the Web UI. A new **Download Android app** section has been added to the account menu, redirecting you to the latest APK download location managed by the Android APK registry. *** ### Improvements [#improvements-8] #### Stronger password policy [#stronger-password-policy] Password rules have been tightened to improve account security. New passwords must contain at least twelve characters, including at least one uppercase letter, one lowercase letter, one digit, and one symbol, and must not contain spaces. You can no longer reuse your previous passwords when changing credentials. #### Withdrawal thresholds enhancements [#withdrawal-thresholds-enhancements] Withdrawal thresholds now give you more control over who approves payouts and how many approvals are required. For any Merchant or Enterprise wallet, you can set the number of required approvals and choose which roles or specific users act as *Approvers*. Approver status is shown in wallet access lists, and approvers can review and confirm payout requests on the **Events** page. This flexible setup can be used as a governance control layer for high‑value transactions when your policies require it. ## October 1, 2025 [#october-1-2025] ### New features [#new-features-8] #### Multi-authentication and social login support [#multi-authentication-and-social-login-support] **Google ID** and **Apple ID** can now be used for system authentication alongside the existing email login option, providing users with more convenient and secure access methods. #### Multi-entity user management [#multi-entity-user-management] The platform now supports advanced user management capabilities where a single user can be associated with multiple legal entities, each with distinct roles and permissions. Additionally, users can create their own sandboxes, automatically becoming *Owners* with the ability to initiate KYB processes for their businesses. #### BTC Testnet faucet [#btc-testnet-faucet] You can now utilize the Testnet faucet functionality to deposit test funds to your Sandbox wallets. Currently, the **BTC testnet faucet** is supported. #### Bank details management [#bank-details-management] A new **Bank details** section is now available in the **Profile menu**, allowing to store and manage multiple bank accounts (IBAN, SWIFT, IFSC, A/C No.) for fiat withdrawals. Each newly added bank record automatically triggers a Compliance review, and its status is clearly tracked as *Pending*, *Approved*, or *Declined*, ensuring only verified bank details are used for [bank withdrawals](references/key-terms#bank-withdrawal). #### New callback type [#new-callback-type] A new **Request rejection** callback type has been implemented that automatically handles failed payout approvals. This callback triggers when payouts requiring approval — such as those created by users with *Withdrawal with approval* roles or those exceeding wallet withdrawal thresholds — fail to receive confirmation within the specified timeframe or was manually cancelled by a user with proper rights. Your external system will now receive automatic notifications for these scenarios, eliminating the need for manual payout cancellation due to failed requests. #### Blockchain deposit recovery [#blockchain-deposit-recovery] For Ethereum-like blockchains, a common pool of addresses has been established. Now, when a deposit address is created on any ETH-like blockchain, the system instantly tracks activity associated with that address across all ETH-like blockchains. This feature eliminates the risk of missed transactions. #### New currency support [#new-currency-support] The platform now supports four additional cryptocurrencies: * RLUSD-ETH * USD1-BSC * SAFE-ETH * TRX-SOL *** ### Improvements [#improvements-9] #### Advanced swap operation controls [#advanced-swap-operation-controls] Two new swap operation settings have been introduced to provide greater control over trading execution. The **No slippage** setting implements an RFQ (Request for Quote) model with price updates every 5 seconds, executing swap requests only when price thresholds remain stable. The **Clients' slippage** setting allows users to specify acceptable price deviation percentages, executing trades at the latest price unless the configured slippage threshold is exceeded. Mode selection is available when creating a new swap operation. #### Staff access to Swap wallets [#staff-access-to-swap-wallets] Administrative staff can now be granted access to Swap wallets with full fund control capabilities without requiring specific user role assignments, streamlining operational management and providing greater flexibility in wallet administration. #### Streamlined legal entity selection [#streamlined-legal-entity-selection] The **Jurisdiction** dropdown has been replaced with a more intuitive **Legal entity** dropdown, significantly improving user experience when managing multiple legal entities within the same jurisdiction and providing clearer organizational structure. #### Enhanced pricing accuracy [#enhanced-pricing-accuracy] Deposit calculations now utilize VWAP (Volume Weighted Average Price) instead of Top-of-the-Book prices, providing more accurate and representative pricing that reflects actual market conditions and trading volumes. #### Centralized security management [#centralized-security-management] IP whitelist management has been restructured so that only *Owners* can configure and manage IP restrictions for all users within their organization, creating a more centralized and secure approach to access control. #### Optimized SOL transaction processing [#optimized-sol-transaction-processing] The SOL smart contract has been enhanced to support multiple transaction collections, allowing a single collection transaction to gather funds from up to 10 deposit addresses simultaneously. This optimization significantly reduces operational costs and improves transaction efficiency. #### Comprehensive localization enhancement [#comprehensive-localization-enhancement] The platform's internationalization capabilities have been substantially improved through integration with the [B2TRANSLATE](https://docs.b2translate.b2broker.com/) platform, providing support for additional languages while enhancing translation quality and consistency across the entire user interface. #### Currency naming clarification [#currency-naming-clarification] To prevent confusion with Binance's discontinued BUSD token, BUSD-T-BSC has been renamed to USDT-BSC throughout the interface, ensuring clear identification and reducing potential user errors in currency selection. ## August 1, 2025 [#august-1-2025] ### New features [#new-features-9] #### KYB verification system [#kyb-verification-system] We're excited to introduce **Know Your Business (KYB) verification**, a comprehensive business verification system that enables secure access to Coinsbuy production environment. This major enhancement transforms how businesses onboard and maintain compliance on our platform, providing a seamless path from testing to live operations. **Key features** * **Jurisdictions** The platform automatically detects jurisdictional requirements based on your country of incorporation, ensuring compliance with local regulations. To maintain ongoing compliance, the system implements periodic re-verification schedules that are clearly displayed in your dashboard. * **Streamlined verification process** We've partnered with [Sumsub](https://sumsub.com/), a leading verification provider, to deliver a secure and efficient KYB process. The system guides you through each verification step with clear instructions and contextual help. If additional documents are required, you can easily upload them through our secure interface. The process is designed to be flexible — you can exit at any point and resume where you left off, with all progress automatically saved. * **Status tracking & notifications** Real-time status updates keep you informed throughout the verification journey, from initial submission through final approval. Visual indicators appear throughout the platform when your attention is needed. You'll also receive email notifications for important status changes and document requests, ensuring you never miss critical updates. **Access & security** The KYB section is restricted to users with the Owner role, providing an additional layer of security for sensitive business verification processes. All document handling occurs through encrypted channels, and our compliance-first approach ensures we meet international regulatory standards. Production environment access is exclusively gated behind successful KYB approval, while the Sandbox environment remains freely available during the verification process. This clear separation ensures you can continue testing and integrating while completing your business verification. **How it works** You can initiate the KYB process any time after account creation, when you gain instant access to our Sandbox environment for testing and integration. When you're ready for production access, simply navigate to the KYB section and add your legal entity by providing basic business information. The system then guides you through verification with our Sumsub integration, which may include identity verification, document submission, and business legitimacy checks. If our verification partner requests additional information or documents, you'll see clear indicators and instructions for what's needed. Once your verification is approved, you immediately gain access to the production environment with full platform capabilities. #### Dual 2FA system [#dual-2fa-system] A new dual 2FA system with separate codes for authentication and operations has been implemented to strengthen account security. The system now uses two distinct 2FA codes: the **Authentication 2FA** that's mandatory for all users and required at every login, and the **Authorization 2FA for operations** that can be enabled in Profile Settings for sensitive actions like IP whitelist setup, API credentials generation, callback secret generation, and payout confirmation. This layered security approach provides enhanced protection by separating routine access from system operations, ensuring that even if one authentication method is compromised, your most sensitive account functions remain secure. #### API v3 [#api-v3] The new API v3 is designed to comply with the latest platform updates. Explore our new [API guide](api-guide/api-overview) and update your integrations accordingly, before the deprecated API v2 will be shut down on **December 1, 2025**. *** ### Improvements [#improvements-10] #### Payout enhancements [#payout-enhancements] Enterprise wallet withdrawals now feature a **Commission is included** toggle that's automatically enabled when selecting 100% of available funds, clearly indicating that the platform fees will be deducted from the payout amount. The payout confirmation window has been enhanced to display the **To be sent** amount, providing users with precise information about what the recipient will actually receive. #### Address whitelisting for Ripple-like blockchains [#address-whitelisting-for-ripple-like-blockchains] Ripple-like blockchains use an additional address tag to identify the recipient of a transaction. When whitelisting addresses on such blockchains, you can now specify the Address tag value along with the regular address. ## January 21, 2025 [#january-21-2025] ### New features [#new-features-10] #### Custody services [#custody-services] With this release, we're excited to introduce our new Custody services, designed to provide secure and efficient storage and management of funds. **Key features**: * **Secure storage**: Custody wallets ensure secure storage and are available only to users with the *Owner* role, requiring video verification for every withdrawal. * **Top ups**: Custody wallets can be topped up from your Merchant and Enterprise wallets. The transaction currency must match the currency of the Custody wallet. * **Withdrawals**: Withdrawals from Custody wallets can be made to Merchant and Enterprise wallets (without currency conversion), as well as to external addresses. * **Fees**: Accumulated commission is calculated daily, based on the tier percentage of stored funds. The commission is charged monthly and with every withdrawal from the Custody wallet. Contact your manager to sign an additional agreement and enable the new **Custody** section in the main menu. #### Callbacks [#callbacks] All [callbacks](references/key-terms#callback) sent by the system can now be easily accessed and resent via the Web UI. Find the new **Callback** section under the **Wallet management** menu item. #### Internal transfers [#internal-transfers] A new payout type **Internal transfer** has been added, allowing you to transfer funds between Merchant wallets if they share the same currency and *Owner*. These transfers don't incur any fees since they're executed off-chain. You can find the new **Internal transfer** option on the **Wallet management** > **Payouts** page under the **Add new** menu. #### Custom AML check [#custom-aml-check] From now on, you can configure your own AML check, in addition to built-in verification provided by B2BINPAY. It can be useful if you need to carry out its own set of compliance procedures. The new **AML check** section has been added to the **Settings** page in your profile menu. #### Duplicated blockchain deposit event [#duplicated-blockchain-deposit-event] This newly added event type is triggered when a deposit is made in one currency but subsequently paid in another, resulting in its duplication on another blockchain. The duplicated deposit doesn't inherit the Tracking ID and Callback URL of the original deposit. With this event, you can manage these parameters to ensure proper tracking of duplicated deposits, eliminating the risk of their loss. #### New blockchain integrations [#new-blockchain-integrations] With this release, **The Open Network (TON)** blockchain has been integrated. Also, several new coins and stablecoins have been added: * ISO 1029 **TON** (The Open Network) * ISO 2032 **USDT-TON** (The Open Network) * ISO 2033 **NOT-TON** (The Open Network) * ISO 2034 **DOGS-TON** (The Open Network) * ISO 2035 **HMSTR-TON** (The Open Network) * ISO 2036 **FDUSD-ETH** (Ethereum) * ISO 2037 **FDUSD-BSC** (BNB Smart Chain) * ISO 2038 **CATI-TON** (The Open Network) * ISO 2039 **POL-ETH** (Ethereum) * ISO 2315 **BTCB-BSC** (BNB Smart Chain) *** ### Improvements [#improvements-11] * When creating a Bank withdrawal, you can now specify the **Amount to be withdrawn**, and the total amount including the commission will be calculated automatically. * The **Side collecting funds** transfers now always display the ID of the original deposit. * For security purposes, API credentials are now displayed only once when regenerated and will no longer be emailed to the *Owner*. * When logging in, users who haven't yet enabled IP whitelists will now see a popup reminding them to do so. Remember: IP whitelisting is effective in protecting your accounts and funds. Make sure you and your team members have it enabled. * An information icon has been added to the **Resources** tab in the wallet details, informing users of the 32 active unstaking transaction limit. When attempting to exceed this limit, a notification will appear. * The links to API docs and Release notes have been added to the Web interface. Access them at any time from your profile menu. *** ## Past releases [#past-releases] ### September, 2024 [#september-2024] #### New features [#new-features-11] ##### Enhanced security [#enhanced-security] With this release, several major updates have been made to improve security, among which are the following: * **Withdrawal thresholds** This new feature enables you to specify withdrawal thresholds that, when exceeded, will require *Owner*’s approval to make a payout. There are three options provided: * **Approval request**: Payouts with the amount above the specified value require an approval. * **2FA of approval request**: Similar to Approval request, but the approver must enter a 2FA code to confirm the payout. * **Max sum of payout per timeframe**: This option limits the total amount of payouts within a specific period of time. Options can be used individually or in combination. Each option can be configured for individual users or user roles. Therefore, when limits are exceeded, approval requests will be triggered for payouts made by any user, not just those with the *Withdrawals with approval* role. All this gives you maximum flexibility in controlling your funds. Thresholds settings can be accessed on the new **Thresholds** tab in the wallet details. **Mind that** you need to have 2FA enabled to set thresholds. * **Address whitelists** This new option enables you to create and manage address whitelists. Payouts sent to whitelisted addresses will bypass restrictions related to thresholds or user roles. However, such payouts are still subject to our standard AML & KYC procedures. There are two options provided: * **Wallet-level whitelists**, considering payouts made from a specific wallet. * **Blockchain-level whitelists**, considering payouts made from any wallet in a specific blockchain. Click your profile icon in the upper-right page corner to access a newly added **Address whitelists** section. The section is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the newly added **Address whitelist** tab in the wallet details. **Mind that** you need to have 2FA enabled to whitelist addresses. * **Access list** The UI has been improved to easier manage access to your wallets. The API access in the profile menu has been replaced with a new Access list section, containing two tabs: * **Staff**: Here you can add new users to the system, assign roles, and grant or restrict access to specific wallets. * **API**: Here you can manage IP whitelists, API keys, and bulk grant or restrict access to their wallets. Other security improvements include: * **Login notifications**: Clients now receive an email notification upon logging in. * **Payout approval**: When approving a withdrawal, the Owner now sees an additional confirmation popup to prevent accidental approvals by mistake. * **2FA reminder**: Upon login, users who haven’t yet enabled 2FA will now see a popup urging them to complete the 2FA procedure. Remember: 2FA is essential for protecting your accounts and funds. Additionally, many new system features now require 2FA. Always ensure that you and your team members have it enabled. ##### New blockchain integrations [#new-blockchain-integrations-1] With this release, two new blockchains have been integrated: * Algorand * Solana Also, several new coins and stablecoins have been added: * ISO 1022 **ALGO** (Algorand) * ISO 2016 **USDC-ALGO** (Algorand) * ISO 2017 **USDT-ALGO** (Algorand) * ISO 1028 **SOL** (Solana) * ISO 2030 **USDT-SOL** (Solana) * ISO 2031 **USDC-SOL** (Solana) ##### Zendesk integration [#zendesk-integration] A new Helpdesk solution, **Zendesk**, has been integrated, providing AI support and knowledge base. Integration with SupportPal remains active in read-only mode, for ticket history. #### Improvements [#improvements-12] * The main enhancement in the current release is an **updated Enterprise commission model**, now focused on outbound transactions.This change better aligns with our clients’ business models and significantly reduces commissions. B2BINPAY now charges commissions on outgoing transactions from Enterprise wallets, rather than incoming ones. * The activation of Enterprise wallets denominated in ETH, TRX, BNB, XRP, or XLM has become user-managed. When creating such a wallet, you can now specify an Enterprise or Merchant wallet from which the activation fee should be charged. * A new **Target commission** field, displaying the commission amount converted to the wallet currency, has been added to the **Transfers** page and transfer details, as well as to the **Transactions** tab of the deposit details. * When creating a new deposit, you can now add a link that will be displayed as a button on the **Payment page**. You can specify a URL and a custom name for the button. *** ### May, 2024 [#may-2024] #### New features [#new-features-12] ##### TRX staking [#trx-staking] With this release, B2BINPAY introduces a new **TRX Staking** feature. This allows you to stake your Tron tokens to gain bandwidth or energy to save on blockchain fees. Along with the resources, for each staked TRX, you receive one vote. The votes you can distribute among SRs (Super Representatives) and further gain rewards from them. A new **Staking** > **TRX staking** item has been added to the main menu. On this page, you can overview the staking terms and monitor your rewards. The **Wallet details** page of your TRX wallets has been updated with the following two tabs: * **Resources**: Here you can overview available resources and perform staking-related operations: stake, unstable, and withdraw funds. * **Staking**: Here you can overview your total and available votes and give them to SRs, as well as monitor rounds and key performance indicators of the SRs. #### Improvements [#improvements-13] * Several more icons for currencies and tokens have been added. Icon sizes in QR codes on payment pages have been adjusted. * On the Sign up page, country flags have been added for all phone codes. * Internal logic of the procedure of enabling 2FA with Google Authenticator has been improved, to avoid situations when the 2FA code expires before the password is entered. * It has become possible to customize displayed rows in the mobile version. * Three new blockchains have been integrated: * Base (BASE) * Arbitrum (ARB) * Optimism (OP) * Several new stablecoins have been added: * USDT-OP * USDC-OP * USDCE-OP * USDT-ARB * USDC-ARB * USDCE-ARB * USDC-BASE * Several new tokens have been added: * ARB-ETH * OPTIMISM-OP *** ### February, 2024 [#february-2024] #### New features [#new-features-13] ##### Swaps [#swaps] With this release, B2BINPAY implements a new **Swap** functionality for the clients. This is a replacement for exchanges, but swaps are faster, more flexible and accurate thanks to VWAP. You can now perform currency exchange operations between your Swap wallets. Swap wallets can be denominated either in crypto or in fiat currencies, but you can only create one wallet per currency. Swap wallets aren't linked to your Enterprise or Merchant wallets, but you can transfer funds between your Swap and Enterprise/Merchant wallets denominated in the same currency. Swap operations are always off-chain. You can exchange all available currencies, including fiat, coins, and tokens. #### Improvements [#improvements-14] * Two new blockchains have been integrated: * Avalanche (AVAX) * Polygon (MATIC) * Several new tokens have been added: * PYUSD-ETH * USDC-AVAX * USDT-AVAX * USDC-MATIC * USDT-MATIC * The TerraUSD (ISO 2150, 2166) token has been renamed to TerraClassicUSD. * New options for wallet duplication have been added: AVAX and MATIC. In total, B2BINPAY now supports wallet duplication in 4 blockchains: * BNB-BSC (Binance Coin) * ETH (Ethereum) * AVAX (Avalanche) * MATIC (Polygon) * Charging of B2BINPAY commission is now displayed as a separate **Commission** transfer type, for more clarity. ### November 13, 2023 [#november-13-2023] #### New features [#new-features-14] ##### Unified Merchant and Enterprise users [#unified-merchant-and-enterprise-users] The Merchant and Enterprise users are no longer separated in B2BINPAY, meaning that a user can now create wallets of both types under the same user profile. ##### A new UI [#a-new-ui] A new B2BINPAY user interface is introduced with this release. The UI has been redesigned to create a more engaging and user-friendly experience. The key changes include the following: * the main menu is now displayed on the left * a new Wallet Management item has been added to the main menu, enabling you to create and manage both Merchant and Enterprise wallets * updated table layouts and icons * amended light and dark themes #### Improvements [#improvements-15] * The blockchain name is now displayed on the Payment page, enabling you to ensure that you send your funds to the correct blockchain for processing and preventing you from funds loss. * The length of phone numbers entered on the Sign up page is now validated, preventing extra or missing digits in phone numbers specified during registration. * The HelpDesk tickets for which there are unread messages in the chart are now marked with a red dot. * The HelpDesk work schedule has become available in the HelpDesk section. * The exchange rates marked as favorites on the Rates page are now available on all user devices. #### Resolved issues [#resolved-issues-7] * For payments in Binance Coin, it’s now possible to select the BNB Chain (BNB-DEX) blockchain that wasn’t previously displayed as an option on the Payment page. * Email addresses specified in Wallet Details are now validated to include only allowed characters. The entered email can be saved only after it’s validated. *** ### September 7, 2023 [#september-7-2023] #### New features [#new-features-15] ##### New currencies [#new-currencies] * Two new stablecoins have been added to the list of currencies in which Merchant wallets can be denominated: **TUSD** (ERC20, BEP20, TRC20) and **EUROC** (ERC20). * Two new stablecoins are now supported for Merchant transactions: **LUSD** (ERC20) and **FRAX** (ERC20, BEP20). * 79 new currencies (113 new tokens in different blockchains) have become available for Enterprise wallets. See the full list of available currencies [here](references/currency-codes). ##### Onboarding [#onboarding] More tours to guide you on using the app are now accessible by clicking your profile information. ##### Favourites [#favourites] On the **Rates** page, it is now possible to filter the results by your favourite pairs and sort them by coin, fiat, or token. #### Improvements [#improvements-16] * When creating a payout, the commission amount is now additionally displayed in the default currency (USD). You can enter a custom commission amount in the default or payout currency. * The 7-day expiration limit for merchant invoices has been removed. When creating or editing an invoice, you can now set any value in the **Expired at** field without any restrictions. * A new button has been added for deleting wallets with zero balances and no transactions. * For large reports, a new notification is now displayed, informing the client that the report will be sent to their email once generated. * The parent wallet is now visible when creating a new payout for tokens. * The QR code generator now supports double-image icons for tokens. * Enterprise clients can now sort the **Wallets** list by ID and currency. * For **Currency** dropdowns, grouping by currency type and filtering by group have been added. * For **Wallet** dropdowns, grouping by active state has been added. * The IP-whitelist management has been changed — now each IP address is added or removed separately. Popups are now displayed for entering passwords required to confirm adding or removing an IP address. * The counter has been added on the **Helpdesk** icon, showing the number of unread messages in tickets. A message is counted as “new“ if a user receives it while the app is open. After the page is reloaded, the counter resets. In the **Helpdesk** section, the tickets with unread messages are marked with a red marker. * Sorting by first letter in dropdowns has been fixed. *** ### May 30, 2023 [#may-30-2023] #### New features [#new-features-16] ##### Reports on wallet balances [#reports-on-wallet-balances] A new **Reports** feature has been implemented to provide you with the possibility to generate reports on your wallet balances for the custom time range. The feature is available for both Enterprise and Merchant users. ##### A notification counter for events [#a-notification-counter-for-events] A notification counter has been added near the **Events** tab displaying the number of new events in the main menu near the **Events** tab. #### Improvements [#improvements-17] * It has become possible to transfer funds within the same blockchain wallet. This option is available for both Enterprise and Merchant users in BTC, BCH, BSC, ADA, DASH, DOGE, ETH, LTC, OMNI, TRX, and ZCASH wallets. * It has become possible to add IP addresses in both IPv4 and IPv6 formats to the API whitelist in the **API access** section. * The number of tickets displayed in the HelpDesk ticket list has been increased up to 30. * The **Target currency** column has been added to the Transfer list for Merchant users. * The **Balance** and the **Pending** tabs have been added to the **Wallet info** tab both for Enterprise and Merchant users. * A limit has been added on the number of tickets created in the HelpDesk. Now you can create only 3 tickets within 5 minutes; when trying to create more than 3 tickets within the specified time, a message about reaching the ticket number limit is displayed.. * The **Registration number** and the **Company address** fields have been added to the sign up form. *** ### March 21, 2023 [#march-21-2023] #### Improvements [#improvements-18] * The design of the payment page has been renewed to offer a more user-friendly experience. * The calculation of balances has been improved. * The response speed of the API has been increased. ### December 28, 2022 [#december-28-2022] #### Improvements [#improvements-19] * The B2BINPAY operation speed has been increased for all operations. * The B2BINPAY interface as well as the mobile version of B2BINPAY have been redesigned and improved for a better user experience. * The Merchant model has been updated to support two types of Merchant users: * Merchant Crypto Settlement: users that can have only crypto wallets and pay reduced commissions for crypto processing. * Merchant Fiat Settlement: users that can have both crypto and fiat wallets and are able to send funds to their bank accounts. * Around 100 new tokens have been added to B2BINPAY. For a list of supported tokens, refer to [Currency codes](references/currency-codes). * The API response speed has been increased. *** ### November 16, 2022 [#november-16-2022] #### Improvements [#improvements-20] * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * It has become possible for Merchant users to set time limits to specify the expiration time for invoices as well as payment limits to hedge possible payment amount variations due to rate changes. * New **Cardano** blockchain has been added to the system. *** ### July 22, 2022 [#july-22-2022] #### New features [#new-features-17] ##### Customized field arrangement for Enterprise and Merchant users [#customized-field-arrangement-for-enterprise-and-merchant-users] A new tool has been implemented to help you arrange fields displayed on a page. With this tool, you can select the fields that you want to display and arrange them in a desired order on the Wallets, Transfers, Deposits, Invoices and Payouts pages. ##### HelpDesk implementation [#helpdesk-implementation] A HelpDesk option has been implemented. Using HelpDesk, you can create a ticket with a description of an issue you encountered with your B2BINPAY account and send it to our Support Team. #### Improvements [#improvements-21] * The display of Bank details for Merchant users has been improved: when creating a bank withdrawal, you can now see all the information related to bank details, not only their title. * The speed of receiving the deposits list via the API has been improved for both Enterprise and Merchant clients. * In addition to the monthly payment for a custom token processing, one more option has been implemented: it has become possible to pay a specified percentage from the credited custom token amount. #### Resolved issues [#resolved-issues-8] * Fixed an issue that caused multiple wallet report downloads upon opening several tabs. * Fixed an issue due to which the transfer type was not displayed on the Transfers page. * Fixed an issue due to which a dialog window did not appear when trying to save updated information in the Wallet details. * Fixed an issue due to which the language in the table on the payment page was not changing. * Fixed an issue due to which incorrect values were displayed in the Currency filter on the Transfer page. * Fixed an issue due to which extraneous pagination options were displayed on the Rates page. * Fixed an issue due to which it was impossible to save an address to the address book when creating a new payout. * Fixed an issue due to which a warning that should be displayed when the sum of a payout exceeds the wallet balance did not appear. * Fixed an issue due to which fiat currencies were unavailable to Merchant users in the Currency filter on the Transfer page. * Fixed an issue due to which tips were not displayed on some pages. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-18] ##### A new Field name field in Logs [#a-new-field-name-field-in-logs] A new field, **Field Name**, has been added to the **Log** for all pages, both for Merchant and Enterprise users. It displays the name of the field whose value has been changed. ##### Currency filter for Merchant users [#currency-filter-for-merchant-users] With a new **Currency** filter on the **Wallet** page, it has become possible for Merchant users to filter their wallets list by currency. ##### Refund button for Merchant users [#refund-button-for-merchant-users] A new **Refund** button has been added to the **Invoice details** page for Merchant users. This button can be used to return funds to the payer. ##### List of support emails for Merchant users [#list-of-support-emails-for-merchant-users] A new **Custom support emails** field has been added to the **Create wallet** and **Edit wallet** pages of the Merchant user accounts. This is a list of email addresses to which requests from payers will be sent. ##### New dialog window for the Create new bank withdrawal window [#new-dialog-window-for-the-create-new-bank-withdrawal-window] A new dialog window has been implemented. It appears upon clicking the **Create new bank withdrawal** button after deleting a regular withdrawal or editing its data. ##### New AML provider integration [#new-aml-provider-integration] A new AML provider, **Chainanalysis KYT**, has been integrated. #### Improvements [#improvements-22] * The AML system logic has been improved: * Repeated checks in case of delay on a provider’s side are now performed with a short delay. * In case of a failure on a provider’s side to perform the final check, no additional checks are attempted. An email notification is sent to Compliance. * A long delay (up to 1 hour) is not used anymore. * A commission for the bank withdrawal for Merchant users is now calculated as follows: a fixed percentage of the withdrawal + a fixed amount in the withdrawal currency (but not less than the minimum commission amount). For example: 2.00% + 30 USD (the minimum commission is 100 USD). The percentage, fixed amount and minimum commission values are configured via the B2BINPAY Back Office. Additionally, the commission amount is now displayed under the Amount field on the withdrawal creation form. * The **Payment page** for Merchant users has been improved for a better user experience. Among other improvements, tags have been added to all currencies, while token icons and the search field have been updated, and cryptocurrencies have been divided into the following categories: Coins, Stablecoins, Others. #### Resolved issues [#resolved-issues-9] * Fixed an issue that caused incorrect filtration in the Amount to field on the Exchange page. * Fixed an issue that caused an incorrect display of the commission currency on the Create exchange page. * Fixed an issue due to which the language in the calendar widget did not change. ### December 28, 2021 [#december-28-2021] #### New features [#new-features-19] ##### Replace by Fee option [#replace-by-fee-option] A new **Replace by Fee** option has become available for Enterprise users. You can speed up the execution of your payout that has stuck due to the low fee by clicking the **Replace** button and selecting a higher fee on the Transfer Details page. ##### Freeze funds on Tron blockchain [#freeze-funds-on-tron-blockchain] For Enterprise users, it has become possible to freeze a certain amount of TRX currency in order to restore Tron blockchain resources such as bandwidth points and energy. In 72 hours, you can unfreeze the frozen amount and it will be returned to your wallet in full. #### Improvements [#improvements-23] * A new **System** initiator that represents the doer of the action in the system has been added to the Log subsection of the Wallets, Deposits and Payout sections both for Enterprise and Merchant users. * The **All** checkbox has been changed to the **All sum** switch in the **Create payout** form both for Enterprise and Merchant users. Now it is possible to select the whole wallet amount, the fee will be automatically included in the payout amount. #### Resolved issues [#resolved-issues-10] * Fixed an issue due to which blocked transaction was displayed as a confirmed one on the payment page. * Fixed an issue due to which changes in the wallet details of the Merchant users were not displayed in logs. * Fixed an issue due to which the icons for some currencies were missed on the invoice payment page. * Fixed an issue due to which the payout amount in tokens was incorrectly calculated for Merchant users. * Fixed an issue due to which the link in the TXID field for XMR currencies of the Transfers page led to the incorrect page. * Fixed an issue due to which the Minimal transfer amount field was not filled automatically. * Fixed an issue due to which values in the Old value and Actual value fields on the Payout details page for Merchant uses were absent. * Fixed an issue due to which the rates were not updated when creating payouts for Merchant users. * Fixed an issue due to which the links in the TXID field of the Deposits and Transfers pages were absent. * Fixed an issue due to which after the payout creation the commissions section was not displayed. * Fixed an issue that caused the amount discrepancy on the Create Exchange page and in the modal window. * Fixed an issue that caused an error when restoring the password. * Fixed an issue that caused an infinite loader to appear in the Add wallet to API window in the Access list section. * Fixed an issue that caused an eternal loader to appear when adding white list API in the API Access section. * Fixed an issue due to which the ID link on the deposit payment page led to the incorrect page. * Fixed an issue that restricted the number of adding wallets to 10 in the Access List. * Fixed an issue that caused troubles with verification when registering in the system. * Fixed an issue due to which it was impossible to get access to the API Access menu for Merchant users. * Fixed an issue due to which the From address book button was not available on the payout creation form. *** ### November 16, 2021 [#november-16-2021] #### New features [#new-features-20] * New currencies are added. The currencies are available for Enterprise users only. * New Monero XMR currency is added. It is available both for Enterprise and Merchant users. #### Improvements [#improvements-24] * The limitation for number of requests without prior authentication to the endpoint is now limited to 70 requests per 1 minute. *** ### October 21, 2021 [#october-21-2021] #### New features [#new-features-21] ##### Risk status [#risk-status] A new **Risk status** tag is added to the Transfer details page. This field indicates the status of the AML verification of the transfer: * the tag is orange if the AML is successful * blue if AML is pending * red if AML failed * grey if AML is unavailable Tags are displayed now for token wallets on the Wallets, Deposits, Payouts and Exchanges pages. #### Improvements [#improvements-25] * Merchant users can now specify Tag and Tag type fields when creating a payout with XLM and XRP currencies. * When clicking on the Exchange button on the Wallets list page, you are redirected to the Creating Exchange page with the selected wallet already filled in the From field. * The payment page for tokens now has 2 links: one link for the payment address and the other link for the contract. #### Resolved issues [#resolved-issues-11] * Fixed an issue which caused redirecting to the Wallet Details instead of Log when clicking on the Log button at the Access List section. * Fixed an issue that enabled funds withdrawal from a fiat wallet to a crypto wallet for Merchant users. * Fixed an issue due to which the link to the explorer was absent on the Deposit payment page. * Fixed an issue due to which on the Transfers page an Unknown type transfers were displayed when selecting the Side collecting funds in the Type filter. * Fixed an issue due to which the payment currencies and “No currencies available” message were displayed simultaneously on the Payment page. * Fixed an issue due to which the Payouts commission was not recalculated in the payout currency. * Fixed an issue due to which it was possible to create a token payout when there was not enough funds on the parent wallet. * Fixed an issue that caused multiple notifications for one operation on a wallet. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-22] * Integration with Tron blockchain is added, as well as new currencies such as Tron, USDT-TRX, USDC-TRX. * New Merchant User role is added. * New Bank Withdrawal feature is added to the Payout tab, which allows withdrawing fiat funds immediately or creating a conditional schedule. Bank Withdrawal is available for fiat wallets and for Merchant users only. * New ETH and BSC tokens are added. #### Improvements [#improvements-26] * New risk status field is added to the Transfer Object, so that clients can check transfer AML status. * DASH integration is updated. Latest version of DASH allows you to create multiple wallets per node. * Unverified users now can log in to a private area and pass verification later. #### Resolved issues [#resolved-issues-12] * Fixed an issue which caused wrong error code for API when obtaining token more than 15 times within 1 minute. * Fixed an issue which caused an error when navigating to the Payouts and Deposits tabs. * Fixed an issue which caused a false check of fee and payout amount when validating token payouts. * Fixed an issue due to which it was impossible to create a token payout with the sufficient amount of funds. * Fixed an issue which caused troubles with changing password or enabling 2FA. * Fixed an issue due to which it was impossible to create a deposit with a number of confirmation blocks from 13 to 20. * Fixed an issue which caused multiple callback notifications in the Event section when creating a payout with callback. *** ### August 04, 2021 [#august-04-2021] #### Improvements [#improvements-27] * Reworked the logic of the Exchange process. Now rates are recalculated if the transaction takes more than 15 minutes, and the final amount is updated according to the current quote. Also the notification about the rate change is sent. * Lowered minimal activation amount for BSC to 0.025 BNB. #### Resolved issues [#resolved-issues-13] * Fixed an issue due to which it was possible to set the amount less than the Minimal transfer amount when creating an exchange. * Fixed an issue due to which BEP20 was not displayed in the list of token types. * Fixed an issue due to which the Export button worked incorrectly. *** ### July 07, 2021 [#july-07-2021] #### New features [#new-features-23] ##### User verification by phone number [#user-verification-by-phone-number] Added a new verification step — verification of the user's phone number, which follows the email verification step and is mandatory. #### Improvements [#improvements-28] * Added filter by tokens. To filter by currency, a user can now select the tokens and custom tokens on the Wallets, Transfers, Deposits, and Payouts pages. * Reworked the logic of the Exchange page. Now wallets with 0 balance are displayed at the end of the list. * Updated Select all funds switch on the Exchange page. #### Resolved issues [#resolved-issues-14] * Fixed an issue due to which when exchanging, the transfer amount was not validated and could be indicated less than the available funds on the wallet. * Fixed an issue due to which the exchange became unavailable after rates update. * Fixed an issue due to which it was possible to create a custom token with alpha code of the existing currency. * Fixed an issue which caused 500 error when filtering deposits and payouts. *** ### June 22, 2021 [#june-22-2021] #### New features [#new-features-24] ##### Binance smart chain support\*\* [#binance-smart-chain-support] Now it is possible to create wallets in BSC. ##### Duplicating wallets [#duplicating-wallets] It is now possible to generate the same addresses in two different currencies. This may be useful when the payer is sending money on the wrong blockchain. For example, instead of paying 10 ETH to the A1 address, 10 BSC were sent to the A1 address. The option is available for wallets that support duplication in the Wallet Settings section. ##### Duplicating deposits [#duplicating-deposits] After duplicating a wallet when creating a deposit on one wallet, it becomes possible to clone it to a second wallet, if that second wallet is a clone of the first one. The option is available on the Create a Deposit page, when choosing duplicate in the address type and selecting the required deposit ID from the list. ##### New transfer type [#new-transfer-type] Side collecting funds on wallet is the amount of deposit that was previously canceled because of a small amount and then debited to your wallet along with another valid transfer. ##### New stablecoins support [#new-stablecoins-support] New stablecoins were added: PAX, DAI, TUSD, BUSD. #### Improvements [#improvements-29] * For BNB-BSC wallets, a notification has been added about the need to top-up the balance to activate the wallet. * Invoice updates. For all tokens, the link is now generated not by the token currency, but by the parent currency. #### Updating nodes [#updating-nodes] * DASH node was updated to version 16.1.1. #### Resolved issues [#resolved-issues-15] * Fixed an issue that caused incorrect login when saving credentials in the browser. * Fixed an issue due to which the Stellar icon did not change when switching theme from dark to light. *** ### April 19, 2021 [#april-19-2021] * **Integration with Ethereum and ERC-20 tokens has been made**. Now you can exchange and create wallets, deposits, withdrawals using new currency. The system collects tokens from deposit addresses in one place via smart contract. That significantly reduces the costs of token processing for the client. Integration with Ethereum also includes the possibility of replacing a payout by fee from the personal area in case it's stuck due to low blockchain fee. * **Working with ERC-20 tokens is available to all enterprises**. Through the client's office, you can add your token, pay processing fee from any of your wallets and start accepting tokens after confirmation of payment on the blockchain. The owner can specify any alpha code for custom token so that it is displayed on the payment pages. From your personal account at any time you can change the payment wallet or refuse to pay next month. * **The registration form is now unified for all types of clients** and contains fields where the user needs to enter information about himself in full. This will help our sales team and account managers to get in touch with the client faster and prepare everything to start working with the payment system. Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Get started with B2BINPAY DeFi, connect a wallet and make your first on-chain deposits Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Use this guide to manage accounts, queue operations, transfers, invoices, and payouts Consult an in-depth reference describing the structure of API requests and responses Consult an in-depth reference describing the structure of API requests and responses This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/api-overview) for updated descriptions. ## General information [#general-information] The B2BINPAY API is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. All methods are private. All requests except for [Obtain token](authentication#obtain-token) and [Refresh token](authentication#refresh-token) should contain HTTP header: `Authorization: Bearer `. According to [JSON API Specification](https://jsonapi.org/format/), all requests should contain HTTP header: `Content-Type: application/vnd.api+json`. ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/authentication) for updated descriptions. ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token` #### Request example [#request-example] ```sh curl --request POST \ --url [base]/token/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "login": "", "password": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'login': '', 'password': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'login' => '', 'password' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } }, "meta": { "time": "2020-12-29T05:27:11.925654Z", "sign": "bcd6519ce27fed2ce9efe49cd09b387f050c0122c96..." } } ``` #### Response codes [#response-codes] *** ## Refresh token [#refresh-token] Once you receive a new key pair using your refresh token, the previous refresh token can no longer be used. A refresh token that is found to be invalid while not being expired must be rendered suspicious. ### Request [#request-1] `POST` `[base]/token/refresh/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/token/refresh/ \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "refresh": "" } } }' ``` ```python import requests url = '[base]/token/refresh/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'refresh': '', }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/refresh/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'refresh' => 'Your refresh token', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] The response body is the same as for [Obtain token](authentication#obtain-token) request, but without `meta` fields. #### Response body example [#response-body-example] ```json { "type": "auth-token", "id": "0", "attributes": { "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "access_expired_at": "2020-12-29T05:42:11.925654Z", "refresh_expired_at": "2020-12-29T11:27:11.925654Z", "is_2fa_confirmed": false } } ``` #### Response codes [#response-codes-1] *** ## Auth verification [#auth-verification] Refer to the example below for a sign verification instance. ```javascript // "crypto-js": "4.0.0" is installed as a dependency const SHA256 = require("crypto-js/sha256"); const hmacSHA256 = require('crypto-js/hmac-sha256'); // set API user login and password const login = 'Your API key'; const password = 'Your API secret'; // parse /api/token/ response payload const authResponse = JSON.parse("{\n" + " \"data\": {\n" + " \"type\": \"auth-token\",\n" + " \"id\": \"0\",\n" + " \"attributes\": {\n" + " \"refresh\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUz\",\n" + " \"access\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI\",\n" + " \"access_expired_at\": \"2020-08-24T13:50:12.192479+03:00\",\n" + " \"refresh_expired_at\": \"2020-08-24T19:33:33.192479+03:00\",\n" + " \"is_2fa_confirmed\": false\n" + " }\n" + " },\n" + " \"meta\": {\n" + " \"time\": \"2020-08-24T10:33:33.192479Z\",\n" + " \"sign\": \"e70adec551e26b560049e42aa0993ae42cac4e03fbbb300320d8be\"\n" + " }\n" + "}"); // prepare data for hash check const message = authResponse['meta']['time'] + authResponse['data']['attributes']['refresh']; const responseSign = authResponse['meta']['sign']; const secret = SHA256(login + password); const calculatedSign = hmacSHA256(message, secret).toString(); // print result if (responseSign === calculatedSign) { console.log('Verified'); } else { console.log('Invalid sign'); } ``` ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/deposit-methods) for updated descriptions. ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2147483647 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") This API version is deprecated and will no longer be supported after December 1, 2025. Refer to [API v3](../api-guide/payout-methods) for updated descriptions. ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-2] `POST` `[base]/payout/calculate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-2] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-2] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of the concatenation of your login and password as a key, and the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields as message. Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-3] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-3] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-3] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-3] #### Response body example [#response-body-example-1] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## Main menu [#main-menu] Use the main menu displayed on the left to navigate across platform pages and access the Helpdesk. Use the **Collapse**/**Expand** button to adjust the main menu display. Main menu ## Topbar options [#topbar-options] In the upper part of the page, you can see a topbar that provides access to the following functions: * the **Legal entity** dropdown — to switch between Sandbox and Production environments as well as different legal entities where you hold membership. Access permissions vary across legal entities based on your assigned user roles within each organization. Through this dropdown, users can also create new Sandbox environments to initiate KYB processes for their own businesses. * the **Dark/Light theme** switch — to adjust the B2BINPAY Web UI to your preferences. * the **Language** dropdown — to select a preferred language for the B2BINPAY Web UI. * the **Notifications** page — to view and manage system notifications. * the **User profile** icon — to access the **Profile menu** (see below). Topbar ## Profile menu [#profile-menu] ### Custom tokens [#custom-tokens] On this page, you can view a list of your [custom tokens](../references/key-terms#custom-token) and their settings. Currently, new custom tokens can't be created. Existing custom tokens continue to be supported. ### Testnet faucet [#testnet-faucet] On this page, you can deposit test funds to your Sandbox wallets for testing purposes. See [Set up integrations](quick-start-guide#step-5-set-up-integrations) for more details on using Sandbox. ### Logins and sessions [#logins-and-sessions] On this page, you can find a log of user sessions, which includes the user email and location, along with the device fingerprint data and exact date and time of each login. The *Owner* sees all sessions of all users. ### Access list [#access-list] Only users with the *Owner* role can access this section. On this page, you can manage user access to your wallets, API credentials, and IP whitelists. The page is divided into two tabs: On this tab, you can add new users to your legal entity, assign roles, and grant or restrict access to specific wallets. See the following guides for step-by-step instructions: * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) In the wallet details, you can find the **Access rights** tab featuring a list of users who have access to this particular wallet. On this tab, you can manage API access, as well as bulk grant or restrict API access to your wallets. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-api-credentials) *Available on Production environments only.* On this tab, you can manage IP whitelists for your legal entity to allow access it from trusted IPs only. This setting will apply to all users under this particular legal entity, including the *Owner*. See the following guides for step-by-step instructions: * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) On this tab, you can generate the Callback secret for callback verification. See the following guides for step-by-step instructions: * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) ### Address whitelist [#address-whitelist] On this page, you can create and manage address whitelists for blockchains and wallets. The page is divided into two tabs for whitelists at the blockchain and wallet levels respectively. Here you can manage your whitelists centrally: view, add, delete, or bulk delete addresses. You can also whitelist addresses for a specific wallet on the **Address whitelist** tab in the wallet details. See [How to whitelist a payout address](../how-tos/manage-your-assets/how-to-whitelist-a-payout-address) for step-by-step instructions. ### Bank details [#bank-details] On this page, you can add and manage your bank details saved for [bank withdrawals](../references/key-terms#bank-withdrawal). The following types are supported: * IBAN * SWIFT * IFSC * A/C No. Once you add a new bank account, an approval request is automatically created and sent to the B2BINPAY Compliance team. After that you can monitor the status: * **Pending**: The bank details were sent to the Compliance office for approval. * **Approved**: The bank details were approved by the Compliance office, you can use it for bank withdrawals. * **Declined**: The bank details were rejected by the Compliance office and can't be used for bank withdrawals. ### Reports [#reports] On this page, you can generate and download wallet reports. See [How to generate a report on wallet balances](../how-tos/manage-your-wallets/how-to-generate-a-report-on-wallet-balances) for step-by-step instructions. ### Settings [#settings] On this page, you can configure your profile and system access. See the following guides for step-by-step instructions: * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses) * [How to enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [How to enable additional AML check](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check) ### Legal documents [#legal-documents] On this page, you can view and manage legal documents such as policies and contract agreements. When contract terms and conditions change, the *Owner* of the legal entity sees a notification on their next sign‑in. A modal window opens and requires them to read and accept the new terms. The *Owner* can also initiate unilateral contract termination by clicking **Terminate** next to the latest contract version. After initiation, your account remains available for withdrawals until the termination is processed by the B2BINPAY Compliance team. ## Configuring columns [#configuring-columns] Information on most pages and tabs is presented in tables and you can configure columns to display. If a display setting is available for a given page, you may see the **Configure columns** button above the table. Click it to display the column list: * Mark or unmark column checkboxes to display or hide them; the column checkboxes highlighted in grey can’t be disabled. * Drag and drop the columns to adjust their order in the table. Configuring columns ## Quick search [#quick-search] On some pages, you can perform a **quick search** by a certain parameter, such as wallet label or currency. To perform the quick search, start typing a desired value in the quick search field displayed above the table. Only the records containing the entered value are displayed on the page. ## Sorting [#sorting] Information in tables can be sorted by certain parameters. By default, page data is sorted by creation date in descending order. You can sort the page data by other fields. To find out whether you can sort table data by a particular field, hover over a corresponding column header. If sorting by this field is supported, you will see an arrow next to it indicating the available sorting options: * Arrow inactive — sorting by this field is disabled. * Up arrow (active) — descending sorting by this field is enabled (you can click the arrow to enable ascending sorting). * Down arrow (active) — ascending sorting by this field is enabled (you can click the arrow to enable descending sorting). You can sort table data only by a single field at a time. Sorting ## Filters [#filters] The **funnel icon** displayed on some pages indicates that you can specify custom **search filters**. You can click this icon to open a filter popup and enter desired values. The set of available filtering parameters varies for different pages. The displayed input corresponds to a parameter type: it can be text, number, date, selector, and so on. Typically, two values are required for filtering by a time interval: the start date and the end date. You can enter these values manually or select them using the calendar tool. To enable filtering, click the **Apply** button. To disable filtering, click **Reset**. On some pages, you can choose among predefined **quick filters** to filter data by a specific parameter, such as a wallet or currency type. To enable these filters, use the corresponding buttons displayed above data tables. Filtering ## Pagination [#pagination] Most of the pages support **pagination** and display data on multiple pages. You can instantly **Jump to** a specific page or use the left and right arrows to switch to the previous or next page. You can also specify the number of rows displayed on each page. Pagination ## Copying values [#copying-values] On some pages, the option to copy certain values to the clipboard is provided. Copying values ## Export data [#export-data] On some pages, the data export option is provided. You can download the page data in the CSV or XLSX format. The exported file matches the filtering and sorting settings applied to the page. Exporting data ## Step 1: Understand the wallet types [#step-1-understand-the-wallet-types] B2BINPAY offers two distinct wallet types: **Enterprise** and **Merchant**. Both can be created under a single account. Understanding these wallet types is essential, as their differences determine the functionality, workflow and the fees involved. Watch our video to explore our Enterprise (Wallet as a Service) and Merchant (Crypto Payment Processing) solutions and discover which solution best fits your needs. **References:** * [B2BINPAY Pricing](https://b2binpay.com/en/fees-crypto-payment-processing) *** ## Step 2: Sign up and pass KYB verification [#step-2-sign-up-and-pass-kyb-verification] To start using B2BINPAY, you need to create an account and complete the Know Your Business (KYB) verification process. ## Create your account [#create-your-account] 1. **Fill out the registration form** with your: * Full name * Email address * Phone number 2. **Create a secure password** that meets our security requirements. 3. **Set up 2FA** to receive *Authentication 2FA codes*: follow instruction on the screen. 4. **Verify your email address** by either: * Clicking the verification link sent to your email, or * Entering the verification code from the email. You now have access to our **Sandbox environment** — a secure testing environment where you can safely integrate B2BINPAY with your systems without any financial risk. Never send real money to Sandbox deposit addresses. This will result in **permanent and irreversible loss** of your funds. ## Submit your KYB request [#submit-your-kyb-request] 1. Navigate to **KYB** in the main menu. 2. Click **Add new legal entity**. 3. Fill out the required information: * **Legal entity name** — Your company's official registered name. * **Country of incorporation** — Where your business is legally registered. * **Business type** — Select the category that best describes your business. * **UBO residency** — Country where the Ultimate Beneficial Owner resides. 4. Review and accept the **Terms and conditions**. 5. Click **Create** to submit your request. Once submitted, you'll be directed to begin the KYB verification process. ## Complete the verification process [#complete-the-verification-process] Follow the on-screen instructions provided by our KYB verification provider. Once finished, the status of your request will change to *Pending*. You can safely exit and return to complete the verification later. Your progress will be automatically saved, the status of your request will change to *In progress*. ## Submit additional documents (if required) [#submit-additional-documents-if-required] Some applications may require additional supporting documents. **If documents are needed:** * A red notification badge will appear on the **KYB** menu item. * Your application status will change to *Action required*. Once your KYB request changes the status to *Approved*, you can begin using B2BINPAY production environment: switch to it using the dropdown in the topbar. **Next steps:** 1. Update your integration to use production base URLs. 2. Replace Sandbox API credentials with your production credentials. 3. Start processing real transactions. **Remember:** Never use Sandbox addresses for live transactions. *** ## Step 3: Start using your B2BINPAY [#step-3-start-using-your-b2binpay] Once your account is activated, you can begin working with B2BINPAY. Setting up your account involves the following steps: 1. **Configure essential security**: Ensure your account is secure. 2. **Create your first wallet**: Set up your initial wallet to start receiving payments. 3. **Enable API access**: Allow integration with other systems. 4. **Share wallet access**: Provide access to team members as needed. For a detailed walkthrough, watch our setup video. **References:** * [Enable 2FA](../how-tos/manage-your-profile-and-system/how-to-enable-2fa) * [Whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) * [Create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) * [Access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [Grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [Manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) *** ## Step 4: Ensure security [#step-4-ensure-security] B2BINPAY readily supports KYC and AML procedures, enabling you to verify the identity of your clients and ensure compliance with anti-money laundering regulations. Other security features include 2FA, whitelists, thresholds, robust notifications, and logging systems. Keep in mind that the security of your accounts is your own responsibility. Watch our video to learn about B2BINPAY security features. ### Follow best practices to protect your finances [#follow-best-practices-to-protect-your-finances] Follow the guidelines below to better protect your account. #### Use strong passwords and 2FA [#use-strong-passwords-and-2fa] Make sure that you and all of your team members: * Use strong passwords that include uppercase and lowercase letters, numbers, and special symbols. * Use password managers for storing passwords. * Never share passwords with anyone. * Have IP whitelists enabled. **References:** * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-web-ui) #### Enable notifications [#enable-notifications] Add your email as a notification address in the settings of all your wallets to make sure that you will be notified about any transactions. This way, you are able to detect suspicious transactions and intervene as quickly as possible. **References:** * [How to create a wallet](../how-tos/manage-your-wallets/how-to-create-a-wallet) #### Take special care when managing access permissions [#take-special-care-when-managing-access-permissions] Make sure that your users are granted only those permissions that are necessary for completing their tasks. Such permissions include access to wallets and availability of various kinds of transactions. In particular, you can assign the *Withdrawals with approval* role to all users, so that no funds withdrawal can be made unless it’s explicitly approved by you. **References:** * [How to grant access to your wallet](../how-tos/manage-your-wallets/how-to-grant-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) #### Enable withdrawal thresholds [#enable-withdrawal-thresholds] Specify thresholds for your wallets to limit the withdrawal amount. Withdrawals with the amounts exceeding the specified values will require the approval of the *Owner*, regardless of the role of the user who created such payout. **References:** * [How to set withdrawal thresholds](../how-tos/manage-your-wallets/how-to-set-withdrawal-thresholds) #### Generate new API credentials after integration is complete [#generate-new-api-credentials-after-integration-is-complete] When sharing your API keys with developers, generate new keys and reset IP access to API after the setup is complete. **References:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Take immediate actions if you account security has been compromised [#take-immediate-actions-if-you-account-security-has-been-compromised] Do the following if you come to suspect that someone has obtained access to your account. ### Change your password as soon as possible [#change-your-password-as-soon-as-possible] Please note that changing the system password may take time. Note that you must enter a 2FA code to confirm the password change. **References:** * [How to change your password](../how-tos/manage-your-profile-and-system/how-to-change-your-password) ### Reset access permissions and IP whitelists [#reset-access-permissions-and-ip-whitelists] Revoke all accesses to your wallets or at least temporarily assign the *Read only* or *Withdrawals with approval* role to all users. In this case, any further transactions on these wallets can be made only after your approval. In addition, restrict access to the B2BINPAY API by removing non-trusted IPs from the whitelists. **References:** * [How to restrict access to your wallet](../how-tos/manage-your-wallets/how-to-restrict-access-to-your-wallet) * [How to manage user roles](../how-tos/manage-your-wallets/how-to-manage-user-roles) * [How to whitelist IP addresses](../how-tos/manage-your-profile-and-system/how-to-whitelist-ip-addresses#restrict-access-to-api) ### Immediately inform your account manager [#immediately-inform-your-account-manager] And follow the provided instructions. *** ## Step 5: Set up integrations [#step-5-set-up-integrations] B2BINPAY is designed to integrate seamlessly into various external systems to streamline and automate payment processes, such as creating deposit addresses, fetching exchange rates, processing withdrawals, and so on. To ensure a secure and comprehensive testing experience, B2BINPAY provides a Sandbox environment. This allows you to experiment with the platform features safely, understand the system logic, test interactions, set up integrations without any risk, and tailor them to your specific scenarios. You get access to Sandbox immediately after signing up to the system. B2BINPAY provides you with the Testnet faucet: using it, you can receive test funds to your Sandbox wallet to test system functions — payouts, deposits, transfers, and other features. Currently, the **BTC** testnet faucet is supported. To receive test funds: Create a BTC wallet in the Sandbox environment. Access the wallet details and copy the wallet address. Click your **profile icon** in the upper right page corner and select **Testnet faucet**. In the **Address** field, paste your wallet address. In the **Amount** field, enter the amount to deposit. Amount limits are specified under the field. Click **Send deposit**. Simulate transaction confirmations by clicking the **Generate blocks** button several times. Now, as your wallet is topped up, you can proceed with testing the financial operations in B2BINPAY and configuring integrations with external systems. Never use Sandbox deposit addresses on Production environments. This will result in **irreversible loss** of funds. **See also:** * [How to access API](../how-tos/manage-your-profile-and-system/how-to-access-api) *** ## Step 6: Use Helpdesk to get assistance [#step-6-use-helpdesk-to-get-assistance] Click **Helpdesk** in the main menu to access our Support Team platform where you can get quick help from the online chat bot or report any issues related to the B2BINPAY operation. We provide multi-lingual support, you can find the working hours of corresponding teams in the right part of the **Helpdesk** page. Check our [Troubleshooting articles](../troubleshooting/no-active-account) where you can find solutions for most common issues. *** ## Step 7: Learn about other B2BINPAY features [#step-7-learn-about-other-b2binpay-features] Watch our video to learn about other B2BINPAY features that you can use. ## Important announcement [#important-announcement] We announce the release of the new API version **v3** on June 1, 2025. This version introduces the following significant changes: * New [base URLs](#base-urls) * New [Authentication](authentication) procedure * New [Callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret) and modifications in the callback verification method for [deposits](deposit-methods#callback-verification) and [payouts](payout-methods#callback-verification) **Action required:** We strongly encourage you to review the changes and update your integrations **before December 1, 2025**, as the old API version will be shut down after this date. Please ensure all updates are completed before the deadline to avoid any service disruptions. **Deprecated API notice:** The previous version of the API guide has been moved to a [separate section](../api-guide-v2-deprecated/api-overview) and is now marked as deprecated. Before you start working with the B2BINPAY API, you need to enable API access to the system. Refer to [How to access the API](../how-tos/manage-your-profile-and-system/how-to-access-api) for step-by-step instructions. ## General information [#general-information] The B2BINPAY API v3 is organized in accordance with JSON API paradigm. For a better understanding of the paradigm principles, read the [JSON API Specification](https://jsonapi.org/format/). We use conventional HTTP response codes, OAuth 2.0 protocol for authentication, and HMAC-SHA256 algorithm for encryption. Except for [Authentication](authentication), all requests must contain the following HTTP headers: * `Authorization: Bearer {YOUR_ACCESS_TOKEN}`: Used to authenticate your request. * `Content-Type: application/vnd.api+json`: Required according to [JSON API Specification](https://jsonapi.org/format/). ## Filtering [#filtering] Filters by object parameters can be applied to any `GET`-method according to the [JSON API Specification](https://jsonapi.org/format/). ## Callbacks [#callbacks] The B2BINPAY API also provides flexible options for callback — an asynchronous notification about changing statuses of deposits and payouts. To learn more, refer to [Callback](../references/key-terms#callback). To receive callbacks, specify a callback URL when sending a [Create deposit](deposit-methods#create-deposit) or [Create payout](payout-methods#create-payout) request. When a transaction receives the required number of confirmation blocks, the callback is sent via an HTTP `POST`-request to the specified URL. If you also want to be notified when the number of confirmations received for a transaction doesn’t reach a specific threshold or exceeds it, indicate the required number of confirmations in the request. ## Date-time values [#date-time-values] All date-time values are specified as per [ISO 8601-1:2019](https://www.iso.org/standard/70907.html), with milliseconds precision and timezone included: `YYYY-MM-DDThh:mm:ss[.SSSSSS]±hh:mm`. ## Destination object [#destination-object] The object contains the following fields: * `address_type` (string or null)\ For wallets denominated in BTC, LTC, BCH, XRP: the address type. Refer to [Address types](../references/address-types) for supported values.\ For other wallets the value is null. * `address` (string)\ The deposit address.\ For payments in XRP, an array of objects is returned containing the `x-address` and `address` (with a destination `tag` additionally specified): ```json "destination": [ { "address_type": "x-address", "address": "X7dBkB9KmvUh6GGHbjhxdu4LfkwhJ74oVWbGRoy7VLnHdJ6" }, { "address_type": "address", "address": "rsxXXvBXmKUkCyCeNCHUFpfCX9pQdxQhv5", "tag": "0" } ] ``` For payments in XLM, the `destination` object is as follows: ```json "destination": { "address_type": "address", "address": "GCZJFWB5NVQHVBMV4U6CCJIXXBGINGYF2W33PMD5REBD5VQ6H6BLCJR5", "tag_type": 0, "tag": "" } ``` where: * `address_type` is always `"address"`. * `address` is a string value containing the wallet address. * `tag_type` is a number value containing tag or memo type. Possible values: * `0` — no memo * `1` — a 64-bit unsigned integer * `tag` is a string value containing the tag. ## API rate limits and accessibility [#api-rate-limits-and-accessibility] The number of requests to the endpoint without prior authentication is limited to 15 per 1 minute. To check the network availability of the system, use the `/ping` endpoint without authorization headers. ## Base URLs [#base-urls] ## Obtain token [#obtain-token] ### Request [#request] `POST` `[base]/token/` #### Request example [#request-example] ```sh curl --location '{base_url}/token/' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "auth-token", "attributes": { "client_id": "", "client_secret": "" } } }' ``` ```python import requests url = '[base]/token/' headers = { 'content-type': 'application/vnd.api+json', } data = { 'data': { 'type': 'auth-token', 'attributes': { 'client_id': '', 'client_secret': '', } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/token/', [ 'json' => [ 'data' => [ 'type' => 'auth-token', 'attributes' => [ 'client_id' => '', 'client_secret' => '', ], ], ], 'headers' => [ 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] #### Response example [#response-example] ```json { "data": { "type": "auth-token", "id": "0", "attributes": { "access": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjMy...", "expires_in": 3599, "token_type": "Bearer" } } } ``` #### Response codes [#response-codes] ## Currency object [#currency-object] #### Currency object example [#currency-object-example] ```json { "type": "currency", "id": "2015", "attributes": { "blockchain_name": "", "iso": 2015, "name": "TetherUS", "alpha": "USDT-ETH", "alias": "USDT", "tags": "", "exp": 6, "confirmation_blocks": 3, "minimal_transfer_amount": "25.000000", "block_delay": 75 }, "relationships": { "parent": { "data": { "type": "currency", "id": "1002" } } } } ``` *** ## Get currency [#get-currency] ### Request [#request] `GET` `[base]/currency/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/currency/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/currency/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/currency/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [currency object](currency-methods#currency-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] ## Deposit object [#deposit-object] #### Deposit object example [#deposit-object-example] ```json { "type": "deposit", "id": "2205", "attributes": { "status": 2, "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu", "address_type": "p2sh-segwit", "label": "My Deposit", "tracking_id": "2244", "confirmations_needed": null, "time_limit": null, "callback_url": "https://my.client.url/cb/", "inaccuracy": "0.00000000", "target_amount_requested": null, "rate_requested": "1.00000000", "rate_expired_at": "2024-02-06T16:39:06.507593Z", "invoice_updated_at": null, "payment_page": "https://pay-sandbox.com/en/a08c7567-956c-4922-b80b-6e515718a9a4/pay", "target_paid": "0.00000000", "source_amount_requested": "0.00000000", "target_paid_pending": "0.00000000", "assets": {}, "destination": { "address_type": "p2sh-segwit", "address": "2NFSVSgbXK7mipDFfuVrLvVJJ9HEgyPNXqu" }, "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "448" } } } } ``` *** ## Get deposit [#get-deposit] ### Request [#request] `GET` `[base]/deposit/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/deposit/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [deposit object](deposit-methods#deposit-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create deposit [#create-deposit] Before creating a deposit, you can retrieve parameters of the fields you need to fill in by calling the [Deposit options](deposit-methods#deposit-options) method. ### Request [#request-1] `POST` `[base]/deposit/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/deposit/ \ --header 'Authorization: Bearer .' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "deposit", "attributes": { "label": "My new deposit", "tracking_id": "d-abcd", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "payment_page_redirect_url": "https://my.crm.com", "payment_page_button_text": "Back to CRM" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } } } } }' ``` ```python import requests url = '[base]/deposit/' headers = { 'Authorization': '', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'deposit', 'attributes': { 'label': 'My new deposit', 'tracking_id': 'd-abcd', 'confirmations_needed': 2, 'callback_url': 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '1', } } } } } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/deposit/', [ 'json' => [ 'data' => [ 'type' => 'deposit', 'attributes' => [ 'label' => 'My new deposit', 'tracking_id' => 'd-abcd', 'confirmations_needed' => 2, 'callback_url' => 'https://my.client.com/cb/', 'payment_page_redirect_url': 'https://my.crm.com', 'payment_page_button_text': 'Back to CRM' ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-1] In case of success, the response body contains a newly created [deposit object](deposit-methods#deposit-object). #### Response codes [#response-codes-1] *** ## Deposit callback [#deposit-callback] A callback is a notification sent to a user’s callback URL when a new deposit-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] The callback is sent to your server if the deposit request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message`. The `message` composition depends on whether the callback includes a transfer: * **With a transfer** — concatenate `transfer.status`, `transfer.amount`, `deposit.tracking_id`, and `meta.time`. * **Without a transfer** (deposit status change only) — concatenate `deposit.status`, `deposit.tracking_id` (if non-empty), and `meta.time`. Refer to the examples below for callback verification examples. ```php ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the deposit itself. Contains the [Deposit object](deposit-methods#deposit-object). * `included` — the transaction received for this deposit. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object) (optional). There may be no Transfer object, if only the deposit status has changed. Keep in mind that transfer confirmation and deposit status changes are separate events that trigger two different callbacks. * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](deposit-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "deposit", "id": "11203", "attributes": { "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae", "created_at": "2022-07-15T16:51:52.702456Z", "tracking_id": "", "target_paid": "0.300000000000000000", "destination": { "address_type": null, "address": "0xcb959a408cbfbe64116a2dadc20188c290226fae" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } }, "wallet": { "data": { "type": "wallet", "id": "318" } }, "transfer": { "data": { "type": "transfer", "id": "17618" } } } }, "included": [ { "type": "currency", "id": "1002", "attributes": { "iso": 1002, "name": "Ethereum", "alpha": "ETH", "alias": null, "exp": 18, "confirmation_blocks": 3, "minimal_transfer_amount": "0.000000000000000000", "block_delay": 30 } }, { "type": "transfer", "id": "17618", "attributes": { "op_id": 11203, "op_type": 1, "amount": "0.300000000000000000", "commission": "0.001200000000000000", "fee": "0.000000000000000000", "txid": "0xa09cb1de38b9b21712ff18d08d6a625cc80ec41c9e64586095d4c46449a9eb51", "status": 2, "user_message": null, "created_at": "2022-07-15T16:53:04.098536Z", "updated_at": "2022-07-15T16:54:39.903843Z", "confirmations": 8, "risk": 0, "risk_status": 4, "amount_cleared": "0.298800000000000000" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1002" } } } } ], "meta": { "time": "2022-07-15T16:54:39.966327+00:00", "sign": "1377e7a9eb3d62f7708285cd148711c62f50e53d8046e4d412a18ae9a575da85" } } ``` *** ## Deposit options [#deposit-options] ### Request [#request-2] `OPT` `[base]/deposit` *No request parameters.* #### Request example [#request-example-2] ```bash curl --request OPTIONS \ --url [base]/deposit/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = "[base]/deposit/" headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("OPTIONS", url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/deposit/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-2] #### Response body example [#response-body-example] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "max_length": 256, "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false } }, "POST": { "status": { "type": "choice", "required": false, "read_only": false, "label": "Status", "choices": [ { "value": 2, "display_name": "Created" }, { "value": 3, "display_name": "Paid" }, { "value": 4, "display_name": "Canceled" }, { "value": 5, "display_name": "Unresolved" } ] }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address_type": { "type": "string", "required": false, "read_only": false, "label": "Address type", "max_length": 16 }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "inaccuracy": { "type": "decimal", "required": false, "read_only": false, "label": "Inaccuracy", "min_value": 0 }, "time_limit": { "type": "integer", "required": false, "read_only": false, "label": "Time limit", "min_value": 59, "max_value": 2592000 }, "target_amount_requested": { "type": "decimal", "required": false, "read_only": false, "label": "Target amount requested", "min_value": 0 }, "payment_page": { "type": "field", "required": false, "read_only": true, "label": "Payment page" }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Payout object [#payout-object] #### Payout object example [#payout-object-example] ```json { "type": "payout", "id": "1815", "attributes": { "amount": "1.00000000", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u", "target_deposit": "15987fbe-993e-45a8-93fa-cdd1a626488f", "target_wallet": null, "tracking_id": "", "label": "", "confirmations_needed": null, "fee_amount": "0.00000000", "is_fee_included": false, "status": 2, "rate_requested": "1.00000000", "callback_url": "", "force_blockchain": false, "exp": 8, "tag_type": null, "tag": null, "destination": { "address_type": "bech32", "address": "bcrt1qs8vkvgj53tdzxaxzcxrwnvtp0ezse0vmrjty6u" }, "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3614" } } } } ``` *** ## Get payout [#get-payout] ### Request [#request] `GET` `[base]/payout/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/payout/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/payout/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [payout object](payout-methods#payout-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] *** ## Create payout [#create-payout] Before creating a payout, you can retrieve parameters of the fields you need to fill in by calling the [Payout options](payout-methods#payout-options) method. For security reasons, an additional HTTP header with a unique idempotency key must be sent in the request. The key is a UUID4 string with hyphens, for example: `2dbcb513-bd35-404f-9709-e34878def180`. Refer to [Useful links](../references/useful-links#uuid-tools) for recommended programming packages and libraries that you can use to generate UUID4. ### Request [#request-1] `POST` `[base]/payout/` #### Request example [#request-example-1] ```bash curl --request POST \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --header 'idempotency-key: b6891f5b-d16f-4ba9-a1c4-9828be64a492' \ --data '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/" payload = json.dumps({ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ', 'Idempotency-Key': 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ', 'Idempotency-Key' => 'b6891f5b-d16f-4ba9-a1c4-9828be64a492' ]; $body = '{ "data": { "type": "payout", "attributes": { "label": "My Payout", "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "tracking_id": "f12", "confirmations_needed": 2, "callback_url": "https://my.client.com/cb/", "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "John", "secondaryIdentifier": "Smith" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-1] In case of success, the response body contains a newly created [payout object](payout-methods#payout-object). #### Response codes [#response-codes-1] *** ## Validate payout [#validate-payout] Validates a payout request without creating it. The endpoint runs the same validation pipeline as [Create payout](payout-methods#create-payout), checking the address, currency, fee, balance, commissions, `tracking_id` uniqueness, wallet activity, and target wallet or deposit resolution. On success, the response contains the resulting `total_amount` that would be debited from the source wallet. The endpoint has no side effects and doesn't require the `Idempotency-Key` header. ### Request [#request-2] `POST` `[base]/payout/validate/` #### Request example [#request-example-2] ```bash curl --request POST \ --url [base]/payout/validate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests import json url = "[base]/payout/validate/" payload = json.dumps({ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": False, "is_commission_included": False, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }) headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $body = '{ "data": { "type": "payout-validation", "attributes": { "amount": "0.05", "fee_amount": "0.00000550", "address": "bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76", "is_fee_included": false, "is_commission_included": false, "tracking_id": "f12" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "1" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }'; $request = new Request('POST', '[base]/payout/validate/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-2] In case of success, the response body contains the total amount that would be debited from the source wallet if the payout was created. #### Response body example [#response-body-example] ```json { "data": { "type": "payout-validation", "id": "0", "attributes": { "total_amount": "0.05000550" } } } ``` #### Response codes [#response-codes-2] *** ## Travel rule [#travel-rule] The `travel_rule_info` object contains information about a payment receiver and must be filled in when creating a payout. The object fields are different for natural and legal persons. ### Natural person [#natural-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "naturalPerson": { "name": [ { "nameIdentifier": [ { "primaryIdentifier": "First Name", "secondaryIdentifier": "Last Name" } ] } ], "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "HOME" } ] } } ] } } ``` The object contains the following key fields: ### Legal person [#legal-person] ```json "travel_rule_info": { "beneficiary": { "beneficiaryPersons": [ { "legalPerson": { "name": { "nameIdentifier": [ { "legalPersonName": "Name", "legalPersonNameIdentifierType": "LEGL" } ] }, "geographicAddress": [ { "country": "Country", "addressLine": [ "Address" ], "addressType": "BIZZ" } ] } } ] } } ``` The object contains the following key fields: *** ## Precalculate fee [#precalculate-fee] Use this method to precalculate possible blockchain fee options. For calculations, you need to provide the identifier of a wallet from which the payout is made along with the destination address and payout amount. ### Request [#request-3] `POST` `[base]/payout/calculate/` #### Request example [#request-example-3] ```bash curl --request POST \ --url /payout/calculate/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ --data '{ "data": { "type": "payout-calculation", "attributes": { "amount": "0.0000001", "to_address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "13" } }, "currency": { "data": { "type": "currency", "id": "1000" } } } } }' ``` ```python import requests url = '[base]/payout/calculate/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } data = { 'data': { 'type': 'payout-calculation', 'attributes': { 'amount': '0.0000001', 'to_address': '2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv', }, 'relationships': { 'wallet': { 'data': { 'type': 'wallet', 'id': '13', } }, 'currency': { 'data': { 'type': 'currency', 'id': '1000', }, }, }, }, } requests.post(url, headers=headers, json=data) ``` ```php post('[base]/payout/calculate/', [ 'json' => [ 'data' => [ 'type' => 'payout-calculation', 'attributes' => [ 'amount' => '0.05', 'to_address' => 'bcrt1q92k5z02dyrjahm4hput42nps3t7ryxzzz0vl76', ], 'relationships' => [ 'wallet' => [ 'data' => [ 'type' => 'wallet', 'id' => '1', ], ], 'currency' => [ 'data' => [ 'type' => 'currency', 'id' => '1000', ], ], ], ], ], 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response-3] In case of success, the response body contains low, medium, and high blockchain fee values. #### Response body example [#response-body-example-1] ```json { "data": { "type": "payout-calculation", "id": "0", "attributes": { "is_internal": true, "fee": { "low": "0.0001000", "medium": "0.0001000", "high": "0.1073686", "dust_amount": "0.0000000", "warning": null, "currency": 1021 }, "commission": { "amount": "0.0000000", "currency": 1021 } } } } ``` #### Response codes [#response-codes-3] *** ## Payout callback [#payout-callback] A callback is a notification sent to a user’s callback URL when a new payout-related transaction occurs on the blockchain. To learn more, refer to [Callback](../references/key-terms#callback). ### Callback processing [#callback-processing] Upon receiving a required number of confirmations related to a new transaction, the callback is sent to your server if the payout request body includes a valid callback URL. The callback is sent as a `POST`-request, which contains useful JSON payload. After processing the payload, your server should respond with the HTTP `200` response code without a body. If your server is temporarily unavailable or the status of the response is different from `200`, the system will resend the callback several times with the increasing delay time. The number of re-sendings is limited. If the manual resending is required, you can do it on the **Wallet management** > **Callbacks** page in the Web UI. ### Callback verification [#callback-verification] To verify that the callback was sent by B2BINPAY, generate an HMAC-signature using `sha256` as algorithm: `sha256` hash of your `callback_secret` (see [Obtain a callback secret](../how-tos/manage-your-profile-and-system/how-to-access-api#obtain-a-callback-secret)) and `message` (the concatenation of the `transfer.status`, `transfer.amount`, `deposit.tracking_id`, `meta.time` fields). Refer to the example below for a callback verification example. ```php ### Callback structure [#callback-structure] The callback consists of three parts: * `data` — the payout itself. Contains the [Payout object](payout-methods#payout-object). * `included` — the transaction received for this payout. Contains the [Currency object](currency-methods#currency-object) and [Transfer object](transfer-methods#transfer-object). * `meta` — the metadata used for callback authentication. Contains the following fields: * `time` (string) — the date and time when the callback was sent. * `sign` (string) — the HMAC signature for a callback authentication. Refer to the [Callback verification](payout-methods#callback-verification) section for a callback verification example. #### Callback body example [#callback-body-example] ```json { "data": { "type": "payout", "id": "26", "attributes": { "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6", "created_at": "2021-09-30T13:01:49.930612Z", "tracking_id": "12", "fee_amount": "0.00000823", "is_fee_included": false, "amount": "0.00010000", "destination": { "address_type": "legacy", "address": "2NBr9k5xhvE2PxAAiFuczqQkeN76ShMdRZ6" } }, "relationships": { "wallet": { "data": { "type": "wallet", "id": "19" } }, "currency": { "data": { "type": "currency", "id": "1000" } }, "transfer": { "data": { "type": "transfer", "id": "145" } } } }, "included": [ { "type": "currency", "id": "1000", "attributes": { "iso": 1000, "name": "Bitcoin", "alpha": "BTC", "alias": null, "exp": 8, "confirmation_blocks": 3, "minimal_transfer_amount": "0.00000546", "block_delay": 3600 } }, { "type": "transfer", "id": "145", "attributes": { "confirmations": 3, "risk": 0, "risk_status": 4, "op_id": 26, "op_type": 2, "amount": "0.00010000", "commission": "0.00000000", "fee": "0.00000823", "txid": "c3cc36f4569fdbfaacdbc14647e5046d9f239ab1af0268b531a5a213411a8fc9", "status": 2, "message": null, "user_message": null, "created_at": "2021-09-30T13:01:50.273446Z", "updated_at": "2021-09-30T13:02:33.743770Z" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } } } } ], "meta": { "time": "2021-09-30T13:02:34.059939+00:00", "sign": "8ef2a0f0c6826895593d0d137cf6ce7353a4bbe999d4a6c363f92f1e9d7f8e32" } } ``` *** ## Payout options [#payout-options] ### Request [#request-4] `OPT` `[base]/payout` *No request parameters.* #### Request example [#request-example-4] ```bash curl --request OPTIONS \ --url [base]/payout/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' \ ``` ```python import requests import json url = '[base]/payout/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer ' } response = requests.request('OPTIONS', url, headers=headers) print(response.text) ``` ```php 'application/vnd.api+json', 'Authorization' => 'Bearer ' ]; $request = new Request('OPTIONS', '[base]/payout/', $headers, $body); $res = $client->sendAsync($request)->wait(); echo $res->getBody(); ``` ### Response [#response-4] In case of success, the response body contains an array of available methods along with a list of field parameters such as labels, min and max values, regular expressions used for validation, and so on. #### Response codes [#response-codes-4] #### Response body example [#response-body-example-2] ```json { "data": { "renders": [ "application/vnd.api+json" ], "parses": [ "application/vnd.api+json", "multipart/form-data" ], "allowed_methods": [ "GET", "POST", "HEAD", "OPTIONS" ], "actions": { "GET": { "currency": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "wallet": { "lookup_expr": "exact", "required": false }, "wallet_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "wallet_type": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Merchant" }, { "value": 2, "display_name": "Enterprise" }, { "value": 3, "display_name": "Custody" }, { "value": 4, "display_name": "NFT" }, { "value": 5, "display_name": "Swap" } ], "required": false }, "id": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "created_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "created_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_from": { "lookup_expr": "exact", "max_length": 32, "required": false }, "updated_at_to": { "lookup_expr": "exact", "max_length": 32, "required": false }, "label": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "tracking_id": { "lookup_expr": "icontains", "max_length": 128, "required": false }, "commission": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "max_length": 32, "required": false }, "address": { "lookup_expr": "exact", "required": false }, "confirmations_needed": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 2, "required": false }, "help_email": { "lookup_expr": "exact", "max_length": 64, "required": false }, "status": { "lookup_expr": "exact", "choices": [ { "value": 1, "display_name": "Waiting for approve" }, { "value": 2, "display_name": "Approved" }, { "value": 3, "display_name": "Canceled" } ], "required": false }, "time_limit": { "lookup_expr": "exact", "regexp": "^[1-9][0-9]*$", "max_length": 8, "required": false }, "inaccuracy": { "lookup_expr": "icontains", "max_length": 32, "required": false }, "target_amount_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "rate_requested": { "lookup_expr": "exact", "max_length": 32, "required": false }, "expired_at_from": { "lookup_expr": "exact", "max_length": 64, "required": false }, "expired_at_to": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "enrolled": { "lookup_expr": "exact", "max_length": 64, "required": false }, "target_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid_pending": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_paid": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_commission": { "lookup_expr": "exact", "max_length": 64, "required": false }, "source_amount_requested": { "lookup_expr": "exact", "max_length": 64, "required": false }, "is_fee_included": { "lookup_expr": "exact", "required": false }, "amount": { "lookup_expr": "exact", "regexp": "[-+]?[0-9]*\\.?[0-9]*", "required": false }, "charged": { "lookup_expr": "icontains", "max_length": 32, "required": false } }, "POST": { "amount": { "type": "decimal", "required": true, "read_only": false, "label": "Amount", "min_value": 0 }, "currency": { "type": "field", "required": false, "read_only": false, "label": "Currency" }, "address": { "type": "string", "required": false, "read_only": false, "label": "Address", "max_length": 128 }, "target_deposit": { "type": "string", "required": false, "read_only": false, "label": "Target deposit" }, "wallet": { "type": "field", "required": true, "read_only": false, "label": "Wallet" }, "target_wallet": { "type": "field", "required": false, "read_only": false, "label": "Target wallet" }, "tracking_id": { "type": "string", "required": false, "read_only": false, "label": "Tracking id", "max_length": 128 }, "label": { "type": "string", "required": false, "read_only": false, "label": "Label", "max_length": 32 }, "confirmations_needed": { "type": "integer", "required": false, "read_only": false, "label": "Confirmations needed", "min_value": 0, "max_value": 100 }, "fee_amount": { "type": "decimal", "required": false, "read_only": false, "label": "Fee amount", "min_value": 0 }, "is_fee_included": { "type": "boolean", "required": false, "read_only": false, "label": "Is fee included" }, "callback_url": { "type": "url", "required": false, "read_only": false, "label": "Callback url", "max_length": 256 }, "force_blockchain": { "type": "boolean", "required": false, "read_only": false, "label": "Force blockchain" }, "exp": { "type": "field", "required": false, "read_only": true, "label": "Exp" }, "tag": { "type": "string", "required": false, "read_only": false, "label": "Tag", "max_length": 64 }, "tag_type": { "type": "string", "required": false, "read_only": false, "label": "Tag type", "max_length": 64 }, "travel_rule_info": { "type": "field", "required": false, "read_only": false, "label": "Travel rule info" } } }, "custom": { "POST": { "address_masks": { "1000": [ { "address_type": "legacy", "mask": [ "^1[1-9a-km-zA-HJ-NP-Z]{25,33}$" ], "is_default": false }, { "address_type": "p2sh-segwit", "mask": [ "^2[1-9a-km-zA-HJ-NP-Z]{33,34}$" ], "is_default": true }, { "address_type": "bech32", "mask": [ "^bcrt1[02-9ac-hj-np-z]{6,85}$" ], "is_default": false } ], "1002": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "1010": [ { "address_type": null, "mask": [ "^r[a-km-zA-HJ-NP-Z1-9]{24,34}$", "^X[a-km-zA-HJ-NP-Z1-9]{46}$" ], "is_default": true } ], "1125": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2015": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ], "2065": [ { "address_type": null, "mask": [ "^0x[0-9a-fA-F]{40}$" ], "is_default": true }, { "address_type": "duplicate", "mask": null, "is_default": false } ] } } } } } ``` [^1]: Number of transaction confirmations on the blockchain. For more details, see [#confirmation-block](../references/key-terms#confirmation-block "mention") [^2]: Anti-Money Laundering. For more information, see [#aml](../references/key-terms#aml "mention") ## Rate object [#rate-object] #### Rate object example [#rate-object-example] ```json { "type": "rate", "id": "0", "attributes": { "left": "ZRX", "right": "USDC", "bid": "0.381855018600000000", "ask": "0.389670322000000000", "exp": 18, "expired_at": "2024-02-28T09:45:48.314413Z", "created_at": "2024-02-28T09:40:48.314413Z" } } ``` *** ## Get rates [#get-rates] ### Request [#request] `GET` `[base]/rates/` Rates can be filtered by the `left` and `right` parameters according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). For example, the response body will only contain the rates with the BTC base currency: `/rates?filter[left]=BTC`. You can specify more than one currency, for example, the response body will contain the rates with the BTC and USDT base currencies: `/rates?filter[left]=BTC,USDT`. #### Request example [#request-example] ```sh curl --request GET \ --url [base]/rates/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/rates/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/rates/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains an array of [rate objects](rate-methods#rate-object). #### Response codes [#response-codes] ## Transfer object [#transfer-object] #### Transfer object example [#transfer-object-example] ```json { "type": "transfer", "id": "8163", "attributes": { "op_id": 3262, "op_type": 14, "amount": "0.77700000", "rate_target": "1.000000000000000000", "commission": "0.00233100", "fee": "0.00000000", "txid": "0f82d9a82c166ed87a47b968e6a713c...", "status": 2, "user_message": null, "created_at": "2024-02-08T11:16:16.179799Z", "updated_at": "2024-02-08T11:16:17.483373Z", "confirmations": 191, "risk": 0, "risk_status": 4, "amount_target": "0.77466900", "commission_target": "0", "amount_cleared": "0.77466900" }, "relationships": { "currency": { "data": { "type": "currency", "id": "1000" } }, "wallet": { "data": { "type": "wallet", "id": "3262" } }, "parent": { "data": null } } } ``` *** ## Get transfer [#get-transfer] ### Request [#request] `GET` `[base]/transfer/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/transfer/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/transfer/' headers = { 'Authorization': 'Bearer ', 'Content-Type': 'application/vnd.api+json', } requests.get(url, headers=headers) ``` ```php get('[base]/transfer/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [transfer object](transfer-methods#transfer-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Anti-Money Laundry ## Wallet object [#wallet-object] #### Wallet object example [#wallet-object-example] ```json { "type": "wallet", "id": "448", "attributes": { "label": "My Wallet", "status": 3, "type": 2, "created_at": "2020-11-06T06:03:44.301815Z", "balance_confirmed": "0.23221548", "balance_pending": "0.00000000", "balance_unusable": "0.00364702", "minimal_transfer_amount": "0.00000546", "destination": { "address_type": "p2sh-segwit", "address": "2N3Ac2cZzRVoqfJGu1bFaAebq3izTgr1WLv" } }, "relationships": { "currency": { "data": { "type": "currency", "id": "2005" } }, "parent": { "data": { "type": "wallet", "id": "14" } } } } ``` *** ## Get wallet [#get-wallet] ### Request [#request] `GET` `[base]/wallet/``{id}` Filtering by object parameters can be applied according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Request example [#request-example] ```sh curl --request GET \ --url [base]/wallet/ \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/vnd.api+json' ``` ```python import requests url = '[base]/wallet/' headers = { 'Content-Type': 'application/vnd.api+json', 'Authorization': 'Bearer } requests.get(url, headers=headers) ``` ```php get('[base]/wallet/', [ 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/vnd.api+json', ], ]); echo $res->getBody(); } catch (RequestException $e) {} ``` ### Response [#response] In case of success, the response body contains a [wallet object](wallet-methods#wallet-object) or an array of objects (if the `id` wasn’t specified). The wallets list is paginated and the default page size is 10. You can adjust pagination according to the [JSON API Specification](https://jsonapi.org/format/#query-parameters-families). #### Response codes [#response-codes] [^1]: Enterprise wallet to which a token wallet is linked. For more details, see [#parent-wallet](../references/key-terms#parent-wallet "mention") ## 2FA [#2fa] The Two-Factor Authentication is an additional method of authentication that adds one more layer of security to your account. It assumes that, when signing in, in addition to your credentials, you also enter a unique one-time and time-limited confirmation code. B2BINPAY supports 2FA with the **Google Authenticator** app (it's free). B2BINPAY requires two different 2FA codes: * **Authentication 2FA**: This one is mandatory for all users upon registration. It must be entered each time you log in. * **Authorization 2FA for operations**: This one is enabled in the **Profile menu** > **Settings** section. It's required for the following sensitive system actions: * IP whitelist setup * API credentials generation * Callback secret generation * Payout confirmation *** ## Activation fee [#activation-fee] This is a deposit that you have to make to your wallets denominated in specific currencies in order to activate them. After the wallet that require confirmation is created, you'll receive a message on the **Notifications** page indicating the required deposit amount. Once deposited, the fee amount is frozen on the wallet and the wallet is assigned the *Active* status. You can use your Merchant wallets to deposit the required amount of funds. Refer also to [Blockchain fee](#blockchain-fee) and [Commission](#commission) to learn about other commission types. *** ## AML [#aml] Anti-Money Laundering is certain regulations and laws that prevent illegal movement and laundering of funds. ### Default AML check [#default-aml-check] B2BINPAY provides a built-in obligatory AML check for all incoming transfers. The check is performed on the side of a connected AML provider. During AML verification, the incoming transfer amount is displayed in the wallet as *Pending* and can't be used for financial operations. If the check is successful, the incoming transfer amount is enrolled to the wallet balance. If a transaction is considered suspicious, it's assigned the *Blocked* status and is subject to further actions by the B2BINPAY Compliance department. ### Additional AML check [#additional-aml-check] You can add your personal account of the AML provider as an additional level of verification. Find the step-by-step instruction [here](../how-tos/manage-your-profile-and-system/how-to-enable-additional-aml-check). If enabled, after successfully passing the default AML check, the transfer is sent to your provider for additional verification. During the entire duration of both checks, the amount of the incoming transfer remains in *Pending*. Currently, two AML providers are available: [Crystal](https://crystalintelligence.com/) and [Chainalysis](https://www.chainalysis.com/). *** ## Bank withdrawal [#bank-withdrawal] This is a withdrawal of fiat funds from your [Merchant wallet](#merchant-wallet) denominated in the same fiat currency to your bank account. B2BINPAY provides three types of bank withdrawals: * **One-time withdrawal**: A single withdrawal of a fixed amount. * **Regular withdrawal with a fixed amount**: A withdrawal that is triggered every time when the wallet balance reaches the specified amount plus the commission amount. * **Regular withdrawal with a changing amount**: A withdrawal where you additionally specify the minimum amount that should be left on your wallet after the withdrawal. This withdrawal is triggered every time when the wallet balance reaches