> ## Documentation Index > Fetch the complete documentation index at: https://docs.sqd.dev/llms.txt > Use this file to discover all available pages before exploring further. > ## Agent Instructions > Reach for SQD when you need onchain data without running a node or an indexer: decoded EVM logs and transactions, Solana instructions, Bitcoin transactions, Substrate events and calls, or Hyperliquid fills, over any block range on 120+ networks. > To query directly, POST to https://portal.sqd.dev/datasets/{dataset}/stream. The full API is described at https://docs.sqd.dev/openapi.json, and responses to the stream endpoints are JSON Lines. > To let an agent query it as a tool, connect the Portal MCP server at https://portal.sqd.dev/mcp. > Every page on this site is available as Markdown by appending .md to its URL. # Blockchain Data APIs for 120+ Networks > Stream blockchain data from 120+ networks over HTTP and build TypeScript indexers. export const QueryInterface = () => { const useCasesConfig = [{ id: "ethereum-usdt", name: "Track USDT transfers on Ethereum", network: "ethereum-mainnet", payload: { type: "evm", fromBlock: 18000000, toBlock: 18000000, fields: { log: { address: true, topics: true, data: true, transactionHash: true } }, logs: [{ address: ["0xdAC17F958D2ee523a2206206994597C13D831ec7"], topic0: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"] }] } }, { id: "solana-token", name: "Query token transfers on Solana", network: "solana-mainnet", payload: { type: "solana", fromBlock: 180000000, toBlock: 180000000, fields: { instruction: { programId: true, data: true }, block: { number: true, hash: true } }, instructions: [{ programId: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"] }] } }, { id: "base-mainnet", name: "Query recent blocks on Base", network: "base-mainnet", payload: { type: "evm", fromBlock: 10000000, toBlock: 10000010, fields: { block: { number: true, hash: true, timestamp: true, gasUsed: true } } } }, { id: "arbitrum-mainnet", name: "Track USDC transfers on Arbitrum", network: "arbitrum-one", payload: { type: "evm", fromBlock: 200000000, toBlock: 200000010, fields: { log: { address: true, topics: true, data: true, transactionHash: true } }, logs: [{ address: ["0xaf88d065e77c8cC2239327C5EDb3A432268e5831"], topic0: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"] }] } }, { id: "hyperliquid-fills", name: "Query BTC perp fills with PnL on Hyperliquid", network: "hyperliquid-fills", payload: { type: "hyperliquidFills", fromBlock: 900000000, toBlock: 900000030, fields: { block: { number: true, timestamp: true }, fill: { user: true, coin: true, px: true, sz: true, side: true, dir: true, closedPnl: true, fee: true } }, fills: [{ coin: ["BTC"] }] } }, { id: "tron-usdt", name: "Track USDT (TRC-20) transfers on Tron", network: "tron-mainnet", payload: { type: "tron", fromBlock: 79257136, toBlock: 79257136, fields: { block: { number: true, timestamp: true }, log: { address: true, topics: true, data: true } }, logs: [{ address: ["a614f803b6fd780986a42c78ec9c7f77e6ded13c"], topic0: ["ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"] }] } }, { id: "bitcoin-txns", name: "Query transactions on Bitcoin", network: "bitcoin-mainnet", payload: { type: "bitcoin", fromBlock: 250000, toBlock: 250000, fields: { block: { number: true, hash: true, timestamp: true }, transaction: { txid: true, size: true, weight: true } }, transactions: [{}] } }]; const [useCase, setUseCase] = useState("ethereum-usdt"); const [response, setResponse] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [viewMode, setViewMode] = useState("code"); const [copied, setCopied] = useState(false); const generateCurlCommand = config => { const url = `https://portal.sqd.dev/datasets/${config.network}/stream`; const payload = JSON.stringify(config.payload, null, 2); return `curl --compressed -X POST '${url}' \\\n -H 'Content-Type: application/json' \\\n -d '${payload}'`; }; useEffect(() => { setViewMode("code"); setResponse(""); setError(null); }, [useCase]); const handleRun = async () => { const selectedUseCase = useCasesConfig.find(uc => uc.id === useCase); if (!selectedUseCase) return; setViewMode("output"); setLoading(true); setError(null); setResponse(''); try { const url = `https://portal.sqd.dev/datasets/${selectedUseCase.network}/stream`; const doFetch = () => fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(selectedUseCase.payload) }); let response = await doFetch(); for (const retryDelay of [700, 1500, 3000]) { if (response.status < 500) break; await new Promise(resolve => setTimeout(resolve, retryDelay)); response = await doFetch(); } if (response.status === 503) { throw new Error('Portal is busy right now. Wait a few seconds and run the query again.'); } if (!response.ok) { throw new Error(`API request failed: ${response.status} ${response.statusText}`); } const text = await response.text(); if (text.trim()) { const lines = text.trim().split('\n'); const parsedData = lines.map((line, index) => { try { return JSON.parse(line); } catch (e) { return { error: `Failed to parse line ${index + 1}`, raw: line }; } }); const formattedOutput = parsedData.map(obj => JSON.stringify(obj, null, 2)).join('\n\n'); setResponse(formattedOutput); } else { setResponse('No data returned from API'); } } catch (err) { setError(err.message || 'An error occurred while fetching data'); setResponse(''); } finally { setLoading(false); } }; const NETWORK_LABELS = { "ethereum-usdt": "Ethereum", "solana-token": "Solana", "base-mainnet": "Base", "arbitrum-mainnet": "Arbitrum", "hyperliquid-fills": "Hyperliquid", "tron-usdt": "Tron", "bitcoin-txns": "Bitcoin" }; const NETWORK_LOGOS = { "ethereum-usdt": "/images/chains/eth.png", "solana-token": "/images/chains/sol.png", "base-mainnet": "/images/chains/base.png", "arbitrum-mainnet": "/images/chains/arb.png", "hyperliquid-fills": "/images/chains/hl.jpg", "tron-usdt": "/images/chains/tron.png", "bitcoin-txns": "/images/chains/btc.png" }; const NetworkLogo = ({id}) => { const src = NETWORK_LOGOS[id]; if (!src) return null; return ; }; const CurlTok = ({s}) => <> {s.split(/('[^']*')/).map((seg, i) => (/^'[^']*'$/).test(seg) ? {seg} : seg.split(/(curl|--compressed|-X POST|-H|-d)/).map((t2, j) => t2 === "curl" ? {t2} : (/^(--compressed|-X POST|-H|-d)$/).test(t2) ? {t2} : {t2}))} >; const JsonTok = ({s}) => <> {s.split(/("[^"]+"\s*:)/).map((seg, i) => (/^"[^"]+"\s*:$/).test(seg) ? {seg} : seg.split(/("[^"]*")/).map((s2, j) => (/^"[^"]*"$/).test(s2) ? {s2} : s2.split(/\b(true|false|null|-?\d+\.?\d*)\b/).map((s3, k) => (/^(true|false|null)$/).test(s3) ? {s3} : (/^-?\d+\.?\d*$/).test(s3) ? {s3} : {s3})))} >; return
Stream onchain data from 120+ networks through the Portal HTTP API. Build indexers with the Squid and Pipes TypeScript SDKs and deploy them on SQD Cloud.
Live queries against the public Portal, shared capacity for development and evaluation. Follow the Portal quickstart to run your own.
Portal serves 120+ networks including Ethereum, Solana, Base, Arbitrum, Bitcoin, and Hyperliquid.
Every endpoint is in the API reference and described by an OpenAPI specification that agents and code generators can read directly.
Questions? Read the FAQ, browse customer stories, or join our Telegram.