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") 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. - 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"}'