Submit Endpoint
Submit transactions directly to the blockchain with optional confirmation waiting.
Endpoint
POST /wallet/submit
Requires: an API key (web sessions are not accepted) with Wallet API (walletApiEnabled) enabled and read-only off.
Overview
Submit raw EVM transactions directly to the blockchain. Unlike the Agent Prompt which uses natural language, this endpoint accepts explicit transaction parameters.
- Direct submission — Bypass the AI agent for pre-built transactions
- Synchronous response — Returns transaction hash immediately
- Optional confirmation — Wait for on-chain confirmation or return immediately
- Full control — Specify exact gas, nonce, and calldata
Request
{
"transaction": {
"to": "0x1234567890abcdef1234567890abcdef12345678",
"chainId": 8453,
"value": "1000000000000000000",
"data": "0x..."
},
"description": "Transfer 1 ETH",
"waitForConfirmation": true
}
| Field | Type | Description | Required |
|---|---|---|---|
transaction.to | string | Destination address | Yes |
transaction.chainId | number | Chain ID (8453=Base, 1=Ethereum, 137=Polygon, 130=Unichain, 480=World Chain, 42161=Arbitrum, 56=BNB Chain, 4663=Robinhood Chain, 5042=Arc) | Yes |
transaction.value | string | Value in wei | No |
transaction.data | string | Calldata (hex string) | No |
transaction.gas | string | Gas limit | No |
transaction.gasPrice | string | Gas price (legacy) | No |
transaction.maxFeePerGas | string | Accepted but not applied — EIP-1559 fees are set from the network | No |
transaction.maxPriorityFeePerGas | string | Accepted but not applied — EIP-1559 fees are set from the network | No |
transaction.nonce | number | Transaction nonce | No |
description | string | Human-readable description for logging | No |
waitForConfirmation | boolean | Wait for tx confirmation (default: true) | No |
Response
Success (200 OK)
{
"success": true,
"transactionHash": "0xabc123...",
"status": "success",
"blockNumber": "12345678",
"gasUsed": "21000",
"signer": "0x1234...5678",
"chainId": 8453
}
With waitForConfirmation: false the response returns at broadcast with status: "pending". A transaction that mines and reverts answers 400 with success: false, status: "reverted" and its transactionHash — it is on-chain, so don't resubmit blindly.
Access Control
- Read-only keys are rejected with 403
- Allowed recipients configured on the key will block ALL raw submissions (can't verify recipients from calldata). Use the Agent Prompt instead, which enforces allowed recipients through the agent.
- Wallet security settings apply the same way as for agent transactions, and every rejection is a 403. A paused wallet (
"Wallet paused"), a wallet without MFA ("MFA required",code: "MFA_REQUIRED") or "Enable arbitrary contract calls" switched off ("Arbitrary contract calls disabled") is refused up front. Otherwise the nativevalueis priced in USD and checked against the per-transaction and daily limits (and counts toward the daily total), and the wallet's permitted-recipients list is enforced ontowhenvalue > 0; calldata with no native value counts as $0. These rejections carryerrorCode(PER_TX_LIMIT_EXCEEDED,DAILY_LIMIT_EXCEEDED,RECIPIENT_NOT_PERMITTED,RECIPIENT_COOLDOWN,PRICING_UNAVAILABLE) alongside the user-facingerror. See Security settings. - NFT transfers: a call that directly transfers an NFT (ERC-721 or ERC-1155), or grants an operator approval over one, is held to the wallet's NFT transfer setting. When NFT transfers are off (no window open) or the count is spent, the signer refuses it and the submission fails with a
400and noerrorCode, not a403. - Gas is not sponsored on this endpoint, except for partner-provisioned wallets whose organization funds sponsorship. A wallet without enough native token for gas gets a
400witherror: insufficient_funds_for_gasand a human-readablemessage.
Examples
curl
curl -X POST https://api.bankr.bot/wallet/submit \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"transaction": {
"to": "0x1234567890abcdef1234567890abcdef12345678",
"chainId": 8453,
"value": "1000000000000000000"
},
"description": "Send 1 ETH"
}'
Bankr CLI
bankr wallet submit tx --to 0x... --chain-id 8453 --value 1000000000000000000
bankr wallet submit json '{"to":"0x...","chainId":8453,"value":"1000000000000000000"}'