Get Started
Solana RPC Nodes
Dedicated Nodes
Sending Transactions
Getting Data
- Overview
- Get Accounts
- Get Program Accounts
- Get Transactions
- Get NFTs
- Get SPL Tokens
- Digital Asset Standard (DAS)
- Enhanced Transactions API
Data Streaming
- Overview
- Quickstart
- Standard Websockets
- Enhanced Websockets (Beta)
- LaserStream
- Yellowstone gRPC
Event Listening
- Overview
- Quickstart
- Webhooks
Resources
LaserStream gRPC
Highly configurable real-time data streams.
Laserstream is currently in private beta and not yet publicly available. Access is limited, and some features may still be under development.
Overview
Laserstream’s gRPC offering builds on a Yellowstone-based interface and enhances it with features like historical replay, multi-node failover, and a fully managed environment. You can connect either directly with @yellowstone-grpc
or use the higher-level Helius Laserstream client for added benefits (auto-reconnect, subscription management, error handling, etc.).
Quickstart
Create a New Project
mkdir laserstream-grpc-demo
cd laserstream-grpc-demo
npm init -y
Install Dependencies
npm install helius-laserstream
npm install --save-dev typescript ts-node
npx tsc --init
Obtain Your API Key
Generate a key from the Helius Dashboard.
Create a Subscription Script
Create index.ts
with the following:
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscriptionRequest: SubscribeRequest = {
transactions: {
client: {
accountInclude: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
accountExclude: [],
accountRequired: [],
vote: false,
failed: false
}
},
commitment: CommitmentLevel.CONFIRMED,
accounts: {},
slots: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
accountsDataSlice: [],
// Optionally, you can replay missed data by specifying a fromSlot:
// fromSlot: '224339000'
// Note: Currently, you can only go back up to 3000 slots.
};
// TODO: Replace the values below with your actual Laserstream API key and endpoint
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscriptionRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
Replace Your Endpoint and API Key
In index.ts
, update the config
object with the actual apiKey
and endpoint
from your Helius Dashboard:
const config: LaserstreamConfig = {
apiKey: 'YOUR_ACTUAL_API_KEY',
endpoint: 'YOUR_ACTUAL_ENDPOINT',
}
Run and View Results
npx ts-node index.ts
Whenever a confirmed
token transaction involves TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
, you’ll see the data in your console.
Subscribe Request
In the subscribe request, you need to include the following:
const subscriptionRequest: SubscribeRequest = {
commitment: CommitmentLevel.CONFIRMED,
accountsDataSlice: [],
transactions: {},
accounts: {},
slots: {},
blocks: {},
blocksMeta: {},
entry: {},
}
Next, you’ll need to specify the filters for the data you want to subscribe to, such as accounts, blocks, slots, or transactions.
slots: {
// mySlotLabel is a user-defined name for slot updates
mySlotLabel: {
// filterByCommitment: true => Only broadcast slot updates at the specified subscribeRequest commitment
filterByCommitment: true
// interslotUpdates: true allows receiving updates for changes occurring within a slot, not just new slots.
interslotUpdates: true
}
},
If all fields are empty, all accounts are broadcasted. Otherwise:
- Fields operate as a logical AND.
- Values within arrays act as a logical OR (except within filters, which operate as a logical AND)
accounts: {
// tokenAccounts is a user-defined label for the "accounts" subscription
tokenAccounts: {
// Matches any of these public keys (logical OR)
account: ["9SHQTA66Ekh7ZgMnKWsjxXk6DwXku8przs45E8bcEe38"],
// Matches owners that are any of these public keys
owner: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
// Filters - all must match (AND logic)
filters: [
{ dataSize: 165 },
{
memcmp: {
offset: 0,
data: { base58: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }
}
}
]
}
},
If all fields are left empty, all transactions are broadcasted. Otherwise:
- Fields operate as a logical AND.
- Values within arrays are treated as a logical OR.
transactions: {
// myTxSubscription is a user-defined label for transaction filters
myTxSubscription: {
vote: false,
failed: false,
signature: "",
// Transaction must include at least one of these public keys (OR)
accountInclude: ["86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY"],
// Exclude if it matches any of these
accountExclude: [],
// Require all accounts in this array (AND)
accountRequired: []
}
},
blocks: {
// myBlockLabel is a user-defined label for block subscription
myBlockLabel: {
// Only broadcast blocks referencing these accounts
accountInclude: ["86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY"],
includeTransactions: true,
includeAccounts: false,
includeEntries: false
}
},
This functions similarly to Blocks but excludes transactions, accounts, and entries. Currently, no filters are available for block metadata—all messages are broadcasted by default.
blocksMeta: {
blockmetadata: {}
},
Currently, there are no filters available for entries; all entries are broadcasted.
entry: {
entrySubscribe: {}
},
Code Examples
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscriptionRequest: SubscribeRequest = {
transactions: {},
commitment: CommitmentLevel.CONFIRMED,
accounts: {},
slots: {
slot: { filterByCommitment: true },
},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
accountsDataSlice: [],
}
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscriptionRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscriptionRequest: SubscribeRequest = {
transactions: {},
commitment: CommitmentLevel.CONFIRMED,
accounts: {},
slots: {
slot: { filterByCommitment: true },
},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
accountsDataSlice: [],
}
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscriptionRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscribeRequest: SubscribeRequest = {
accounts: {
accountSubscribe: {
account: ["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"], // USDC mint account
owner: [],
filters: []
}
},
accountsDataSlice: [],
commitment: CommitmentLevel.CONFIRMED,
slots: {},
transactions: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {}
};
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscribeRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscriptionRequest: SubscribeRequest = {
transactions: {
client: {
accountInclude: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
accountExclude: [],
accountRequired: [],
vote: false,
failed: false
}
},
commitment: CommitmentLevel.CONFIRMED,
accounts: {},
slots: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
accountsDataSlice: [],
};
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscriptionRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscriptionRequest: SubscribeRequest = {
entry: {},
accounts: {},
accountsDataSlice: [],
slots: {},
blocks: {
blocks: {
accountInclude: []
}
},
blocksMeta: {},
transactions: {},
transactionsStatus: {},
commitment: CommitmentLevel.CONFIRMED,
};
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscriptionRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscriptionRequest: SubscribeRequest = {
entry: {},
accounts: {},
accountsDataSlice: [],
slots: {},
blocks: {},
blocksMeta: {
blockmetadata: {}
},
transactions: {},
transactionsStatus: {},
commitment: CommitmentLevel.CONFIRMED,
};
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscriptionRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'
async function main() {
const subscriptionRequest: SubscribeRequest = {
entry: {
entrySubscribe: {} // Subscribe to all entries
},
accounts: {},
accountsDataSlice: [],
slots: {},
blocks: {},
blocksMeta: {},
transactions: {},
transactionsStatus: {},
commitment: CommitmentLevel.CONFIRMED,
};
const config: LaserstreamConfig = {
apiKey: 'your-api-key',
endpoint: 'your-endpoint',
}
await subscribe(config, subscriptionRequest, async (data) => {
console.log(data);
}, async (error) => {
console.error(error);
});
}
main().catch(console.error);
Was this page helpful?