Skip to main content
Get your Grid integration up and running in minutes with this step-by-step guide using email-based authentication.

Prerequisites

Node.js Setup

Required: Node.js 16+ with npmCheck: node --version

Grid API Key

Get yours: Grid DashboardEnvironment: Use sandbox for testing
1

Install and Setup

Install the SDK and configure your Grid client:
npm install @sqds/grid
// .env file
GRID_API_KEY=your-api-key-here
GRID_ENVIRONMENT=sandbox

// Your application
import { GridClient } from '@sqds/grid';

const gridClient = new GridClient({
  environment: process.env.GRID_ENVIRONMENT as 'sandbox' | 'production',
  apiKey: process.env.GRID_API_KEY!,
  baseUrl: 'https://grid.squads.xyz'
});
2

Create Account

Choose your account type and create your Grid account:
Grid accounts do not have the same address in sandbox and production. DO NOT send funds to the same address in both environments. Create unique accounts for each environment and ensure you use the correct address for your environment.
// 1. Initiate account creation with your email
const response = await gridClient.createAccount({
  email: "user@example.com", // Replace with your email
});
const user = response.data;

// 2. Generate session secrets for secure authentication
const sessionSecrets = await gridClient.generateSessionSecrets();

// 3. Complete authentication with OTP from email (check inbox/spam)
const authResult = await gridClient.completeAuthAndCreateAccount({
  user,
  otpCode: "123456", // 6-digit code from email
  sessionSecrets,
});

if(authResult.success){
  console.log("Account created successfully!");
  console.log("Address:", authResult.data?.address);
  console.log("Session:", authResult.data?.authentication);
  LocalState.saveState("user", authResult.data);
} else {
  console.log('❌ error authResult: ', authResult);
}
Email-based accounts: Check your email for the 6-digit OTP code. It may take 1-2 minutes to arrive and could be in your spam folder.Custom signer accounts: Store your keypairs securely - you’ll need them to sign transactions.
3

Send Your First Transaction

Create a spending limit and execute your first transaction:
// Create spending limit transaction
const spendingLimitPayload = {
  amount: 100000, // 0.1 USDC (USDC uses 6 decimal places)
  mint: "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", // USDC token mint
  period: "one_time", // Options: 'one_time' | 'daily' | 'weekly' | 'monthly';
  destinations: ["DESTINATION_ADDRESS"], // Replace with actual destination
};

const result = await gridClient.createSpendingLimit(
  authResult.address,
  spendingLimitPayload
);

// Sign and submit with managed authentication
const signature = await gridClient.signAndSend({
  sessionSecrets, // From account creation step
  session: authResult.authentication, // Auth token from previous step
  transactionPayload: result.data, // Transaction data from spending limit creation
  address: authResult.address, // Your account address
});

console.log("Transaction executed successfully!");
console.log("Signature:", signature);
What this does: Creates a spending policy allowing one-time transfers of up to 0.1 USDC to specified addresses. This is a foundational building block for payment flows.
4

Verify Transaction

Confirm your transaction executed successfully:
// Get current account balances
const balances = await gridClient.getAccountBalances(authResult.address);

console.log("Account balances:");
console.log("Sol balance:", balnaces.data.sol);
balances.data.tokens.forEach((balance) => {
  console.log(`${balance.mint}: ${balance.amount} (${balance.symbol})`);
});

// Get recent transaction history
const transfers = await gridClient.getTransfers(authResult.address, {
  limit: 10,
  orderBy: "created_at",
  status: "completed",
});

console.log("Recent transactions:");
transfers.data.forEach((transfer) => {
  console.log(`${transfer.amount} ${transfer.symbol} - ${transfer.status}`);
  console.log(`Signature: ${transfer.signature}`);
});

// Check current spending limits
const spendingLimits = await gridClient.getSpendingLimits(authResult.address);

console.log("Active spending limits:");
spendingLimits.data.forEach((limit) => {
  console.log(`${limit.amount} ${limit.symbol} per ${limit.period}`);
  console.log(`Remaining: ${limit.remainingAmount}`);
});
View on blockchain: Paste your transaction signature into Solana Explorer (use devnet cluster for sandbox transactions) to see full on-chain details.
Environment reminder: Always use sandbox for testing. Production requires KYC verification and involves real funds.
I