Overview
Create, monitor, accelerate, and export on-chain transactions. Outbound transactions are evaluated against every active policy before the Bitnob Secure Enclave signs them; if a rule fires require_approval, the transaction is held in pending_authorization until the quorum is met.
- Create transactionPOST/transactions
- Batch transferPOST/transactions/batch
- Get transactionGET/transactions/:id
- List transactionsGET/transactions
- Estimate feePOST/transactions/estimate-fee
- Validate addressPOST/transactions/validate-address
- Sign transactionPOST/transactions/:id/sign
- Cancel transactionPOST/transactions/:id/cancel
- Speed up transactionPOST/transactions/:id/speed-up
- AnalyticsGET/transactions/analytics
- AssetsGET/transactions/assets
- ExportGET/transactions/export
Create Transaction (Transfer)
Use Case
Creates and signs a transfer transaction. When every policy passes, the transaction is signed automatically within the Bitnob Secure Enclave. If a policy requires multi-party approval, the transaction is parked in pending_authorization until approvers vote.
Request Body
Source wallet.
Recipient address (26-128 chars).
Human-readable amount (e.g., `"1.5"`), must be > 0.
Asset identifier (2-50 chars, e.g., `USDC_ETH`, `ETH`, `BTC`).
Network override (defaults to environment).
`low`, `medium` (default), or `high`.
Optional memo (max 256 chars).
1-64 characters.
Enable gas sponsorship from org's gas station.
Specific gas station to use (implies `sponsor_gas = true`).
Create Transaction Response
Unique identifier for this transaction. Use it on every follow-up endpoint — get, cancel, sign, speed-up, or sponsorship lookup — and pin it to your internal records.
Source wallet that owns this transaction. Lets you trace the transaction back to a customer's wallet and the parent vault.
Specific address involved in the transaction (the sending address on outbound transfers). Useful when a wallet has many derived addresses and you need to attribute funds to one.
Asset identifier — bare symbol for native assets (e.g., `ETH`, `BTC`) and `<symbol>_<chain>` for tokens (e.g., `USDC_ETH`). Matches the same identifiers used in balances and policies.
Blockchain the transaction settles on (e.g., `ethereum`, `bitcoin`, `solana`). Determines which signing curve and broadcast pipeline the Enclave uses.
Network within the chain (e.g., `mainnet`, `sepolia`, `testnet`). Critical to check — testnet and mainnet transactions are tracked separately and funds are not interchangeable.
Type of operation: `transfer` for ordinary sends, `swap` for in-protocol swaps, `contract_call` for arbitrary contract interactions, and `gas_refill` / `gas_sponsorship` for gas-station bookkeeping rows.
`outbound` when Bitnob is sending funds out (created via this endpoint); `inbound` for funds received into one of your addresses. Drives whether the wallet's `balance` decreases or increases.
Lifecycle status. Walks through `pending_signature` → `pending_authorization` (if a policy requires approval) → `signed` → `awaiting_sponsorship` → `broadcasting` → `confirming` → `completed`. Terminal failure states are `failed`, `cancelled`, and `rejected`.
Human-friendly version of `status` (e.g., `Processing`, `Completed`, `Failed`). Safe to drop into UI without translating raw enum values.
On-chain sender address. Always the wallet's address on `outbound` transactions; the external sender's address on `inbound`.
On-chain recipient address. Set from the request body for outbound transfers; the wallet's address for inbound transfers.
Raw amount in the asset's smallest unit (wei for ETH, satoshi for BTC, lamport for SOL, sun for TRX). Returned as a string to avoid floating-point precision loss in JSON.
Human-readable amount aligned to the asset's `asset_decimals` (e.g., `1.5`, `100.0`). Safe to display in UI alongside the symbol.
`native` for the chain's built-in gas asset (ETH, BTC, SOL, TRX, etc.); `token` for ERC-20s, SPLs, TRC-20s, and other contract-issued assets.
Short ticker symbol (e.g., `ETH`, `USDC`, `BTC`). Pair with `amount_decimal` for human-readable amounts in dashboards or notifications.
Token contract address when `asset_type == "token"`. Empty string for native assets — that's the quickest way to distinguish the two without inspecting `asset_type`.
Number of decimal places the asset uses (e.g., 18 for ETH, 6 for USDC, 8 for BTC). Use it to convert between `amount` and `amount_decimal` yourself when needed.
On-chain transaction hash. Empty until the Enclave signs and broadcasts; once set you can verify the tx on any block explorer for this chain.
Convenience URL for a public block explorer (e.g., Etherscan, mempool.space) once the transaction is broadcast. Empty before broadcast.
Block height the transaction was mined in. `0` while still pending or broadcasting; updates once the network includes the tx in a block.
Number of block confirmations accumulated. Bitnob marks the transaction `completed` once it meets the chain's finality threshold.
USD equivalent of `amount` at the moment the transaction was created. Snapshotted on creation so dashboards and reports stay stable even when prices move.
USD equivalent of the network fee at the time the transaction was created. Useful for reconciling cost across many transactions.
The asset → USD rate used to compute `amount_usd` and `fee_amount_usd`. Lets you re-derive the snapshots if you ever need to.
Failure reason — populated only when `status` is `failed`. Empty string on healthy transactions.
When Bitnob accepted the transaction request. Set immediately on creation; the other timestamps below fill in as the transaction progresses.
When the Bitnob Secure Enclave produced a signature for the transaction. Empty until status leaves `pending_signature` / `pending_authorization`.
When the signed transaction was submitted to the network. Empty until status reaches `broadcasting` or later.
When the transaction crossed the chain's confirmation threshold and Bitnob marked it `completed`. Empty until then.
Network fee breakdown for this transaction — contains `amount`, `amount_decimal`, `asset_id`, `asset_symbol`, and `asset_decimals` for the fee asset (usually the chain's native gas token).
`true` when a gas station paid the network fee for this transfer instead of the source wallet. Lets you tell sponsored withdrawals apart at a glance.
Identifier of the gas station that funded the fee when `sponsored = true`. Empty for self-funded transactions.
Identifier of the separate `gas_sponsorship` transaction that moved the fee asset from the gas station to this wallet. Use it to reconcile sponsored fee flows.
Raw amount of native gas the sponsor transferred into the source wallet to cover the fee, in the asset's smallest unit.
Batch Transfer
Use Case
Sends up to 100 transfers in a single request from the same source wallet.
Request Body
Wallet that funds every transfer in this batch.
1-100 transfer items. Each item produces its own transaction.
Recipient address (26-128 chars). Validated against the asset's chain.
Asset identifier (e.g., `USDC_ETH`, `ETH`, `BTC`). Chain is inferred from the asset.
Human-readable amount (e.g., `"50"`, `"1.5"`). Must be > 0.
Optional client reference (max 64 chars) echoed back on the leg's transaction.
Network the whole batch settles on (e.g., `mainnet`, `sepolia`).
Client-generated key (1-64 chars) that deduplicates batch retries.
Get Transaction
Use Case
Retrieves a single transaction by ID.
Get Transaction Response
data is the same TransactionResponse object returned by Create Transaction Response. Refer there for the per-field explanations.
List Transactions
Use Case
Lists transactions for a wallet or address. Either wallet_id or address_id is required.
Query Parameters
Restrict results to transactions on a single wallet. One of `wallet_id` or `address_id` is required.
Restrict results to transactions on a single derived address. Use instead of `wallet_id` when a wallet has many addresses and you only want one.
Page size. Default 20, max 100. Use with `offset` to paginate through long transaction histories.
Number of items to skip from the start of the result set. Default 0. Pair with `limit` for cursor-style paging.
Filter by lifecycle status (e.g., `completed`, `pending_authorization`, `failed`). Useful for surfacing transactions stuck awaiting approval.
Filter by operation type: `transfer`, `swap`, `contract_call`, `gas_refill`, or `gas_sponsorship`. Handy for excluding internal gas bookkeeping rows.
`inbound` for funds received, `outbound` for funds sent. Default returns both.
Filter by a counterparty on-chain address — matches whether it appears as sender or recipient. Use the more specific `from_address` / `to_address` if you need one side.
Match only transactions where this address is the sender. Use to find deposits from a known origin.
Match only transactions where this address is the recipient. Use to find withdrawals to a known destination.
Preset time window (`1h`, `24h`, `7d`, `30d`, `180d`, `270d`, `1y`). Quicker than supplying `start_date` / `end_date` for common ranges.
Custom range lower bound. Overrides `period` when both are provided. Inclusive.
Custom range upper bound. Pair with `start_date` for a precise window. Inclusive.
Include failed inbound transactions from internal transfers. Off by default to keep customer-facing views clean.
Filter by asset symbol (e.g., `ETH`, `USDC`). Returns transactions in that asset across whichever chain the symbol lives on.
Filter by on-chain hash (prefix match supported). Useful when you only know part of the hash from a block explorer or webhook.
List Transactions Response
Each entry in data[] uses the same TransactionResponse object as Create Transaction Response. Refer there for the per-field explanations. The meta envelope below carries pagination state (total, limit, offset, has_more).
Estimate Fee
Use Case
Returns an estimated network fee for a proposed transfer before submission.
Request Body
Source wallet.
Recipient (26-128 chars).
Transfer amount.
Asset identifier (2-50 chars).
Network.
Estimate Fee Response
Asset the fee will be paid in — typically the chain's native gas asset (e.g., `ETH`, `BTC`, `TRX`).
Blockchain the estimate applies to.
Network within the chain (e.g., `mainnet`, `sepolia`).
Estimated network fee in the native asset's smallest unit (wei, satoshi, sun). Returned as a string to avoid float precision loss.
Same fee converted to USD using the current exchange rate. Handy for quoting cost in your UI.
Gas limit Bitnob will set on the transaction. EVM chains only.
Legacy gas price (wei) for pre-EIP-1559 EVM transactions. Empty when EIP-1559 fields are in use.
EIP-1559 max fee per gas (wei) — the cap on `base_fee + tip`. EVM chains on EIP-1559 only.
EIP-1559 priority tip (wei) paid to the validator on top of the base fee. EVM chains on EIP-1559 only.
Bitcoin fee rate in sat/vB. Populated only for Bitcoin estimates.
Priority tier the estimate corresponds to: `low`, `medium`, or `high`. Higher tiers shrink `estimated_seconds` at the cost of `estimated_fee`.
Expected confirmation time at this priority, in seconds. Treat as a guideline — actual inclusion depends on network conditions.
Estimated energy units the transaction will consume. Tron only — drives TRX-staked energy planning for gas stations.
Estimated bandwidth points the transaction will consume. Tron only — drives TRX-staked bandwidth planning for gas stations.
Validate Address
Use Case
Validates an on-chain address against the rules of the specified asset's chain.
Request Body
Asset to validate against.
Address to validate.
Validate Address Response
Whether the address passed validation for the given asset's chain.
Echo of the requested asset identifier.
Chain inferred from the asset.
Echo of the address checked.
Sign Transaction
Use Case
Manually triggers signing for a transaction that was held in pending_authorization and has now received the required approvals.
Sign Transaction Response
data is the same TransactionResponse object returned by Create Transaction Response. Refer there for the per-field explanations. The main change after this call is status advancing from pending_authorization to signed and signed_at getting populated.
Cancel Transaction
Use Case
Cancels a pending transaction before it is broadcast.
Cancel Transaction Response
data is the same TransactionResponse object returned by Create Transaction Response. Refer there for the per-field explanations. The main change after this call is status flipping to cancelled — terminal, so no further timestamps update.
Speed Up Transaction
Use Case
Replaces a pending (broadcast but unconfirmed) transaction with a higher fee.
Speed Up Transaction Response
data is the same TransactionResponse object returned by Create Transaction Response. Refer there for the per-field explanations. The main changes after this call are a fresh tx_hash, an updated fee breakdown (higher than the original), and a new broadcast_at timestamp.
Transaction Analytics, Assets, Export
Use Case
Aggregated analytics, the list of distinct assets transacted, and JSON/CSV export of historical transactions.