> ## 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
Query {useCasesConfig.map(uc => { const active = uc.id === useCase; return ; })}
{loading ?
Streaming from Portal...
: viewMode === "code" ?
{generateCurlCommand(useCasesConfig.find(uc => uc.id === useCase)).trim().split('\n').map((line, i) =>
{i + 1} {line.includes('curl') || line.match(/^\s*-[XHd]/) ? : }
)}
: response ?
{response.trim().split('\n').map((line, i) =>
{i + 1}
)}
: error ?
Error: {error}
:
Hit Run to stream live data from Portal
}
{NETWORK_LABELS[useCase]} {useCasesConfig.find(uc => uc.id === useCase)?.network + "/stream"}
{useCasesConfig.find(uc => uc.id === useCase)?.name}
; };

SQD Documentation

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.

Query with Portal Build with the SDK

Live queries against the public Portal, shared capacity for development and evaluation. Follow the Portal quickstart to run your own.

Products

HTTP API for raw blockchain data with arbitrary ranges, streaming, and finality handling TypeScript libraries for decoding, transforming, and persisting data to any database Managed indexer hosting with monitoring, scaling, and zero DevOps Decentralized data lake behind Portal, with self-hosting options

Get started

Extract data in minutes with plain HTTP requests, no setup required Create a type-safe indexer and stream data to your own database Ship your indexer to SQD Cloud with managed infrastructure and monitoring Use MCP servers, agent skills, and LLM-optimized docs to build with agents Every Portal endpoint, with request and response schemas and a live playground The machine-readable Portal API description, for agents and code generators

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.

## Related topics - [Network, Portal and SDK FAQ](/en/other/faq.md) - [Portal: Blockchain Data API](/en/portal/overview.md) - [SQD Network](/en/network/overview.md) - [External APIs and IPFS](/en/sdk/squid-sdk/substrate/guides/advanced/external-apis-ipfs.md) - [SQD Connector for Claude](/en/ai/claude-connector.md) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.