What is a Dataset?
A dataset is a specific type of blockchain data that Streams delivers to your destination. Blockchains produce several types of data — blocks, transactions, event logs, receipts — and each serves different purposes.
How Datasets Work with Streams
When you create a stream, you configure two things:
- Network — The blockchain you want data from (e.g., Ethereum Mainnet, Polygon, Solana)
- Dataset — The type of data you want to receive (e.g., blocks, transactions, logs)
Your stream then delivers that data type from that network to your destination. For example, selecting ethereum-mainnet + logs delivers all smart contract event emissions from Ethereum.
Why Different Datasets Exist
Blockchains produce data at multiple levels:
- Blocks contain a header plus all transactions that were included
- Transactions are individual operations submitted to the network
- Logs (EVM chains) are events emitted by smart contracts during execution
- Receipts contain execution results like status, gas used, and logs
Streaming full blocks when you only need transfer events wastes bandwidth and processing power.
Available Data Sources
The available datasets vary by blockchain. Select a chain below to see its supported datasets and data schema.
EVM-compatible chains — Ethereum, Base, Arbitrum, Optimism, Polygon, and more.
HyperEVM supports standard EVM datasets. Hypercore supports specialized datasets including trades, orders, and market events.
Choosing the Right Dataset
Select your blockchain to see available datasets and when to use each one.
- EVM Chains
- Solana
- Bitcoin
- XRPL & Stellar
- Hyperliquid
Ethereum, Polygon, Base, Arbitrum, and other EVM-compatible chains.
| Dataset | Description | Use When |
|---|---|---|
| Block | Block header and all transactions | You need full block context |
| Transactions | Individual transaction data | Tracking specific transactions or addresses |
| Logs | Smart contract event emissions | Monitoring events like transfers, swaps, mints |
| Receipts | Execution results with status and gas used | Verifying transaction success or gas analysis |
| Block with Receipts | Block data combined with all receipts | Need both block and execution data together |
| Traces (debug) | Internal transaction traces via debug_traceBlock | Debugging or analyzing internal calls |
| Traces (trace_block) | Transaction traces via trace_block | Tracing with Parity/OpenEthereum style |
| Block + Receipts + debug | Combined block, receipts, and debug traces | Complete block data with execution traces |
| Block + Receipts + trace_block | Combined block, receipts, and trace_block | Complete block data with Parity-style traces |
| Dataset | Description | Use When |
|---|---|---|
| Block | Full block with all transactions | Processing complete Solana blocks |
| Programs + Logs | Program invocations and log messages | Monitoring specific program activity |
| Dataset | Description | Use When |
|---|---|---|
| Block | Block header and all transactions | Processing Bitcoin block and transaction data |
| Dataset | Description | Use When |
|---|---|---|
| Ledger | Ledger data with transactions and metadata | Processing XRP or Stellar ledger data |
Hyperliquid EVM uses standard EVM datasets (Block, Transactions, Logs, Receipts, etc.)
Hyperliquid Hypercore (Beta) has specialized datasets:
| Dataset | Description | Use When |
|---|---|---|
| Block | L1 block data | Processing Hyperliquid blocks |
| Events | On-chain events | Monitoring protocol events |
| Orders | Order submissions and cancellations | Tracking order flow |
| Events with orders | Events combined with order data | Need both events and related orders together |
| Trades | Executed trades | Building trade history or analytics |
| Book updates | Order book changes | Maintaining order book state |
| Twap | Time-weighted average price orders | Tracking TWAP executions |
| Writer actions | Vault writer actions | Monitoring vault activity |
Payload Structure
Each stream delivery contains two top-level fields:
data— The dataset content. The structure depends on the selected dataset and follows the chain's native data format.metadata— Information about the stream and current batch (see below).
{
"data": [
// array of blocks, transactions, logs, etc. — shape varies by dataset
],
"metadata": {
"network": "ethereum-mainnet",
"dataset": "block",
"batch_start_range": 19271200,
"batch_end_range": 19271294,
// ... see Stream Metadata below
}
}
Stream Metadata
Metadata is included with every delivery:
- HTTP headers: Metadata fields are sent as HTTP headers on every delivery request.
- Payload body: Metadata is included as a
metadataobject in the JSON payload body. - Filter function: The full payload (including
metadata) is passed to your filter function when one is configured.
Note: Metadata is sent once per batch, not per individual data record.
You can access metadata fields in your filter function like this:
function main(stream) {
const network = stream.metadata.network; // e.g. "ethereum-mainnet"
const dataset = stream.metadata.dataset; // e.g. "block"
const startRange = stream.metadata.batch_start_range; // e.g. 19271200
const endRange = stream.metadata.batch_end_range; // e.g. 19271294
const streamId = stream.metadata.stream_id;
// ... rest of your filter
return stream.data;
}
Stream Metadata Properties (once per batch)
| Property | Type | Header Name | Description | Example |
|---|---|---|---|---|
| batch_start_range | integer | Batch-Start-Range | Starting block of the current batch | 19271200 |
| batch_end_range | integer | Batch-End-Range | Ending block of the current batch | 19271294 |
| data_size_bytes | integer | Batch-Data-Size-Bytes | Total size of the raw data content in bytes | 48230 |
| blocks_reorged | array | null | Batch-Blocks-Reorged | Block numbers delivered as a result of a chain reorganization. null in body when empty, [] in headers. | [19271293, 19271294] |
| reorgs | array | null | Batch-Reorgs | Detailed reorg info including block number, hash, and timestamp of the displaced block. null in body when empty, [] in headers. | [{"block_number": 19271294, ...}] |
| dataset | string | Stream-Dataset | Type of dataset | "block" |
| network | string | Stream-Network | Blockchain network | "ethereum-mainnet" |
| start_range | integer | Stream-Start-Range | Starting range of data capture for the stream | 100 |
| end_range | integer | Stream-End-Range | Ending range of data capture for the stream | 200 |
| keep_distance_from_tip | integer | Stream-Keep-Distance-From-Tip | Distance from the chain tip | 0 |
| stream_id | string | Stream-Id | ID of the stream | "f6ad6459-..." |
| stream_name | string | Stream-Name | Name of the stream | "stream test1" |
| stream_region | string | Stream-Region | Region of the stream | "usa_east" |
Payload Examples
- No Reorgs
- With Reorgs
HTTP Headers:
Stream-Id: f6ad6459-b5ad-4183-b370-1c1388e47e83
Stream-Name: stream test1
Stream-Region: usa_east
Stream-Network: ethereum-mainnet
Stream-Dataset: block
Stream-Start-Range: 100
Stream-End-Range: 200
Stream-Keep-Distance-From-Tip: 0
Batch-Start-Range: 19271200
Batch-End-Range: 19271294
Batch-Data-Size-Bytes: 48230
Batch-Reorgs: []
Batch-Blocks-Reorged: []
Payload Body:
{
"data": [
// Dataset content structure varies by dataset type
// and maintains the original format from the data source
],
"metadata": {
"stream_id": "f6ad6459-b5ad-4183-b370-1c1388e47e83",
"stream_name": "stream test1",
"stream_region": "usa_east",
"network": "ethereum-mainnet",
"dataset": "block",
"start_range": 100,
"end_range": 200,
"keep_distance_from_tip": 0,
"batch_start_range": 19271200,
"batch_end_range": 19271294,
"data_size_bytes": 48230,
"reorgs": null,
"blocks_reorged": null
}
}
When a chain reorganization occurs, the affected blocks are re-delivered with updated data. The reorgs field contains the block number, hash, and timestamp of the displaced (orphaned) block, while data contains the new canonical block data.
HTTP Headers:
Stream-Id: f6ad6459-b5ad-4183-b370-1c1388e47e83
Stream-Name: stream test1
Stream-Region: usa_east
Stream-Network: ethereum-mainnet
Stream-Dataset: block
Stream-Start-Range: 100
Stream-End-Range: 200
Stream-Keep-Distance-From-Tip: 0
Batch-Start-Range: 19271293
Batch-End-Range: 19271294
Batch-Data-Size-Bytes: 12500
Batch-Reorgs: [{"block_number":19271293,"block_hash":"0x1a2b3c...","block_timestamp":"1700000000"},{"block_number":19271294,"block_hash":"0x4d5e6f...","block_timestamp":"1700000012"}]
Batch-Blocks-Reorged: [19271293,19271294]
Payload Body:
{
"data": [
// Re-delivered blocks with updated canonical data after the reorg
],
"metadata": {
"stream_id": "f6ad6459-b5ad-4183-b370-1c1388e47e83",
"stream_name": "stream test1",
"stream_region": "usa_east",
"network": "ethereum-mainnet",
"dataset": "block",
"start_range": 100,
"end_range": 200,
"keep_distance_from_tip": 0,
"batch_start_range": 19271293,
"batch_end_range": 19271294,
"data_size_bytes": 12500,
"reorgs": [
{
"block_number": 19271293,
"block_hash": "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b",
"block_timestamp": "1700000000"
},
{
"block_number": 19271294,
"block_hash": "0x4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e",
"block_timestamp": "1700000012"
}
],
"blocks_reorged": [19271293, 19271294]
}
}