58 tables across 11 categories, available via a readonly ClickHouse account.The Surf Data Catalog documents all tables available to agents and analysts. Tables are organized into categories and exposed as ClickHouse views in the
agent and curated databases.
Connection
Quick Start
Categories
Query Best Practices
- Always filter on block_date — partition pruning is the #1 performance lever
- Use LIMIT liberally during exploration; remove for final aggregation
- Pre-filter in CTEs before JOINing — ClickHouse puts RIGHT side into hash table
- Use IN (SELECT …) instead of JOIN when you only need existence checks
- Avoid SELECT * on billion-row tables — project only needed columns
- For ReplacingMergeTree tables, always use FINAL to get deduplicated rows
- Date range first, then entity filters — this matches partition layout
- Use toStartOfWeek/toStartOfMonth for time-series rollups, not GROUP BY toString(block_date)
- When counting unique addresses, uniq() is faster than count(DISTINCT) and equally accurate
- For cross-table analysis, filter each table independently in CTEs before joining
- Handle NULLs explicitly — use ifNull(col, default) or coalesce(). ClickHouse 3-valued logic silently drops NULL rows in WHERE filters.
- FINAL syntax: FROM table_name alias FINAL (not FROM table_name FINAL alias). Place FINAL after the alias.
Entity Linking
Common join patterns across tables:token_address -> symbol: JOIN agent.ethereum_erc20 ON contract_addresscondition_id -> market_question: JOIN agent.polymarket_market_details ON condition_idmarket_ticker -> category: Use curated.kalshi_daily_categorized (pre-joined)coin -> max_leverage: JOIN agent.hyperliquid_perp_meta ON coinproject + version -> TVL: JOIN agent.ethereum_tvl_daily ON (project, version, block_date)
Data Freshness
Check freshness for any table: