# Solana

> Read the Solana blockchain through its keyless public JSON-RPC endpoints: SOL and SPL token balances, account state, a wallet's recent transactions, a transaction's full detail with the balance changes it caused, token supply, and cluster health. No account or API key required.

App · Cryptocurrency · 7 actions. Web page: https://docs.lodol.com/docs/integrations/solana

## Actions

### Get account info

Get an account's state: the program that owns it, its balance, whether it is executable, and its data. Accounts the node can decode (token accounts, mints, stake and vote accounts) come back as readable fields; anything else keeps its data as base64.

**Inputs**

- Address (`address`, text, required): Base58 address of the account to read. Any account works: a wallet, a token account, a mint, or a program.
- Cluster (`cluster`, text): Which Solana cluster to read from. Mainnet Beta is the live chain carrying real value; Devnet and Testnet are for trying a workflow out first and their tokens are worth nothing. Defaults to Mainnet Beta. One of: `mainnet-beta` (Mainnet Beta (live)), `devnet`, `testnet`. Default: `mainnet-beta`.
- Commitment (`commitment`, text): How settled the data has to be before the node answers. 'Finalized' is a block that can no longer be rolled back and is the right choice for anything about money; 'confirmed' is a couple of seconds fresher; 'processed' is the newest and the least certain. Defaults to finalized. One of: `finalized` (Finalized (safest)), `confirmed`, `processed` (Processed (newest)). Default: `finalized`.

**Outputs**

- `account_type` (text): Kind of account, e.g. 'mint' or 'account'
- `address` (text): Address the account is for
- `cluster` (text): Cluster it was read from
- `context_slot` (number): Slot the node answered at, i.e. how current this reading is
- `data_base64` (text): Raw account data, when it could not be decoded
- `executable` (true/false): Whether the account is a program itself
- `exists` (true/false): False when nothing has ever been created at this address; the rest of the fields are then empty
- `lamports` (number): Balance in lamports, the chain's own unit (1 SOL = 1,000,000,000)
- `owner` (text): Address of the program that owns the account
- `owner_program` (text): Name of that program when it is a well-known one, e.g. 'SPL Token Program'
- `parsed` (object): Decoded account fields, when the node could
- `program` (text): Program the data was decoded as, e.g. 'spl-token'
- `rent_epoch` (number): Epoch rent is next owed, when one applies
- `rent_exempt` (true/false): Whether the account holds enough to owe no rent
- `sol` (number): The same balance expressed in SOL
- `sol_string` (text): The same balance in SOL as an exact decimal string, for balances too large to hold in a number without rounding
- `space` (number): Size of the account's data, in bytes

**Example output**

```json
{
  "account_type": "mint",
  "address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "cluster": "mainnet-beta",
  "context_slot": 351842091,
  "data_base64": null,
  "executable": false,
  "exists": true,
  "lamports": 388127588933,
  "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
  "owner_program": "SPL Token Program",
  "parsed": {
    "decimals": 6,
    "freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
    "isInitialized": true,
    "mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
    "supply": "8492155106448329"
  },
  "program": "spl-token",
  "rent_epoch": null,
  "rent_exempt": true,
  "sol": 388.127588933,
  "sol_string": "388.127588933",
  "space": 82
}
```

### Get network status

Check that a Solana cluster is healthy and see where it is in the current epoch: the slot it has reached, how far through the epoch that is, and the version the node runs. Useful as a guard before a workflow reads anything else.

**Inputs**

- Cluster (`cluster`, text): Which Solana cluster to read from. Mainnet Beta is the live chain carrying real value; Devnet and Testnet are for trying a workflow out first and their tokens are worth nothing. Defaults to Mainnet Beta. One of: `mainnet-beta` (Mainnet Beta (live)), `devnet`, `testnet`. Default: `mainnet-beta`.

**Outputs**

- `block_height` (number): Current block height
- `cluster` (text): Cluster checked
- `endpoint` (text): RPC endpoint the check was made against
- `epoch` (number): Current epoch number
- `epoch_progress_percent` (number): How far through the epoch the cluster is
- `feature_set` (number): Feature-set identifier the node runs
- `health` (text): 'ok', or what the node said about being behind
- `healthy` (true/false): Whether the node is caught up with the cluster
- `slot` (number): Highest slot the node has reached
- `slot_index` (number): Slots into the current epoch
- `slots_in_epoch` (number): Total slots this epoch holds
- `solana_core_version` (text): Node software version, e.g. '2.3.6'
- `transaction_count` (number): Transactions the cluster has ever processed

**Example output**

```json
{
  "block_height": 329914772,
  "cluster": "mainnet-beta",
  "endpoint": "https://api.mainnet-beta.solana.com",
  "epoch": 814,
  "epoch_progress_percent": 74.56,
  "feature_set": 3341060832,
  "health": "ok",
  "healthy": true,
  "slot": 351842091,
  "slot_index": 322091,
  "slots_in_epoch": 432000,
  "solana_core_version": "2.3.6",
  "transaction_count": 425819330244
}
```

### Get recent transactions

List the transactions that touched an address, newest first, with each one's signature, time, and whether it succeeded. This is how a workflow watches a wallet: hand a signature to 'Get transaction' for the detail, or stop at the last one already seen so a scheduled run only picks up what is new.

**Inputs**

- Address (`address`, text, required): Base58 address to list transactions for. A wallet, a token account, or a program all work.
- Limit (`limit`, number): How many transactions to return, newest first, from 1 to 1000. Defaults to 10. From 1 to 1000. Default: `10`.
- Before signature (`before`, text): Return only transactions older than this signature. Pass the 'oldest_signature' of a previous run to page further back in time.
- Until signature (`until`, text): Stop at this signature and return only what is newer than it. Pass the 'newest_signature' a previous run saw so a scheduled workflow picks up only new activity.
- Cluster (`cluster`, text): Which Solana cluster to read from. Mainnet Beta is the live chain carrying real value; Devnet and Testnet are for trying a workflow out first and their tokens are worth nothing. Defaults to Mainnet Beta. One of: `mainnet-beta` (Mainnet Beta (live)), `devnet`, `testnet`. Default: `mainnet-beta`.
- Commitment (`commitment`, text): How settled the data has to be before the node answers. 'Finalized' is a block that can no longer be rolled back and is the right choice for anything about money; 'confirmed' is a couple of seconds fresher. Defaults to finalized. One of: `finalized` (Finalized (safest)), `confirmed`. Default: `finalized`.

**Outputs**

- `address` (text): Address the transactions were listed for
- `cluster` (text): Cluster they were read from
- `count` (number): Number of transactions returned
- `newest_signature` (text): First signature in the list, to use as 'until' next run
- `oldest_signature` (text): Last signature in the list, for paging back
- `signatures` (list)

**Example output**

```json
{
  "address": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
  "cluster": "mainnet-beta",
  "count": 2,
  "newest_signature": "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7",
  "oldest_signature": "3nVfYSN2SPZWGZa6Ln6NKGRA7XQvZSTVeM8FBGoLnJRDSXhTyPZKfcEXtnfwvJnAynmYQqDbAWJDkUDBGa2vhcFT",
  "signatures": [
    {
      "block_time": 1784894400,
      "block_time_iso": "2026-07-24T12:00:00+00:00",
      "confirmation_status": "finalized",
      "error": null,
      "memo": null,
      "signature": "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7",
      "slot": 351842077,
      "succeeded": true
    },
    {
      "block_time": 1784893180,
      "block_time_iso": "2026-07-24T11:39:40+00:00",
      "confirmation_status": "finalized",
      "error": {
        "InstructionError": [
          0,
          {
            "Custom": 1
          }
        ]
      },
      "memo": null,
      "signature": "3nVfYSN2SPZWGZa6Ln6NKGRA7XQvZSTVeM8FBGoLnJRDSXhTyPZKfcEXtnfwvJnAynmYQqDbAWJDkUDBGa2vhcFT",
      "slot": 351839112,
      "succeeded": false
    }
  ]
}
```

### Get SOL balance

Get the SOL balance of any wallet or account address, in lamports and in SOL. An address that has never been funded reads as zero rather than as an error.

**Inputs**

- Address (`address`, text, required): Base58 address of the wallet or account to read, for example '9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM'.
- Cluster (`cluster`, text): Which Solana cluster to read from. Mainnet Beta is the live chain carrying real value; Devnet and Testnet are for trying a workflow out first and their tokens are worth nothing. Defaults to Mainnet Beta. One of: `mainnet-beta` (Mainnet Beta (live)), `devnet`, `testnet`. Default: `mainnet-beta`.
- Commitment (`commitment`, text): How settled the data has to be before the node answers. 'Finalized' is a block that can no longer be rolled back and is the right choice for anything about money; 'confirmed' is a couple of seconds fresher; 'processed' is the newest and the least certain. Defaults to finalized. One of: `finalized` (Finalized (safest)), `confirmed`, `processed` (Processed (newest)). Default: `finalized`.

**Outputs**

- `address` (text): Address the balance is for
- `cluster` (text): Cluster it was read from
- `context_slot` (number): Slot the node answered at, i.e. how current this reading is
- `lamports` (number): Balance in lamports, the chain's own unit (1 SOL = 1,000,000,000)
- `sol` (number): The same balance expressed in SOL
- `sol_string` (text): The same balance in SOL as an exact decimal string, for balances too large to hold in a number without rounding

**Example output**

```json
{
  "address": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
  "cluster": "mainnet-beta",
  "context_slot": 351842091,
  "lamports": 2497550000,
  "sol": 2.49755,
  "sol_string": "2.49755"
}
```

### Get token balances

List the SPL token balances held by a wallet, one row per token account with its mint and amount. Narrow it to a single mint to ask about one token, such as how much USDC a wallet holds.

**Inputs**

- Owner address (`owner`, text, required): Base58 address of the wallet whose token balances to read. This is the wallet itself, not one of its token accounts.
- Mint address (`mint`, text): Mint address of a single token to report on, for example the USDC mint. Leave blank to return every token account the wallet holds.
- Token program (`token_program`, text): Which token program to look under when no mint is given. Most tokens use the original SPL Token program; newer ones with transfer fees or interest use Token-2022, and its accounts are invisible to a query for the original. One of: `spl-token` (SPL Token (original)), `token-2022`. Default: `spl-token`.
- Include empty accounts (`include_empty`, true/false): Include token accounts holding a zero balance. A wallet keeps an account for every token it has ever touched, so these are left out by default. Default: `false`.
- Cluster (`cluster`, text): Which Solana cluster to read from. Mainnet Beta is the live chain carrying real value; Devnet and Testnet are for trying a workflow out first and their tokens are worth nothing. Defaults to Mainnet Beta. One of: `mainnet-beta` (Mainnet Beta (live)), `devnet`, `testnet`. Default: `mainnet-beta`.
- Commitment (`commitment`, text): How settled the data has to be before the node answers. 'Finalized' is a block that can no longer be rolled back and is the right choice for anything about money; 'confirmed' is a couple of seconds fresher; 'processed' is the newest and the least certain. Defaults to finalized. One of: `finalized` (Finalized (safest)), `confirmed`, `processed` (Processed (newest)). Default: `finalized`.

**Outputs**

- `accounts` (list)
- `cluster` (text): Cluster they were read from
- `context_slot` (number): Slot the node answered at, i.e. how current this reading is
- `count` (number): Number of accounts returned
- `mint` (text): Mint the query was narrowed to, or null
- `owner` (text): Wallet the balances belong to
- `token_program` (text): Token program the query covered, or null when a mint was given instead
- `total_accounts` (number): Accounts before empty ones were filtered out

**Example output**

```json
{
  "accounts": [
    {
      "account_lamports": 2039280,
      "amount": "1250450000",
      "decimals": 6,
      "is_native": false,
      "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "owner": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      "program": "spl-token",
      "pubkey": "FpB2Zh7KrKrDqvJVv3cvtRYYFXFbLPTNCsSCLZbSHqZm",
      "state": "initialized",
      "token_program_id": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
      "ui_amount": 1250.45,
      "ui_amount_string": "1250.45"
    },
    {
      "account_lamports": 2541280,
      "amount": "500000000",
      "decimals": 9,
      "is_native": true,
      "mint": "So11111111111111111111111111111111111111112",
      "owner": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      "program": "spl-token",
      "pubkey": "7uKZ4pDcCBrDbQCEmqNaGgb1Vv4rBfbjBcvBRRCxAr3m",
      "state": "initialized",
      "token_program_id": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
      "ui_amount": 0.5,
      "ui_amount_string": "0.5"
    }
  ],
  "cluster": "mainnet-beta",
  "context_slot": 351842091,
  "count": 2,
  "mint": null,
  "owner": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
  "token_program": "spl-token",
  "total_accounts": 5
}
```

### Get token supply

Get the circulating supply of an SPL token from its mint address, as the raw amount and with the mint's decimals applied.

**Inputs**

- Mint address (`mint`, text, required): Base58 mint address of the token, for example 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' for USDC.
- Cluster (`cluster`, text): Which Solana cluster to read from. Mainnet Beta is the live chain carrying real value; Devnet and Testnet are for trying a workflow out first and their tokens are worth nothing. Defaults to Mainnet Beta. One of: `mainnet-beta` (Mainnet Beta (live)), `devnet`, `testnet`. Default: `mainnet-beta`.
- Commitment (`commitment`, text): How settled the data has to be before the node answers. 'Finalized' is a block that can no longer be rolled back and is the right choice for anything about money; 'confirmed' is a couple of seconds fresher; 'processed' is the newest and the least certain. Defaults to finalized. One of: `finalized` (Finalized (safest)), `confirmed`, `processed` (Processed (newest)). Default: `finalized`.

**Outputs**

- `amount` (text): Raw amount in the token's smallest unit, as a string because it can be larger than a number holds exactly
- `cluster` (text): Cluster it was read from
- `context_slot` (number): Slot the node answered at, i.e. how current this reading is
- `decimals` (number): Decimal places the mint uses, e.g. 6 for USDC
- `mint` (text): Mint the supply is for
- `ui_amount` (number): The human-readable amount, with those decimals already applied
- `ui_amount_string` (text): The same human figure as an exact decimal string

**Example output**

```json
{
  "amount": "8492155106448329",
  "cluster": "mainnet-beta",
  "context_slot": 351842091,
  "decimals": 6,
  "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "ui_amount": 8492155106.448329,
  "ui_amount_string": "8492155106.448329"
}
```

### Get transaction

Get a confirmed transaction by signature, with what it actually moved worked out: the fee, the instructions it ran, and the SOL and token balance changes per account. Use it to confirm a payment arrived and for how much.

**Inputs**

- Signature (`signature`, text, required): Base58 transaction signature, the long string an explorer shows for a transaction, or one returned by 'Get recent transactions'.
- Include program logs (`include_logs`, true/false): Include the program log messages the transaction emitted. They are long and mostly useful for working out why something failed, so they are left out by default. Default: `false`.
- Cluster (`cluster`, text): Which Solana cluster to read from. Mainnet Beta is the live chain carrying real value; Devnet and Testnet are for trying a workflow out first and their tokens are worth nothing. Defaults to Mainnet Beta. One of: `mainnet-beta` (Mainnet Beta (live)), `devnet`, `testnet`. Default: `mainnet-beta`.
- Commitment (`commitment`, text): How settled the data has to be before the node answers. 'Finalized' is a block that can no longer be rolled back and is the right choice for anything about money; 'confirmed' is a couple of seconds fresher. Defaults to finalized. One of: `finalized` (Finalized (safest)), `confirmed`. Default: `finalized`.

**Outputs**

- `accounts` (list): Every account the transaction referenced, in order
- `block_time` (number): Block time as seconds since the Unix epoch
- `block_time_iso` (text): The same block time as an ISO 8601 UTC timestamp
- `cluster` (text): Cluster it was read from
- `compute_units_consumed` (number): Compute units the transaction used
- `error` (object): Why it failed, or null when it succeeded
- `fee_lamports` (number): Fee paid, in lamports
- `fee_payer` (text): Account that paid the fee (the first signer)
- `fee_sol` (number): The same fee expressed in SOL
- `fee_sol_string` (text): The same fee in SOL as an exact decimal string
- `instructions` (list)
- `logs` (list): Program log messages, when they were asked for
- `recent_blockhash` (text): Blockhash the transaction was signed against
- `signature` (text): Signature of the transaction
- `slot` (number): Slot the transaction landed in
- `sol_balance_changes` (list)
- `succeeded` (true/false): Whether the transaction ran without error
- `token_balance_changes` (list)
- `version` (text): Transaction version: 'legacy' or 0

**Example output**

```json
{
  "accounts": [
    "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
    "3nq5EFTvQxLcRUqcRPBTQjPZbDdBXqzZbYbFAyGtxTfp",
    "11111111111111111111111111111111"
  ],
  "block_time": 1784894400,
  "block_time_iso": "2026-07-24T12:00:00+00:00",
  "cluster": "mainnet-beta",
  "compute_units_consumed": 450,
  "error": null,
  "fee_lamports": 5000,
  "fee_payer": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
  "fee_sol": 5e-06,
  "fee_sol_string": "0.000005",
  "instructions": [
    {
      "accounts": [],
      "data": null,
      "index": 0,
      "info": {
        "destination": "3nq5EFTvQxLcRUqcRPBTQjPZbDdBXqzZbYbFAyGtxTfp",
        "lamports": 100000000,
        "source": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM"
      },
      "program": "system",
      "program_id": "11111111111111111111111111111111",
      "type": "transfer"
    }
  ],
  "logs": [],
  "recent_blockhash": "6vJDPqZmRr2Tp3fnLxvGpJmwLzY6cH9SxiCWJRBhkPYq",
  "signature": "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7",
  "slot": 351842077,
  "sol_balance_changes": [
    {
      "address": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      "change_lamports": -100005000,
      "change_sol": -0.100005,
      "post_lamports": 2397545000,
      "pre_lamports": 2497550000
    },
    {
      "address": "3nq5EFTvQxLcRUqcRPBTQjPZbDdBXqzZbYbFAyGtxTfp",
      "change_lamports": 100000000,
      "change_sol": 0.1,
      "post_lamports": 100890880,
      "pre_lamports": 890880
    }
  ],
  "succeeded": true,
  "token_balance_changes": [],
  "version": "legacy"
}
```
