Connect ClickHouse JS Client to Tinybird¶
The official ClickHouse JavaScript client can connect to Tinybird using the ClickHouse® HTTP protocol compatibility. This enables you to query your Tinybird data sources programmatically from Node.js applications with full type safety and modern JavaScript features.
The ClickHouse® connection to Tinybird is read-only. You can use it to query and analyze data from your Tinybird data sources, but you cannot modify data through this connection.
Prerequisites¶
- Node.js 16.0 or later
- A Tinybird workspace with data sources
- A Tinybird Auth Token with read permissions for the workspace data sources
Installation¶
Install the official ClickHouse JavaScript client:
npm install @clickhouse/client
Configuration¶
Create a client instance with the following configuration:
import { createClient } from '@clickhouse/client' const client = createClient({ url: 'https://clickhouse.tinybird.co', username: '<WORKSPACE_NAME>', // Optional, for identification password: '<TOKEN>', // Your Tinybird Auth Token })
See the list of ClickHouse hosts to find the correct one for your region.
Test the connection¶
Create a simple query to verify your connection:
async function testConnection() { try { const resultSet = await client.query({ query: 'SELECT database, name, engine FROM system.tables LIMIT 5', }) const data = await resultSet.json() console.table(data.data) } catch (error) { console.error('Connection failed:', error) } } testConnection()
Query your data¶
Once connected, you can query your Tinybird data sources:
// Query a specific data source async function queryDataSource() { const resultSet = await client.query({ query: 'SELECT * FROM your_data_source_name LIMIT 10', }) const data = await resultSet.json() return data.data } // Query with parameters async function queryWithParams() { const resultSet = await client.query({ query: ` SELECT timestamp, user_id, event_name FROM events WHERE timestamp >= {start_date:DateTime} LIMIT {limit:UInt32} `, query_params: { start_date: '2024-01-01 00:00:00', limit: 100, }, }) return await resultSet.json() }
Observability¶
You can also explore Tinybird's observability data from internal service data sources:
// View recent API endpoint usage and performance const recentUsage = await client.query({ query: ` SELECT start_datetime, pipe_name, duration, result_rows, read_bytes, status_code FROM tinybird.pipe_stats_rt WHERE start_datetime >= now() - INTERVAL 1 DAY ORDER BY start_datetime DESC LIMIT 10 ` }) // Analyze endpoint performance metrics const performanceMetrics = await client.query({ query: ` SELECT pipe_name, count() as request_count, avg(duration) as avg_duration_ms, avg(result_rows) as avg_result_rows, sum(read_bytes) as total_bytes_read FROM tinybird.pipe_stats_rt WHERE start_datetime >= now() - INTERVAL 1 HOUR GROUP BY pipe_name ORDER BY request_count DESC ` }) const usage = await recentUsage.json() const metrics = await performanceMetrics.json() console.table(usage.data) console.table(metrics.data)
Error handling¶
Handle connection and query errors appropriately:
import { ClickHouseError } from '@clickhouse/client' async function safeQuery(query) { try { const resultSet = await client.query({ query }) return await resultSet.json() } catch (error) { if (error instanceof ClickHouseError) { console.error('ClickHouse error:', error.message) console.error('Code:', error.code) } else { console.error('Connection error:', error.message) } throw error } }