Only this pageAll pages
Powered by GitBook
1 of 55

Terminal

Loading...

INTEGRATION GUIDES

Loading...

Loading...

How to get started

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Best Practices

Loading...

Loading...

Loading...

Loading...

TERMINAL GUIDE

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

API REFERENCE

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

use cases

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

INTEGRATIONS / PLUGINS

Loading...

WHAT WE SUPPORT

Loading...

Loading...

Deploy Widgets on Your Site

Learn how to deploy our widgets on your website.

How the Integration Works

Integrating with the Inabit Terminal is a straightforward process. Before you begin, choose the organization where the integration will be applied and decide whether to use the mainnet or sandbox (testnet) environment.

To enable a sandbox organization, please contact the Inabit support team.

Integration Steps

  1. Implement the Inabit Approval App. (link)

  2. Create the widget. (link)

  3. Embed the widget into your website.(link)

  4. Monitor the Terminal via webhook (link) or by polling the Terminal API (link), and align it with your internal flow — for example, when a customer completes a purchase on your eCommerce site, update the order status and initiate product shipment accordingly.

Overview

Read our documentation and get up to speed on how to access our API capabilities.

Introduction

The inabit Terminal is your command center for managing digital assets, processing payments, and automating Web3 operations - all in one secure, intuitive interface.

Whether you're embedding crypto widgets into your platform, automating fund flows, or fueling cross-chain transactions, this documentation will guide you through everything you need to know to get started and scale confidently.

Advanced Settings

Advanced settings of our POS widgets before creation

⚙️ Advanced Widget Settings

Reusable Address (Toggle)

Enable Terminal

To enable the Inabit Terminal, please contact the Inabit support team. Once the terminal feature is activated, you will be able to proceed with the integration.

You can also schedule a quick call through the interface under the Terminal page to go through enabling it with a dedicated support agent.

Organization

What Is Our Terminal?

Inabit Terminal is a crypto payment gateway that allows platforms, merchants, and service providers to accept cryptocurrency directly from their users in a secure, compliant, and customizable way.

It provides an all-in-one infrastructure for generating deposit addresses, tracking blockchain payments, and settling transactions in crypto or fiat, without needing to manage wallets, private keys, or custom smart contracts.

Think of Inabit Terminal as your crypto-native checkout engine, fully managed and easy to integrate via API or UI.

Who Is It For?

  • Payment Service Providers (PSPs) – who want to offer crypto payments to their merchants.

  • Merchants and eCommerce stores – accepting crypto as part of checkout (POS or online).

  • Platforms and SaaS products – embedding crypto flows inside digital apps.

  • White-label/Embedded Finance Providers – offering crypto to their downstream clients (Terminal-as-a-Service).

What Can You Do With Our Terminal?

  • Generate on-chain deposit addresses (Purchase or Customer Address types)

  • Monitor incoming payments in real time

  • Receive webhook callbacks when payment is complete

  • Accept a wide range of crypto assets across supported blockchains

  • Settle in crypto or convert to fiat

  • Define widget settings like confirmations, expiration, and reuse

  • Use either UI (no code) or GraphQL API (developer-first)

How It Works (High-Level Flow)

  1. Enable Terminal for your organization (via support)

  2. Create a widget (via the Inabit Dashboard or API)

  3. Display the widget to your customer - a QR code + address will be generated

  4. Customer pays in crypto

  5. Inabit monitors the blockchain

  6. You receive a webhook (or poll API) once confirmed

  7. You fulfill the order or service, and optionally settle to fiat

You can manage the entire flow through the Inabit Dashboard - no code required.

Types of Widgets

Inabit Terminal supports two widget types, depending on your payment model:

Widget Type
Use Case
Reuse Address?
Expiration?
Best For

Purchase Address

One-time purchases or invoices

Optional

Yes

eCommerce, donation, QR-POS

Customer Address

Persistent user/account deposits

Yes

Optional

Wallet top-ups, recurring users

Read more about widget types →

Environments

Environment
Description
Real Blockchain?

Mainnet

Used for live production payments

Yes (real funds)

Sandbox

Used for testing with testnet assets

Yes (testnet coins)

The Sandbox environment allows you to run full end-to-end tests using real blockchain behavior, without any financial risk.

Having trouble collecting assets on testnet? When testing through our APIs, inabit can provide you with testnet assets including tokens to get going with your tests! All you need to do is request tokens through our support team at: [email protected] or through an existing dedicated integration channel.

Why Should You Use Our Terminal?

Benefit
Description

✅ Simple Integration

Use low-code UI or API; no smart contracts or wallet setup required

✅ Self-Custody by Default

You control your wallets and funds

✅ Fully Customizable

Define confirmations, expiration, gas logic, etc.

✅ Real-Time Visibility

Webhooks and dashboard give full payment transparency

✅ Multi-Org, Multi-Chain Ready

Easily support different merchants and chains with one infrastructure

✅ Built-in Compliance Tools

Governance settings and reporting help meet regulatory needs

Taking The Next Steps

Get Started with Terminal

Understand Widget Types

View Use Cases

Explore API Reference

Read FAQ

This feature is only applicable for Purchase Address widget type.

  • Enabled – The same deposit address will be used for each transaction.

  • Useful for recurring or identifiable customers.

  • Can be reused for new deposits without creating a new widget.

  • Disabled – A new, unique deposit address is generated per session/transaction.

Expiration Time

This feature is only applicable for Purchase Address widget type.

  • Set a time window (in minutes) for how long the widget will remain valid after being opened.

  • This can be changed per blockchain as well, depending on the setting

  • Example: 15 minutes, 60 minutes.

Expiration Time Action

This feature is only applicable for Purchase Address widget type.

What should happen when the widget expires?

  • Fail the request – The transaction is invalidated.

  • Update the rate of the POS transaction – The widget remains usable, but the rate will refresh based on current market price.

Accept Partial Payment (Toggle)

This feature is only applicable for Purchase Address widget type.

  • Enabled – The widget will accept any amount deposited, even if it doesn’t match the target amount.

  • Use this when the deposit can vary or when customer balance might be uncertain.

  • Partial deposits will still be marked successful and trigger webhook notifications if applicable.

Redirect URL

  • This field is where you enter the URL where the customer will be sent upon successful purchase.

  • inabit will be add the identifier to the redirect URL.

Webhook URL

  • inabit will use this URL to send back webhook callbacks/notifications to this address.

Environments

inabit offers two workspace environments all under the same umbrella (Mainnet and Testnet)

Testnet is used for testing purposes, allowing developers to experiment without risking real assets. Mainnet is used to deploy into production for real-time operations with actual funds.

Technically, inabit hosts only one environment which is our production app at use.inabit.com, the testnet/development env sits within the organization-level.

Testnet Organization

Upon request, inabit will create a testnet organiztion for you.

Testnet is used as a blockchain network designed specifically for developers to conduct tests. It operates independently on its own blockchain, and its assets have no real monetary value. This makes it an ideal environment for experimenting with integration workflows and performing other operations as in the production environment, but without paying real-world fees.

Testnet faucets

Testnet faucets in blockchain are tools that give developers free test tokens for development environments, allowing them to test applications and transactions without risking real funds. These tokens mimic real cryptocurrency but hold no actual value, making them ideal for safe testing and debugging on blockchain platforms. You can use the faucets outlined in the document.

Note

inabit currently supports only EVM/Ethereum Sepolia testnet for testing purposes.

In a regular organization, mainnet is used as a fully operational blockchain network where cryptocurrency transactions are broadcast, confirmed, and recorded in real time. All assets on mainnet hold real-world monetary value. You use native assets to make transactions and pay network fees.

GET Widget by ID

GET All Widgets

Testnet faucets

Payment Service Providers

Prerequisites

Widget

Gas Sweeping

What is gas sweeping and how it works in our terminal

What is Gas Sweeping?

Gas Sweeping is an essential part of how inabit automates the secure movement of funds across deposit addresses and wallets. Every widget created within the inabit Terminal collects user deposits to unique, on-chain addresses. To ensure these funds are accessible and manageable at scale, inabit uses sweeping mechanisms to transfer them into centralized organization wallets.

Gas Sweeping refers to this automated fund consolidation, and requires blockchain-native gas fees to execute transactions securely and efficiently.

How Gas Sweeping Works

When users deposit funds via a widget (e.g., USDT on Tron or Ethereum), the funds initially sit in a dedicated deposit address generated for that session. To make these funds usable for your organization, the Terminal automatically "sweeps" them into a central wallet.

Key Behaviors

  • Sweeping is triggered based on the widget's configuration:

    • Daily, Weekly, On-demand, or Never

  • Each sweep consumes gas fees (TRX for Tron, ETH for Ethereum, etc.)

Smart Sweeping Design

  • Gas Separation: Gas for sweeping is drawn from your organization's gas station wallet, not from the deposit address, ensuring funds are always sweepable.

  • Fail-safe Logic: inabit’s infrastructure monitors sweep attempts and retries if gas is insufficient.

  • Fee Control: You can configure whether the gas cost is covered by you (the merchant) or passed on to the end user at the widget level.

Viewing Your Gas Balances Status

On the Terminal Dashboard, you’ll find a section showing gas balances per blockchain:

  • Tron

  • Ethereum

  • BSC (Binance Smart Chain)

  • Polygon

These balances represent how much gas is available to support sweep transactions.

✅ Best Practices

  • Keep your gas balances topped up to avoid failed sweeps.

  • Monitor the gas status from the dashboard.

  • Use the "Add Gas" feature (explained below) to easily fund your sweep stations.

GET Org Purchase by ID

Wallet Structures

Learn about the Terminal wallet structures and their roles in integration.

This document provides best practices and clear guidelines for merchants using our Terminal to manage their wallet structure. It explains how to set up and operate wallets in a self-custody environment, ensuring security, compliance, and operational efficiency. Merchants remain in full control of their funds, while following standardized practices to reduce risk and simplify treasury management.

1. Deposit Addresses (Purchase & Deposit Widgets)

Purpose:

Customer Address Widget via API

Overview

Use this flow when you want to keep your own UI while letting inabit Terminal handle the crypto backend. This guide covers only the Customer Address widget end-to-end backend flow: your backend will 1) identify the customer, 2) request a one-time address token, 3) (optionally) fetch allowed assets/blockchains, and 4) generate a deposit address for the chosen blockchain + asset.

Deposit Statuses

Receiving Purchase and Deposit Updates (Hybrid Webhook + API)

Deposit Statuses:

For Both Widget Types:

Deposit Statuses

Receiving Purchase and Deposit Updates (Hybrid Webhook + API)

Deposit Statuses:

For Both Widget Types:

Terminal-as-a-Service

An example use case of how the Terminal can be utilized.

Problem

White-label providers and embedded finance platforms want to offer crypto payments as part of their services, with tenant-level separation, compliance, and customization—without managing blockchain infrastructure internally.

Gas Features

Learn about our gas funding & sweeping as part of the terminal's operations

Overview

inabit’s Terminal includes robust gas management features that ensure seamless blockchain operations at scale. From automating transaction costs to allowing easy refueling, the Gas Features in the Terminal give your organization full control and reliability over how blockchain-native gas is handled across your payment infrastructure.

GET Widget Purchase by ID

GET All Widget Purchases

GET All Org Purchases

GET All Org Deposits

GET All Widget Deposits

To prevent failed or stuck transactions, inabit handles sweeping gas from a separate station wallet, not from the customer’s deposit address

Confirming – The full amount has been received, and the system is now waiting for the required number of blockchain confirmations to mark the deposit as successful.

  • Unconfirmed – A deposit has been detected on the blockchain but has not yet been included in a block (only relevant for UTXO-based networks such as Bitcoin).

  • Completed – The required number of blockchain confirmations has been received, and the deposit is finalized successfully.

  • PendingFork - Tx confirmed on a forked block; credit on hold until reorg resolves. After settlement, the deposit may complete or fail.

  • Failed - The deposit cannot be credited (e.g., transaction invalid/dropped, double-spent or replaced via RBF to a different address). The payment attempt should be considered unsuccessful.

  • Purchase Widget Type only:

    • Initiated – The deposit request has been created, but no blockchain deposit address has been assigned yet.

    • Allocated – A unique blockchain address has been successfully generated and linked to the deposit.

    • Undercharge – The customer deposited less than the expected amount, but the deposit window is still active, allowing them to complete the payment.

    • UnderchargeExpired – The customer deposited less than the required amount, and the payment window has expired, meaning the transaction cannot be completed.

    • Overcharge – The customer deposited more than the required amount. The deposit will still be processed, and the system may handle the excess according to predefined rules (e.g., ignore, credit, or refund).

    • Expired – The customer did not complete the payment within the allowed time window, and the transaction is no longer valid.

    Confirming – The full amount has been received, and the system is now waiting for the required number of blockchain confirmations to mark the deposit as successful.

  • Unconfirmed – A deposit has been detected on the blockchain but has not yet been included in a block (only relevant for UTXO-based networks such as Bitcoin).

  • Completed – The required number of blockchain confirmations has been received, and the deposit is finalized successfully.

  • PendingFork - Tx confirmed on a forked block; credit on hold until reorg resolves. After settlement, the deposit may complete or fail.

  • Failed - The deposit cannot be credited (e.g., transaction invalid/dropped, double-spent or replaced via RBF to a different address). The payment attempt should be considered unsuccessful.

  • Purchase Widget Type only:

    • Initiated – The deposit request has been created, but no blockchain deposit address has been assigned yet.

    • Allocated – A unique blockchain address has been successfully generated and linked to the deposit.

    • Undercharge – The customer deposited less than the expected amount, but the deposit window is still active, allowing them to complete the payment.

    • UnderchargeExpired – The customer deposited less than the required amount, and the payment window has expired, meaning the transaction cannot be completed.

    • Overcharge – The customer deposited more than the required amount. The deposit will still be processed, and the system may handle the excess according to predefined rules (e.g., ignore, credit, or refund).

    • Expired – The customer did not complete the payment within the allowed time window, and the transaction is no longer valid.

    Solution

    Inabit Terminal supports multi-organization setup, allowing the integrator to create separate environments (sandbox or mainnet) per client. Each client has its own widgets, webhooks, settlement flows, and settings—all centrally managed.

    Actors

    • Platform integrator (white-label provider)

    • Sub-clients (merchants, financial apps, platforms)

    • End customers

    Integration Flow Explained

    1. Integrator contacts Inabit support to enable Terminal for their main organization. Implement the Inabit Approval App to authorize API operations and widget management.

    2. For each client, create a dedicated Inabit organization via admin tools or API.

    3. Create Customer Address or Purchase Address widgets for each organization.

    4. Sub-client embeds the widgets into their checkout or product interface.

    5. Each sub-client receives its own webhook events for transaction updates.

    6. Integrator manages settlement, compliance, and reporting across clients.

    Relevant Features

    • Full organizational isolation per client

    • Custom webhook URLs, policies, and widget configuration

    • Central management for compliance and analytics

    • Widget branding per sub-organization

    • Crypto-to-fiat off-ramp options per tenant

    Benefits

    • Scalable crypto payment infrastructure for platforms with many clients

    • Complete white-label capability

    • Segregated data and flows per tenant

    • Centralized control over technical and financial flows

    Gas Sweeping

    Whenever a user makes a deposit through a widget, the funds are initially stored in a dedicated blockchain address. To centralize and secure these funds, inabit automatically sweeps them into your organization's main wallet using a process called Gas Sweeping.

    This process requires gas fees (e.g., ETH, TRX, MATIC), which are not deducted from the user’s deposit. Instead, they are handled through your organization’s Gas Station Wallet, ensuring reliability and avoiding failed transactions.

    Sweeping frequency is fully configurable:

    • Daily

    • Weekly

    • On-demand

    • Never (manual sweep only)

    ➡️ Read more about Gas Sweeping →

    Gas Refueling

    To support sweeping and other blockchain operations, inabit provides an easy way to top up gas balances directly from the Terminal.

    You can refuel your Gas Station Wallet by:

    • Paying with a credit card (select chain, amount, and billing details)

    • Sending crypto to a dedicated funding address per blockchain

    These funds are stored securely and used exclusively to cover gas fees for sweep operations — not user balances or purchases.

    ➡️ Read more about Gas Refueling →

    Why It Matters

    • No need to rely on user deposits having spare gas

    • Automated fund consolidation keeps your assets secure and organized

    • Reduce operational risk with proactive refueling and monitoring

    • Works across multiple blockchains: Ethereum, Tron, Polygon, BSC, and more

    Wallet addresses generated under the merchant/PSP’s ownership.

  • Serve as the entry point for customer funds, used in two ways:

    • Purchase Widget → a customer sends crypto to pay for a specific order/invoice.

    • Deposit Widget → a customer funds their merchant/PSP account balance.

  • Provide full traceability by linking deposits to a specific customer or order.

  • Type:

    • API Wallets (created per customer/purchase request).

    Wallet Policy:

    • Funds from Deposit Addresses are swept exclusively into the Master Wallet.

    • Designed for short-term holding only; balances should not remain idle.

    • Every address must be tied to a customer ID/ purchase ID

    Who Uses It:

    • Merchant/PSP → owns and manages these addresses via inabit terminal API

    • End-customer → only sends funds to the address (no control beyond payment).

    2. Master Wallet

    Purpose:

    • A UI wallet serving as the main consolidation hub for swept funds from Deposit Addresses.

    • Acts as the core treasury.

    Type: UI Wallet (with system-level sweeps feeding into it).

    Wallet Policy:

    • Funds flow in automatically from Deposit Addresses.

    • Funds can only move out to internal wallets (Refund Wallet, Operational Wallet) or to system-approved actions (On/Off-Ramp, Swap).

    • Outbound transactions are governed by strict merchant-defined policies (e.g., approval thresholds per transaction amount, role-based approval, multi-sig).

    • No direct payouts to external addresses are permitted from this wallet.

    Who Uses It:

    • Merchant/PSP treasury/finance teams for managing liquidity allocations.

    • Policy and approval settings configured by merchant admins in the UI.

    3. Operational Wallet

    Purpose:

    • Active working capital for day-to-day merchant/PSP operations.

    • Used for settlements and payouts.

    Type: UI wallet

    Wallet Policy:

    • Weekly rebalancing from Master Wallet (customizable).

    • Withdrawal limits + approval workflow recommended.

    • Multi-sig for high-value transfers.

    Who Uses It:

    • Merchant finance teams.

    • PSP operators managing liquidity cycles.

    4. Refund Wallet

    Purpose:

    • A dedicated wallet used solely for processing customer refunds.

    • Separates refund liabilities from operational and treasury funds, ensuring clear audit trails.

    Type:

    • API Wallet → for large companies/PSPs that automate their refund flows directly via API.

    • UI Wallet → for smaller companies that process refunds manually through the dashboard.

    Wallet Policy:

    • Funded only from the Master Wallet (no direct customer deposits).

    • Rebalanced daily or per merchant policy to maintain only the required float.

    • All refunds must be executed from this wallet to guarantee traceability and reporting.

    • Policy rules can enforce limits per refund transaction and approval chains where relevant.

    Who Uses It:

    • Large companies → automated refund system via API integration.

    • Small companies → merchant support or finance staff using the UI for manual refund approvals and execution.

    Terminal Entities

    Learn about the entities surrounding our payments terminal

    Account

    An Account in Inabit is the top-level entity that governs access, ownership, and identity across the platform. Each account has a single owner and can contain one or more organizations beneath it. All users are created at the account level, where their credentials (e.g., login details, authentication methods) are managed centrally. These users can then be assigned to one or multiple organizations, each with specific roles and permissions.

    The mobile app and web platform operate at the account level, providing unified access and navigation across all linked organizations. This model enables clear separation of data and operations per organization, while allowing account users to manage multiple business entities from a single secure login.

    Organization

    An Organization in Inabit represents an isolated operational unit within an Account. It serves as a container for blockchain configurations, wallets, policies, and approval logic specific to a particular business entity, brand, or environment (such as sandbox vs. mainnet).

    Each Account can have multiple organizations, allowing a single user base to manage and operate across distinct environments or clients while keeping operational and financial data completely separated. Organizations control their own blockchain settings, asset management, and custody setup.

    Merchant

    A Merchant refers to a specific business or client that receives crypto payments through the Inabit Terminal. Merchants operate under a parent organization and may represent a single store, a brand, or a tenant in a multi-client setup. Each merchant can have its own branding, business logic, and webhook URLs. In multi-tenant or white-label models (e.g., Terminal-as-a-Service), a separate organization can be provisioned per merchant to ensure full data and operational isolation. Merchants use widgets to accept payments and interact with their end customers.

    Widget

    A Widget is the core interface used to accept crypto payments. It is a lightweight, embeddable component that generates a deposit address (and QR code) and displays it to the customer. Widgets handle the entire crypto payment lifecycle—from address creation and payment detection to confirmation and status updates. Inabit supports two types of widgets:

    • Purchase Address Widget: For one-time payments (e.g., a checkout or invoice)

    • Customer Address Widget: For recurring or persistent use (e.g., top-up wallets)

    Widgets can be created and managed via the Inabit Dashboard (no code) or the GraphQL API, and can be configured with parameters such as expiration time, confirmation threshold, and address reuse behavior.

    Scope
    • Widget type: Customer Address only (not Purchase or other widgets).

    • Side: Backend/server only (no client-side API calls here).

    Security (important):

    • All API calls on this page must be made from your server

    • Never expose your Widget API Key to the browser or mobile client.

    Prerequisites

    • A Customer Address widget configured in the inabit UI (copy the Widget API Key from the code/snippet panel).

    • The list of blockchains you want to support in the widget (configure in the UI).

    Base URL : https://api.inabit.biz

    Step 1 - Create or Get the Customer UUID

    Each customer is identified by a customerUuid. Use your own stable identifier (email, user ID) as the customerIdentifier.

    1.1 Create (if the customer does not exist)

    Response

    1.2 Get existing customer id

    If the customer already exists and you saved the customer id - you can skip this step do go to create token)

    Response

    Step 2 - Create an Address Token for the Customer

    The address token authorizes address creation for this specific customer.

    Response

    • Store the addressGenerationToken temporarily (it’s one-time/short-lived).

    From this point on, the Authorization header must use the address token, not the API key.

    Step 3 - (Optional) Fetch Allowed Assets/Blockchains

    If needed fetch the widget asset list

    Response

    This is the list of all supported asset for the widget.

    Step 4 - Generate the Deposit Address (per Blockchain & Asset)

    Request the address for the chosen blockchain and asset.

    Response

    Use data.address as the customer’s deposit address for that blockchain/asset and save it for further use of the customer (this will be the customer’s address moving forward for this given blockchain and Asset)

    curl --location 'https://api.inabit.biz/v1/customer' \
      --header 'Content-Type: application/json' \
      --header 'Authorization: Bearer {widget api key}' \
      --data-raw '{
        "customerIdentifier": "[email protected]"
      }'
    {
      "data": {
        "id": "f8a68b70-657d-4bfb-b343-52e733f4e78b",
        "widgetId": "85b8e3d5-1030-4a7c-8e64-5269462ec811",
        "customerIdentifier": "[email protected]"
      }
    }
    curl --location 'https://api.inabit.biz/v1/[email protected]' \
      --header 'Authorization: Bearer {widget api key}' \
      --data ''
    {
      "data": {
        "id": "54c18bc5-70d3-45bd-81c2-e2bbaba27464",
        "widgetId": "85b8e3d5-1030-4a7c-8e64-5269462ec811",
        "customerIdentifier": "[email protected]"
      }
    }
    curl --location 'https://api.inabit.biz/v1/customer/address-token' \
      --header 'Content-Type: application/json' \
      --header 'Authorization: Bearer {widget api key}' \
      --data '{
        "customerUuid": "54c18bc5-70d3-45bd-81c2-e2bbaba27464"
      }'
    {
      "data": {
        "customerUuid": "54c18bc5-70d3-45bd-81c2-e2bbaba27464",
        "addressGenerationToken": "b92605cb-ed0d-4d7e-89d4-a03f3ec26a6a"
      }
    }
    curl --location 'https://api.inabit.biz/v1/customer/asset' \
      --header 'Authorization: Bearer b92605cb-ed0d-4d7e-89d4-a03f3ec26a6a' \
      --data ''
    {
      "data": {
        "assets": [
          { "asset": "TRX",  "blockchains": ["tron"] },
          { "asset": "USDT", "blockchains": ["tron"] },
          { "asset": "BUSD", "blockchains": ["ethereum"] }
        ],
        "total": 3
      }
    }
    curl --location 'https://api.inabit.biz/v1/customer/deposit-address' \
      --header 'Content-Type: application/json' \
      --header 'Authorization: Bearer b92605cb-ed0d-4d7e-89d4-a03f3ec26a6a' \
      --data '{
        "blockchain": "tron",
        "asset": "TRX"
    }'
    {
      "data": {
        "id": 273,
        "address": "TTf28GEr2eGKAB5YnhnE1x38b9QB6CArSe",
        "walletIdInabit": "cmcf6ko51000l6701ho72vqgw",
        "blockchainCode": "tron",
        "customerId": "54c18bc5-70d3-45bd-81c2-e2bbaba27464",
        "widgetId": "85b8e3d5-1030-4a7c-8e64-5269462ec811"
      }
    }

    Customer Address Widget

    Important Note:

    Widget Types Supported in inabit: Inabit currently supports two widget types, each with its own implementation instructions.

    The information displayed below is an example of how a widget implementation setup/guide looks like. You can access your widget implementation guide at all times by clicking the "Code" Icon on the widget drawer that's pinned to the top right hand side of the

    Customer Address Widget

    Step 1: Implement Server-Side Terminal Call

    Create or Retrieve a Customer Profile (Backend)To initialize the widget for a user, you must first ensure a customer profile exists in the backend system. This is identified by a unique customerIdentifier (e.g., the user’s email or internal ID). Depending on whether the user is new or already exists, follow the appropriate substep:

    a. Create a New Customer (if not yet created)

    If the user does not already exist in your backend, send a POST request to create a new customer profile:

    b. Retrieve Existing Customer (if already created)

    Store this id securely as customerUuid for future requests.

    If you’ve already created a customer but did not save their UUID, you can retrieve it using their customerIdentifier:

    c. Once you have the customerUuid, you can proceed to generate the address token in the next step and then add the snippet for the token request:

    Widget API Key: (i.e.) 8119595e07cb3a87ccfa46..............1885e89d7ef4ed8c2cb

    Note, your actual API Key will be displayed on the widget implementation guide per widget created, you will be able to copy it from there directly.

    Step 2: Add Script Tag to page Header

    a. Add the following script tag to your page header:

    Step 3: Call open.widget Function

    Call openwidget function with token id, should open in popup After the customer clicks on the button (buy with crypto for example )

    Note, in this step, you'll be able to choose if the widget will be open as a re-direct or as an iFrame (inline with your user interface).

    Each of the types has different open.widget functions formats, as shown below.

    Redirect:

    Inline (iFrame):

    Need any further help? Feel free to if you encounter any issues during the widget implementation process.

    New to Crypto Payments

    An example use case of how the Terminal can be utilized.

    Customer Profile

    A traditional Payment Service Provider (PSP) that currently processes fiat payments and wants to offer crypto as a new payment method to its merchants. The PSP has no prior blockchain infrastructure and wants to add crypto with minimal complexity.

    Problem

    The PSP’s merchants are asking to accept crypto, but the PSP lacks the technical expertise, custody solution, and blockchain monitoring tools to support this in-house.

    Solution

    Inabit Terminal provides a full crypto payment stack out-of-the-box. The PSP can create widgets through the UI or API, embed them into merchant checkouts, and manage all payments without handling wallets or private keys. Settlement can be performed in crypto or off-ramped to fiat.

    Actors

    • PSP (operator)

    • Merchant (PSP’s client)

    • End customer (payer)

    Integration Flow Explained

    1. PSP contacts Inabit support to enable Terminal for their organization (sandbox or mainnet).

    2. Implement the Inabit Approval App to authorize access and manage keys.

    3. PSP creates and configures widgets via the Inabit Dashboard (no code required).

    4. Widgets are embedded into merchant checkout or point-of-sale systems.

    Relevant Features

    • UI-based onboarding and widget creation

    • Self-custody setup with secure key management

    • Crypto-to-fiat settlement options

    • Per-widget webhook notifications

    Benefits

    • Launch crypto payments without internal development

    • Add new revenue stream from crypto transaction volume

    • Stay competitive by offering merchants modern payment methods

    • Easily scale across chains and merchant types

    Recieving Updates

    Receiving Purchase and Deposit Updates (Hybrid Webhook + API)

    This document provides best practices for receiving Purchase and Deposit updates from Inabit Terminal. It explains how to combine Webhooks (for instant notifications) with the GET API (for reconciliation and reliability).

    Goal: A simple, reliable setup to receive purchase and deposit updates using both:

    • Webhooks for instant notifications

    • GET API backup for periodic reconciliation and gap-filling.

    The hybrid approach is the recommended method for production.

    1) Why Hybrid?

    • Immediate updates: Webhooks deliver events as they happen (e.g. IncomingTransactionReceived, PurchaseInitiated ).

    • Resilient: If a webhook is delayed, retried, or missed, the GET API fills the gap.

    • Accurate: Regular API polling verifies totals, confirmations, and states.

    2) Minimal Setup

    Webhook push

    • Inabit Terminal sends an HTTPS POST for each deposit or purchase event. (Refer to )

    • Merchant endpoint should:

    • Validate JSON & schema.

    • Respond with 2xx within 5s after basic checks.

    GET API pull

    • Poll events by timestamp (starting from the last processed event).

    • Maintain a durable checkpoint (last handled timestamp).

    • Recommended polling frequency: every 2–3 minutes.

    • Use the last timestamp as the starting point and set the end time with ~1 minute delay to ensure no missed events.

    Integrating with inabit

    An example use case of how the Terminal can be utilized.

    Problem

    Platforms and SaaS companies want to embed crypto payments into their own products—such as booking systems, subscriptions, or digital goods—but need a flexible, event-driven architecture that’s easy to integrate.

    Solution

    Inabit Terminal allows developers to create widgets tied to customer flows and receive real-time payment events via webhooks or polling APIs. This makes it easy to trigger business logic such as access provisioning, notifications, or fulfillment.

    Actors

    • Platform developer

    • Platform user

    • End customer

    Integration Flow Explained

    1. Developer contacts Inabit support to enable Terminal in sandbox or mainnet.

    2. Implement the to authorize API operations and widget management.

    3. Create a for each platform user or transaction.

    4. Embed the widget into the platform’s UI (e.g., checkout page, account dashboard).

    Relevant Features

    • Persistent or transaction-specific addresses

    • Webhook events: pending, confirmed, expired

    • Polling option via Terminal API

    • Sandbox for testing and validation

    Benefits

    • Fits seamlessly into existing SaaS workflows

    • Enables automated crypto payment handling

    • Supports recurring payments or on-demand events

    • Minimal backend complexity

    Testnet Faucets

    List of available faucets to use to retrieve testnet assets

    Testnets provide a development environment where developers can test and debug features and applications without any real-world financial implications. Testnet tokens mimic the behaviour of real tokens but have no monetary value, and thus, are essential for executing transactions in the development environments.

    The following table outlines testnet faucets across different blockchains.

    Chain Name
    Faucet Name
    Faucet URL
    Description

    Bitcoin

    Bitcoin Testnet 4 Faucet

    Provides BTC testnet funds for Testnet 4

    Note

    The availability of the faucets listed in the table above may change over time. Developers are advised to visit the respective faucet URLs to confirm functionality.

    Payment Service Providers

    Guide describing how PSPs integrate with inabit’s our Terminal Gateway API

    Overview

    This guide describes the end-to-end integration between a PSP and inabit to power crypto payments for multiple merchants under a single PSP-owned account. The integration provides a compliant, secure, and scalable self-custodial setup using inabit’s infrastructure, paired with the PSP’s front-end and back-office systems.

    Key Highlights

    • Single PSP account on inabit; each merchant is mapped to its own widget

    Support and FAQ

    Support

    If you need assistance at any stage of your integration:

    • Email: [email protected]

    • Enterprise Clients: Use your dedicated support channel (Slack/Telegram), as well as our ticket system in our help center at:

    Enable Crypto Checkout

    An example use case of how the Terminal can be utilized.

    Problem

    Merchants want to accept crypto payments online or in-store without managing wallets, keys, or complex integrations. They need a way to easily accept crypto while maintaining control and compliance.

    Crypto-friendly PSP

    An example use case of how the Terminal can be utilized.

    Customer Profile

    A Payment Service Provider (PSP) already offering some crypto services, or working with crypto-native clients, that wants to upgrade to a robust, production-grade crypto payment solution with more control, scalability, and compliance.

    Solution

    Inabit Terminal provides embeddable Point-of-Sale widgets that issue deposit addresses and track incoming payments in real time. These widgets can be used for both physical checkout (QR code) and online purchases.

    Actors

    • Merchant

    • End customer

    Integration Flow Explained

    1. Merchant (or PSP on their behalf) contacts Inabit support to enable the Terminal feature.

    2. Implement the Inabit Approval App to authorize API operations and widget management.

    3. Create a Purchase Address widget through Inabit’s API.

    4. Embed the widget on the merchant’s checkout page or display the QR code at a physical terminal.

    5. Customer scans the QR code or copies the address to pay in crypto.

    6. Inabit Terminal detects the incoming transaction and confirms it.

    7. Merchant receives a webhook and completes the order (shipping or service delivery).

    Relevant Features

    • QR code generation with every widget

    • Configurable expiration, confirmation requirements, and underpayment tolerance

    • Support for single-use or reusable addresses

    • Works across major crypto networks and assets

    • Fully compatible with eCommerce flows

    Benefits

    • Accept crypto with no in-house wallet infrastructure

    • Real-time transaction visibility and automatic order updates

    • Simple and fast deployment

    When customers pay in crypto, Inabit monitors the blockchain and confirms payment.

  • PSP receives webhook updates and notifies merchants or settles transactions accordingly.

  • No blockchain expertise required
    Problem

    The PSP may already support crypto payments using basic infrastructure or third-party wallets, but needs better custody, webhook handling, gas management, and multi-chain support to scale effectively and serve higher volumes securely.

    Solution

    Inabit Terminal provides a scalable infrastructure for crypto payments with advanced customization, organizational hierarchy, and integration tooling. PSPs can operate multiple organizations (e.g., per merchant) and automate flows via API, enabling enterprise-grade crypto payment processing.

    Actors

    • PSP (integration owner

    • Merchant clients (end users)

    • End customers (crypto payers)

    Integration Flow Explained

    1. PSP enables Terminal via Inabit support.

    2. PSP Implements the Inabit Approval App to access wallets and configure permissions.

    3. PSP provisions organizations per merchant or segment (optional).

    4. Widgets are created via the API with specific chains, assets, confirmation settings.

    5. PSP integrates webhooks and/or uses polling to update merchant systems in real time.

    6. PSP manages gas, settlements, and off-ramp logic through Inabit’s APIs and dashboards.

    Relevant Features

    • GraphQL API for full automation

    • Multi-org setup for merchant isolation

    • Advanced gas controls and refueling

    • Webhook reliability with retries

    • Support for on-chain settlement, fiat conversion, and reporting

    Benefits

    • Full control over payment flows and configurations

    • Scalable architecture for high-volume PSP operations

    • Enhanced compliance, visibility, and automation

    • Better UX for crypto-native and hybrid merchants

    Enqueue the event for asynchronous processing (avoid heavy logic in the webhook).

  • Retries: If no 200 response is received, Inabit retries delivery.

  • Signature: Support for signing will be added in future. In the meantime, merchants can validate by cross-checking the event using the GET API by Purchase/Deposit ID endpoint.

  • Webhooks

    Customer sends crypto to the address; Terminal detects and confirms the transaction. Platform receives webhook or polls the API to get status.

  • Business logic is executed (e.g., subscription activated, content delivered, balance credited, etc.).

  • Advanced widget configuration (e.g., max confirmations, sweeping frequency)
    Inabit Approval App
    Customer Address widget

    Ethereum

    Web3 Faucet

    Google Cloud Web3 Faucet

    Provides Ethereum testnet funds for Sepolia​​.

    Ethereum

    Multichain Faucet

    Faucet Link

    Provides free testnet funds for Sepolia​​.

    Solana

    Sol Faucet

    moralis.io

    Provides testnet SOL​​.

    Ripple

    XRP Testnet Faucet

    test.bithomp.com

    Awaiting activation for XRP testnet tokens

    coinfaucet
    reach out to us
    curl --location https://api-stage.inabit.biz/v1/customer
    --header Content-Type: application/json
    --Authorization: Bearer 8119595e07cb3a87ccfa46cf32d989ad2c10349bee26d1885e89d7ef4ed8c2cb
    data-row-{
      customerIdentifier: [email protected]
    }
    Response: The API will return a JSON object containing the customer's UUID (id)
    which will be required in subsequent steps
    {
      "data": {
          "id": "customer-uuid",
        }
    }
    curl --location https://api-stage.inabit.biz/v1/customer?customerIdentifier=encoded_email
    --header Content-Type: application/json
    --Authorization: Bearer 8119595e07cb3a87ccfa46cf32d989ad2c10349bee26d1885e89d7ef4ed8c2cb
    Response:The API will return the customer object containing the UUID:
    {
        "data": {
            "id": "customer-uuid",
         }
    }
    curl --location 'https://api-stage.inabit.biz/v1/customer/address-token'
    --header Content-Type: application/json
    --Authorization:Bearer 8119595e07cb3a87ccfa46cf32d989ad2c10349bee26d1885e89d7ef4ed8c2cb
    "data":{
        "customerUuid": "27b4f808-be6c-4701-bff3-6eeaad8389e9"
    }'
    Response: The API will return a JSON object containing the token id which will be required in subsequent steps.
    {
      "data": {
                customerUuid": "customer-uuid",
                addressGenerationToken: "address-token-id",
        }
    }
    <script src="https://stage.inabit.biz/widget.js" ></script>
    //token id is the id from response of previous step.
      window.openWidget(tokenId)
    
    //if you want to open the widget in a popup, you can use the following code:
      window.openWidget(tokenId, {mode:'popup'})
    //token id is the id from response of previous step.
      window.openWidget(tokenId, {mode:'iframe'})
    
    //You can set full width to true to open the widget in 100%
      window.openWidget(tokenId, {mode:'iframe'}, {fullWidth: true})

    Treasury owned by the PSP: automatic sweeping, crypto-to-crypto swaps, withdrawals, and off-ramping executed under PSP policy and compliance.

  • Remote Approver App (Approver Docker) hosted by the PSP or managed by inabit to enforce policy-based approvals.

  • Operational visibility via webhooks plus safety-net API polling for deposits/withdrawals, enabling accurate settlement and reconciliation per merchant.

  • This approach gives the PSP full operational control and compliance ownership while delivering fast merchant onboarding, reliable settlement, and transparent status updates—without requiring merchants to manage crypto infrastructure.

    2. Architecture & Concepts

    Before integrating, it is critical to understand the three main components of the inabit ecosystem:

    A. Wallet Hierarchy

    inabit utilizes a dual-wallet system to separate customer deposits from treasury operations:

    • API Wallets (Deposit Addresses): These are generated programmatically for every transaction or customer. They serve as the entry point for funds and automatically sweep received assets into your central treasury.

    • UI Wallets (Treasury & Operations): These are the permanent wallets managed via the Inabit Dashboard or Admin API (e.g., Master Wallet, Operational Wallet). They are used to aggregate funds, manage liquidity, and execute settlements.

    Important: For the mandatory architecture regarding how to separate your Master Wallet (Cold/Treasury) from your Operational Wallet (Hot/Settlement), please refer to the [Wallet Structures Best Practices] guide.

    B. The Approver (Security Layer)

    inabit utilizes a "Remote Approver App" (Approver Docker) to enforce security policies.

    • Function: It cryptographically signs transactions based on your defined policies (e.g., "Auto-approve transfers under $10k").

    • Deployment: You can Self-Host (recommended for full control) or use inabit-Hosted (managed service).

    C. API Structure

    The integration uses a hybrid API approach:

    • GraphQL API: Used for backend operations (Withdrawals, Wallet Management, Reporting).

    • REST API (Terminal): Used for frontend payment intent creation and widget rendering.

    3. API Credentials

    Once onboarding is complete, inabit generates the following keys. (except for the widget API key, that is generated upon widget's creation) You must use the correct key for the specific task:

    Which key do I use, and when?

    Action
    Use this key
    Why / Scope
    Provided when
    Tiny header example

    Create/list UI wallets create withdrawals,view wallets, open new wallet, add coins

    API Admin (GraphQL)

    Platform-level ops & governance

    At account opening - provided by inabit Support

    Authorization: Bearer <API_ADMIN_TOKEN>

    Org-wide Terminal reads (e.g., get all widgets, get all customers), org-scoped deposit lookups

    Terminal Organization API Key (REST)

    Organization-level Terminal access across widgets/customers

    When Terminal is enabled - provided by inabit Support

    Authorization: Bearer <TERMINAL_ORG_API_KEY>

    Additional Reference

    We highly advise taking a look at the following pages as you start developing:

    • API Login Access / Authentication

    • Remote & Automatic Approvals (Docker Configuration)

    • Automate Signing Transactions

    • Supported Blockchains & Assets

    4. Onboarding to inabit

    a. Open account + pairing

    b. signs up: https://use.inabit.com/create_account

    c. Pair the owner’s mobile device (key custody + approvals). Device pairing enables secure, policy-enforced approvals for sensitive actions.

    d. inabit Enables API Access

    inabit automatically generates two API users.

    • API Signer

      • Created for the sole purpose of serving as the "Approver" to sign transactions using inabit's Approvals Docker.

    • API Admin

      • Serves as the API key/access user for inabit's API endpoints.

    Note that the account owner will need to approve the creation of these users on the inabit mobile app.

    Learn more about API User Roles in this dedicated guide.

    e. Open UI wallets

    What is a Master Wallet?

    The Master Wallet serves as the central aggregator for all crypto transactions and funds flow. It is a secure, self-custody wallet

    For recommended best-practice wallet structures, see here: For inabit wallet types guide, see here

    f .Implement Remote Approver App

    The Remote Approver App (Approver Docker) enables policy-based, automated approvals for API wallets only (it does not apply to UI wallets).

    Deployment options

    • Self-hosted (recommended default): One-time Docker setup via the inabit CLI on your own infrastructure.

    • Setup & configuration guide

    • inabit-hosted (managed): inabit can host and operate the Remote Approver App for you

    • For inabit-hosted contact inabit support

    When to choose which?

    • Choose self-hosted if you require full infrastructure control or have strict internal hosting policies.

    • Choose inabit-hosted to reduce ops overhead; in this managed mode, API wallets can transfer funds only to internal wallets within your organization, and you still retain self-custody via your approval policies and paired identities.

    5. Enabling Terminal

    To enable inabit Terminal, contact our Support.

    As part of activation:

    1. Provide us with a generic webhook callback URL to serve as the organization-level default for events.

    2. inabit will activate Terminal and return an Organization API Key for communicating with the inabit Terminal API at the org scope.

    6. Creates & Configures Widgets

    Widget Creation

    Widgets are created and managed directly in the inabit Terminal UI. The PSP creates a separate widget for each merchant, and configures its parameters (supported blockchains, assets, visual settings) and generates the widget-specific API key and snippet, which is then embedded.

    Widget Configuration

    Choosing the Right Widget Type:

    The PSP selects and configures the widget per merchant use case. inabit supports two types: Purchase Address and Customer Address.”

    Example use case
    Widget type to use
    Why

    One-time payment per transaction (e.g., single bet, fixed-price checkout, specific game session)

    Purchase Address

    Creates a time-boxed, amount-bound address per purchase with clear success/expiry states.

    Funding a customer wallet / account balance with flexible amounts used across sessions

    Customer Address

    Provides a persistent address per customer for ongoing top-ups and balance management.

    Dedicated address per customer for recurring deposits, reconciliation, and linking on-chain flows to a user profile

    Customer Address

    Stable, per-customer address simplifies reconciliation and KYC/accounting.

    Quick picker:

    • Need exact amount + expiry for a single transaction? → Purchase Address

    • Need recurring or flexible deposits tied to a customer? → Customer Address

    Implementation notes:

    • Both types support: confirmations policy, auto-sweep to Master Wallet, and coin/chain allow-lists.

    • Typically: shorter expiry for Purchase Address; no expiry (or long TTL) for Customer Address.

    For a full description of widget types, their behavior, and recommended use cases, see here :


    Functionality Settings

    Once the widget type is chosen, customize the widget based on the merchant’s requirements. inabit offers robust, per-widget configuration options that allow fine-tuning of how each widget behaves. Key parameters include:

    • Supported Coins – Define which cryptocurrencies the widget will accept.

    • Deposit Amount – (Purchase Address only)

    • Predefined: The widget displays a specific amount to be deposited by the end-customer.

    • Flexible: The widget does not enforce a specific deposit amount, allowing users to send any amount to the assigned address. In this mode, the deposit address remains the same for that customer/session, and any funds received at that address will be credited accordingly.

    • Sweeping Frequency – Set how often received funds are automatically moved to the Master Wallet.

    • Expiration Time (Purchase Address only) – Configure how long each payment request remains valid.

    • Blockchain Confirmations – Configure the required number of confirmations per chain.

    These and other advanced options allow for flexible and secure integration into any existing merchant flow.

    For the full list of available settings and best practices, refer to:

    • Creating Widgets Guide

    • Advanced Widget Settings

    Customizing the Widget Interface / UX

    By default, you can adjust the following UI parameters:

    • Widget Name – A unique name to identify your widget (e.g., “Basic Plan Payment”).

    • Description (Optional) – Short text explaining what this widget is used for.

    • Merchant Name (Optional) – Merchant name displayed to the end user (if applicable).

    If further customization is required:

    Is required (logos, fonts, colors, layout, etc.), you can override the widget’s CSS.

    The merchant (or the PSP on their behalf) can also decide whether to let the end user select the asset & blockchain inside the widget. The widget can always be reviewed in preview mode before going live to ensure it looks and behaves as expected.

    (Example widget preview details and images remain as in the original guide.)


    Installs Widgets

    inabit supports multiple, straightforward implementation methods per widget type. Choose the approach that best fits your stack and UX-each method is intuitive and easy to set up.

    Purchase Address Widget (one-time, amount-bound)

    Supported methods:

    1. Redirect

    2. API:

    A. Redirect-API (hosted flow)

    Best for: quickest go-live and minimal frontend work.

    • How it works: Create a purchase via API → receive a hosted URL → redirect the customer. Full flow.

    B. Embedded-API (embedded/open on demand)

    Best for: full control from your app with a light client snippet.

    • How it works: Create a purchase via API → open the widget using the purchase id (popup or new window). Widget implementation guide

    Customer Address (persistent address per customer)

    Supported methods:

    1. Redirect

    2. iframe

    3. API

    A. Redirect (hosted flow):

    Best for: fastest integration when you want inabit to fully host the UI.

    • How it works: Create/obtain the Customer Address session or token → redirect the user to the hosted page tied to that customer. Widget implementation guide

    B. iframe (embedded hosted UI):

    Best for: native feel while keeping low frontend effort.

    • How it works: Generate the Customer Address URL (session/token) server-side → embed in an <iframe> in your account page. Widget implementation guide

    C. Fully API:

    Best for: fully custom UI with your own components.

    • How it works: Use inabit’s APIs to create or fetch the customer’s persistent address, show it in your UI, and track status via webhooks. Widget implementation guide


    Deposit Management

    How Will the PSP Stay Up-to-Date on Incoming Deposits?

    In many industries it's common practice to lock funds once a deposit transaction is detected on-chain, even before it has been fully confirmed. This provides a better user experience by showing a successful deposit immediately-while still protecting the merchant by making the funds non-withdrawable until sufficient blockchain confirmations are received.

    inabit's system fully supports this flow: once a transaction is detected, it updates the widget with a pending confirmation status, allowing the platform to reflect the deposit in the UI while ensuring risk mitigation through backend-level enforcement of fund availability only after confirmation.

    Best practice for monitoring deposits: use a hybrid of webhooks and API polling for real-time state changes, plus periodic polling as a safety net (e.g., to recover from missed callbacks or network hiccups). See the full guidance here.

    To keep the PSP in sync, inabit emits webhook callbacks for each deposit event and any status change, enabling real-time tracking and deterministic, status-based logic within the PSP’s environment.

    List of Potential Deposit Statuses:

    Purchase Address - only

    • Initiated – The deposit request has been created, but no blockchain deposit address has been assigned yet.

    • Allocated – A unique blockchain address has been successfully generated and linked to the deposit.

    • Undercharge – The customer deposited less than the expected amount, but the deposit window is still active, allowing them to complete the payment.

    • UnderchargeExpired – The customer deposited less than the required amount, and the payment window has expired, meaning the transaction cannot be completed.

    • Overcharge – The customer deposited more than the required amount. The deposit will still be processed, and the system may handle the excess according to predefined rules (e.g., ignore, credit, or refund).

    • Expired – The customer did not complete the payment within the allowed time window, and the transaction is no longer valid.

    For both widget types (Purchase Address & Customer Address):

    • Confirming – The full amount has been received, and the system is now waiting for the required number of blockchain confirmations to mark the deposit as successful.

    • Unconfirmed – A deposit has been detected on the blockchain but has not yet been included in a block (only relevant for UTXO-based networks such as Bitcoin).

    • Completed – The required number of blockchain confirmations has been received, and the deposit is finalized successfully.

    • PendingFork - Tx confirmed on a forked block; credit on hold until reorg resolves. After settlement, the deposit may complete or fail.

    • Failed - The deposit cannot be credited (e.g., transaction invalid/dropped, double-spent or replaced via RBF to a different address). The payment attempt should be considered unsuccessful.

    Get deposit by UUID for merchant:

    GET https://api.inabit.biz/v1/merchant/purchase/{{purchaseId}}

    (Sample JSON response as in the original guide.)


    Withdrawal Process

    How Are Withdrawals Handled?

    Withdrawals are processed centrally from the Master Wallet, which acts as the secure treasury account for each merchant. This wallet receives funds via automatic sweeps from all the individual deposit wallets (API wallets) that are generated through inabit’s POS widgets.

    Here's How It Works:

    1. Deposit Collection & Sweeping Each time a user deposits via a widget, a unique blockchain address (API wallet) is created. Once a deposit is confirmed, inabit automatically sweeps the funds from these individual wallets to the merchant’s Master Wallet at predefined intervals (e.g., hourly, daily). Refer to our docs to learn more about Gas Fees and Sweeping.

    2. Withdrawal Execution Once the funds are consolidated in the Master Wallet, withdrawals can be initiated. The PSP can trigger a withdrawal using inabit’s APIs or the UI

    Creating a Withdrawal via API

    Initiate a mutation to create an asset transfer request to send for approval from the Master Wallet.

    Headers

    • Content-Type: application/json

    • Authorization: Bearer <token>

    Body (WithdrawalCreateInput object)

    • wallet.id (String, required) – Master Wallet ID

    • financialAsset.id (String, required) – Asset ID

    • address (String, required) – Destination address (To)

    • amount (Integer, required) – Transfer amount

    • blockchain.id (String, required) – Blockchain ID

    • note (String, optional) – Transaction note

    • priority (String, optional) – Transaction priority (Slow, Medium, Fast, etc.)

    Example body:

    Response

    • id (String) – Withdrawal ID

    Real-Time Visibility

    inabit provides real-time status updates on withdrawal requests, including initiation, signing, blockchain confirmation, and completion, allowing the psp to reflect up-to-date information within its platform and back office.

    To find out how to subscribe to Withdrawal Webhooks, please visit our Webhooks page.

    Security and Policy

    All outgoing transactions undergo approval logic (via the Approver Docker and mobile app). Only authorized signers (e.g., the API Signer configured during onboarding) can approve withdrawal

  • General Documentation

  • For enabling the terminal feature for your inabit account/organization, please contact our support with a request for activation (applicable for both sandbox and mainnet environments).

  • Frequently Asked Questions (FAQ)

    Getting Started

    Q: How do I enable the Inabit Terminal on my organization?

    A: Contact the Inabit support team with your organization ID. Terminal access is available in both mainnet and sandbox (testnet) environments.

    Q: How do I test the Terminal integration?

    A: Use the sandbox environment, which operates on public testnets .You can fund test wallets with testnet tokens and perform end-to-end integration with real blockchain behavior.

    Widget Types

    Q: What is the difference between Purchase Address and Customer Address widgets?

    A:

    • Purchase Address Widget: Creates a new address for each transaction. Ideal for one-time payments or invoices.

    • Customer Address Widget: Provides a reusable address per customer. Ideal for recurring payments or wallet top-ups.

    Q: Can I reuse a Purchase Address for multiple payments?

    A: Yes. Enable the reuseAddress setting when creating the widget. Otherwise, the address will expire after a defined time or a single payment.

    Transactions & Confirmations

    Q: How many confirmations are required before a payment is marked as complete?

    A: The default number of confirmations depends on the blockchain (e.g., 1 on Ethereum, 2 on Bitcoin). You can request Inabit Support to customize confirmation thresholds per blockchain, or configure them dynamically based on transaction amount ranges and blockchain.

    Q: What happens if the customer pays after the widget expires?

    A: The payment will still be detected by the Terminal, but it will not be associated with any active purchase. You will need to manually retrieve unlinked payments via the API and associate them with a customer or transaction on your end.

    Q: What is a partial payment, and how is it handled?

    A: Partial payments (i.e., when a customer sends less than expected) are not automatically accepted. You should handle such cases manually and decide whether to fulfill or refund.

    Webhooks & API

    Q: How do I get real-time updates when a payment is received?

    A: When creating the widget, you need to set the webhook URL on widget creation or edit that you will receive payment events. Terminal will send POST requests to this URL with updates such as pending, confirmed, expired.

    Q: Can I pull transaction status instead of using webhooks?

    A: Yes. You can use the Terminal API to retrieve widget status and monitor incoming payments programmatically.

    Q: What happens if my webhook endpoint is temporarily unavailable?

    A: Inabit automatically retries failed webhook deliveries using exponential backoff. You can also fetch the latest status using the API to reconcile.

    Security & Compliance

    Q: Does Inabit Terminal hold custody of funds?

    A: No. Inabit Terminal is a self-custody platform. All deposit addresses are controlled by your organization, and you retain full access to funds.

    Advanced Configuration

    Q: Can I configure expiration, confirmations, and reuse behavior?

    A: Yes. When creating a widget, you can define:

    • Expiration time (in minutes)

    • Confirmation threshold (per blockchain or by amount tier

    • Reuse behavior (true or false)

    Q: Can I manage multiple client environments?

    A: Yes. You can create and manage separate organizations per client using Inabit’s Terminal-as-a-Service model. Each org has its own API keys, widgets, and webhook endpoints.

    https://support.inabit.com/

    Payment Orchestrators

    Guide describing how the Orchestrator integrates with inabit’s APIs..

    Overview

    This guide describes the end-to-end integration with inabit to enable seamless crypto-payment flows and secure treasury operations. The integration provides a compliant, scalable, and self-custodial setup using inabit’s infrastructure.

    API Introduction

    Our APIs combine GraphQL (core inabit platform) and REST APIs (inabit Terminal), allowing clients to query exactly the data they need with maximum flexibility and efficiency. This hybrid approach enables streamlined integration with both wallet infrastructure and payment flows.

    APIs & Auth at a glance

    • Platform API (GraphQL): wallets, governance, withdrawals, org objects. Auth: Authorization: Bearer <API_ADMIN_TOKEN>

    • Terminal API (REST): Terminal resources (widgets, purchases, customer addresses, deposits). Auth: Authorization: Bearer <TERMINAL_ORG_API_KEY> or Authorization: Bearer <TERMINAL_WIDGET_API_KEY> depending on scope.

    Which key do I use, and when?

    Action
    Use this key
    Why / Scope
    Provided when
    Header Example

    Additional Reference

    We highly advise taking a look at the following pages as you start developing:

    • API Login Access / Authentication

    • Remote & Automatic Approvals (Docker Configuration)

    • Automate Signing Transactions

    • Supported Blockchains & Assets

    Technical Architecture: Merchant Onboarding

    (Architecture diagram)


    Merchant Onboarding Flow Explained

    When a new merchant is onboarded to inabit, the process begins with registration and using the inabit mobile app.

    Once the merchant is registered and paired:

    • inabit automatically generates two under the merchant’s account:

    • API Signer (used by the Orchestrator/merchant)

    • API Admin (used by the Orchestrator)

    The merchant owner then receives an approval request on their inabit mobile app and must approve the newly created API users.

    After the API users are approved:

    • inabit securely shares the API credentials with the Orchestrator, enabling the next steps in the onboarding process.

    • Next, the Orchestrator or the merchant installs the inabit Approver Docker and pairs the API Signer.

    Note: The merchant can choose to host the Docker either on their own servers or let the Orchestrator manage it.

    To complete the pairing process:

    • The merchant enters a pairing code into their inabit mobile app that is received from the Orchestrator (via direct communication).

    • Now that pairing is done:

      • The Orchestrator opens a Master Wallet with the required blockchains (an inabit wallet used as a central aggregator for the merchant).

      • The Orchestrator then proceeds to configure the inabit POS widget(s) based on the merchant’s requirements, including:

    After configuration, inabit supplies the implementation guide, and the Orchestrator integrates the widget into the merchant’s platform using the provided code, script or via API.

    Now that the flow is clear, let's review the implementation process step by step! ✨


    1. Merchant Onboards to inabit

    The merchant begins by creating an account on the inabit platform.

    Step-by-Step:

    1. As a merchant, visit the onboarding URL: https://use.inabit.com/create_account?channel=[OrchestratorName]

    2. On the Plan Selection screen, select Enterprise. This ensures the merchant is granted access to advanced platform features and API capabilities required for the Wallet-as-a-Service integration.

    3. Complete Device Pairing: As the final onboarding step, the merchant must pair their mobile device with the inabit platform. This process is critical for enabling self-custody-meaning the merchant remains the sole custodian of their customers' funds.

    The paired device acts as a cryptographic key manager and approval layer, ensuring secure signing of all transactions and operations on the platform.


    2. inabit Enables API Access

    inabit allows access to its API for the Orchestrator by generating 2 API users under the merchant's account:

    1. API Signer Created for the sole purpose of serving as the "Approver" to sign transactions using inabit's Approvals Docker.

    2. API Admin Serves as the API key/access user for inabit's API endpoints.

    Note that the merchant owner will need to approve the creation of these users on their inabit mobile app.

    Learn more about API User Roles in a .


    3. inabit Sends Access Tokens to the Orchestrator

    After the API users are approved:

    • inabit shares the API credentials with the Orchestrator, enabling the next steps in the onboarding process.

    • Sharing the access tokens of both users will occur only on a secured channel of the Orchestrator's preference.


    4. Orchestrator Implements inabit Remote Approver App

    The Remote Approver App (Approver Docker) enables policy-based, automated approvals for API wallets only (it does not apply to UI wallets).

    Deployment options

    • Self-hosted (recommended default): One-time Docker setup via the inabit CLI on your own infrastructure.

    • inabit-hosted (managed): inabit can host and operate the Remote Approver App for you

    When to choose which?

    • Choose self-hosted if you require full infrastructure control or have strict internal hosting policies.

    • Choose inabit-hosted to reduce ops overhead; in this managed mode, API wallets can transfer funds only to internal wallets within your organization, and you still retain self-custody via your approval policies and paired identities.

    In order to automate signing transactions on behalf of the merchant, the App needs to be installed and the API Signer user is paired. Please refer to the full guide explaining the Docker setup and configuration in Remote Approver App Setup.


    5. Orchestrator/Merchant Sends Pairing Code to the Merchant owner

    Once the Docker is up and running, the pairing process will commence as follows:

    1. Docker issues a Pairing Code in the Docker logs (example log output shown in the original guide).

    2. Docker proceeds to send an approval request to the owner to authorize the approver app (just like any other user).

    3. The Orchestrator/merchant sends the Pairing Code to the merchant owner via a secured channel of choice.

    4. The merchant’s owner inserts the code in the mobile app to complete the pairing process.


    6. Orchestrator Creates a Master Wallet in the Merchant's inabit Account

    Once device pairing is completed, the Orchestrator proceeds to create a Master Wallet for the merchant through inabit's API.

    What is a Master Wallet?

    The Master Wallet serves as the central aggregator for all crypto transactions and funds flow. It is a secure, self-custody wallet fully accessible by the merchant.

    Supported Blockchains

    During wallet creation, the Orchestrator selects the required blockchains (e.g., Ethereum, Tron, Polygon) that the merchant will support for their clients. Each blockchain comes with its own address and supports its respective tokens (e.g., USDT on Tron, ETH on Ethereum).

    How to Create a Master Wallet?

    The CreateWalletWithInabit mutation allows API admins to create a new inabit wallet (that is accessible in the platform's interface, unlike API wallets) with a designated address for a given asset & blockchain.

    Remember to authenticate to call our GraphQL API using an access token (bearer) with your API Admin credentials.

    Example Mutation:

    Headers

    • Content-Type: application/json

    • Authorization: Bearer <token>

    Body (WalletCreateWithInabitInput object)

    • name (string, required) – Name of the wallet

    • organizationId (string, required) – ID of the organization in inabit

    Example body:

    Response (Success example):

    • In the mutation's response, you will receive the created wallet ID including the associated blockchain address.

    You can also try this mutation via Apollo Studio.

    • For recommended best-practice wallet structures, :


    7. Orchestrator Enables Terminal Access

    To enable inabit Terminal, contact inabit Support. As part of activation:

    1. Provide a generic webhook URL to serve as the organization-level default for events.

    2. inabit will activate Terminal and return an Organization API Key for communicating with the inabit Terminal API at the org scope.

    After activation, proceed with widget creation and deployment. You can also schedule an enablement call from the Terminal page in the interface. ()

    Note on API keys

    • Organization API Key (issued during enablement): used to pull organization-level information, e.g., get all widgets, get all customers, etc.

    • Widget API Key (issued when you create a widget): used to pull widget-level information and interact with that specific widget (e.g., get widget details, purchase status, address-token status).

    8. Orchestrator Creates & Configures Widgets

    Widget Creation

    The Orchestrator will create and edit new widgets via a dedicated endpoint that inabit will provide them upon integration kickoff or from the terminal UI.

    Widget Configuration

    Choosing the Right Widget Type:

    The Orchestrator selects and configures the widget per merchant use case. We support two types: Purchase Address and Customer Address.”

    Quick picker

    • Need exact amount + expiry for a single transaction? → Purchase Address

    • Need recurring or flexible deposits tied to a player? → Customer Address

    Implementation notes

    • Both types support: confirmations policy, auto-sweep to Master Wallet, and coin/chain allow-lists.

    • Typically: shorter expiry for Purchase Address; no expiry (or long TTL) for Customer Address.

    For a full description of widget types, their behavior, and recommended use cases, :


    Functionality Settings

    Once the widget type is chosen, the Orchestrator customizes the widget based on the merchant’s requirements. inabit offers robust, per-widget configuration options that allow fine-tuning of how each widget behaves. Key parameters include:

    • Supported Coins – Define which cryptocurrencies the widget will accept.

    • Deposit Amount – Can be: (relevant Purchase Address only)

    • Predefined - The widget displays a specific amount to be deposited by the end-customer.

    • Flexible - The widget does not enforce a specific deposit amount, allowing users to send any amount to the assigned address. In this mode, the deposit address remains the same for that customer/session, and any funds received at that address will be credited accordingly.

    These and other advanced options allow for flexible and secure integration into any existing merchant flow.

    For the full list of available settings and best practices, refer to:


    Customizing the Widget Interface / UX

    By default, you can adjust the following UI parameters:

    • Widget Name – A unique name to identify your widget (e.g., “Basic Plan Payment”).

    • Description (Optional) – Short text explaining what this widget is used for.

    • Merchant Name (Optional) – Merchant name displayed to the end user (if applicable).

    If further customization is required (logos, fonts, colors, layout, etc.), you can override the widget’s CSS.

    The merchant (or the Orchestrator on their behalf) can also decide whether to let the end user select the asset & blockchain inside the widget. The widget can always be reviewed in preview mode before going live to ensure it looks and behaves as expected.

    (Example widget preview details and images remain as in the original guide.)


    9. Orchestrator Installs Widgets on the Merchant's Platform

    inabit supports multiple, straightforward implementation methods per widget type. Choose the approach that best fits your stack and UX-each method is intuitive and easy to set up.

    Customer Address (persistent address per player)

    Supported methods:

    1. API

    2. iframe

    3. Redirect

    1. Using API

    This option is best for creating fully custom UI with your own components.

    How it works: Use inabit’s APIs to create or fetch the customer’s persistent address, show it in your UI, and track status via webhooks

    2. iframe (embedded hosted UI)

    • Best for: native feel while keeping low frontend effort.

    • How it works: Generate the Customer Address URL (session/token) server-side → embed in an <iframe> in your account page.

    Steps

    Step 1: Implement Server-Side Terminal Call

    Create or Retrieve a Customer Profile (Backend)To initialize the widget for a user, you must first ensure a customer profile exists in the backend system. This is identified by a unique customerIdentifier (e.g., the user’s email or internal ID). Depending on whether the user is new or already exists, follow the appropriate substep:

    a. Create a New Customer (if not yet created)

    If the user does not already exist in your backend, send a POST request to create a new customer profile:

    b. Retrieve Existing Customer (if already created)

    Store this id securely as customerUuid for future requests.

    If you’ve already created a customer but did not save their UUID, you can retrieve it using their customerIdentifier:

    c. Once you have the customerUuid, you can proceed to generate the address token in the next step and then add the snippet for the token request

    Widget API Key:

    Step 2: Add Script Tag to page Header

    a. Add the following script tag to your page header:

    Step 3: Call open.widget Function Call openwidget function with token id, should open in popup After the customer clicks on the button.

    1. Add a container where the iframe will be rendered:

    2. Open the widget using the token ID returned in the previous step:

    // 3. (Optional) To make the widget take up 100% width, set fullWidth to true:

    The merchant can also retrieve the above information themselves by accessing the terminal through their inabit account by logging into our platform.

    3. Redirect (hosted flow)

    • Best for: fastest integration when you want inabit to fully host the UI.

    • How it works: Create/obtain the Customer Address session or token → redirect the user to the hosted page tied to that customer.


    Deposit Management

    How Will the Orchestrator Stay Up-to-Date on Incoming Deposits?

    In many industries it's common practice to lock funds once a deposit transaction is detected on-chain, even before it has been fully confirmed. This provides a better user experience by showing a successful deposit immediately-while still protecting the merchant by making the funds non-withdrawable until sufficient blockchain confirmations are received.

    inabit's system fully supports this flow: once a transaction is detected, it updates the widget with a pending confirmation status, allowing the platform to reflect the deposit in the UI while ensuring risk mitigation through backend-level enforcement of fund availability only after confirmation.

    Best practice for monitoring deposits: use a hybrid of webhooks and API polling for real-time state changes, plus periodic polling as a safety net (e.g., to recover from missed callbacks or network hiccups). See the full guidance .

    To keep the Orchestrator in sync, inabit emits webhook callbacks for each deposit event and any status change, enabling real-time tracking and deterministic, status-based logic within the Orchestrator’s environment.

    List of Potential Deposit Statuses:

    • Confirming – The full amount has been received, and the system is now waiting for the required number of blockchain confirmations to mark the deposit as successful.

    • Unconfirmed – A deposit has been detected on the blockchain but has not yet been included in a block (only relevant for UTXO-based networks such as Bitcoin).

    • Completed – The required number of blockchain confirmations has been received, and the deposit is finalized successfully.

    Get deposit by UUID for merchant:

    GET https://www.inabit.biz/v1/merchant/purchase/{{purchaseId}}

    (Sample JSON response as in the original guide.)


    Merchant Withdrawal Process

    How Are Withdrawals Handled?

    Withdrawals are processed centrally from the Master Wallet, which acts as the secure treasury account for each merchant. This wallet receives funds via automatic sweeps from all the individual deposit wallets (API wallets) that are generated through inabit’s POS widgets.

    Here's How It Works:

    1. Deposit Collection & Sweeping Each time a user deposits via a POS widget, a unique blockchain address (API wallet) is created. Once a deposit is confirmed, inabit automatically sweeps the funds from these individual wallets to the merchant’s Master Wallet at predefined intervals (e.g., hourly, daily). Refer to our documentation to learn more about .

    2. Withdrawal Execution Once the funds are consolidated in the Master Wallet, withdrawals can be initiated. The Orchestrator or the merchant can trigger a withdrawal using inabit’s APIs.

    Initiate a mutation to create an asset transfer request to send for approval from the Master Wallet.

    Headers

    • Content-Type: application/json

    • Authorization: Bearer <token>

    Body (WithdrawalCreateInput object)

    • wallet.id (String, required) – Master Wallet ID

    • financialAsset.id (String, required) – Asset ID

    • address (String, required) – Destination address (To)

    Example body:

    Response:

    • id (String) – Withdrawal ID

    Real-Time Visibility

    inabit provides real-time status updates on withdrawal requests, including initiation, signing, blockchain confirmation, and completion, allowing the Orchestrator to reflect up-to-date information within its platform and back office.

    To find out how to subscribe to Withdrawal Webhooks, please visit our page.

    Security and Policy

    All outgoing transactions undergo approval logic (via the and mobile app). Only authorized signers (e.g., the API Signer configured during onboarding) can approve withdrawals.

    Purchases Without Amount

    Learn more about the types of POS Widgets our Terminal offers

    Widget Types in Our Terminal

    Inabit Terminal provides two widget types to support a wide range of payment scenarios. Both handle deposit address generation, blockchain monitoring, and transaction confirmation. The main difference lies in how deposit addresses are assigned and reused.

    1. Purchase Address Widget

    Used for single-use or transaction-specific payments. This widget generates a unique deposit address for each new payment flow, enabling easy matching of transactions to specific purchases.

    Common Use Cases:

    • eCommerce checkout flows

    • Invoices with expiration windows

    • Donations or one-time contributions

    • Payment links in emails or support chats

    How It Works:

    • A new deposit address is generated each time the widget is created.

    • The customer sends crypto to this unique address.

    • The widget listens for an on-chain deposit and triggers a webhook or terminal API callback.

    • After the specified number of confirmations, the transaction is marked as complete.

    Key Features:

    • Unique address per transaction for clean reconciliation

    • Supports expiration windows and partial payments

    • Enables reuse of addresses across different purchases to reduce network fees

    • Automatic rate refresh upon expiration (when enabled)

    2. Customer Address Widget

    Designed for long-term use, this widget assigns a persistent deposit address to a specific customer or account. All incoming payments to that address are monitored over time, allowing flexible, account-based payment handling.

    Common Use Cases:

    • Recurring user payments

    • Wallet or account top-ups

    • Subscription billing (manual)

    • Developer platforms or marketplaces

    How It Works:

    • A customer-specific deposit address is created once and reused for that customer.

    • The address is monitored continuously by Inabit Terminal.

    • Each incoming transaction to the address is tracked, confirmed, and pushed to your system via webhook or API.

    • Multiple payments can be made to the same address over time.

    Key Features:

    • Persistent deposit address per customer or account

    • Optimized for recurring or ongoing payments

    • Simplifies deposit handling in user/account-based systems

    • Configurable expiration, confirmation count, and other options

    Choosing the Right Widget

    Scenario
    Recommended Widget

    Integration Notes

    • Both widget types are created via the Inabit Terminal GraphQL API or from the Inabit Dashboard.

    • All widgets support:

      • Blockchain and asset selection

      • Confirmation threshold configuration

    Widget Types

    Learn more about the types of POS Widgets our Terminal offers

    Widget Types in Our Terminal

    Inabit Terminal provides two widget types to support a wide range of payment scenarios. Both handle deposit address generation, blockchain monitoring, and transaction confirmation. The main difference lies in how deposit addresses are assigned and reused.

    1. Purchase Address Widget

    Used for single-use or transaction-specific payments. This widget generates a unique deposit address for each new payment flow, enabling easy matching of transactions to specific purchases.

    Common Use Cases:

    • eCommerce checkout flows

    • Invoices with expiration windows

    • Donations or one-time contributions

    • Payment links in emails or support chats

    How It Works:

    • A new deposit address is generated each time the widget is created.

    • The customer sends crypto to this unique address.

    • The widget listens for an on-chain deposit and triggers a webhook or terminal API callback.

    • After the specified number of confirmations, the transaction is marked as complete.

    Key Features:

    • Unique address per transaction for clean reconciliation

    • Supports expiration windows and partial payments

    • Enables reuse of addresses across different purchases to reduce network fees

    • Automatic rate refresh upon expiration (when enabled)

    2. Customer Address Widget

    Designed for long-term use, this widget assigns a persistent deposit address to a specific customer or account. All incoming payments to that address are monitored over time, allowing flexible, account-based payment handling.

    Common Use Cases:

    • Recurring user payments

    • Wallet or account top-ups

    • Subscription billing (manual)

    • Developer platforms or marketplaces

    How It Works:

    • A customer-specific deposit address is created once and reused for that customer.

    • The address is monitored continuously by Inabit Terminal.

    • Each incoming transaction to the address is tracked, confirmed, and pushed to your system via webhook or API.

    • Multiple payments can be made to the same address over time.

    Key Features:

    • Persistent deposit address per customer or account

    • Optimized for recurring or ongoing payments

    • Simplifies deposit handling in user/account-based systems

    • Configurable expiration, confirmation count, and other options

    Choosing the Right Widget

    Scenario
    Recommended Widget

    Integration Notes

    • Both widget types are created via the Inabit Terminal GraphQL API or from the Inabit Dashboard.

    • All widgets support:

      • Blockchain and asset selection

      • Confirmation threshold configuration

    Supported Assets

    Which assets & tokens inabit currently supports

    inabit supports multiple assets

    It is important to note that all assets and tokens within standards we support such as ERC-20 (or equivalent, e.g. BEP-20 or TRC-20) are supported by our wallets.

    The table below provides the native assets (Blockchain assets) that we supports (that aren't tokens).

    As for tokens, inabit will support all tokens within the blockchains and standards that it currently supports. See supported blockchains list here.

    Table Columns:

    • Financial Asset - the name of the digital asset

    • Blockchain Code - the blockchain on which the asset exists

    Supported Native Assets

    Supported Blockchains

    Which blockchains & protocols inabit currently supports

    inabit supports major blockchain protocols (mainnet) and nearly limitless digital assets in its system. This page gives an overview of all of the blockchains we support.

    Supported functions

    Not all blockchains function identically, so we support different features depending on the technical constraints of each blockchain. In the table below, you can compare which broad feature sets are supported on which blockchains.

    The table does NOT include ALL supported features on each blockchain. It is simply an overview the general supports in standards and basic blockchain compatibility.

    The list below is relevant only for inabit native wallets.

    If you connected an exchange, all of its blockchains and assets are automatically supported in inabit.

    Blockchain
    Support

    Refund Flows

    Learn about the Terminal's recommended refund flow as part of the integration.

    This document provides best practices and clear guidelines for merchants using Inabit Terminal to manage the refund process. It explains how to structure refunds in a self-custody environment, ensuring compliance, transparency, and operational efficiency. Merchants remain in full control of their funds while following standardized steps to reduce risk and improve customer trust.

    1. Core Principles

    • Self-Custody by Default: Merchants maintain full control of assets via API wallets; Inabit does not take custody, but provides orchestration (refund logic, rebalancing, swaps).

    Creating Widgets

    Creating clearing-ready POS widgets through our interface

    🧩 Creating Widgets Through The Interface

    POS Widgets in inabit’s Terminal are embeddable components that enable merchants to accept cryptocurrency payments directly from users. These widgets are highly customizable and connected to your organization’s internal wallet infrastructure, giving you full control over supported assets, payout behavior, fees, expiration rules, and more.

    Gas Refueling

    What is gas refueling and how it works in our terminal

    Gas Refueling – Interface Documentation

    Gas Refueling allows your organization to top up blockchain-native gas (e.g., ETH, TRX, MATIC) used for sweeping deposit funds from customer addresses into your central wallet.

    This gas is stored in a dedicated "Station Wallet", separate from any user-facing deposit address — ensuring you maintain uninterrupted operations without worrying about gas availability on each incoming address.

    mutation CreateWithdrawal($data: WithdrawalCreateInput!) {
      createWithdrawal(data: $data) {
        id
      }
    }
    {
      "data": {
        "wallet": {
          "id": "clol7o576002oaz011mmtnvru"
        },
        "financialAsset": {
          "id": "clefn78gv011olc6rcwtt0wel"
        },
        "address": "0x7582f3483116105e0b7845ac1a0df5eb0c8cd062",
        "amount": 5,
        "blockchain": {
          "id": "clefn78em00mslc6r3lzf3h5a"
        },
        "note": "",
        "priority": "Medium"
      }
    }

    Single-widget reads (e.g., get widget details, purchase and deposit statuses)

    Terminal Widget API Key (REST)

    Per-widget access; safer for widget-scoped services

    During widget setup - shown on the widget implementation instructions page in the platform

    Authorization: Bearer <TERMINAL_WIDGET_API_KEY>

    If payment is not received in time, the widget can expire and optionally generate a new quote or address.

    Best for real-time, time-limited payments

  • Highly auditable and secure

  • Multi-use crypto billing profiles

    Ideal for customer wallets, balances, or prepaid models

    Donations with tracking per campaign

    Purchase Address Widget

    Payment links sent via email or chat

    Purchase Address Widget

    API-based integration for programmatic payouts

    Customer Address Widget

    Service credit recharge by end users

    Customer Address Widget

    Expiration timeouts

  • Partial payment tolerance

  • Widgets can be embedded in web or mobile applications.

  • Real-time payment updates are available via webhook or by polling the Terminal API.

  • Sandbox and mainnet environments are supported for safe development and production deployments.

  • One-time eCommerce checkout

    Purchase Address Widget

    Physical store QR code payment

    Purchase Address Widget

    Invoice with expiration (e.g., due in 30 minutes)

    Purchase Address Widget

    Subscription top-ups or account funding

    Customer Address Widget

    Multi-user platform that tracks deposits per user

    Customer Address Widget

    Recurring customer payments with the same address

    Customer Address Widget

    If payment is not received in time, the widget can expire and optionally generate a new quote or address.

    Best for real-time, time-limited payments

  • Highly auditable and secure

  • Multi-use crypto billing profiles

    Ideal for customer wallets, balances, or prepaid models

    Donations with tracking per campaign

    Purchase Address Widget

    Payment links sent via email or chat

    Purchase Address Widget

    API-based integration for programmatic payouts

    Customer Address Widget

    Service credit recharge by end users

    Customer Address Widget

    Expiration timeouts

  • Partial payment tolerance

  • Widgets can be embedded in web or mobile applications.

  • Real-time payment updates are available via webhook or by polling the Terminal API.

  • Sandbox and mainnet environments are supported for safe development and production deployments.

  • One-time eCommerce checkout

    Purchase Address Widget

    Physical store QR code payment

    Purchase Address Widget

    Invoice with expiration (e.g., due in 30 minutes)

    Purchase Address Widget

    Subscription top-ups or account funding

    Customer Address Widget

    Multi-user platform that tracks deposits per user

    Customer Address Widget

    Recurring customer payments with the same address

    Customer Address Widget

    More about widget types →

    Terminal Widget API Key (REST)

    Per-widget access; safer for widget-scoped services

    During widget setup — shown on the widget implementation instructions page in the platform

    Authorization: Bearer <TERMINAL_WIDGET_API_KEY>

  • Supported coins

  • Sweeping frequency

  • Expiration time

  • And more.

  • Sweeping Frequency – Set how often received funds are automatically moved to the Master Wallet.

  • Blockchain Confirmations – Configure the required number of confirmations per chain.

  • PendingFork - Tx confirmed on a forked block; credit on hold until reorg resolves. After settlement, the deposit may complete or fail.

  • Failed - The deposit cannot be credited (e.g., transaction invalid/dropped, double-spent or replaced via RBF to a different address). The payment attempt should be considered unsuccessful.

  • amount (Integer, required) – Transfer amount
  • blockchain.id (String, required) – Blockchain ID

  • note (String, optional) – Transaction note

  • priority (String, optional) – Transaction priority (Slow, Medium, Fast, etc.)

  • Create/list UI wallets create withdrawals,view wallets, open new wallet, add coins

    API Admin (GraphQL)

    Platform-level ops & governance

    At account opening — provided by inabit Support

    Authorization: Bearer <API_ADMIN_TOKEN>

    Org-wide Terminal reads (e.g., get all widgets, get all customers), org-scoped deposit lookups

    Terminal Organization API Key (REST)

    Organization-level Terminal access across widgets/customers

    When Terminal is enabled — provided by inabit Support

    Authorization: Bearer <TERMINAL_ORG_API_KEY>

    Example use case

    Widget type to use

    Why

    One-time payment per transaction (e.g., single bet, fixed-price checkout, specific game session)

    Purchase Address

    Creates a time-boxed, amount-bound address per purchase with clear success/expiry states.

    Funding a player wallet / account balance with flexible amounts used across sessions

    Customer Address

    Provides a persistent address per player for ongoing top-ups and balance management.

    Dedicated address per player for recurring deposits, reconciliation, and linking on-chain flows to a user profile

    Customer Address

    Stable, per-customer address simplifies reconciliation and KYC/accounting.

    device pairing
    API users
    (See: How to Perform Device Pairing)
    dedicated guide
    Setup & configuration guide
    inabit Remote Approver
    Clone inabit's CLI Github Repository
    see here
    Reference
    see here
    Creating Widgets Guide
    Advanced Widget Settings
    See full instructions here
    here
    Gas Fees and Sweeping
    Webhooks
    Remote Approver Docker

    Single-widget reads (e.g., get widget details, purchase and deposit statuses)

    mutation CreateWalletWithInabit($data: WalletCreateWithInabitInput!) {
      createWalletWithInabit(data: $data) {
        id
        name
      }
    }
    {
      "data": {
        "name": "My Inabit Wallet",
        "organization": {
          "id": "clu6oj0kg0xxxxxb98guo82u"
        }
      }
    }
    {
      "data": {
        "createWalletWithInabit": {
          "id": "clvw5pxxxxxxx7qhe3atv9d",
          "name": "My Inabit Wallet"
        }
      }
    }
    
    curl --location https://api.inabit.biz/v1/customer
    --header Content-Type: application/json
    --Authorization: Bearer cf4377b581610c77xxxxxxxxxxx9b5375af1ea3be73ab44605be8c30a7ad1d4
    data-row-{
     customerIdentifier: [email protected]
    }
    Response: The API will return a JSON object containing the customer's UUID (id)
    which will be required in subsequent steps
    {
      "data": {
          "id": "customer-uuid",
        }
    }
    curl --location https://api.inabit.biz/v1/customer?customerIdentifier=encoded_email
    --header Content-Type: application/json
    --Authorization: Bearer cf4377b581610xxxxxxxxxxxxx9b5375af1ea3be73ab44605be8c30a7ad1d4
    Response:The API will return the customer object containing the UUID:
    {
        "data": {
            "id": "customer-uuid",
         }
    }
    curl --location 'https://api.inabit.biz/v1/customer/address-token'
    --header Content-Type: application/json
    --Authorization:Bearer cf4377b581610cxxxxxxxxxxxxxx5af1ea3be73ab44605be8c30a7ad1d4
    "data":{
       "customerUuid": "27b4f808-be6c-xxxx-xxxx-6eeaad8389e9"
    }'
    Response: The API will return a JSON object containing the token id which will be required in subsequent steps.
    {
      "data": {
                customerUuid": "customer-uuid",
                addressGenerationToken: "address-token-id",
        }
    }
    cf4377b581610c775646c46xxxxxxxxxxxxxxxxxxxxxxc30a7ad1d4
    <script src="https://www.inabit.biz/widget.js" ></script>
    // Open the widget using the token ID returned in the previous step:
    window.openWidget(tokenId, {
      isToken: true
    })
    
    // To open the widget in a popup, you can use:
    window.openWidget(tokenId, {
      mode: 'popup',
      isToken: true
    });
    
    
    <div id="terminal-payment"></div>
    window.openWidget(tokenId, {
      mode: 'iframe',
      isToken: true
    });
    
    window.openWidget(tokenId, {
      mode: 'iframe',
      fullWidth: true,
      isToken: true
    });
    mutation CreateWithdrawal($data: WithdrawalCreateInput!) {
    createWithdrawal(data: $data) {
        id
      }
    }
    {
      "data": {
        "wallet": {
          "id": "clol7o576002oaz011mmtnvru"
        },
        "financialAsset": {
          "id": "clefn78gv011olc6rcwtt0wel"
        },
        "address": "0x7582f3483116105e0b7845ac1a0df5eb0c8cd062",
        "amount": 5,
        "blockchain": {
          "id": "clefn78em00mslc6r3lzf3h5a"
        },
        "note": "",
        "priority": "Medium"
      }
    }

    XRPL (Ripple)

    ✓

    Bitcoin Cash

    ✓

    Litecoin

    ✓

    Ton

    Coming soon

    Bitcoin

    ✓ (Acceleration using CPFP)

    Ethereum

    ✓ (ERC-20 + ERC-1155)

    Binance Smart Chain

    ✓

    Polygon

    ✓

    Solana

    ✓

    Tron

    ✓ (TRC-20 + TRC-10)

  • Separation of Flows: Refunds are logically separated from deposits to avoid operational confusion and improve auditability.

  • Security First: Every refund requires strict address verification and transaction simulation before execution.

  • Predictability: Fees and balances must always be simulated and validated prior to committing a refund transaction.

  • 2. Standard Refund Workflow

    Step 1 – Refund Request

    • The End-Customer requests a refund through the Merchant’s platform.

    • The request includes: end-customer wallet address, amount, and asset.

    Step 2 – Address Verification

    • Merchant verifies the provided address:

    • Confirm valid blockchain format:

    Variables (Body):

    Step 3 – Refund Logic & Fee Simulation

    • Merchant platform simulates the refund:

    • Check fee cost vs. refund amount.

    Variables (Body):

    • Apply refund logic (min amount, full refund, partial refund).

    Step 4 – Balance Validation

    • If refund wallet (API wallet) has sufficient balance → create withdrawal request directly.

    • If insufficient balance → trigger one of two:

      • Master Wallet Refill – request funds from Inabit Master Wallet.

      • Swap – convert another asset into the required refund asset.

    Step 5 – Withdrawal Execution

    • Refund API wallet executes withdrawal to the End-Customer’s wallet.

    • Transaction details logged for audit.

    3. Best Practices for Merchants

    A. Address Handling

    • Always verify the refund address before submission.

    • Maintain KYT/AML screening at refund step (not just deposit step).

    • Encourage refunds to original funding address unless policy explicitly allows otherwise.

    B. Balances & Liquidity

    • Maintain a daily rebalancing schedule between Master Wallet and Refund API Wallet to ensure refund capacity.

    • Monitor minimum thresholds (e.g., ensure refund wallet has ≥ X daily refund volume).

    • Use Inabit’s swap service only when master wallet transfer cannot fulfill the request quickly.

    C. Fees & Costs

    • Always simulate gas/fee costs prior to refund.

    • If fees exceed a set % of refund value, apply business logic (e.g., absorb fee vs. deduct from refund).

    • Document your fee-handling policy clearly for customers.

    D. Security & Controls

    • Implement multi-sig policies on Master Wallet withdrawals.

    • Enforce withdrawal velocity limits (e.g., max N refunds per hour).

    • Keep strict audit logs: refund request ID, linked deposit ID, blockchain TX ID, timestamps.

    E. Customer Transparency

    • Provide end-customers with refund confirmation including TX hash.

    • Communicate expected blockchain settlement time.

    4. Operational Recommendations

    • Automation: Use Inabit APIs to automate refund initiation, balance checks, and KYT checks.

    • Exception Handling: Create fallback logic if refund wallet + master wallet + swaps cannot fulfill request (manual review).

    • Testing: Simulate refund flows regularly in sandbox before enabling for production.

    • Monitoring: Integrate refund activity into merchant dashboards with real-time alerts (e.g., failed withdrawals, low refund balance).

    5. Example Flow Summary (Aligned with Diagram)

    1. End-Customer requests refund → Merchant verifies & simulates.

    2. If refund wallet balance sufficient → direct withdrawal.

    3. If insufficient → Merchant triggers master wallet transfer or asset swap.

    4. Refund API wallet executes withdrawal.

    5. End-Customer receives refund → TX hash returned.

    What is a POS Widget?

    A POS (Point of Sale) Widget is a payment interface you can generate inside your Terminal to receive deposits from end users or customers in a specific cryptocurrency. You can configure it to:

    • Support specific assets (e.g., USDT on Tron or Ethereum)

    • Sweep funds to your wallets automatically

    • Apply expiration and confirmation logic

    • Choose who pays the fees (merchant or customer)

    • Embed it into your app, website, or customer flow

    These widgets are ideal for:

    • Subscription billing

    • Pay-per-use tools

    • Partner platforms

    • In-app payments

    ➕ Creating a New Widget

    From the Terminal dashboard:

    1. Click the blue “Add New Widget” button on the top right.

    2. A widget creation drawer will appear on the right side with the following fields:

    🧾 Widget Creation Form Fields

    1. Widget Name

    • A unique name to identify your widget (e.g., Basic Plan Payment).

    • Visible internally and optionally to users.

    2. Description

    • A short explanation of what this widget is used for.

    • Optional but helps for internal tracking.

    3. Merchant Name (Optional)

    • Name of the merchant displayed to the end user (if applicable).

    4. Assets (Supported Assets)

    • Select which cryptocurrencies the widget will accept.

    • Example: USDT (TRC20), USDC (ERC20), ETH.

    • Dropdown field with multi-select options.

    • You can also search for a specific asset code you're looking for using the search bar.

    🧹 Sweeping Mechanism

    This defines how and when collected funds will be transferred from the widget deposit addresses to your organization wallet.

    Options:

    • Daily – Sweeps once per day to the configured wallet.

    • Weekly – Sweeps once per week.

    • On-Demand – Funds are swept only when triggered via API or Terminal manually.

    Choose based on your operational and liquidity needs.

    🎯 Destination Address

    • Select the wallet address to which collected funds will be swept.

    • Dropdown field pulling from your organization's wallet list.

    ⚙️️ Sweeping Fees

    Choose who pays the gas/processing fee when sweeping occurs:

    • Charge Merchant (Myself) – Your organization covers the sweep cost.

    • Charge Customer – Fees are deducted from the user's deposit amount.


    ⚙️ Advanced Settings

    Learn more about which advanced settings are offered as part of our widgets creation which you can directly control when choosing to create a new widget or when you edit an existing one.

    Refer to the Advanced Settings page to learn more.

    🎉 Final Step: Create Widget

    Once all the fields are set:

    • Click “Create Widget”

    • Your new POS Widget will be added to the list and ready for use.

    That's it! You can now embed it, monitor its activity, and manage its funds directly from the Terminal.

    To learn more about how and review the implementation steps, refer here.

    You can also click on the "Preview Widget" to review your changes live, the widget will then appear on your screen as an example to how it will be shown on your application/website:

    Widget Preview Example:

    When Do You Need to Refuel?

    You’ll need to refuel gas when:

    • You see gas balances running low on any supported chain

    • You anticipate high transaction volume requiring many sweep operations

    • You want to proactively ensure sweeping never fails due to gas shortages

    How to Add Gas in the Terminal

    1. On the main Terminal dashboard, locate the “Gas Balance” panel.

    1. Click the small “Add Gas” icon on the top right of the gas section.

    2. A popup will open with funding options.

    Option 1: Purchase Gas via Credit Card

    This flow enables you to directly buy gas using fiat.

    Steps:

    1. Select Blockchain to fund (e.g., Ethereum, Tron).

    2. Enter Company Name.

    3. Select Country.

    4. Enter your Credit Card Details.

    5. Enter the Amount to purchase.

    6. Confirm and complete the payment.

    Once approved, gas will be instantly credited to the selected station wallet.

    Option 2: Fund via Crypto Transfer

    Prefer to move gas from an existing crypto wallet?

    Steps:

    1. Select the Blockchain you'd like to fund.

    2. A dedicated deposit address will be generated along with a QR code.

    3. Send the required gas (e.g., TRX, ETH) to the address shown.

    4. The station wallet will be updated once the transaction is confirmed.

    Safety and Monitoring

    • All gas refuels are automatically tracked and reflected in your dashboard.

    • There is no expiration for gas balances.

    • You can refuel at any time, and all balances are held in enterprise-grade custody infrastructure.

    ✅ Summary

    Gas Refueling
    Description

    Uses

    Covers sweeping transaction fees

    Payment Options

    Credit Card / Crypto Transfer

    Chains Supported

    Ethereum, Tron, BSC, Polygon

    Where to Access

    Terminal Dashboard → Gas Section

    Best Practice

    Keep balances above minimum recommended levels

    Financial Asset

    BTC

    Blockchain Code

    bitcoin

    Financial Asset

    ETH

    Blockchain Code

    ethereum

    Financial Asset

    TRX

    Blockchain Code

    tron

    Financial Asset

    BNB

    Blockchain Code

    binance-smart-chain

    Financial Asset

    SOL

    Blockchain Code

    solana

    Financial Asset

    XRP

    Blockchain Code

    XRP

    Financial Asset

    MATIC

    Blockchain Code

    polygon

    Financial Asset

    BCH

    Blockchain Code

    bitcoin-cash

    Financial Asset

    LTC

    Blockchain Code

    litecoin

    Remote Approver

    A One-Time setup of a docker through inabit CLI, which facilitates remote transaction signing.

    Production-ready CLI for configuring and running the Inabit Remote Approver with Docker and nginx.

    Current version: v0.1.3

    What you get

    • Guided setup wizard (validates token, configures URL/ports, generates nginx.conf)

    • Automatic nginx and Docker Compose configuration

    • HTTPS support with auto-detected certificates (PEM or CRT/KEY)

    • Health checks and smart troubleshooting

    • One-command cleanup and uninstall

    Install (production)

    Clone the release repository on your remote instance and run the installer:

    After installation, the global command inabit is available.

    Quick start

    Setup flow (overview)

    1

    Start setup

    Run:

    This begins the guided wizard.

    2

    During setup, HTTP 403 from curl can be normal if Cloudflare or similar blocks non-browser requests; browsers should still work. The wizard treats 403/502/503 as acceptable during early startup while the approver initializes.

    Nginx in production (what the wizard configures)

    • Domain

      • Port 80 (HTTP): server { listen 80; } that proxies to approver:${APPROVER_PORT}

      • Port 443 (HTTPS):

    Supported certificate pairs to place in local ssl/:

    • cert.pem + key.pem

    • cert.crt + key.key

    • server.crt + server.key

    Project structure (for reference)

    Prerequisites

    Required on the host where you install the CLI:

    • Docker

    • Docker Compose

    Troubleshooting

    Common commands (click to expand)

    License

    This project is part of the Inabit Remote Approver service.

    WooCommerce

    Docker setup and configuration to simulate inabit approvals remotely on your server

    Overview

    This standalone project is designed to be deployed on a user's own server, enabling integration with inabit from remote.

    Its primary purpose is to facilitate the approval of pending transactions within a gated approvals flow. This is essentially replacing an owner/approver's mobile approvals app, allowing users to control approvals on their server.

    query IsValidAddress($where: WalletAddressValidateWhereInput!) {
        isValidAddress(where: $where)
    }
    {
        "where": {
            "address": "0x..."
            "blockchainId": "clefn7d3k04ellc6rb2sdbowp",
            "financialAssetId": "clefn78hd013rlc6rmjqa0k9t"
        }
    }
    
    query ValidateTransactionFee($where: ValidateTransactionFeeInput!) {
        validateTransactionFee(where: $where) {
            isValid
            priorities {
                noPriority
                verySlow
                slow
                medium
                fast
                veryFast
            }
        }
    }
    {
        "where": {
            "amount": 0,
            "organization:" {
                "id": "currencyOrgId"
            },
            "wallet": {
                "id": "clvxlyl7k00008o013v2q879r"
            },
            "financialAsset": {
                "id": "clvxlyl7k00008o013v2q879r"
            },
            "blockchain": {
                "id": "clvxlyl7k00008o013v2q879r"
            }
        }
    } 
     /$$                     /$$       /$$   /$$       
    |__/                    | $$      |__/  | $$       
     /$$ /$$$$$$$   /$$$$$$ | $$$$$$$  /$$ /$$$$$$     
    | $$| $$__  $$ |____  $$| $$__  $$| $$|_  $$_/     
    | $$| $$  \ $$  /$$$$$$$| $$  \ $$| $$  | $$       
    | $$| $$  | $$ /$$__  $$| $$  | $$| $$  | $$ /$$   
    | $$| $$  | $$|  $$$$$$$| $$$$$$$/| $$  |  $$$$//$$
    |__/|__/  |__/ \_______/|_______/ |__/   \___/ |__/
    Validate login token

    The wizard validates the provided token and obtains an access token.

    3

    Configure service port

    Default approver service port: 3020.

    4

    Choose network approach

    Select one of:

    • Domain

    • IP + Port

    5

    Domain flow

    When using a domain:

    • Choose HTTP (80) or HTTPS (443)

    • Generates nginx.conf

    • Auto-updates docker-compose ports

    • Detects SSL files in ./ssl (PEM or CRT/KEY)

    6

    IP + Port flow

    When using IP + Port:

    • Generates nginx.conf with a single server { listen <custom>; }

    • Proxy to approver:${APPROVER_PORT}

    • Compose port exposed automatically: <custom>:<custom>

    7

    Validate external URL

    Wizard performs a health check to validate external accessibility.

    8

    Create directories and configuration

    Wizard creates required directories and configuration files.

    9

    Start services

    Starts nginx, then starts the approver service.

    10

    Verify accessibility

    Wizard verifies the service is reachable and healthy.

    11

    Pairing

    Shows pairing code and instructions to complete setup.

    listen 80; redirects HTTP to HTTPS

  • listen 443 ssl; http2 on; uses detected cert/key under /etc/nginx/ssl/

  • Docker Compose ports exposed automatically: 80:80 and 443:443

  • IP + Port

    • Single server { listen <custom>; } with proxy to approver:${APPROVER_PORT}

    • Compose port exposed automatically: <custom>:<custom>

  • domain.crt + domain.key

  • Bash shell

    Project's Public Github Repository

    Functionality

    Upon running, the application must successfully initialize and communicate with Inabit. This involves several steps depending on the initiation state. If the 'signer' is approved, the handling of pending transaction flow may proceed.

    First Run

    During the first run, a pairing process is initiated. This includes:

    1. Logging into Inabit using the provided login token.

    2. Validating the user's current state.

    3. Requesting a pairing token.

    4. Producing an encrypted key used for signing, saving it to a mapped volume.

    5. Sending pairing data to Inabit and requesting the 'Owner' to authorize the approver.

    6. Refreshing the login token i.e. acquiring automatically a new valid login token.

    Recurring Runs

    For subsequent runs, after validating that the user is paired, the application continues its operation as usual.

    Initiation Errors

    If anything goes wrong during the initiation stage, the approver initiation process will be aborted.

    Prerequisites

    1. An initial login token of a valid user within Inabit with the role: 'apiSigner'.

    2. Enabled communication with the Inabit server (valid URL and whitelisted IPs and ports).

    Deployment

    From within the root directory inabit/inabit-remote:

    Set Login Token

    • The login token is approver's token valid for 30 days, allowing authentication with Inabit.

    • The token is automatically refreshed, i.e. switched to a new 30 days valid token, on:

      • each docker init.

      • every 15 days (configurable)

    • The refreshed login token is saved to a mapped volume on host machine.

    • The login token must be mapped to a selected location in the host filesystem for initialization and persistency.

    • Create a folder named refresh.

    • Set into the folder the login token file r.dat (which includes the login token).

    • Map the folder in the docker-compose.prod.yml:

    • Add the following environment variables in correspondence:

    Build

    Run

    Required Configurations

    The required config can be provided in 2 ways:

    1. Baked into the docker by building the docker with a valid .env file.

    2. Through the docker-compose.prod.yml file variables override section environment.

    In case using .env is selected, remember to modify or remove the environment: section, from docker-compose.prod.yml. In case of a change of the .env , a new docker image build must proceed.

    Required Environment Variables

    Important

    The approvers' key must be mapped to a selected location in the host filesystem for persistency. This is the required combination of env variables:

    In the Docker Compose file:

    Ensure Correspondence

    Ensure there is correspondence between the volume mapping and the selected KEY_FILE_PATH settings. The volume mapping in the Docker Compose file should reflect the chosen KEY_FILE_PATH for persisting the encrypted key:

    Pairing

    On Docker init , it is first checked if the approver is in status Paired or WaitingForApproval.

    If not, a pairing flow starts:

    Within the flow interaction with Inabit,

    1. a pairing data is exchanged with Inabit including the public signing key of the approver.

    2. an approval message is sent to the owner of the organization.

    3. a pairing code is produced in the approver start up log trace, and must be passed directly to the owner for pairing completion.

    Wish to see how you can automate approving and signing transactions?

    Refer to the next page to understand how to automate signing transactions using our docker!

    Gas Features
    # Clone the release bundle (contains installer + docker-compose.yml)
    git clone https://your-release-repo-url.git approver-cli
    cd approver-cli
    
    # Install as current user (no sudo needed)
    bash inabit-cli-installation-v1.0.sh
    # Clone the release bundle (contains installer + docker-compose.yml)
    git clone https://your-release-repo-url.git approver-cli
    cd approver-cli
    
    # Install system-wide (requires sudo)
    sudo bash inabit-cli-installation-v1.0.sh
    # Run the guided setup
    inabit setup
    
    # Check status / logs
    inabit status
    inabit logs
    
    # Manage services
    inabit restart
    inabit stop
    inabit start
    
    # Cleanup everything created by setup (keeps Docker images)
    inabit cleanup
    
    # Uninstall the CLI and remove the global "inabit" command
    inabit uninstall
    
    # For system-wide installs, use: sudo inabit uninstall
    inabit setup
    release/
    ├── inabit-cli-installation-v1.0.sh   # Installer
    ├── docker-compose.yml                # Docker services configuration
    └── README.md
    # Status / Logs
    inabit status
    inabit logs
    
    # Restart / Cleanup
    inabit restart
    inabit cleanup
    volumes:
         - ./refresh:/app/apps/approver/refresh
    LOGIN_TOKEN_FILE_PATH=refresh
    LOGIN_TOKEN_FILE_NAME=r.dat
    REFRESH_LOGIN_TOKEN_IN_MINUTES=21600 # 15 days in seconds, do not change! 
    docker-compose -f docker-compose.prod.yml build approver
    docker-compose -f docker-compose.prod.yml up approver
    INABIT_API_BASE_URL=http://localhost:3000/graphql
    APPROVER_URL=http://example.example
    APPROVER_PORT=3020
    SECRET=change-me
    KEY_FILE_PATH=dat
    KEY_FILE_NAME=k.dat
    LOGIN_TOKEN_FILE_PATH=refresh
    LOGIN_TOKEN_FILE_NAME=r.dat
    ORGANIZATION_NAME=my-organization
    SECRET=koko-moko  # Encryption secret for the key.
    KEY_FILE_PATH=dat     # File path relative to the app/apps/approver i.e., app/apps/approver/dat.
    KEY_FILE_NAME=k.dat   # File name of the encrypted key.
    volumes:
          - ./dat:/app/apps/approver/dat
    volumes:
          - ./dat:/app/apps/approver/dat
    {
      level: 'info',
      message: 'Pairing code: c754ce6d209dcc1b6f2312903ef31f0ac297b63e5dead29a6b877ecad8c77ada',
      metadata: { timestamp: '2024-02-21T08:54:17.560Z' },
      timestamp: '2024-02-21T08:54:17.560Z'
    }

    Webhooks

    Retrieve notifications through webhooks on transaction events and status changes

    About Our Webhooks 📣

    Inabit Terminal uses webhooks to notify your backend when key payment events occur. Webhooks are triggered per widget and can be configured globally at the organization level or overridden per widget.

    Terminal supports two webhook types, based on widget type:

    • Customer Address Widgets – for persistent payment addresses

    • Purchase Address Widgets – for one-time payments

    Webhook Events Overview

    Widget Type
    Event Name
    Description

    Configuring Webhooks

    Organization-Level Webhooks

    Webhook URLs are registered during onboarding and apply to all widgets by default. To update these, contact [email protected].

    Widget-Level Webhooks

    API: When , you can override the default webhook URL:

    UI: Upon widget creation, you'll be requested to insert a Webhook URL to receive notifications to:

    Webhook Event Payloads

    IncomingTransactionStatusInitiated

    Triggered when a new on-chain transaction is detected for a Customer Address widget.

    IncomingTransactionReceived

    Triggered when a transaction is retrieved/received for the first time. (e.g., Confirming)

    IncomingTransactionStatusUpdated

    Triggered when a transaction's status is updated (e.g., Confirmed).

    PurchaseInitiated

    Triggered when a Purchase Address widget is created (initiated).

    PurchaseUpdated

    Triggered when a purchase is updated (payment received, amount confirmed, status changed).

    Security and Reliability

    Retries

    If a webhook delivery fails (e.g., due to a timeout or non-2xx response), Inabit Terminal will wait 30 seconds, then automatically retry the webhook up to 5 additional times, with 30 seconds between each retry

    Signature Validation (coming soon): HMAC-based signature header for payload verification.

    Best Practices

    • Acknowledge webhook events with HTTP 200 OK

    Validate the event type before handling the payload

  • Store widgetId or purchaseId to associate the event with your system

  • Log all webhook payloads for auditability and replay if needed

  • Customer Address

    IncomingTransactionReceived

    A new transaction is detected (“Unconfirmed” for UTXO blockchains, “Confirming” for non UTXO blockchains)

    Customer Address

    IncomingTransactionStatusUpdated

    Transaction status changes (e.g., “Completed”)

    Purchase Address

    PurchaseInitiated

    Widget is created and ready to receive payment, status=”Initiated”

    Purchase Address

    PurchaseUpdated

    creating a widget

    Purchase status or amount has changed

    {
      "webhookUrl": "https://yourdomain.com/webhook/inabit"
    }
    {
      "event": "IncomingTransactionStatusInitiated",
      "data": {
        "transactionId": "cmd62lqob00yre7014nj501zc",
        "transactionHash": "0xbb22...5011",
        "status": "Pending",
        "amount": 20,
        "sourceAddress": "0x0bf2...",
        "destinationAddress": "0x1973...",
        "asset": "USDT",
        "blockchain": "ethereum-sepolia",
        "customerIdentifier": "[email protected]",
        "widgetId": "31ec71e3-26ed-4653-ad3b-c56f42330510",
        "targetConfirmations": "12"
      }
    }
    {
      "event": "IncomingTransactionReceived",
      "data": {
        "transactionId": "cmdrdvuae01ytec01vtdf3wql",
        "transactionHash": "0x2a754742bce4786b4ca870ab5c15f53e108f56663b949fe570db0db36be3c4ab",
        "status": "Confirming",
        "amount": 5,
        "sourceAddress": "0x2dbcaac27274e0dc7835e0d6c1b3c6bce2712790",
        "destinationAddress": "0xc4870c59e649e1b66d6329e16c6d942cad8e59d4",
        "asset": "USDT",
        "blockchain": "ethereum-sepolia",
        "createdAt": "2025-07-31T12:41:28.093Z",
        "customerIdentifier": "[email protected]",
        "widgetId": "9e37db44-0eea-465e-b35d-907d0a817b89",
        "widgetName": "test 20 customer address",
        "baseCurrency": "USD",
        "baseCurrencyAmount": 4.998749,
        "targetConfirmations": "12"
      }
    }
    {
      "event": "IncomingTransactionStatusUpdated",
      "data": {
        "transactionId": "cmdrdvuae01ytec01vtdf3wql",
        "transactionHash": "0x2a754742bce4786b4ca870ab5c15f53e108f56663b949fe570db0db36be3c4ab",
        "status": "Completed",
        "amount": 5,
        "sourceAddress": "0x2dbcaac27274e0dc7835e0d6c1b3c6bce2712790",
        "destinationAddress": "0xc4870c59e649e1b66d6329e16c6d942cad8e59d4",
        "asset": "USDT",
        "blockchain": "ethereum-sepolia",
        "createdAt": "2025-07-31T12:41:28.093Z",
        "customerIdentifier": "[email protected]",
        "widgetId": "9e37db44-0eea-465e-b35d-907d0a817b89",
        "widgetName": "test 20 customer address",
        "baseCurrency": "USD",
        "baseCurrencyAmount": 4.998749,
        "targetConfirmations": "12"
      }
    }
    {
      "event": "PurchaseUpdated",
      "data": {
        "purchaseId": "5a7e6bad-8ad8-464f-9892-0f2df100b79c",
        "status": "Initiated",
        "amount": 0,
        "plannedAmount": 0.00000673,
        "asset": "BTC",
        "blockchain": "bitcoin",
        "address": "bc1q8pe73z...",
        "fiatCurrency": "USD",
        "fiatAmount": 0.8,
        "confirmationAmount": 6,
        "widgetId": "bd6510a0-ad66-4f95-ad50-1bc415bf97a6",
        "widgetName": "product widget purchase",
        "purchaseIdentifier": "[email protected]",
        "title": "Payment",
        "subTitle": "The payment description",
        "siteName": "Merchant Site",
        "transactions": [],
        "currentDate": "2025-07-16T11:50:12.835Z",
        "expirationDate": "2025-07-16T12:35:12.388Z",
        "acceptPartialPayment": true,
        "redirectUrl": "http://www.inabit.com"
      }
    }
    {
      "event": "PurchaseUpdated",
      "data": {
        "purchaseId": "5a7e6bad-8ad8-464f-9892-0f2df100b79c",
        "status": "Completed",
        "amount": 0.000007,
        "plannedAmount": 0.00000673,
        "asset": "BTC",
        "blockchain": "bitcoin",
        "address": "bc1q8pe73z...",
        "fiatCurrency": "USD",
        "fiatAmount": 0.8,
        "confirmationAmount": 6,
        "widgetId": "bd6510a0-ad66-4f95-ad50-1bc415bf97a6",
        "transactions": [
          "e30e54115a76d52b2f857e1f0fa6888c76f2f04edc6095498107eebdf299dff9"
        ],
        "allocationDate": "2025-07-16T11:50:12.388Z",
        "expirationDate": "2025-07-16T12:35:12.388Z",
        "acceptPartialPayment": true,
        "redirectUrl": "http://www.inabit.com"
      }
    }

    Purchase Address Widget

    Important Note:

    Widget Types Supported in inabit: Inabit currently supports two widget types, each with its own implementation instructions.

    The information displayed below is an example of how a widget implementation setup/guide looks like. You can access your widget implementation guide at all times by clicking the "Code" Icon on the widget drawer that's pinned to the top right hand side of the

    Purchase Address Widget

    Step 1: Implement Server-Side Terminal Call

    Widget API Key: (i.e.) 8119595e07cb3a87ccfa46..............1885e89d7ef4ed8c2cb

    Step 2: Add Script Tag to page Header

    a. Add the following script tag to your page header:

    Step 3: Call open.widget Function

    Call openwidget function with purchase id, should open in popup After the customer clicks on the button (buy with crypto for example )

    You will also be able to preview the widget by clicking on the "Preview Widget" button from within the implementation guide popup displayed.

    Need further help? Feel free to if you encounter any issues during the widget implementation process.

    reach out to us
    curl --location https://api-stage.inabit.biz/api/v1/purchase
    --header Content-Type: application/json
    --Authorization: Bearer 9de7db51f9d1ce9d52112e13f341915b4551d2ff6ec229f55d453c1dc5861b44
    data-row-{
      title: <Your title goes here>,
      subTitle: <your subtitle goes here>,
      siteName: <your siteName goes here>,
      purchaseIdentifier: <your purchase identifier goes here>,
      fiatAmount: <fiat amount goes here>,
      fiatCurrency: <fiat currency goes here>
    }
    <script src="https://stage.inabit.biz/widget.js" ></script>
    // purchaseId is the id from response of previous step.
     window.openWidget(purchaseId);
    
    //if you want to open the widget in a popup, you can use the following code:
     window.openWidget(purchaseId, {mode:'popup'})

    Get merchant's widget by Uuid

    get

    Get merchant's widget by Uuid

    This endpoint is used to get merchants's widget by widget's Uuid.

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{ORGANIZATION_API_KEY}}

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    200

    OK

    application/json
    Responseobject
    get
    /v1/merchant/widget/da9f2521-0167-436a-9f04-3bcc9dcad182

    Get all merchant's widgets

    get

    Get all merchant's widgets

    This endpoint is used to get all merchant's widgets by its ORGANIZATION_API_KEY.

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{ORGANIZATION_API_KEY}}

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    200

    OK

    application/json
    Responseobject
    get
    /v1/merchant/widget

    Get merchant's purchase by UUID

    get

    Get merchant's purchase by UUID

    This endpoint is used to get mercpurchase by purchase's unique identifier (UUID).

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{ORGANIZATION_API_KEY}}

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    200

    OK

    application/json
    Responseobject
    get
    /v1/merchant/purchase/dadb4fff-d69e-4760-980a-182b15421ff9

    Get widget's purchase by Uuid

    get

    Get widget's purchase by Uuid

    This endpoint is using WIDGET_API_KEY to get purchase by Uuid

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{WIDGET_API_KEY}}

    Query Params

    • limit: number

    • offset: number

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    200

    OK

    application/json
    Responseobject
    get
    /v1/widget/purchase/e36bea7d-5685-4fdc-be66-1db73ce56c7c

    Get widget's list of purchases

    get

    Get widget's list of purchases

    This endpoint is used to get all purchases by WIDGET_API_KEY.

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{WIDGET_API_KEY}}

    Query Params

    • limit: number

    • offset: number

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    limitintegerOptionalExample: 5
    offsetintegerOptionalExample: 0
    Responses
    200

    OK

    application/json
    Responseobject
    get
    /v1/widget/purchase

    Get merchant's list of purchases

    post

    Get merchant's list of purchases

    This endpoint is used to get all merchant's purchases by its ORGANIZATION_API_KEY.

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{ORGANIZATION_API_KEY}}

    Query Params

    • limit: number

    • offset: number

    Body

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    limitintegerOptionalExample: 5
    offsetintegerOptionalExample: 0
    Body
    objectOptionalExample: { // "searchText": "sam" // "statuses": ["Completed"] // "widgetUuids": ["903fea77-636c-477a-9692-d189b92b56bc", "95ba9ae3-7b71-482d-9989-23e420483c59"] // "merchants": ["Merchant #1"] // "createdAt": "2025-04-25T16:43" }
    Responses
    201

    Created

    application/json
    post
    /v1/merchant/purchase/search

    Get merchant's incoming transactions

    get

    Get merchant's incoming transactions

    This endpoint retrieves the details about all transactions of a specific merchant based on the provided merchnat's ORGANIZATION_API_KEY.

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{ORGANIZATION_API_KEY}}

    Query Params

    • limit: number

    • offset: number

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    offsetintegerOptionalExample: 0
    limitintegerOptionalExample: 5
    Responses
    200

    OK

    application/json
    Responseobject
    get
    /v1/merchant/incoming-transaction

    Get customer transactions

    get

    Get customer transactions

    This endpoint retrieves the details about all transactions of all widget's customers based on the provided WIDGET_API_KEY.

    Request

    • Method: GET

    • URL:

    Headers

    • Authorization: Bearer {{WIDGET_API_KEY}}

    Query Params

    • limit: number

    • offset: number

    • customerId: string

    Response

    • Status: 200 OK

    • Content Type: application/json

    Response Body

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    offsetintegerOptionalExample: 0
    limitintegerOptionalExample: 5
    customerIdstringOptional
    Responses
    200

    OK

    application/json
    Responseobject
    get
    /v1/customer/incoming-transaction
    201

    Created

    http://localhost:3000/v1/purchase/search
    {
      "searchText?": string,
      "statuses": string[],
      "widgetUuids": string[],
      "merchants": string[],
      "createdAt": Date;
    }
    
    200

    OK

    http://localhost:3000/v1/widget/:widgetUuid
    {
      "data": {
          "id": string,
          "apiKey": string,
          "status": Enum['Active', 'Inactive']
          "name": string,
          "description": string,
          "merchant": string,
          "assetsByBlockchain": {
             "blockchain": Enum('ethereum', 'tron', 'binance-smart-chain', 'MATIC', 'bitcoin'),
             "assets": [
              Enum('USDT', 'USDC', 'ETH', 'MATIC','BNB', 'TRX', 'BTC')
           ],
           "confirmationsAmount": number, // min 1
           "expirationTime": number,
           "expirationTimeAction": Enum('FailRequest', 'UpdateRate')
         },
         "reusableAddress": boolean,
         "sweepingGasTolerance": number,
         "aggregationWallet": string,
         "sweepingFrequency": {
            "type":Enum('Daily', 'Weekly'),
            "period": string, // Represents either "08:00:00" or "Monday 09:00:00"
          },
          "acceptPartialPayment": boolean,
          "sweepingCost": Enum('Merchant', 'Customer'),
          "webhookUrl": string,
          "redirectUrl": string,
          "purchasesToday": number,
          "purchasesTotal": number,
          "incomeToday": number,
          "incomeTotal": number,
          "balance": number    
       }
    }
    
    200

    OK

    http://localhost:3000/v1/widget
    {
      "data": [
        {
          "id": string,
          "apiKey": string,
          "status": Enum['Active', 'Inactive']
          "name": string,
          "description": string,
          "merchant": string,
          "assetsByBlockchain": {
             "blockchain": Enum('ethereum', 'tron', 'binance-smart-chain', 'MATIC', 'bitcoin'),
             "assets": [
              Enum('USDT', 'USDC', 'ETH', 'MATIC','BNB', 'TRX', 'BTC)
           ],
           "confirmationsAmount": number, // min 1
           "expirationTime": number,
           "expirationTimeAction": Enum('FailRequest', 'UpdateRate')
         },
         "reusableAddress": boolean,
         "sweepingGasTolerance": number,
         "aggregationWallet": string,
         "sweepingFrequency": {
            "type":Enum('Daily', 'Weekly'),
            "period": string, // Represents either "08:00:00" or "Monday 09:00:00"
          },
          "acceptPartialPayment": boolean,
          "sweepingCost": Enum('Merchant', 'Customer'),
          "webhookUrl": string,
          "redirectUrl": string,
          "purchasesToday": number,
          "purchasesTotal": number,
          "incomeToday": number,
          "incomeTotal": number,
          "balance": number
        }
      ]
    }
    
    200

    OK

    http://localhost:3000/v1/purchase/:purchaseUuid
    {
      "data": {
        {
          "id": string,
           "title": string,
           "subTitle": string,
           "siteName": string,
           "asset": Enum('USDT', 'USDC', 'ETH', 'MATIC','BNB', 'TRX', 'BTC'),
           "blockchain": Enum('ethereum', 'tron', 'binance-smart-chain', 'MATIC', 'bitcoin'),
           "address": string,
           "transaction": string[],
           "fiatAmount": number,
           "fiatCurrency": [
               Enum('USD', 'EUR')
            ],
           "currentDate": Date,
           "amount": number,
           "plannedAmount": number,
           "baseCurrencyAmount": number,
           "plannedBaseCurrencyAmount": number,
           "creationDate": Date,
           "allocationDate": Date,
           "expirationDate": Date,
           "status": ENUM('Allocated', 'Expired', 'Unconfirmed', 'Confirming', 'Completed', 'Overcharge', 'Undercharge', 'Failed', 'GenerateAddressFailed', 'Swept'),
           "widgetId": string,
           "redirectUrl": string,
           "confirmationAmount": number,
           "acceptPartialPayment": boolean,
           "widgetName": string,
           "sweepingStatus": <TBD>,
           "sweepingFee": <TBD>
           "merchantName": string,
           "redirectUrl": string,
           "widgetId": string,
           "purchaseIdentifier": string,
        }
      }
    }
    
    200

    OK

    http://localhost:3000/v1/widget/purchase/:purchaseUuid
    {
      "data": 
         {
            "id": string,
            "title": string,
            "subTitle": string,
            "siteName": string,
            "asset": Enum(&#x27;USDT&#x27;, &#x27;USDC&#x27;, &#x27;ETH&#x27;, &#x27;MATIC&#x27;,&#x27;BNB&#x27;, &#x27;TRX&#x27;, &#x27;BTC&#x27;),
            "blockchain": Enum(&#x27;ethereum&#x27;, &#x27;tron&#x27;, &#x27;binance-smart-chain&#x27;, &#x27;MATIC&#x27;, &#x27;bitcoin&#x27;),
            "address": string,
            "transaction": string[],
            "fiatAmount": number,
            "fiatCurrency": [
                Enum(&#x27;USD&#x27;, &#x27;EUR&#x27;)
             ],
            "currentDate": Date,
            "amount": number,
            "plannedAmount": number,
            "baseCurrencyAmount": number,
            "plannedBaseCurrencyAmount": number,
            "creationDate": Date,
            "allocationDate": Date,
            "expirationDate": Date,
            "status": ENUM(&#x27;Allocated&#x27;, &#x27;Expired&#x27;, &#x27;Unconfirmed&#x27;, &#x27;Confirming&#x27;, &#x27;Completed&#x27;, &#x27;Overcharge&#x27;, &#x27;Undercharge&#x27;, &#x27;Failed&#x27;, &#x27;GenerateAddressFailed&#x27;, &#x27;Swept&#x27;),
            "widgetId": string,
            "redirectUrl": string,
            "confirmationAmount": number,
            "acceptPartialPayment": boolean,
            "widgetName": string,
            "sweepingStatus": <TBD>,
            "sweepingFee": <TBD>
            "merchantName": string,
            "redirectUrl": string,
            "widgetId": string,
            "purchaseIdentifier": string,
         }
    }
    
    200

    OK

    http://localhost:3000/v1/widget/purchase
    {
      "data": 
        "purchases": [
          {
            "id": string,
            "title": string,
            "subTitle": string,
            "siteName": string,
            "asset": Enum('USDT', 'USDC', 'ETH', 'MATIC','BNB', 'TRX', 'BTC'),
            "blockchain": Enum('ethereum', 'tron', 'binance-smart-chain', 'MATIC', 'bitcoin'),
            "address": string,
            "transaction": string[],
            "fiatAmount": number,
            "fiatCurrency": [
                Enum('USD', 'EUR')
             ],
            "currentDate": Date,
            "amount": number,
            "plannedAmount": number,
            "baseCurrencyAmount": number,
            "plannedBaseCurrencyAmount": number,
            "creationDate": Date,
            "allocationDate": Date,
            "expirationDate": Date,
            "status": ENUM('Allocated', 'Expired', 'Unconfirmed', 'Confirming', 'Completed', 'Overcharge', 'Undercharge', 'Failed', 'GenerateAddressFailed', 'Swept'),
            "widgetId": string,
            "redirectUrl": string,
            "confirmationAmount": number,
            "acceptPartialPayment": boolean,
            "widgetName": string,
            "sweepingStatus": <TBD>,
            "sweepingFee": <TBD>
            "merchantName": string,
            "redirectUrl": string,
            "widgetId": string,
            "purchaseIdentifier": string,
          }
        ],
       "total": number
    }
    
    200

    OK

    http://localhost:3000/v1/merchant/income-transaction
    {
        "data": [
            {
                "id": number,
                "purchaseId": string,
                "address": string,
                "blockchain": Enum('ethereum', 'tron', 'binance-smart-chain', 'MATIC'),
                "assets": [
                    Enum('USDT', 'USDC', 'ETH', 'MATIC','BNB', 'TRX')
                 ],
                "hash": string,
                "amount": number,
                "sourceaddress": string
            },
         ]
    }
    
    200

    OK

    http://localhost:3000/v1/customer/incoming-transaction
    POST /v1/merchant/purchase/search HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 283
    
    "{\r\n    // \"searchText\": \"sam\"\r\n    // \"statuses\": [\"Completed\"]\r\n    // \"widgetUuids\": [\"903fea77-636c-477a-9692-d189b92b56bc\", \"95ba9ae3-7b71-482d-9989-23e420483c59\"]\r\n    // \"merchants\": [\"Merchant #1\"]\r\n    // \"createdAt\": \"2025-04-25T16:43\"\r\n}"
    {
      "data": {
        "purchases": [
          {
            "id": "9707d9d6-e38b-46a5-93e6-e182e2998bcc",
            "title": "F-16 Fighting Falcon",
            "subTitle": "Fighter aircraft",
            "siteName": "MySuperSite",
            "asset": "TRX",
            "blockchain": "tron",
            "address": "TJ82CHL6mrUpiobrq1Co1CYeML1BrPF1sa",
            "transactions": [],
            "fiatAmount": 5,
            "fiatCurrency": "USD",
            "currentDate": "2025-05-02T10:50:55.762Z",
            "confirmationAmount": 20,
            "amount": 0,
            "plannedAmount": 20.401369,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 5,
            "creationDate": "2025-05-02T10:11:11.181Z",
            "allocationDate": "2025-05-02T10:11:25.435Z",
            "expirationDate": "2025-05-02T10:21:25.435Z",
            "status": "Allocated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "[email protected]"
          },
          {
            "id": "cabcb234-7409-4611-adf6-4484b49e0d44",
            "title": "F-16 Fighting Falcon",
            "subTitle": "Fighter aircraft",
            "siteName": "MySuperSite",
            "address": null,
            "transactions": [],
            "fiatAmount": 5,
            "fiatCurrency": "USD",
            "currentDate": "2025-05-02T10:50:55.762Z",
            "confirmationAmount": 1,
            "amount": 0,
            "plannedAmount": 0,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 0,
            "creationDate": "2025-05-02T10:09:59.653Z",
            "allocationDate": null,
            "expirationDate": null,
            "status": "Failed",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "[email protected]"
          },
          {
            "id": "35798a3f-593a-4d96-a391-f72fe2114e4f",
            "title": "Payment",
            "subTitle": "The payment description",
            "siteName": "Merchant Site",
            "address": null,
            "transactions": [],
            "fiatAmount": 1.5,
            "fiatCurrency": "USD",
            "currentDate": "2025-05-02T10:50:55.762Z",
            "confirmationAmount": 1,
            "amount": 0,
            "plannedAmount": 0,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 0,
            "creationDate": "2025-04-30T10:18:27.773Z",
            "allocationDate": null,
            "expirationDate": null,
            "status": "Initiated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "[email protected]"
          },
          {
            "id": "914a5275-2efe-4f8e-a297-c7351eb6a70a",
            "title": "Payment",
            "subTitle": "The payment description",
            "siteName": "Merchant Site",
            "address": null,
            "transactions": [],
            "fiatAmount": 1.5,
            "fiatCurrency": "USD",
            "currentDate": "2025-05-02T10:50:55.762Z",
            "confirmationAmount": 1,
            "amount": 0,
            "plannedAmount": 0,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 0,
            "creationDate": "2025-04-30T09:12:21.503Z",
            "allocationDate": null,
            "expirationDate": null,
            "status": "Initiated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "[email protected]"
          },
          {
            "id": "5068ff2c-dc7c-483c-b523-ae7bf224d547",
            "title": "Payment",
            "subTitle": "The payment description",
            "siteName": "Merchant Site",
            "asset": "TRX",
            "blockchain": "tron",
            "address": "TSRgRsSagJkeTza5Ei2bamDHp3sscbWhud",
            "transactions": [],
            "fiatAmount": 1.5,
            "fiatCurrency": "USD",
            "currentDate": "2025-05-02T10:50:55.762Z",
            "confirmationAmount": 20,
            "amount": 0,
            "plannedAmount": 6.125299,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 1.500047,
            "creationDate": "2025-04-30T09:10:51.468Z",
            "allocationDate": "2025-04-30T09:11:33.747Z",
            "expirationDate": "2025-04-30T09:21:33.747Z",
            "status": "Allocated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "[email protected]"
          }
        ],
        "total": 389
      }
    }
    {
      "data": 
        "purchases": [
          {
            "id": string,
            "title": string,
            "subTitle": string,
            "siteName": string,
            "asset": Enum('USDT', 'USDC', 'ETH', 'MATIC','BNB', 'TRX', 'BTC'),
            "blockchain": Enum('ethereum', 'tron', 'binance-smart-chain', 'MATIC', 'bitcoin'),
            "address": string,
            "transaction": string[],
            "fiatAmount": number,
            "fiatCurrency": [
                Enum('USD', 'EUR')
             ],
            "currentDate": Date,
            "amount": number,
            "plannedAmount": number,
            "baseCurrencyAmount": number,
            "plannedBaseCurrencyAmount": number,
            "creationDate": Date,
            "allocationDate": Date,
            "expirationDate": Date,
            "status": ENUM('Allocated', 'Expired', 'Unconfirmed', 'Confirming', 'Completed', 'Overcharge', 'Undercharge', 'Failed', 'GenerateAddressFailed', 'Swept'),
            "widgetId": string,
            "redirectUrl": string,
            "confirmationAmount": number,
            "acceptPartialPayment": boolean,
            "widgetName": string,
            "sweepingStatus": <TBD>,
            "sweepingFee": <TBD>
            "merchantName": string,
            "redirectUrl": string,
            "widgetId": string,
            "purchaseIdentifier": string,
          }
        ],
       "total": number
    }
    
    {
      "data": {
        "id": "21a12efa-33c5-4461-8d03-2449391b549a",
        "status": "Active",
        "name": "MyFirstWidget",
        "description": "Some nice description",
        "merchant": "Merchant #1",
        "blockchainAssets": [
          {
            "blockchain": "ethereum",
            "expirationTime": 3,
            "confirmationsAmount": "3",
            "expirationTimeAction": "UpdateRate",
            "assets": [
              "USDC",
              "ETH"
            ]
          },
          {
            "blockchain": "tron",
            "expirationTime": 5,
            "confirmationsAmount": "5",
            "expirationTimeAction": "UpdateRate",
            "assets": [
              "TRX",
              "USDT"
            ]
          }
        ],
        "reusableAddress": true,
        "sweepingGasTolerance": "20.00000000",
        "aggregationWallet": "dd32332trgdjdrawe",
        "sweepingFrequency": {
          "type": "Daily",
          "period": "14:00:00"
        },
        "acceptPartialPayment": true,
        "sweepingCost": "Customer",
        "webhookUrl": "http://merchant-site.com",
        "redirectUrl": "http://redirect-url.com",
        "purchasesToday": 0,
        "purchasesTotal": 0,
        "incomeToday": 0,
        "incomeTotal": 0,
        "balance": 0
      }
    }
    GET /v1/merchant/widget/da9f2521-0167-436a-9f04-3bcc9dcad182 HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": [
        {
          "id": "21a12efa-33c5-4461-8d03-2449391b549a",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "UpdateRate",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 3,
              "confirmationsAmount": "3",
              "expirationTimeAction": "UpdateRate",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "378a2829-bed1-45fb-b009-9873264572c2",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 10,
              "confirmationsAmount": "10",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 1,
              "confirmationsAmount": "10",
              "expirationTimeAction": "UpdateRate",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site2.com",
          "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "2844eca8-6b89-449f-8ec4-9d678e57791b",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "601a35f7-68d2-4406-8ee6-c8a4fd3d1930",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 1,
              "confirmationsAmount": "10",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 1,
              "confirmationsAmount": "10",
              "expirationTimeAction": "UpdateRate",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site2.com",
          "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "ae51a757-4f24-43ce-b349-c2c76aabe27a",
          "status": "Active",
          "name": "MyFirstWidget1111",
          "description": "Some nice description111",
          "merchant": "Merchant #1111",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 1,
              "confirmationsAmount": "1",
              "expirationTimeAction": "UpdateRate",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 1,
              "confirmationsAmount": "1",
              "expirationTimeAction": "UpdateRate",
              "assets": [
                "USDT",
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site2.com",
          "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
          "purchasesToday": 0,
          "purchasesTotal": 5,
          "incomeToday": 0,
          "incomeTotal": 25,
          "balance": 5
        },
        {
          "id": "5b853530-e4ec-4670-bae8-7eb192bdef2c",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "5da30c5c-4863-4d37-bf5b-ef396acaef5d",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "2ca0b7c7-c0c9-4482-a4cf-6a5cce7b4374",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "567184ec-72d9-45ce-91e1-3eb4c4db81d8",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "1fd06fef-98c1-443e-9318-f09ed43db23c",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "76df9940-bcaa-4e68-a803-4c6ea199f895",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [
            {
              "blockchain": "tron",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "USDT",
                "TRX"
              ]
            },
            {
              "blockchain": "ethereum",
              "expirationTime": 5,
              "confirmationsAmount": "5",
              "expirationTimeAction": "FailRequest",
              "assets": [
                "ETH",
                "USDC"
              ]
            }
          ],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "d34a9f9f-64fc-4bc3-828b-9964c1954aa5",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "c1ce409f-2a4d-46d2-9e91-bcff999835ec",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "68e6dcf0-f9f6-4856-b6ba-edf2d294773e",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "7b5cd04b-92f6-4b8f-9b47-9a4c32e39220",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "d815f1ea-1a4f-4cb6-886c-be6c4e2af520",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "23014fb3-dd71-4165-9fe9-91627daf6ad8",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "56686a8d-6003-4b0b-b874-82c3d4b26a70",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        },
        {
          "id": "993e6bca-f7de-4528-9658-a235a010b76a",
          "status": "Active",
          "name": "MyFirstWidget",
          "description": "Some nice description",
          "merchant": "Merchant #1",
          "blockchainAssets": [],
          "reusableAddress": true,
          "sweepingGasTolerance": "20.00000000",
          "aggregationWallet": "dd32332trgdjdrawe",
          "sweepingFrequency": {
            "type": "Daily",
            "period": "14:00:00"
          },
          "acceptPartialPayment": true,
          "sweepingCost": "Customer",
          "webhookUrl": "http://merchant-site.com",
          "redirectUrl": "http://redirect-url.com",
          "purchasesToday": 0,
          "purchasesTotal": 0,
          "incomeToday": 0,
          "incomeTotal": 0,
          "balance": 0
        }
      ]
    }
    GET /v1/merchant/widget HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": {
        "id": "057590e2-002d-4c3b-b646-6a9fbcda89b0",
        "title": "Payment Title X",
        "subTitle": "The payment description XXX",
        "siteName": "Merchant Site",
        "asset": "TRX",
        "blockchain": "tron",
        "address": "TSRgRsSagJkeTza5Ei2bamDHp3sscbWhud",
        "transactions": [
          "302ae537cde6d88bafc5f84f8406ffab48f973bd31cce40de15b66d9adcfb00a"
        ],
        "fiatAmount": 2.5,
        "fiatCurrency": "USD",
        "currentDate": "2025-05-02T10:52:02.871Z",
        "confirmationAmount": 20,
        "amount": 10.174252,
        "plannedAmount": 10.174252,
        "baseCurrency": "USD",
        "baseCurrencyAmount": 2.499494,
        "plannedBaseCurrencyAmount": 2.499979,
        "creationDate": "2025-04-29T15:28:48.742Z",
        "allocationDate": "2025-04-29T15:29:07.974Z",
        "expirationDate": "2025-04-29T15:39:07.974Z",
        "status": "Completed",
        "acceptPartialPayment": true,
        "widgetName": "MyFirstWidget9",
        "sweepingStatus": "TBD",
        "sweepingFee": "TBD",
        "merchantName": "Merchant #1",
        "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
        "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
        "purchaseIdentifier": "[email protected]"
      }
    }
    GET /v1/merchant/purchase/dadb4fff-d69e-4760-980a-182b15421ff9 HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": {
        "id": "577f1edb-35fb-4836-b316-1bd545e9be08",
        "title": "F-16 Fighting Falcon",
        "subTitle": "Fighter aircraft",
        "siteName": "MySuperSite",
        "asset": "TRX",
        "blockchain": "tron",
        "address": "THGuLU7aQzULJoxStv3rkVH2DFhz64J9Z5",
        "transactions": [],
        "fiatAmount": 5,
        "fiatCurrency": "USD",
        "currentDate": "2025-05-14T06:01:15.028Z",
        "confirmationAmount": 20,
        "amount": 0,
        "plannedAmount": 20.247751,
        "baseCurrency": "USD",
        "baseCurrencyAmount": 0,
        "plannedBaseCurrencyAmount": 5.000362,
        "creationDate": "2025-04-29T08:44:31.372Z",
        "allocationDate": "2025-04-29T11:45:27.322Z",
        "expirationDate": "2025-04-29T11:46:27.322Z",
        "status": "Expired",
        "acceptPartialPayment": false,
        "widgetName": "MyFirstWidget",
        "sweepingStatus": "TBD",
        "sweepingFee": "TBD",
        "merchantName": "Merchant #1",
        "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
        "widgetId": "903fea77-636c-477a-9692-d189b92b56bc",
        "purchaseIdentifier": "[email protected]"
      }
    }
    GET /v1/widget/purchase/e36bea7d-5685-4fdc-be66-1db73ce56c7c HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": {
        "purchases": [
          {
            "id": "4f251421-d481-4590-a493-4b180dbcc4f5",
            "title": "Payment",
            "subTitle": "The payment description",
            "siteName": "Merchant Site",
            "asset": "USDC",
            "blockchain": "ethereum",
            "address": "0xe4827dc95c976ec1f7e5f2c02ec1824b9aa400c9",
            "transactions": [],
            "fiatAmount": 1.5,
            "fiatCurrency": "USD",
            "currentDate": "2025-05-02T11:08:23.236Z",
            "confirmationAmount": 12,
            "amount": 0,
            "plannedAmount": 1.51,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 1.500131,
            "creationDate": "2025-04-30T08:14:03.255Z",
            "allocationDate": "2025-04-30T08:14:48.095Z",
            "expirationDate": "2025-04-30T08:24:48.095Z",
            "status": "Allocated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "[email protected]"
          },
          {
            "id": "9dda9e39-dd1c-4fcf-aaa7-1e917c5be829",
            "title": "woocommerce",
            "subTitle": "woocommerce",
            "siteName": "woocommerce",
            "address": null,
            "transactions": [],
            "fiatAmount": 500000,
            "fiatCurrency": "EUR",
            "currentDate": "2025-05-02T11:08:23.236Z",
            "confirmationAmount": 1,
            "amount": 0,
            "plannedAmount": 0,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 0,
            "creationDate": "2025-04-30T07:12:04.149Z",
            "allocationDate": null,
            "expirationDate": null,
            "status": "Initiated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "inabit_wc_order_kObFb1WCr4jaG_1745997123"
          },
          {
            "id": "1d3130d8-490c-4bbe-9293-98a6946e0e2a",
            "title": "woocommerce",
            "subTitle": "woocommerce",
            "siteName": "woocommerce",
            "address": null,
            "transactions": [],
            "fiatAmount": 500000,
            "fiatCurrency": "EUR",
            "currentDate": "2025-05-02T11:08:23.236Z",
            "confirmationAmount": 1,
            "amount": 0,
            "plannedAmount": 0,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 0,
            "creationDate": "2025-04-30T07:04:06.042Z",
            "allocationDate": null,
            "expirationDate": null,
            "status": "Initiated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "inabit_wc_order_6SgURExYzGpTn_1745996645"
          },
          {
            "id": "b5b20231-527c-43c5-927c-bdd1caeed1bf",
            "title": "woocommerce",
            "subTitle": "woocommerce",
            "siteName": "woocommerce",
            "address": null,
            "transactions": [],
            "fiatAmount": 1000000,
            "fiatCurrency": "EUR",
            "currentDate": "2025-05-02T11:08:23.236Z",
            "confirmationAmount": 1,
            "amount": 0,
            "plannedAmount": 0,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 0,
            "creationDate": "2025-04-30T06:57:38.846Z",
            "allocationDate": null,
            "expirationDate": null,
            "status": "Initiated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "inabit_wc_order_xekGDPxdCjej4_1745996258"
          },
          {
            "id": "0ccbcc91-d79e-4958-8298-77695d5dfca6",
            "title": "woocommerce",
            "subTitle": "woocommerce",
            "siteName": "woocommerce",
            "asset": "USDC",
            "blockchain": "ethereum",
            "address": "0x3e2338973beb76d02d07298e9e0e45de7523782c",
            "transactions": [],
            "fiatAmount": 500000,
            "fiatCurrency": "EUR",
            "currentDate": "2025-05-02T11:08:23.236Z",
            "confirmationAmount": 12,
            "amount": 0,
            "plannedAmount": 569599.87,
            "baseCurrency": "USD",
            "baseCurrencyAmount": 0,
            "plannedBaseCurrencyAmount": 569530,
            "creationDate": "2025-04-30T06:53:52.333Z",
            "allocationDate": "2025-04-30T06:53:58.019Z",
            "expirationDate": "2025-04-30T07:03:58.019Z",
            "status": "Allocated",
            "acceptPartialPayment": true,
            "widgetName": "MyFirstWidget9",
            "sweepingStatus": "TBD",
            "sweepingFee": "TBD",
            "merchantName": "Merchant #1",
            "redirectUrl": "https://dev-merchant.aybabtu.xyz/",
            "widgetId": "8157eb9f-0ace-45ae-b8c9-7953637896cf",
            "purchaseIdentifier": "inabit_wc_order_bIVN8dMsplAbs_1745996032"
          }
        ],
        "total": 268
      }
    }
    GET /v1/widget/purchase HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": {
        "transactions": [
          {
            "id": 133,
            "purchaseId": "057590e2-002d-4c3b-b646-6a9fbcda89b0",
            "address": "TSRgRsSagJkeTza5Ei2bamDHp3sscbWhud",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "302ae537cde6d88bafc5f84f8406ffab48f973bd31cce40de15b66d9adcfb00a",
            "amount": 10.174252,
            "sourceAddress": "TG6wQhZHESbJJrmPrY22LS2CbZYdnL1aHJ"
          },
          {
            "id": 131,
            "purchaseId": "a6c37637-a465-4dec-99c2-af79df134078",
            "address": "TCL6HenyHtFhvJRp7F936V6TukAk5oCduk",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "b17efc77ccab25a919a95feb664b207894a32c5b19aac209dd83f4790809e5b4",
            "amount": 10.121646,
            "sourceAddress": "TG6wQhZHESbJJrmPrY22LS2CbZYdnL1aHJ"
          },
          {
            "id": 130,
            "purchaseId": "bfa79463-a32c-4e13-b90b-16a5e58d9dc6",
            "address": "TCL6HenyHtFhvJRp7F936V6TukAk5oCduk",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "1fb5b8bbfc373be7e968b17bf37c23223c5a918938196f228f467945690695d0",
            "amount": 10.252323,
            "sourceAddress": "TG6wQhZHESbJJrmPrY22LS2CbZYdnL1aHJ"
          },
          {
            "id": 123,
            "purchaseId": "99439c8e-f620-4a9b-9dcd-61d0e5f54d36",
            "address": "TSc38UsFkVxfihqDKLen1adRWBEMhJfFpi",
            "asset": "USDT",
            "blockchain": "tron",
            "hash": "ccd4532ea0d5ea432a87e190b5620ae0e296138f93d33e20368a4d861d1ee426",
            "amount": 2.51,
            "sourceAddress": "TG6wQhZHESbJJrmPrY22LS2CbZYdnL1aHJ"
          },
          {
            "id": 120,
            "purchaseId": "8891f263-304f-473d-b268-0b83dbfa7867",
            "address": "bc1qtt36peycf8a78pue6zznds23fk6l0hq7uju3mg",
            "asset": "BTC",
            "blockchain": "bitcoin",
            "hash": "1a0d3612cdb10dfa369995e160a26c1ae5f890209b446396565b94c0fe233575",
            "amount": 0.00002822,
            "sourceAddress": "bc1qdcs0jd7ewe69vfaw589nseq792zptegjj9p52v"
          }
        ],
        "total": 50
      }
    }
    GET /v1/merchant/incoming-transaction HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": {
        "transactions": [
          {
            "id": 52,
            "customerId": "6c998f55-e6c1-46a7-81c9-b0a37e7c5791",
            "address": "TBKpjzT2ENHMr1QD4tir1E7xWhb3bAEkCP",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "cmchp6f4t032agw016rsmmk0y",
            "amount": 10.919025,
            "sourceAddress": "TEvaN9pmFwn6CimujVfADysfTN4fyc5BkW",
            "status": "Completed",
            "currentConfirmation": 23,
            "targetConfirmations": 20
          },
          {
            "id": 51,
            "customerId": "27b4f808-be6c-4701-bff3-6eeaad8389e9",
            "address": "TXET3vPNZoS3rs1njfXtUj9wQrhoLUaLQs",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "cmchiz05g0193gw01qx57ejs0",
            "amount": 10.889536,
            "sourceAddress": "TEvaN9pmFwn6CimujVfADysfTN4fyc5BkW",
            "status": "Completed",
            "currentConfirmation": 21,
            "targetConfirmations": 20
          },
          {
            "id": 50,
            "customerId": "54c18bc5-70d3-45bd-81c2-e2bbaba27464",
            "address": "TTf28GEr2eGKAB5YnhnE1x38b9QB6CArSe",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "cmchfskm900cbgw0175m9z1j9",
            "amount": 9.067689,
            "sourceAddress": "TEvaN9pmFwn6CimujVfADysfTN4fyc5BkW",
            "status": "Completed",
            "currentConfirmation": 20,
            "targetConfirmations": 20
          },
          {
            "id": 49,
            "customerId": "54c18bc5-70d3-45bd-81c2-e2bbaba27464",
            "address": "TTf28GEr2eGKAB5YnhnE1x38b9QB6CArSe",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "1229425399h4z11m73w062nd21",
            "amount": 21.674526,
            "sourceAddress": "TT4NZHexV2JbUFoy1KHWUvkkrk11oGqzo6",
            "status": "Completed",
            "currentConfirmation": 20,
            "targetConfirmations": 20
          },
          {
            "id": 48,
            "customerId": "54c18bc5-70d3-45bd-81c2-e2bbaba27464",
            "address": "TTf28GEr2eGKAB5YnhnE1x38b9QB6CArSe",
            "asset": "TRX",
            "blockchain": "tron",
            "hash": "1229425399h4z11m13w062nd21",
            "amount": 21.674526,
            "sourceAddress": "TT4NZHexV2JbUFoy1KHWUvkkrk11oGqzo6",
            "status": "Completed",
            "currentConfirmation": 20,
            "targetConfirmations": 20
          }
        ],
        "total": 6
      }
    }
    {
        "data": { 
           "transactions":
            [
                {
                    "id": number,
                    "customerId": string,
                    "address": string,
                    "assets": [
                         Enum('USDT', 'USDC', 'ETH', 'MATIC','BNB', 'TRX', 'BTC')
                     ],
                    "blockchain": Enum('ethereum', 'tron', 'binance-smart-chain', 'MATIC', 'bitcoin'),
                    "hash": string,
                    "amount": number,
                    "sourceaddress": string,
                    "currentConfirmation": number,
                    "targetConfirmations": number
                },
            ],
            "total": number
    }
    
    GET /v1/customer/incoming-transaction HTTP/1.1
    Host: {{base_url}}
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*