Program accounts contain the data for all instances of a Solana program. This guide shows you how to efficiently query and filter program accounts.

Using getProgramAccounts

The primary method for fetching program accounts is getProgramAccounts:

const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY", {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getProgramAccounts',
    params: [
      'oreV2ZymfyeXgNgBdqMkumTqqAprVqgBWQfoYkrtKWQ', // Solana Token Program
      {
        encoding: 'jsonParsed',
        filters: [
          // Optional filters go here
        ]
      }
    ]
  })
});
const data = await response.json();
console.log('Program accounts data:', data);

API Reference

getProgramAccounts

Advanced Filtering

Optimize your queries with filters to reduce response size and improve performance:

// Example filtering by memcmp (memory comparison)
const response = await fetch(
  "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      jsonrpc: "2.0",
      id: "1",
      method: "getProgramAccounts",
      params: [
        "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // Solana Token Program
        {
          encoding: "jsonParsed",
          filters: [
            {
              dataSize: 165, // Size of token account data
            },
            {
              memcmp: {
                offset: 32, // Location of owner address in the token account
                bytes: "83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri",
              },
            },
          ],
        },
      ],
    }),
  }
);
const data = await response.json();
console.log("Filtered program accounts data:", data);

API Reference

getProgramAccounts

Filter Types

  • memcmp: Filter accounts that match a specific pattern at a given offset
  • dataSize: Filter accounts by their exact data size
  • Multiple filters: All conditions must be satisfied (logical AND)

Performance Tips

Program account queries can be expensive to execute. Follow these practices:

  • Always use the most restrictive filters possible
  • Consider paginating results for programs with many accounts
  • Use WebSocket subscriptions for accounts you need to monitor continuously
  • For tokens and NFTs, prefer the specialized DAS API endpoints over raw program account queries

Rate Limiting Considerations

Heavy use of getProgramAccounts might result in rate limiting. For high-volume needs, consider:

  • Using dedicated RPC nodes
  • Caching frequently accessed data
  • Implementing backoff strategies for retries