This guide will help you create your first smart account using the Squads API. For a complete overview of the API capabilities, see the API Introduction.
Prerequisites
Before you begin, make sure you have:
Making API Requests
All requests should be made to the base URL:
https://developer-api.squads.so
Include your API key and network in the request headers of every request:
Authorization: Bearer YOUR_API_KEY
x-squad-network: devnet // or 'mainnet' for production
Create your first smart account
Create a basic smart account with a single signer. For more details about smart account creation and management, see the Create Smart Account documentation.
const response = await fetch(
"https://developer-api.squads.so/api/v0/smart_account/transaction/create",
{
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"x-squad-network": "devnet",
"Content-Type": "application/json",
},
body: JSON.stringify({
smart_account_signers: [
{
address: "YOUR_WALLET_ADDRESS",
permissions: ["CAN_INITIATE", "CAN_VOTE", "CAN_EXECUTE"],
},
],
threshold: 1,
}),
}
);
const { smart_account_address } = await response.json();
console.log(`Smart Account created: ${smart_account_address}`);
That’s it! Your smart account is ready to use immediately. No transaction submission or fee payment required. You can later add more signers or set up spending limits as needed.
Create a token transfer
Let’s create a token transfer transaction using your new smart account. We’ll break this down into steps:
1. Set up the transfer instruction
First, import the required dependencies and create the token transfer instruction:
import { createTransferInstruction } from "@solana/spl-token";
import {
Connection,
PublicKey,
TransactionMessage,
VersionedTransaction
} from "@solana/web3.js";
// Initialize connection to Solana
const connection = new Connection("https://api.devnet.solana.com");
// Create the token transfer instruction
const transferInstruction = createTransferInstruction(
new PublicKey("SOURCE_TOKEN_ACCOUNT"), // The smart account's token account
new PublicKey("DESTINATION_TOKEN_ACCOUNT"),
new PublicKey(smart_account_address), // The smart account is the authority
1000000n // Amount (e.g., 1 USDC)
);
2. Create a versioned transaction
Next, create a V0 transaction message with the latest blockhash:
// Get the latest blockhash
const latestBlockhash = await connection.getLatestBlockhash();
// Create a V0 transaction message
const message = new TransactionMessage({
payerKey: new PublicKey(smart_account_address),
recentBlockhash: latestBlockhash.blockhash,
instructions: [transferInstruction]
}).compileToV0Message();
// Create and serialize the transaction
const transaction = new VersionedTransaction(message);
const serializedTransaction = Buffer.from(
transaction.serialize()
).toString('base64');
3. Prepare the transaction
Send the transaction to the Squads API for preparation. This step will:
- Add the necessary program instructions
- Configure fee payment
- Return the prepared transaction and fee details
const prepareResponse = await fetch(
"https://developer-api.squads.so/api/v0/smart_account/transaction/prepare",
{
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"x-squad-network": "devnet",
"Content-Type": "application/json",
},
body: JSON.stringify({
smart_account_address,
transaction: serializedTransaction,
transaction_signers: ["YOUR_WALLET_ADDRESS"],
fee_config: {
currency: "usdc", // Choose 'usdc' or 'sol'
payer_address: "YOUR_FEE_PAYER_ADDRESS",
},
}),
}
);
// Get the prepared transaction and fee information
const { transaction: preparedTransaction, fee } = await prepareResponse.json();
// Log the fee details
console.log(
`Transaction prepared! Fee: ${fee.amount_decimal} ${fee.currency.toUpperCase()}`
);
console.log(
`Fee in SOL: ${fee.sol_equivalent.amount_decimal} SOL`
);
4. Sign and submit the transaction
Finally, sign the prepared transaction with your wallet and submit it to Solana:
// Decode the prepared transaction
const decodedTransaction = VersionedTransaction.deserialize(
Buffer.from(preparedTransaction, "base64")
);
// Sign with your wallet
decodedTransaction.sign([wallet]);
// Submit to Solana
const signature = await connection.sendRawTransaction(
decodedTransaction.serialize()
);
console.log(`Transaction sent: ${signature}`);
// Wait for confirmation
const confirmation = await connection.confirmTransaction({
signature,
blockhash: latestBlockhash.blockhash,
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight
});
console.log("Transfer complete!");
Each step builds on the previous one to create a complete token transfer flow. The Squads API handles the complexity of smart account execution, allowing you to focus on building your application logic.
Next steps