Parameters

address
string
required
Account address (base-58 encoded)
config
object

Response

result
array
Array of signature information objects
signature
string
Transaction signature (base-58 encoded)
slot
number
Slot in which the transaction was processed
err
object
Error if transaction failed, null if transaction succeeded
memo
string
Memo associated with the transaction
blockTime
number
Unix timestamp of when the transaction was processed
confirmationStatus
string
Transaction confirmation status

Code Examples

Basic Request

curl https://rpc.orbitflare.com -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getSignaturesForAddress",
  "params": [
    "ADDRESS"
  ]
}'

Request with Config

curl https://rpc.orbitflare.com -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getSignaturesForAddress",
  "params": [
    "ADDRESS",
    {
      "limit": 100,
      "before": "SIGNATURE",
      "commitment": "confirmed"
    }
  ]
}'

Using web3.js

import { Connection, PublicKey } from '@solana/web3.js';

const connection = new Connection('https://rpc.orbitflare.com');

// Get signatures for address
const signatures = await connection.getSignaturesForAddress(
  new PublicKey('ADDRESS')
);
console.log('Signatures:', signatures);

// Get paginated signatures
async function getPaginatedSignatures(
  address: PublicKey,
  limit: number = 100,
  before?: string
) {
  const signatures = await connection.getSignaturesForAddress(address, {
    limit,
    before
  });
  
  return signatures.map(signature => ({
    signature: signature.signature,
    slot: signature.slot,
    success: !signature.err,
    timestamp: signature.blockTime,
    status: signature.confirmationStatus
  }));
}

Notes

  1. Returns confirmed transaction signatures for an address
  2. Results are returned in reverse chronological order
  3. Pagination can be achieved using the before parameter
  4. The response is immediate as it reads from the current state
  5. Different commitment levels can be specified

Best Practices

  1. Use appropriate limit based on your needs
  2. Implement pagination for large result sets
  3. Cache results when appropriate to reduce RPC load
  4. Consider using websocket subscription for real-time updates
  5. Handle network errors and retry when appropriate

Common Errors

CodeMessageSolution
-32601Method not foundVerify you’re connected to a Solana RPC node
-32602Invalid paramsCheck address and config parameters
-32007Signature information unavailableNode may be bootstrapping or syncing

Use Cases

  1. Transaction History
    interface TransactionHistory {
      transactions: Array<{
        signature: string;
        slot: number;
        success: boolean;
        timestamp: number;
        status: string;
      }>;
      metadata: {
        total: number;
        startTime: number;
        endTime: number;
      };
    }
    
    async function getTransactionHistory(
      address: PublicKey,
      limit: number = 100
    ): Promise<TransactionHistory> {
      const signatures = await connection.getSignaturesForAddress(address, {
        limit
      });
      
      return {
        transactions: signatures.map(signature => ({
          signature: signature.signature,
          slot: signature.slot,
          success: !signature.err,
          timestamp: signature.blockTime || 0,
          status: signature.confirmationStatus || 'unknown'
        })),
        metadata: {
          total: signatures.length,
          startTime: signatures[0]?.blockTime || 0,
          endTime: signatures[signatures.length - 1]?.blockTime || 0
        }
      };
    }
    
  2. Transaction Monitoring
    interface TransactionAlert {
      type: 'new' | 'failed' | 'status_change';
      signature: string;
      previousStatus: string | null;
      currentStatus: string;
      metadata: {
        timestamp: number;
        slot: number;
      };
    }
    
    class TransactionMonitor {
      private previousSignatures: Map<string, any> = new Map();
      
      async monitorTransactions(
        address: PublicKey,
        interval: number = 5000
      ): Promise<TransactionAlert[]> {
        const signatures = await connection.getSignaturesForAddress(address, {
          limit: 10
        });
        const alerts: TransactionAlert[] = [];
        
        signatures.forEach(signature => {
          const previous = this.previousSignatures.get(signature.signature);
          
          if (!previous) {
            alerts.push({
              type: 'new',
              signature: signature.signature,
              previousStatus: null,
              currentStatus: signature.confirmationStatus || 'unknown',
              metadata: {
                timestamp: Date.now(),
                slot: signature.slot
              }
            });
          } else if (previous.confirmationStatus !== signature.confirmationStatus) {
            alerts.push({
              type: 'status_change',
              signature: signature.signature,
              previousStatus: previous.confirmationStatus,
              currentStatus: signature.confirmationStatus || 'unknown',
              metadata: {
                timestamp: Date.now(),
                slot: signature.slot
              }
            });
          }
          
          this.previousSignatures.set(signature.signature, signature);
        });
        
        return alerts;
      }
    }
    
  3. Transaction Analysis
    interface TransactionAnalysis {
      total: number;
      successful: number;
      failed: number;
      statusDistribution: Record<string, number>;
      timeDistribution: {
        hourly: Record<number, number>;
        daily: Record<number, number>;
      };
      metadata: {
        startTime: number;
        endTime: number;
        duration: number;
      };
    }
    
    async function analyzeTransactions(
      address: PublicKey,
      limit: number = 1000
    ): Promise<TransactionAnalysis> {
      const signatures = await connection.getSignaturesForAddress(address, {
        limit
      });
      
      const statusDistribution: Record<string, number> = {};
      const hourlyDistribution: Record<number, number> = {};
      const dailyDistribution: Record<number, number> = {};
      
      let successful = 0;
      let failed = 0;
      
      signatures.forEach(signature => {
        const status = signature.confirmationStatus || 'unknown';
        statusDistribution[status] = (statusDistribution[status] || 0) + 1;
        
        if (signature.err) {
          failed++;
        } else {
          successful++;
        }
        
        if (signature.blockTime) {
          const date = new Date(signature.blockTime * 1000);
          const hour = date.getHours();
          const day = date.getDay();
          
          hourlyDistribution[hour] = (hourlyDistribution[hour] || 0) + 1;
          dailyDistribution[day] = (dailyDistribution[day] || 0) + 1;
        }
      });
      
      return {
        total: signatures.length,
        successful,
        failed,
        statusDistribution,
        timeDistribution: {
          hourly: hourlyDistribution,
          daily: dailyDistribution
        },
        metadata: {
          startTime: signatures[0]?.blockTime || 0,
          endTime: signatures[signatures.length - 1]?.blockTime || 0,
          duration: signatures.length > 1
            ? (signatures[0]?.blockTime || 0) - (signatures[signatures.length - 1]?.blockTime || 0)
            : 0
        }
      };
    }