Simpfor.fun SDK Reference

Complete TypeScript SDK for the Simpfor.fun copy trading platform. Build copy trading apps, integrate trader analytics, and manage user wallets with ease.

Quick Start

Install
npm install simpfor-fun-sdk
Basic Usage
import { SimpforFunSDK } from 'simpfor-fun-sdk';

const sdk = new SimpforFunSDK();

// Authenticate
await sdk.sendVerificationCode('user@example.com');
const result = await sdk.verifyOtp('user@example.com', '123456');

// Get top traders
const traders = await sdk.fetchTopTraders();

// Start copy trading
const copyTrade = await sdk.createCopyTrade(
  result.data.user.uid,
  'trader-address',
  'your-wallet-address'
);

Authentication

Send Verification Code
await sdk.sendVerificationCode(email: string)
Verify OTP
const result = await sdk.verifyOtp(email: string, code: string)
// Returns: { data: { user: User } }

Social Authentication

Privy Integration
await sdk.privyLogin({
  privyAuthToken: string,
  privyEmail: string,
  referralCode?: string
})
Google OAuth
// Get auth URL
const { url } = await sdk.googleLogin({ referralCode?: string })

// Handle callback
await sdk.googleCallback(code: string, state: string)

Copy Trading

Core Operations

Create Copy Trade
await sdk.createCopyTrade(
  userId: number,
  leaderAddress: string,
  followerAddress: string
)
// Returns: { data: { info: CopyTradeInfo } }
Start/Stop Copying
// Start copying trades
await sdk.runCopyTrade(userId: number, copyTradeId: number)

// Stop copying (with optional position close)
await sdk.stopCopyTrade(
  userId: number, 
  copyTradeId: number, 
  closePositions: boolean
)

// Remove copy trade entirely
await sdk.removeCopyTrade(userId: number, copyTradeId: number)
List Copy Trades
const result = await sdk.listCopyTrades(userId: number)
// Returns: { data: { infos: CopyTradeInfo[] } }

Performance Tracking

Get PnL History
await sdk.getCopyTradeHistoryPnl(
  userId: number,
  walletAddress: string,
  sortByPnlDesc: boolean,
  pagination: { page: number, limit: number }
)
Get Trade Details
await sdk.getCopyTradeDetails(
  userId: number,
  copyTradeId: number,
  pagination: { page: number, limit: number }
)
Get Total PnL
await sdk.getCopyTradeTotalPnl(userId: number, walletAddress: string)
// Returns: { data: { pnl: number } }

Trader Discovery

Top Traders

Fetch All Top Traders
const traders = await sdk.fetchTopTraders()
// Returns: Trader[]
Paginated Top Traders
await sdk.topTradersWithPeriod(
  sort: { field: string, order: 'asc' | 'desc' },
  pagination: { page: number, limit: number }
)
Smart Categories
const categories = await sdk.smartTraders()
// Returns: {
//   topValueTrader: TraderInfo[],
//   topRoiTrader: TraderInfo[],
//   topPnlTrader: TraderInfo[],
//   topFollowValueTrader: TraderInfo[]
// }

Trader Analytics

Trader Snapshot
await sdk.traderSnapshot(
  address: string, 
  period: '7d' | '30d' | '90d' | '180d'
)
// Returns comprehensive performance data
Trader Overview
await sdk.traderOverview(address: string)
// Returns basic trader stats
Share Information
await sdk.shareInfo(address: string, period: string)
// Returns formatted data for social sharing

Wallet Management

KMS Wallet Operations

Check Wallet Availability
await sdk.checkWallet(address: string)
// Returns: { isAvailable: boolean, message?: string, errorCode?: string }
Create KMS Key
await sdk.createKmsKey(address: string)
// Returns: { agentKmsAddress: string, kmsExpireTimestamp: number }
Activate KMS Wallet
await sdk.activateKmsWallet(
  walletAddress: string,
  agentAddress: string,
  walletName: string,
  signRawAction: object,
  signature: string
)
List User Wallets
const wallets = await sdk.walletList()
// Returns: { keys: KeyEntry[] }
Refresh Agent Wallet
await sdk.refreshAgentWallet(address: string)
// Returns new expiry timestamp

Builder Fee Management

Get Builder Fee Info
const feeInfo = await sdk.getBuilderFee()
// Returns: { builderAddress: string, builderFeeRate: string }
Bind Builder
await sdk.bindBuilder(
  walletAddress: string,
  approveRequest: ApproveBuilderFeeRequest,
  signature: string
)

Cross-Chain Deposits

Bridge Operations

Get/Create Bridge Address
await sdk.getBridgeAddress(userId: number, walletAddress: string)
// Returns: { userBridgeAddress: string }
List Bridge Addresses
await sdk.listBridgeAddress(userId: number)
// Returns: { addresses: BridgeAddress[] }
Register Bridge with Permit
await sdk.registerBridgeAddress(
  userId: number,
  permitRequest: PermitRequest
)

User Management

Watchlist

Manage Watched Traders
// Add to watchlist
await sdk.addWatchedTrader(address: string)

// Get watched traders
await sdk.getWatchedTraders(
  sort: { field: string, order: string },
  pagination: { page: number, limit: number }
)

// Remove from watchlist
await sdk.removeWatchedTrader(address: string)

Referrals

Get Referral Info
await sdk.getReferralInfo()
// Returns referral stats and commissions
Get Referral List
await sdk.getReferralList(
  filterId?: string,
  startTime?: string,
  endTime?: string,
  pagination: { page: number, limit: number }
)
Claim Commission
await sdk.claimCommission(walletAddress: string)

Coupons & Rewards

Get User Coupons
await sdk.userCoupons(status: 'active' | 'used' | 'expired')
Claim Coupon
await sdk.claimCoupon(couponId: string, walletAddress: string)

Solana Integration

Get Solana Address Status
await sdk.getSolanaAddresses()
// Returns: { address: string, linked: boolean }
Link Solana Address
// Get auth message
const authMsg = await sdk.getSolanaAuthMessage(address: string)

// Link address (after user signs message)
await sdk.linkSolanaAddress(
  address: string,
  message: string,
  signature: string
)

TypeScript Types

Core Interfaces

interface User {
  uid: number;
  email: string;
  referralCode: string;
  invitedByCode: string;
}

interface Trader {
  address: string;
  value: number;
  roi: number;
  pnl: number;
  apy: number;
  maxDrawdown: number;
  sharpeRatio: number;
  winRate: number;
  tradingVolume: number;
  followValue: number;
  watched: boolean;
  copying: boolean;
}

interface CopyTradeInfo {
  copyTradeId: number;
  active: boolean;
  description: string;
  followerAccount: string;
  leaderAccount: string;
  watched: boolean;
  createTime: string;
  updateTime: string;
}

interface ApiResponse<T> {
  code: number;
  message: string;
  data: T;
}

Request Types

interface CreateCopyTradeReq {
  userId: number;
  leaderAccount: string;
  followerAccount: string;
}

interface ApproveBuilderFeeRequest {
  nonce: number;
  builder: number[];
  maxFeeRate: string;
  hyperliquidChain: string;
  signatureChainId: string;
}

interface PermitRequest {
  tokenAddress: string;
  userWalletAddress: string;
  userBridgeAddress: string;
  permitValue: string;
  permitDeadline: string;
  permitSig: string;
}

Error Handling

Error Structure

All API errors follow this format:
interface ApiError {
  code: number;
  message: string;
  data?: any;
}

Common Error Codes

  • 400: Bad Request - Invalid parameters
  • 401: Unauthorized - Authentication required
  • 404: Not Found - Resource doesn’t exist
  • 429: Rate Limited - Too many requests
  • 500: Server Error - Internal server issue

Error Handling Pattern

try {
  const result = await sdk.someOperation();
  // Handle success
} catch (error: any) {
  switch (error.code) {
    case 400:
      console.error('Validation error:', error.message);
      break;
    case 401:
      console.error('Authentication required');
      // Redirect to login
      break;
    case 429:
      console.error('Rate limited - retry later');
      break;
    default:
      console.error('Unexpected error:', error);
  }
}

Rate Limits

  • Authentication: 10 requests/minute
  • Trading Operations: 60 requests/minute
  • Analytics: 100 requests/minute
  • General Endpoints: 200 requests/minute

Configuration

Environment Setup

// Initialize with custom base URL
const sdk = new SimpforFunSDK('https://api.simpfor.fun');

// Access token is managed automatically after authentication
// But you can also set it manually if needed
sdk.accessToken = 'your-token';

Best Practices

Connection Management
  • Reuse SDK instances
  • Implement proper error handling
  • Use retry logic with exponential backoff
Data Management
  • Cache trader data locally when possible
  • Use pagination for large datasets
  • Implement reasonable polling intervals
Security
  • Never expose access tokens client-side
  • Use environment variables for configuration
  • Validate inputs before API calls

Support

Documentation Community
Ready to build? Check out our Integration Examples for complete implementation guides.