Skip to main content
The Solana Privacy Rings API queries the privacy indexer. It returns encrypted state and public transaction metadata. Your wallet decrypts the payloads to read private balances and history. See the privacy overview for concepts and the SDK for deposit, transfer, and withdrawal flows.

Public and Private Balances

A private balance is stored in UTXOs (unspent transaction outputs). A UTXO is not a Solana account. See Private State and UTXOs for how private balances are stored and spent.

Endpoint and Authentication

Send a JSON-RPC 2.0 request to the method’s path with your Helius API key:
The method must match the final URL path segment. Method paths accept a single request; batches, duplicate method fields, and path/body mismatches return HTTP 400 before execution. For local development, use http://127.0.0.1:8784/{method} after starting the local stack.

Methods

getEncryptedUtxosByTags

Discover encrypted outputs by view tags or ring.

getShieldedTransactionsByTags

Query shielded transaction history by view tags or ring.

getShieldedTransactionsBySignature

Retrieve shielded events for one Solana transaction.

getShieldedTransactionsByNullifiers

Find the transactions that spent supplied nullifiers.

getMerkleProofs

Fetch inclusion proofs for state tree commitments.

getNonInclusionProofs

Fetch non-inclusion proofs for nullifier values.

getNullifierQueueElements

Read queued nullifiers in sequence order.

getUserRecords

Look up public shielded address registrations.

Pagination

getEncryptedUtxosByTags, getShieldedTransactionsByTags, and getShieldedTransactionsByNullifiers return a page in result:
  • data groups results by Solana transaction, ordered by ascending slot and signature. The encrypted UTXO method uses an outputs array in each group; the transaction history methods use an events array.
  • limit counts Solana transactions, from 1 to 1,000, and defaults to 1,000. A transaction’s matching outputs or events stay together in one page.
  • Pass a non-null paginationToken back unchanged with the same tags or nullifiers, ring, and slot filters. Continue until the response token is null.
  • filters.slot accepts gt, gte, lt, and lte bounds. Supplied bounds combine with AND. After an uncapped read reaches a null token, save that page’s context.slot and resume later with filters.slot.gt set to it. A read capped by lt or lte covers only slots up to that cap; resume it from the cap, not from context.slot.
  • Set minContextSlot to require a minimum persisted indexer slot. The indexer also requires the slot of your paginationToken and of any gt or gte filter. If it is behind any of these, it returns error -32016 with error.data.contextSlot; retry after it catches up.
History responses can also include outputTreeId, the newest unpaused state tree ID. It is omitted when unavailable. Individual outputs identify their own tree with outputContext.treeId. getNullifierQueueElements uses sequence-based pagination; see its method page.

Data Encoding

Errors

Inspect the JSON-RPC error field before reading result, including when the HTTP status is 200. HTTP 429 indicates rate limiting; see rate limits. See authentication for API key setup.