---
title: getProgramAccounts
description: >-
  Returns accounts owned by the specified program, optionally filtered by data
  content or size.
url: /docs/rpc/http/getprogramaccounts
type: reference
hideTableOfContents: true
---

Returns accounts owned by the specified program, optionally filtered by data
content or size.

<Callout type="info" title="Source">
  [`get_program_accounts`](https://github.com/anza-xyz/agave/blob/v3.1.8/rpc/src/rpc.rs#L599)
</Callout>

<APIMethod>

```jsonc !!request curl
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getProgramAccounts",
  "params": [
    // !hover pubkey
    "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    // !hover(1:20) config
    {
      // !hover commitment
      "commitment": "finalized",
      // !hover encoding
      "encoding": "base64",
      // !hover(1:15) filters
      "filters": [
        { "dataSize": 165 },
        {
          "memcmp": {
            "offset": 0,
            "bytes": "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr"
          }
        },
        {
          "memcmp": {
            "offset": 32,
            "bytes": "5wx11hXBHQALycTQNkeQ5w1N9vgup4ardN2yLiDK4JyK"
          }
        }
      ],
      // !hover sortResults
      "sortResults": true
    }
  ]
}
```

```ts !!request title="Kit"
import { address, createSolanaRpc } from "@solana/kit";

const rpc_url = "https://api.devnet.solana.com";
const rpc = createSolanaRpc(rpc_url);

// !hover pubkey
let program = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");

let accounts = await rpc
  .getProgramAccounts(
    program,
    // !hover(1:22) config
    {
      // !hover commitment
      commitment: "finalized",
      // !hover encoding
      encoding: "base64",
      // !hover(1:17) filters
      filters: [
        {
          dataSize: BigInt(165)
        },
        {
          memcmp: {
            bytes: "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr",
            offset: BigInt(0)
          }
        },
        {
          memcmp: {
            bytes: "5wx11hXBHQALycTQNkeQ5w1N9vgup4ardN2yLiDK4JyK",
            offset: BigInt(32)
          }
        }
      ],
      // !hover sortResults
      sortResults: true
    }
  )
  .send();

console.log(accounts);
```

```ts !!request title="web3.js"
import {
  Connection,
  PublicKey,
  clusterApiUrl,
  type GetProgramAccountsConfig
} from "@solana/web3.js";

const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

// !hover pubkey
let programId = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");

// !hover(1:22) config
let config: GetProgramAccountsConfig = {
  // !hover commitment
  commitment: "finalized",
  // !hover encoding
  encoding: "base64",
  // !hover(1:17) filters
  filters: [
    {
      dataSize: 165
    },
    {
      memcmp: {
        bytes: "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr",
        offset: 0
      }
    },
    {
      memcmp: {
        bytes: "5wx11hXBHQALycTQNkeQ5w1N9vgup4ardN2yLiDK4JyK",
        offset: 32
      }
    }
  ],
  // !hover sortResults
  sortResults: true
};

let accounts = await connection.getProgramAccounts(programId, config);

console.log(accounts);
```

```rs !!request title="Rust"
use anyhow::Result;
use solana_account_decoder::UiAccountEncoding;
use solana_client::{
    nonblocking::rpc_client::RpcClient,
    rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig},
    rpc_filter::{Memcmp, MemcmpEncodedBytes, RpcFilterType},
};
use solana_commitment_config::CommitmentConfig;
use solana_sdk::pubkey;

#[tokio::main]
async fn main() -> Result<()> {
    let client = RpcClient::new_with_commitment(
        String::from("https://api.devnet.solana.com"),
        CommitmentConfig::confirmed(),
    );

    // !hover pubkey
    let program = pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");

    // !hover(1:23) config
    let config = RpcProgramAccountsConfig {
        // !hover(1:12) filters
        filters: vec![
            RpcFilterType::DataSize(165),
            RpcFilterType::Memcmp(Memcmp::new(
                0,
                MemcmpEncodedBytes::Base58("Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr".to_string()),
            )),
            RpcFilterType::Memcmp(Memcmp::new(
                32,
                MemcmpEncodedBytes::Base58("5wx11hXBHQALycTQNkeQ5w1N9vgup4ardN2yLiDK4JyK".to_string()),
            )),
        ]
        .into(),
        account_config: RpcAccountInfoConfig {
            // !hover encoding
            encoding: UiAccountEncoding::Base64.into(),
            // !hover dataSlice
            data_slice: None,
            // !hover commitment
            commitment: CommitmentConfig::finalized().into(),
            // !hover minContextSlot
            min_context_slot: None,
        },
        // !hover withContext
        with_context: None,
        // !hover sortResults
        sort_results: true.into(),
    };

    let accounts = client
        .get_program_accounts_with_config(&program, config)
        .await?;

    println!("{:#?}", accounts);

    Ok(())
}
```

### !params

#### !! pubkey

!type string  
!required

Pubkey of program, as base-58 encoded string

#### !! config

!type object

Configuration object containing the following fields:

##### !! commitment

!type string  
!values processed confirmed finalized  
!default finalized

Solana RPC uses the following commitment levels:

| Value       | Description                                                                                                                                                                                                                                                                |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `processed` | Return data from the highest slot this node has processed on the fork it currently considers best. This is the newest view, but it can still change if the cluster switches forks.                                                                                         |
| `confirmed` | Return data from the highest slot that at least two-thirds of active stake has directly voted to confirm. This is more stable than `processed`, but it is still a weaker guarantee than `finalized`.                                                                       |
| `finalized` | Return data from the highest slot that the cluster recognizes as finalized. In practice, this means the slot has reached maximum vote lockout in validators' vote towers and is recognized by at least two-thirds of active stake. This is the strongest commitment level. |

##### !! minContextSlot

!type number

The minimum slot that the request can be evaluated at

```json title="Example"
{ "minContextSlot": 341197000 }
```

##### !! withContext

!type bool  
!values true false  
!default false

Wrap the result in an RpcResponse JSON object

```json title="Example"
{ "withContext": true }
```

##### !! encoding

!type string  
!values base58 base64 base64+zstd binary jsonParsed  
!default binary

Encoding format for account data.

| Encoding      | Data format                | Notes                                                                                                                                                                                                                            |
| ------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `base64`      | `[data, "base64"]`         | Recommended                                                                                                                                                                                                                      |
| `base58`      | `[data, "base58"]`         | Slow. The account's data field must be 128 bytes or fewer                                                                                                                                                                        |
| `base64+zstd` | `[data, "base64+zstd"]`    | [Zstandard](https://facebook.github.io/zstd/) compressed                                                                                                                                                                         |
| `jsonParsed`  | `{program, parsed, space}` | Falls back to `[data, "base64"]` if no parser found                                                                                                                                                                              |
| `binary`      | `string`                   | Deprecated default. Legacy encoding retained for backwards compatibility. Same base58 encoding as `base58` with the same 128-byte data field limit, but returns data as a plain string instead of an array. Use `base64` instead |

If you use `jsonParsed`, each returned account uses the stable wrapper
`{program, parsed, space}`. The `program` field identifies the parser that
produced `parsed`. If no parser is available, the RPC node falls back to
`[data, "base64"]`.

| `program` value          | Parsed account type                            |
| ------------------------ | ---------------------------------------------- |
| `address-lookup-table`   | Address lookup table accounts                  |
| `bpf-upgradeable-loader` | Upgradeable loader program and buffer accounts |
| `config`                 | Config accounts                                |
| `nonce`                  | Durable nonce accounts                         |
| `spl-token`              | SPL Token accounts                             |
| `spl-token-2022`         | SPL Token 2022 accounts                        |
| `stake`                  | Stake accounts                                 |
| `sysvar`                 | Sysvar accounts                                |
| `vote`                   | Vote accounts                                  |

The nested `parsed` payload remains program-specific.

For the shared account wrapper returned in each `account` field, see
[Account Data](/docs/rpc/json-structures#account-data).

##### !! dataSlice

!type object

Request a slice of the account's data.

| Field    | Type    | Description                                           |
| -------- | ------- | ----------------------------------------------------- |
| `offset` | `usize` | Byte offset from which to start reading account data. |
| `length` | `usize` | Number of bytes to return.                            |

```json title="Example"
{ "offset": 0, "length": 32 }
```

<Callout type="info">
  Data slicing is only available for `base58`, `base64`, `base64+zstd`, and
  `binary` encodings.
</Callout>

##### !! filters

!type array

Filter results using up to 4 filter objects. The resultant account(s) must meet
**all** filter criteria to be included in the returned results.

The following filter types are supported:

| Filter              | Type     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `memcmp`            | `object` | Compares a provided series of bytes with account data at a particular offset. Fields: `offset` (`usize`), byte offset into account data; `bytes` (`string \| array`), data to match, provided as a base-58 string by default, a base-64 string when `encoding` is `"base64"`, or a raw byte array; `encoding` (`string`, optional), encoding for string `bytes`, either `"base58"` (default), `"base64"`, or `"bytes"`. Decoded data is limited to 128 bytes. |
| `dataSize`          | `u64`    | Compares the account data length with the provided size.                                                                                                                                                                                                                                                                                                                                                                                                      |
| `tokenAccountState` | N/A      | Filters for Token or Token-2022 accounts that have been initialized. No value is needed.                                                                                                                                                                                                                                                                                                                                                                      |

##### !! sortResults

!type bool  
!values true false  
!default true

Whether to sort returned accounts before returning them. If disabled, do not
assume any particular response order.

### !!result

```jsonc !response
{
  "jsonrpc": "2.0",
  // !hover(1:13) result
  "result": [
    {
      // !hover pubkey
      "pubkey": "CxELquR1gPP8wHe33gZ4QxqGB3sZ9RSwsJ2KshVewkFY",
      // !hover(1:8) account
      "account": {
        // !hover data
        "data": [
          "KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
          "base64"
        ],
        // !hover executable
        "executable": false,
        // !hover lamports
        "lamports": 15298080,
        // !hover owner
        "owner": "4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T",
        // !hover rentEpoch
        "rentEpoch": 28,
        // !hover space
        "space": 42
      }
    }
  ],
  "id": 1
}
```

!type array

By default, returns an array of JSON objects. If `withContext` flag is set, the
array will be wrapped in an RpcResponse JSON object.

Each object contains:

##### !! pubkey

!type string

The account Pubkey as base-58 encoded string

##### !! account

!type object

Account data object.

This field uses the shared
[Account Data](/docs/rpc/json-structures#account-data) structure.

| Field        | Type                                     | Description                                                                                                                                                                                                         |
| ------------ | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `data`       | `string \| [string, encoding] \| object` | Account data. Binary forms depend on the `encoding` parameter. When `encoding` is `jsonParsed`, this field is `{program, parsed, space}`; if no parser is available, the RPC node falls back to `[data, "base64"]`. |
| `executable` | `bool`                                   | Whether the account contains a program and is therefore read-only.                                                                                                                                                  |
| `lamports`   | `u64`                                    | Lamports assigned to the account.                                                                                                                                                                                   |
| `owner`      | `string`                                 | Program owner pubkey, as a base-58 encoded string.                                                                                                                                                                  |
| `rentEpoch`  | `u64`                                    | Next epoch at which the account owes rent.                                                                                                                                                                          |
| `space`      | `u64 \| null`                            | Account data size in bytes. Current Solana RPC responses populate this field for encoded account responses.                                                                                                         |

When `account.data` is returned as an object, it contains:

| Field     | Type     | Description                                                                                 |
| --------- | -------- | ------------------------------------------------------------------------------------------- |
| `program` | `string` | Name of the parser that produced the decoded account data.                                  |
| `parsed`  | `object` | Parser-specific JSON payload. Its structure depends on the owning program and account type. |
| `space`   | `u64`    | Account data size in bytes.                                                                 |

</APIMethod>
