Send SPL Token
Transfer SPL tokens (USDC, BONK, etc.) to another wallet on Solana. Auto-creates the recipient's token account if needed. Supports both classic SPL Token and Token-2022 programs with safety checks for Transfer Hooks and Permanent Delegate extensions. Ideal for: token payments, airdrops, automated token distribution on Solana.
Catalog action Solana Onchain wallet send
Transfer SPL tokens (USDC, BONK, etc.) to another wallet on Solana. Auto-creates the recipient's token account if needed. Supports both classic SPL Token and Token-2022 programs with safety checks for Transfer Hooks and Permanent Delegate extensions. Ideal for: token payments, airdrops, automated token distribution on Solana.
This action can require a wallet connector, gas, token movement, or an external side effect. Test with simulation or a controlled amount before using it in a live workflow.
At a Glance
| Field | Value |
|---|---|
| Action ID | send-spl-token |
| Category | Solana Onchain |
| Connector | wallet |
| Requires gas | No |
| Funds movement | send |
| Tags | blockchain, solana, spl, token, transfer, send, payment, write |
Payload Schema
| Field | Type | Required | Description |
|---|---|---|---|
tokenMintAddress | string | Yes | The token's contract address on Solana (e.g., the USDC mint address). You can find this on the token's page on Solscan or Jupiter. |
recipientAddress | string | Yes | The Solana wallet address to send tokens to. |
amount | string | No | Amount of tokens to send in human-readable format (e.g., "1.5" for 1.5 USDC). Decimal places must not exceed the token's decimals. |
rawAmount | string | No | Raw amount in smallest unit (alternative to 'amount'). If provided, 'amount' is ignored. |
chainId | number | Yes | Solana network (Mainnet or Devnet) |
allowAtaCreation | boolean | No | If the recipient hasn't received this token before, we'll set up their token account automatically (~0.002 SOL fee from your wallet). |
allowTransferHooks | boolean | No | Allow sending Token-2022 tokens that run custom code during transfers. Leave off unless you specifically need this. Blocked by default for safety. |
allowTransferFee | boolean | No | Allow sending Token-2022 tokens with a Transfer Fee. Recipient receives less than sent (fee deducted on-chain). Blocked by default. |
allowUnverifiedTokens | boolean | No | Allow sending tokens not on the Jupiter verified list. Only applies to automated workflows. Manual executions always allow all tokens. |
Result Schema
| Field | Type | Required | Description |
|---|---|---|---|
status | string | Yes | - |
signature | string | Yes | Transaction signature (base58 encoded) |
transactionHash | string | Yes | Transaction hash (same as signature, for workflow engine compatibility) |
slot | number | No | Slot number where the transaction was confirmed |
amount | string | No | Amount transferred in smallest token unit (raw) |
formattedAmount | string | No | Human-readable amount (e.g., '1.5') |
decimals | number | No | Number of decimal places for the token |
tokenMintAddress | string | No | Token mint address |
tokenSymbol | string | No | Token symbol (e.g., 'USDC') |
recipientAddress | string | No | Recipient wallet address |
recipientTokenAccount | string | No | Recipient's Associated Token Account address |
tokenProgram | string | No | Token program used (spl-token or token-2022) |
chainId | number | No | Chain ID where the transaction was executed |
ataCreated | boolean | No | Whether the recipient's ATA was created in this transaction |
ataCreationCost | string | null | No | SOL cost of ATA creation in lamports, or null if not created |
hasTransferFee | boolean | No | Whether this Token-2022 token has a Transfer Fee extension. If true, a percentage of each transfer is deducted and sent to a fee collector. |
transferFeeBps | number | null | No | Transfer fee in basis points if hasTransferFee is true, otherwise null |
Examples
json{ "type": "send-spl-token", "payload": { "tokenMintAddress": "0x0000000000000000000000000000000000000000", "recipientAddress": "0x0000000000000000000000000000000000000000", "chainId": 7565164 }, "children": [], "connector": { "type": "wallet", "id": "conn_wallet" }}
bashcurl -X POST "https://api.b3os.org/v1/actions/send-spl-token/test" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "inputs": { "tokenMintAddress": "0x0000000000000000000000000000000000000000", "recipientAddress": "0x0000000000000000000000000000000000000000", "chainId": 7565164 }}'
Payload fields can use workflow expressions such as {{$trigger.body.amount}}, {{$nodes.fetch.result.price}}, and {{$props.asset}} when the value should come from a trigger, prior node, or reusable workflow prop.
