Skip to main content

Data Querying Solution

Access comprehensive blockchain data with NUVA Labs' powerful querying APIs. This solution covers everything from real-time data access to historical analysis and custom query building.

Overview

The Data Querying solution provides APIs for:

  • Real-time Data: Live blockchain data and market information
  • Historical Analysis: Access to historical blockchain data
  • Custom Queries: Build complex queries for specific use cases
  • Data Export: Export data for external analysis
  • Analytics: Built-in analytics and reporting tools

Key Features

📊 Real-time Data

  • Live blockchain status and metrics
  • Real-time market data and prices
  • Transaction monitoring and alerts
  • Network health and performance

📈 Historical Analysis

  • Historical price and volume data
  • Transaction history and patterns
  • Network growth and adoption metrics
  • Custom time range analysis

🔍 Advanced Querying

  • Custom query builder
  • Complex filtering and sorting
  • Aggregation and grouping
  • Export to multiple formats

📋 Analytics & Reporting

  • Built-in analytics dashboards
  • Custom report generation
  • Performance metrics
  • Compliance reporting

Quick Start

1. Get Real-time Data

import { NUClient } from '@nu/sdk';

const client = new NUClient({
clientId: process.env.NU_CLIENT_ID,
clientSecret: process.env.NU_CLIENT_SECRET,
environment: 'production',
});

await client.authenticate();

// Get current blockchain status
const status = await client.getBlockchainStatus();
console.log('Current block:', status.latestBlockHeight);

// Get market data
const marketData = await client.getMarketData('asset_1234567890');
console.log('Current price:', marketData.price);

2. Query Historical Data

// Get historical prices
const historicalData = await client.getHistoricalData('asset_1234567890', {
startDate: '2024-01-01',
endDate: '2024-01-31',
interval: '1d',
});

console.log('Historical data points:', historicalData.length);

3. Build Custom Query

// Custom query for large transactions
const largeTransactions = await client.query({
table: 'transactions',
filters: {
amount: { $gte: 1000000 },
date: { $gte: '2024-01-01' },
},
sort: { amount: -1 },
limit: 100,
});

console.log('Large transactions:', largeTransactions.length);

API Reference

Data Querying Endpoints

EndpointMethodDescription
/data/statusGETGet blockchain status
/data/marketGETGet market data
/data/historicalGETGet historical data
/data/queryPOSTExecute custom query
/data/exportPOSTExport data
/data/analyticsGETGet analytics

Real-time Data

Blockchain Status

const status = await client.getBlockchainStatus();
console.log('Network:', status.network);
console.log('Block height:', status.latestBlockHeight);
console.log('Chain ID:', status.chainId);
console.log('Node info:', status.nodeInfo);

Market Data

const marketData = await client.getMarketData('asset_1234567890');
console.log('Price:', marketData.price);
console.log('Volume:', marketData.volume);
console.log('Change 24h:', marketData.change24h);
console.log('Market cap:', marketData.marketCap);

Network Metrics

const metrics = await client.getNetworkMetrics();
console.log('Active validators:', metrics.activeValidators);
console.log('Total stake:', metrics.totalStake);
console.log('Network uptime:', metrics.uptime);

Historical Data

Price History

const priceHistory = await client.getHistoricalData('asset_1234567890', {
startDate: '2024-01-01',
endDate: '2024-01-31',
interval: '1h',
});

priceHistory.forEach((point) => {
console.log(`${point.timestamp}: $${point.price}`);
});

Transaction History

const txHistory = await client.getTransactionHistory({
accountId: 'acc_1234567890',
startDate: '2024-01-01',
endDate: '2024-01-31',
limit: 1000,
});

console.log('Transactions:', txHistory.length);

Volume Analysis

const volumeData = await client.getVolumeAnalysis('asset_1234567890', {
period: '30d',
groupBy: 'day',
});

volumeData.forEach((day) => {
console.log(`${day.date}: ${day.volume} volume`);
});

Custom Queries

Simple Query

const result = await client.query({
table: 'transactions',
filters: {
amount: { $gte: 1000 },
status: 'completed',
},
sort: { timestamp: -1 },
limit: 100,
});

Complex Query

const result = await client.query({
table: 'transactions',
filters: {
$and: [
{ amount: { $gte: 1000 } },
{ status: 'completed' },
{ timestamp: { $gte: '2024-01-01' } },
],
},
groupBy: ['assetId'],
aggregation: {
totalVolume: { $sum: 'amount' },
count: { $count: '*' },
},
sort: { totalVolume: -1 },
});

Aggregation Queries

const analytics = await client.query({
table: 'transactions',
filters: {
timestamp: { $gte: '2024-01-01' },
},
aggregation: {
totalVolume: { $sum: 'amount' },
averageAmount: { $avg: 'amount' },
maxAmount: { $max: 'amount' },
minAmount: { $min: 'amount' },
count: { $count: '*' },
},
});

Data Export

Export to CSV

const exportResult = await client.exportData({
query: {
table: 'transactions',
filters: {
timestamp: { $gte: '2024-01-01' },
},
},
format: 'csv',
filename: 'transactions_2024.csv',
});

console.log('Export URL:', exportResult.downloadUrl);

Export to JSON

const exportResult = await client.exportData({
query: {
table: 'market_data',
filters: {
assetId: 'asset_1234567890',
},
},
format: 'json',
filename: 'market_data.json',
});

Export to Excel

const exportResult = await client.exportData({
query: {
table: 'portfolio_performance',
filters: {
accountId: 'acc_1234567890',
},
},
format: 'excel',
filename: 'portfolio_performance.xlsx',
});

Analytics & Reporting

Built-in Analytics

const analytics = await client.getAnalytics('asset_1234567890', {
period: '30d',
metrics: ['price', 'volume', 'transactions'],
});

console.log('Price trend:', analytics.priceTrend);
console.log('Volume trend:', analytics.volumeTrend);
console.log('Transaction count:', analytics.transactionCount);

Custom Reports

const report = await client.generateReport({
type: 'portfolio_performance',
accountId: 'acc_1234567890',
period: '30d',
format: 'pdf',
});

console.log('Report URL:', report.downloadUrl);

Performance Metrics

const performance = await client.getPerformanceMetrics('acc_1234567890', {
period: '30d',
includeFees: true,
});

console.log('Total return:', performance.totalReturn);
console.log('Sharpe ratio:', performance.sharpeRatio);
console.log('Max drawdown:', performance.maxDrawdown);

Real-time Updates

WebSocket Connection

const ws = client.createWebSocket();

ws.on('blockUpdate', (block) => {
console.log('New block:', block.height);
});

ws.on('priceUpdate', (price) => {
console.log('Price update:', price.assetId, price.price);
});

ws.on('transactionUpdate', (tx) => {
console.log('New transaction:', tx.id);
});

Event Subscriptions

// Subscribe to price updates
await client.subscribeToPriceUpdates('asset_1234567890');

// Subscribe to transaction updates
await client.subscribeToTransactions('acc_1234567890');

// Subscribe to block updates
await client.subscribeToBlocks();

Use Cases

1. Trading Dashboard

class TradingDashboard {
constructor(client) {
this.client = client;
}

async getDashboardData(assetId) {
const [marketData, historicalData, analytics] = await Promise.all([
this.client.getMarketData(assetId),
this.client.getHistoricalData(assetId, { period: '7d' }),
this.client.getAnalytics(assetId, { period: '7d' }),
]);

return {
currentPrice: marketData.price,
priceChange: marketData.change24h,
volume: marketData.volume,
historicalData,
analytics,
};
}
}

2. Portfolio Analyzer

class PortfolioAnalyzer {
constructor(client) {
this.client = client;
}

async analyzePortfolio(accountId) {
const [portfolio, performance, transactions] = await Promise.all([
this.client.getPortfolio(accountId),
this.client.getPerformanceMetrics(accountId, { period: '30d' }),
this.client.getTransactionHistory({ accountId, limit: 1000 }),
]);

return {
totalValue: portfolio.totalValue,
performance,
transactionCount: transactions.length,
topAssets: portfolio.positions
.sort((a, b) => b.value - a.value)
.slice(0, 5),
};
}
}

3. Market Research Tool

class MarketResearchTool {
constructor(client) {
this.client = client;
}

async researchAsset(assetId) {
const [marketData, historicalData, analytics, transactions] =
await Promise.all([
this.client.getMarketData(assetId),
this.client.getHistoricalData(assetId, { period: '90d' }),
this.client.getAnalytics(assetId, { period: '90d' }),
this.client.query({
table: 'transactions',
filters: { assetId },
limit: 1000,
}),
]);

return {
marketData,
historicalData,
analytics,
transactionCount: transactions.length,
averageTransactionSize:
transactions.reduce((sum, tx) => sum + tx.amount, 0) /
transactions.length,
};
}
}

Best Practices

1. Query Optimization

  • Use appropriate filters to limit results
  • Implement pagination for large datasets
  • Cache frequently accessed data
  • Use aggregation for summary data

2. Real-time Updates

  • Use WebSocket for real-time data
  • Implement proper error handling
  • Handle connection drops gracefully
  • Monitor subscription limits

3. Data Export

  • Use appropriate formats for your use case
  • Implement proper error handling
  • Monitor export limits
  • Clean up temporary files

4. Performance

  • Use batch operations when possible
  • Implement proper caching
  • Monitor API usage
  • Use compression for large datasets

Error Handling

Common Errors

try {
const data = await client.getHistoricalData('asset_1234567890');
} catch (error) {
switch (error.code) {
case 'INVALID_DATE_RANGE':
console.error('Invalid date range provided');
break;
case 'RATE_LIMITED':
console.error('Rate limited, please wait');
break;
case 'INSUFFICIENT_DATA':
console.error('Insufficient data for requested period');
break;
case 'QUERY_TIMEOUT':
console.error('Query timeout, try with smaller date range');
break;
default:
console.error('Unexpected error:', error.message);
}
}

Integration Examples

React Data Dashboard

import React, { useState, useEffect } from 'react';
import { NUClient } from '@nu/sdk';

function DataDashboard() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);

useEffect(() => {
const client = new NUClient({
clientId: process.env.REACT_APP_NU_CLIENT_ID,
clientSecret: process.env.REACT_APP_NU_CLIENT_SECRET,
environment: 'production',
});

const loadData = async () => {
try {
await client.authenticate();
const [status, marketData] = await Promise.all([
client.getBlockchainStatus(),
client.getMarketData('asset_1234567890'),
]);
setData({ status, marketData });
} catch (error) {
console.error('Failed to load data:', error);
} finally {
setLoading(false);
}
};

loadData();
}, []);

if (loading) return <div>Loading data...</div>;

return (
<div>
<h2>Data Dashboard</h2>
<div>
<h3>Blockchain Status</h3>
<p>Block Height: {data?.status.latestBlockHeight}</p>
<p>Network: {data?.status.network}</p>
</div>
<div>
<h3>Market Data</h3>
<p>Price: ${data?.marketData.price}</p>
<p>Volume: {data?.marketData.volume}</p>
</div>
</div>
);
}

Next Steps


Ready to start building? Let's explore Blockchain Integration for direct blockchain access!