Use when adding new error messages to React, or seeing "unknown error code" warnings.
npx skills add sendaifun/skills --skill "helius"
Install specific skill from multi-skill repository
# Description
Comprehensive guide for Helius - Solana's leading RPC and API infrastructure provider. Covers RPC nodes, DAS (Digital Asset Standard) API, Enhanced Transactions, Priority Fees, Webhooks, ZK Compression, LaserStream gRPC, and the Helius SDK for building high-performance Solana applications
# SKILL.md
name: helius
description: Comprehensive guide for Helius - Solana's leading RPC and API infrastructure provider. Covers RPC nodes, DAS (Digital Asset Standard) API, Enhanced Transactions, Priority Fees, Webhooks, ZK Compression, LaserStream gRPC, and the Helius SDK for building high-performance Solana applications
Helius Development Guide
Build high-performance Solana applications with Helius - the leading RPC and API infrastructure provider with 99.99% uptime, global edge nodes, and developer-first APIs.
Overview
Helius provides:
- RPC Infrastructure: Globally distributed nodes with ultra-low latency
- DAS API: Unified NFT and token data (compressed & standard)
- Enhanced Transactions: Parsed, human-readable transaction data
- Priority Fee API: Real-time fee recommendations
- Webhooks: Event-driven blockchain monitoring
- ZK Compression: Compressed account and token APIs
- LaserStream: gRPC-based real-time data streaming
- Sender API: Optimized transaction landing
Quick Start
Installation
# Install Helius SDK
npm install helius-sdk
# Or with pnpm (recommended)
pnpm add helius-sdk
Get Your API Key
- Visit dashboard.helius.dev
- Create an account or sign in
- Generate an API key
- Store it securely (never commit to git)
Environment Setup
# .env file
HELIUS_API_KEY=your_api_key_here
Basic Setup
import { createHelius } from "helius-sdk";
const helius = createHelius({
apiKey: process.env.HELIUS_API_KEY!,
});
// RPC endpoint URLs
const MAINNET_RPC = `https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`;
const DEVNET_RPC = `https://devnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`;
RPC Infrastructure
Endpoints
| Network | HTTP Endpoint | WebSocket Endpoint |
|---|---|---|
| Mainnet | https://mainnet.helius-rpc.com/?api-key=<KEY> |
wss://mainnet.helius-rpc.com/?api-key=<KEY> |
| Devnet | https://devnet.helius-rpc.com/?api-key=<KEY> |
wss://devnet.helius-rpc.com/?api-key=<KEY> |
Using with @solana/kit
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
const rpc = createSolanaRpc(
`https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`
);
const rpcSubscriptions = createSolanaRpcSubscriptions(
`wss://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`
);
// Make RPC calls
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();
Helius-Exclusive RPC Methods
| Method | Description |
|---|---|
getProgramAccountsV2 |
Cursor-based pagination for program accounts |
getTokenAccountsByOwnerV2 |
Efficient token account retrieval |
getTransactionsForAddress |
Advanced transaction history with filtering |
// getProgramAccountsV2 - handles large datasets efficiently
const accounts = await helius.rpc.getProgramAccountsV2({
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
cursor: null, // Start from beginning
limit: 100,
});
// getTransactionsForAddress - advanced filtering
const transactions = await helius.rpc.getTransactionsForAddress({
address: "wallet_address",
before: null,
until: null,
limit: 100,
source: "JUPITER", // Filter by source
type: "SWAP", // Filter by type
});
DAS API (Digital Asset Standard)
Unified access to NFTs, tokens, and compressed assets.
Core Methods
// Get single asset
const asset = await helius.getAsset({
id: "asset_id_here",
});
// Get assets by owner
const assets = await helius.getAssetsByOwner({
ownerAddress: "wallet_address",
page: 1,
limit: 100,
displayOptions: {
showFungible: true,
showNativeBalance: true,
},
});
// Get assets by collection
const collection = await helius.getAssetsByGroup({
groupKey: "collection",
groupValue: "collection_address",
page: 1,
limit: 100,
});
// Search assets with filters
const results = await helius.searchAssets({
ownerAddress: "wallet_address",
tokenType: "fungible",
burnt: false,
page: 1,
limit: 50,
});
// Get batch of assets
const batch = await helius.getAssetBatch({
ids: ["asset1", "asset2", "asset3"],
});
// Get asset proof (for compressed NFTs)
const proof = await helius.getAssetProof({
id: "compressed_nft_id",
});
DAS Method Reference
| Method | Description |
|---|---|
getAsset |
Get single asset by ID |
getAssetBatch |
Get multiple assets |
getAssetProof |
Get merkle proof for cNFT |
getAssetProofBatch |
Get multiple proofs |
getAssetsByOwner |
All assets for wallet |
getAssetsByCreator |
Assets by creator address |
getAssetsByAuthority |
Assets by authority |
getAssetsByGroup |
Assets by collection/group |
searchAssets |
Advanced search with filters |
getNftEditions |
Get NFT edition info |
getTokenAccounts |
Get token accounts |
getSignaturesForAsset |
Transaction history for asset |
Enhanced Transactions API
Get parsed, human-readable transaction data.
// Parse transactions by signature
const parsed = await helius.enhanced.getTransactions({
transactions: ["sig1", "sig2", "sig3"],
});
// Get enhanced transaction history
const history = await helius.enhanced.getTransactionsByAddress({
address: "wallet_address",
type: "SWAP", // Optional: filter by type
});
Transaction Types
SWAP- DEX swaps (Jupiter, Raydium, Orca)NFT_SALE- NFT marketplace salesNFT_LISTING- NFT listingsNFT_BID- NFT bidsTOKEN_MINT- Token mintingTRANSFER- SOL/token transfersSTAKE- Staking operationsUNKNOWN- Unrecognized transactions
Priority Fee API
Get real-time priority fee recommendations.
// Get priority fee estimate
const feeEstimate = await helius.getPriorityFeeEstimate({
transaction: serializedTransaction, // Base64 encoded
// OR
accountKeys: ["account1", "account2"], // Accounts in transaction
options: {
priorityLevel: "HIGH", // LOW, MEDIUM, HIGH, VERY_HIGH
includeAllPriorityFeeLevels: true,
lookbackSlots: 150,
},
});
console.log(feeEstimate.priorityFeeEstimate); // microLamports
Using Priority Fees in Transactions
import { getSetComputeUnitPriceInstruction } from "@solana-program/compute-budget";
// Get estimate
const { priorityFeeEstimate } = await helius.getPriorityFeeEstimate({
accountKeys: [payer.address, recipient.address],
options: { priorityLevel: "HIGH" },
});
// Add to transaction
const priorityFeeIx = getSetComputeUnitPriceInstruction({
microLamports: BigInt(priorityFeeEstimate),
});
// Prepend to transaction instructions
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions([priorityFeeIx], tx),
(tx) => appendTransactionMessageInstruction(mainInstruction, tx),
);
Webhooks
Real-time blockchain event notifications.
Webhook Types
| Type | Description |
|---|---|
| Enhanced | Parsed, filtered events (NFT sales, swaps, etc.) |
| Raw | Unfiltered transaction data, lower latency |
| Discord | Direct Discord channel notifications |
Create Webhook
// Create enhanced webhook
const webhook = await helius.webhooks.createWebhook({
webhookURL: "https://your-server.com/webhook",
transactionTypes: ["NFT_SALE", "SWAP"],
accountAddresses: ["address1", "address2"],
webhookType: "enhanced",
});
// Create raw webhook
const rawWebhook = await helius.webhooks.createWebhook({
webhookURL: "https://your-server.com/raw-webhook",
accountAddresses: ["address1"],
webhookType: "raw",
});
Manage Webhooks
// Get all webhooks
const webhooks = await helius.webhooks.getAllWebhooks();
// Get specific webhook
const webhook = await helius.webhooks.getWebhookByID({
webhookID: "webhook_id",
});
// Update webhook
await helius.webhooks.updateWebhook({
webhookID: "webhook_id",
webhookURL: "https://new-url.com/webhook",
accountAddresses: ["address1", "address2", "address3"],
});
// Delete webhook
await helius.webhooks.deleteWebhook({
webhookID: "webhook_id",
});
Webhook Payload (Enhanced)
interface EnhancedWebhookPayload {
accountData: AccountData[];
description: string;
events: Record<string, unknown>;
fee: number;
feePayer: string;
nativeTransfers: NativeTransfer[];
signature: string;
slot: number;
source: string;
timestamp: number;
tokenTransfers: TokenTransfer[];
type: string;
}
ZK Compression API
Work with compressed accounts and tokens (Light Protocol).
// Get compressed account
const account = await helius.zk.getCompressedAccount({
address: "compressed_account_address",
});
// Get compressed token accounts by owner
const tokens = await helius.zk.getCompressedTokenAccountsByOwner({
owner: "wallet_address",
});
// Get compressed balance
const balance = await helius.zk.getCompressedBalance({
address: "compressed_account_address",
});
// Get validity proof
const proof = await helius.zk.getValidityProof({
hashes: ["hash1", "hash2"],
});
// Get compression signatures
const sigs = await helius.zk.getCompressionSignaturesForOwner({
owner: "wallet_address",
limit: 100,
});
ZK Compression Methods
| Method | Description |
|---|---|
getCompressedAccount |
Get compressed account data |
getCompressedAccountProof |
Get proof for account |
getCompressedAccountsByOwner |
All compressed accounts for wallet |
getCompressedBalance |
Get compressed SOL balance |
getCompressedTokenAccountsByOwner |
Compressed token accounts |
getCompressedTokenBalancesByOwner |
Token balances |
getValidityProof |
Get validity proof for hashes |
getCompressionSignaturesForOwner |
Compression transaction history |
getIndexerHealth |
Check indexer status |
getIndexerSlot |
Current indexed slot |
Transaction Sending
Smart Transaction Sending
// Send with automatic retry and optimization
const signature = await helius.tx.sendSmartTransaction({
transaction: signedTransaction,
skipPreflight: false,
maxRetries: 3,
});
// Estimate compute units
const computeUnits = await helius.tx.getComputeUnits({
transaction: serializedTransaction,
});
Optimized Transaction Pattern
import { createHelius } from "helius-sdk";
import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
getBase64EncodedWireTransaction,
} from "@solana/kit";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
async function sendOptimizedTransaction(
helius: ReturnType<typeof createHelius>,
rpc: Rpc,
signer: KeyPairSigner,
instruction: IInstruction
) {
// 1. Get priority fee
const { priorityFeeEstimate } = await helius.getPriorityFeeEstimate({
accountKeys: [signer.address],
options: { priorityLevel: "HIGH" },
});
// 2. Get blockhash
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// 3. Build transaction with compute budget
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(signer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions([
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: BigInt(priorityFeeEstimate) }),
], tx),
(tx) => appendTransactionMessageInstruction(instruction, tx),
);
// 4. Sign
const signedTx = await signTransactionMessageWithSigners(tx);
// 5. Send via Helius
const signature = await helius.tx.sendSmartTransaction({
transaction: getBase64EncodedWireTransaction(signedTx),
});
return signature;
}
WebSocket Subscriptions
Real-time data streaming via WebSocket.
// Subscribe to account changes
const accountSub = await helius.ws.accountNotifications({
account: "account_address",
commitment: "confirmed",
callback: (notification) => {
console.log("Account changed:", notification);
},
});
// Subscribe to logs
const logsSub = await helius.ws.logsNotifications({
filter: { mentions: ["program_id"] },
commitment: "confirmed",
callback: (logs) => {
console.log("Logs:", logs);
},
});
// Subscribe to signature confirmations
const sigSub = await helius.ws.signatureNotifications({
signature: "transaction_signature",
commitment: "confirmed",
callback: (status) => {
console.log("Confirmed:", status);
},
});
// Unsubscribe
await accountSub.unsubscribe();
LaserStream (gRPC)
LaserStream is a next-generation gRPC streaming service - a drop-in replacement for Yellowstone that adds historical replay, auto-reconnect, and multi-region endpoints.
Features
- Ultra-low latency: Taps directly into Solana leaders to receive shreds as they're produced
- Historical replay: Replay past blocks and transactions
- Auto-reconnect: Automatic failover and recovery
- Redundant node clusters: High availability infrastructure
- Regional endpoints: Global coverage for minimal latency
- Block, transaction, and account streaming
Endpoints
| Region | Endpoint |
|---|---|
| Frankfurt | fra.laserstream.helius.dev |
| Amsterdam | ams.laserstream.helius.dev |
| Tokyo | tyo.laserstream.helius.dev |
| Singapore | sg.laserstream.helius.dev |
| Los Angeles | lax.laserstream.helius.dev |
| London | lon.laserstream.helius.dev |
| Newark | ewr.laserstream.helius.dev |
| Pittsburgh | pitt.laserstream.helius.dev |
| Salt Lake City | slc.laserstream.helius.dev |
Atlas Infrastructure
Atlas endpoints provide the backbone for Enhanced WebSockets and high-performance streaming:
// Atlas WebSocket endpoints
const ATLAS_MAINNET_WS = "wss://atlas-mainnet.helius-rpc.com";
const ATLAS_DEVNET_WS = "wss://atlas-devnet.helius-rpc.com";
Enhanced WebSockets (New)
Enhanced WebSockets are now powered by LaserStream infrastructure, offering:
- 1.5β2Γ faster than standard WebSockets
- gRPC reliability in a WebSocket wrapper
- Same filtering and event types as regular WebSockets
// Connect to Enhanced WebSocket
const ws = new WebSocket(
`wss://atlas-mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`
);
ws.on("open", () => {
// Subscribe to account changes
ws.send(JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "accountSubscribe",
params: [accountAddress, { commitment: "confirmed" }],
}));
});
Shred Delivery (Beta)
For teams chasing single-digit millisecond latency, Helius offers a UDP feed of raw shreds directly from validators.
Staking API
Stake SOL with Helius validator programmatically.
// Create stake transaction
const stakeTx = await helius.staking.createStakeTransaction({
payerAddress: "wallet_address",
amount: 1_000_000_000, // 1 SOL in lamports
});
// Create unstake transaction
const unstakeTx = await helius.staking.createUnstakeTransaction({
payerAddress: "wallet_address",
stakeAccountAddress: "stake_account",
});
// Get stake accounts
const stakeAccounts = await helius.staking.getHeliusStakeAccounts({
ownerAddress: "wallet_address",
});
SDK Namespaces
| Namespace | Purpose |
|---|---|
helius.* |
DAS API, priority fees |
helius.rpc.* |
Enhanced RPC methods |
helius.tx.* |
Transaction operations |
helius.staking.* |
Validator staking |
helius.enhanced.* |
Decoded transaction data |
helius.webhooks.* |
Event management |
helius.ws.* |
WebSocket subscriptions |
helius.zk.* |
ZK Compression features |
Error Handling
try {
const assets = await helius.getAssetsByOwner({ ownerAddress: "..." });
} catch (error) {
if (error.response?.status === 401) {
console.error("Invalid API key");
} else if (error.response?.status === 429) {
console.error("Rate limited - upgrade plan or reduce requests");
} else if (error.response?.status >= 500) {
console.error("Helius server error - retry later");
}
}
Common Error Codes
| Code | Meaning | Solution |
|---|---|---|
| 401 | Invalid API key | Check key in dashboard |
| 429 | Rate limited | Upgrade plan or add delays |
| 500+ | Server error | Retry with backoff |
Rate Limits & Pricing
| Plan | Credits/Month | RPC Calls | Webhooks |
|---|---|---|---|
| Free | 500,000 | Standard | 2 |
| Developer | 5M | Enhanced | 10 |
| Growth | 50M | Priority | 50 |
| Enterprise | Custom | Dedicated | Unlimited |
Credit Costs
- Standard RPC: 1 credit/call
- DAS API: 1-10 credits/call
- Webhooks: 1 credit/event delivered
- Webhook management: 100 credits/operation
Best Practices
API Key Security
- Never commit API keys to git
- Use environment variables
- Rotate keys periodically
- Use separate keys for dev/prod
Performance
- Batch requests when possible (getAssetBatch, getAssetProofBatch)
- Use cursor-based pagination for large datasets
- Cache frequently accessed data
- Use appropriate commitment levels
Reliability
- Implement retry logic with exponential backoff
- Handle rate limits gracefully
- Use multiple regional endpoints for failover
- Monitor webhook delivery and handle retries
Resources
Skill Structure
helius/
βββ SKILL.md # This file
βββ resources/
β βββ rpc-methods.md # Complete RPC reference
β βββ das-api.md # DAS API reference
β βββ enhanced-apis.md # Enhanced transactions & priority fees
β βββ webhooks.md # Webhook configuration
β βββ zk-compression.md # ZK compression API
β βββ sdk-reference.md # SDK namespace reference
βββ examples/
β βββ basic-rpc/ # Basic RPC calls
β βββ fetch-nfts/ # DAS API examples
β βββ send-transactions/ # Transaction sending
β βββ webhooks/ # Webhook setup
β βββ streaming/ # Real-time data
βββ templates/
β βββ helius-setup.ts # Starter template
βββ docs/
βββ troubleshooting.md # Common issues
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.