Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Learn how to deploy our widgets on your website.
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.
Implement the Inabit Approval App. (link)
Create the widget. (link)
Embed the widget into your website.(link)
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.
Read our documentation and get up to speed on how to access our API capabilities.
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.
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.

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.
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).
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)
Enable Terminal for your organization (via support)
Create a widget (via the Inabit Dashboard or API)
Display the widget to your customer - a QR code + address will be generated
Customer pays in crypto
Inabit monitors the blockchain
You receive a webhook (or poll API) once confirmed
You fulfill the order or service, and optionally settle to fiat
You can manage the entire flow through the Inabit Dashboard - no code required.
Inabit Terminal supports two widget types, depending on your payment model:
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
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.
✅ 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
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.
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.
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.
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.
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.
inabit will use this URL to send back webhook callbacks/notifications to this address.
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.
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 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.
Noteinabit 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.






What is gas sweeping and how it works in our terminal
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.
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.
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.)
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.
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.
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.
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.
Purpose:
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.
An example use case of how the Terminal can be utilized.
Learn about our gas funding & sweeping as part of the terminal's operations
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.
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.
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.
Platform integrator (white-label provider)
Sub-clients (merchants, financial apps, platforms)
End customers
Integrator contacts Inabit support to enable Terminal for their main organization. Implement the Inabit Approval App to authorize API operations and widget management.
For each client, create a dedicated Inabit organization via admin tools or API.
Create Customer Address or Purchase Address widgets for each organization.
Sub-client embeds the widgets into their checkout or product interface.
Each sub-client receives its own webhook events for transaction updates.
Integrator manages settlement, compliance, and reporting across clients.
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
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
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 →
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 →
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).
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.
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.
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.

Learn about the entities surrounding our payments terminal
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.
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.
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.
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.
Widget type: Customer Address only (not Purchase or other widgets).
Side: Backend/server only (no client-side API calls here).
All API calls on this page must be made from your server
Never expose your Widget API Key to the browser or mobile client.
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
Each customer is identified by a customerUuid. Use your own stable identifier (email, user ID) as the customerIdentifier.
Response
Response
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.
If needed fetch the widget asset list
Response
This is the list of all supported asset for the widget.
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"
}
}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
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
a. Add the following script tag to your page header:
Call openwidget function with token id, should open in popup After the customer clicks on the button (buy with crypto for example )
Redirect:
Inline (iFrame):
Need any further help? Feel free to if you encounter any issues during the widget implementation process.
An example use case of how the Terminal can be utilized.
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.
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.
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.
PSP (operator)
Merchant (PSP’s client)
End customer (payer)
PSP contacts Inabit support to enable Terminal for their organization (sandbox or mainnet).
Implement the Inabit Approval App to authorize access and manage keys.
PSP creates and configures widgets via the Inabit Dashboard (no code required).
Widgets are embedded into merchant checkout or point-of-sale systems.
UI-based onboarding and widget creation
Self-custody setup with secure key management
Crypto-to-fiat settlement options
Per-widget webhook notifications
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
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.
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.
pushInabit 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.
pullPoll 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.
An example use case of how the Terminal can be utilized.
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.
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.
Platform developer
Platform user
End customer
Developer contacts Inabit support to enable Terminal in sandbox or mainnet.
Implement the to authorize API operations and widget management.
Create a for each platform user or transaction.
Embed the widget into the platform’s UI (e.g., checkout page, account dashboard).
Persistent or transaction-specific addresses
Webhook events: pending, confirmed, expired
Polling option via Terminal API
Sandbox for testing and validation
Fits seamlessly into existing SaaS workflows
Enables automated crypto payment handling
Supports recurring payments or on-demand events
Minimal backend complexity
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.
Bitcoin
Bitcoin Testnet 4 Faucet
Provides BTC testnet funds for Testnet 4
NoteThe 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.
Guide describing how PSPs integrate with inabit’s our Terminal Gateway API
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
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:
An example use case of how the Terminal can be utilized.
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.
Merchant
End customer
Merchant (or PSP on their behalf) contacts Inabit support to enable the Terminal feature.
Implement the Inabit Approval App to authorize API operations and widget management.
Create a Purchase Address widget through Inabit’s API.
Embed the widget on the merchant’s checkout page or display the QR code at a physical terminal.
Customer scans the QR code or copies the address to pay in crypto.
Inabit Terminal detects the incoming transaction and confirms it.
Merchant receives a webhook and completes the order (shipping or service delivery).
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
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.
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.
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.
PSP (integration owner
Merchant clients (end users)
End customers (crypto payers)
PSP enables Terminal via Inabit support.
PSP Implements the Inabit Approval App to access wallets and configure permissions.
PSP provisions organizations per merchant or segment (optional).
Widgets are created via the API with specific chains, assets, confirmation settings.
PSP integrates webhooks and/or uses polling to update merchant systems in real time.
PSP manages gas, settlements, and off-ramp logic through Inabit’s APIs and dashboards.
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
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.
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.).
Ethereum
Web3 Faucet
Provides Ethereum testnet funds for Sepolia.
Ethereum
Multichain Faucet
Provides free testnet funds for Sepolia.
Solana
Sol Faucet
Provides testnet SOL.
Ripple
XRP Testnet Faucet
Awaiting activation for XRP testnet tokens


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.
Before integrating, it is critical to understand the three main components of the inabit ecosystem:
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.
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).
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.
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:
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>
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
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.
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.
The Master Wallet serves as the central aggregator for all crypto transactions and funds flow. It is a secure, self-custody wallet
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
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.
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.
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.”
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.)
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.
Supported methods:
Redirect
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
Supported methods:
Redirect
iframe
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
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.
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.)
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.
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.
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
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
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.
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
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).
A: Contact the Inabit support team with your organization ID. Terminal access is available in both mainnet and sandbox (testnet) environments.
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.
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.
A: Yes. Enable the reuseAddress setting when creating the widget. Otherwise, the address will expire after a defined time or a single payment.
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.
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.
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.
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.
A: Yes. You can use the Terminal API to retrieve widget status and monitor incoming payments programmatically.
A: Inabit automatically retries failed webhook deliveries using exponential backoff. You can also fetch the latest status using the API to reconcile.
A: No. Inabit Terminal is a self-custody platform. All deposit addresses are controlled by your organization, and you retain full access to funds.
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)
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.
Guide describing how the Orchestrator integrates with inabit’s APIs..
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.
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.
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.
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
(Architecture diagram)
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! ✨
The merchant begins by creating an account on the inabit platform.
Step-by-Step:
As a merchant, visit the onboarding URL: https://use.inabit.com/create_account?channel=[OrchestratorName]
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.
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.
inabit allows access to its API for the Orchestrator by generating 2 API users under the merchant's account:
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.
Learn more about API User Roles in a .
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.
The Remote Approver App (Approver Docker) enables policy-based, automated approvals for API wallets only (it does not apply to UI wallets).
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.
Once the Docker is up and running, the pairing process will commence as follows:
Docker issues a Pairing Code in the Docker logs (example log output shown in the original guide).
Docker proceeds to send an approval request to the owner to authorize the approver app (just like any other user).
The Orchestrator/merchant sends the Pairing Code to the merchant owner via a secured channel of choice.
The merchant’s owner inserts the code in the mobile app to complete the pairing process.
Once device pairing is completed, the Orchestrator proceeds to create a Master Wallet for the merchant through inabit's API.
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.
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).
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, :
To enable inabit Terminal, contact inabit Support. As part of activation:
Provide a generic webhook URL to serve as the organization-level default for events.
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).
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.
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.)
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.
Supported methods:
API
iframe
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.
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.
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.)
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.
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 .
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
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.
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.
Learn more about the types of POS Widgets our Terminal offers
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.
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.
eCommerce checkout flows
Invoices with expiration windows
Donations or one-time contributions
Payment links in emails or support chats
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.
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)
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.
Recurring user payments
Wallet or account top-ups
Subscription billing (manual)
Developer platforms or marketplaces
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.
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
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
Learn more about the types of POS Widgets our Terminal offers
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.
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.
eCommerce checkout flows
Invoices with expiration windows
Donations or one-time contributions
Payment links in emails or support chats
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.
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)
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.
Recurring user payments
Wallet or account top-ups
Subscription billing (manual)
Developer platforms or marketplaces
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.
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
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
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
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.
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 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.
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.
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 clearing-ready POS widgets through our 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.
What is gas refueling and how it works in our terminal
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
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
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
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 amountblockchain.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.
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.
The End-Customer requests a refund through the Merchant’s platform.
The request includes: end-customer wallet address, amount, and asset.
Merchant verifies the provided address:
Confirm valid blockchain format:
Variables (Body):
Merchant platform simulates the refund:
Check fee cost vs. refund amount.
Variables (Body):
Apply refund logic (min amount, full refund, partial refund).
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.
Refund API wallet executes withdrawal to the End-Customer’s wallet.
Transaction details logged for audit.
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.
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.
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.
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.
Provide end-customers with refund confirmation including TX hash.
Communicate expected blockchain settlement time.
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).
End-Customer requests refund → Merchant verifies & simulates.
If refund wallet balance sufficient → direct withdrawal.
If insufficient → Merchant triggers master wallet transfer or asset swap.
Refund API wallet executes withdrawal.
End-Customer receives refund → TX hash returned.
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
From the Terminal dashboard:
Click the blue “Add New Widget” button on the top right.
A widget creation drawer will appear on the right side with the following 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.
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.
Select the wallet address to which collected funds will be swept.
Dropdown field pulling from your organization's wallet list.
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.
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:

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
On the main Terminal dashboard, locate the “Gas Balance” panel.
Click the small “Add Gas” icon on the top right of the gas section.
A popup will open with funding options.
This flow enables you to directly buy gas using fiat.
Steps:
Select Blockchain to fund (e.g., Ethereum, Tron).
Enter Company Name.
Select Country.
Enter your Credit Card Details.
Enter the Amount to purchase.
Confirm and complete the payment.
Once approved, gas will be instantly credited to the selected station wallet.
Prefer to move gas from an existing crypto wallet?
Steps:
Select the Blockchain you'd like to fund.
A dedicated deposit address will be generated along with a QR code.
Send the required gas (e.g., TRX, ETH) to the address shown.
The station wallet will be updated once the transaction is confirmed.
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.
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
BTC
bitcoin
ETH
ethereum
TRX
tron
BNB
binance-smart-chain
SOL
solana
XRP
XRP
MATIC
polygon
BCH
bitcoin-cash
LTC
litecoin
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
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
Clone the release repository on your remote instance and run the installer:
After installation, the global command inabit is available.
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
Required on the host where you install the CLI:
Docker
Docker Compose
This project is part of the Inabit Remote Approver service.
Docker setup and configuration to simulate inabit approvals remotely on your server
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"
}
}
} /$$ /$$ /$$ /$$
|__/ | $$ |__/ | $$
/$$ /$$$$$$$ /$$$$$$ | $$$$$$$ /$$ /$$$$$$
| $$| $$__ $$ |____ $$| $$__ $$| $$|_ $$_/
| $$| $$ \ $$ /$$$$$$$| $$ \ $$| $$ | $$
| $$| $$ | $$ /$$__ $$| $$ | $$| $$ | $$ /$$
| $$| $$ | $$| $$$$$$$| $$$$$$$/| $$ | $$$$//$$
|__/|__/ |__/ \_______/|_______/ |__/ \___/ |__/

















The wizard validates the provided token and obtains an access token.
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
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.
During the first run, a pairing process is initiated. This includes:
Logging into Inabit using the provided login token.
Validating the user's current state.
Requesting a pairing token.
Producing an encrypted key used for signing, saving it to a mapped volume.
Sending pairing data to Inabit and requesting the 'Owner' to authorize the approver.
Refreshing the login token i.e. acquiring automatically a new valid login token.
For subsequent runs, after validating that the user is paired, the application continues its operation as usual.
If anything goes wrong during the initiation stage, the approver initiation process will be aborted.
An initial login token of a valid user within Inabit with the role: 'apiSigner'.
Enabled communication with the Inabit server (valid URL and whitelisted IPs and ports).
From within the root directory inabit/inabit-remote:
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:
The required config can be provided in 2 ways:
Baked into the docker by building the docker with a valid .env file.
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.
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:
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,
a pairing data is exchanged with Inabit including the public signing key of the approver.
an approval message is sent to the owner of the organization.
a pairing code is produced in the approver start up log trace, and must be passed directly to the owner for pairing completion.
Refer to the next page to understand how to automate signing transactions using our docker!
# 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 uninstallinabit setuprelease/
├── 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 cleanupvolumes:
- ./refresh:/app/apps/approver/refreshLOGIN_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 approverdocker-compose -f docker-compose.prod.yml up approverINABIT_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-organizationSECRET=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/datvolumes:
- ./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'
}Retrieve notifications through webhooks on transaction events and status changes
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 URLs are registered during onboarding and apply to all widgets by default. To update these, contact [email protected].
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:
Triggered when a new on-chain transaction is detected for a Customer Address widget.
Triggered when a transaction is retrieved/received for the first time. (e.g., Confirming)
Triggered when a transaction's status is updated (e.g., Confirmed).
Triggered when a Purchase Address widget is created (initiated).
Triggered when a purchase is updated (payment received, amount confirmed, status changed).
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
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
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"
}
}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
Widget API Key: (i.e.) 8119595e07cb3a87ccfa46..............1885e89d7ef4ed8c2cb
a. Add the following script tag to your page header:
Call openwidget function with purchase id, should open in popup After the customer clicks on the button (buy with crypto for example )
Need further help? Feel free to if you encounter any issues during the widget implementation process.
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'})


OK
OK
OK
OK
50OK
50{ // "searchText": "sam" // "statuses": ["Completed"] // "widgetUuids": ["903fea77-636c-477a-9692-d189b92b56bc", "95ba9ae3-7b71-482d-9989-23e420483c59"] // "merchants": ["Merchant #1"] // "createdAt": "2025-04-25T16:43" }Created
This endpoint retrieves the details about all transactions of a specific merchant based on the provided merchnat's ORGANIZATION_API_KEY.
Method: GET
URL:
Authorization: Bearer {{ORGANIZATION_API_KEY}}
limit: number
offset: number
Status: 200 OK
Content Type: application/json
Response Body
05OK
This endpoint retrieves the details about all transactions of all widget's customers based on the provided WIDGET_API_KEY.
Method: GET
URL:
Authorization: Bearer {{WIDGET_API_KEY}}
limit: number
offset: number
customerId: string
Status: 200 OK
Content Type: application/json
Response Body
05OK



Created
{
"searchText?": string,
"statuses": string[],
"widgetUuids": string[],
"merchants": string[],
"createdAt": Date;
}
OK
{
"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
}
}
OK
{
"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
}
]
}
OK
{
"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,
}
}
}
OK
{
"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,
}
}
OK
{
"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
}
OK
{
"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
},
]
}
OK
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: */*