multiAI Summary Pending
dune
Execute and query Dune Analytics dashboards for on-chain data and custom SQL analytics.
272 stars
Installation
Claude Code / Cursor / Codex
$curl -o ~/.claude/skills/dune/SKILL.md --create-dirs "https://raw.githubusercontent.com/TermiX-official/cryptoclaw/main/skills/dune/SKILL.md"
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/dune/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How dune Compares
| Feature / Agent | dune | Standard Approach |
|---|---|---|
| Platform Support | multi | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Execute and query Dune Analytics dashboards for on-chain data and custom SQL analytics.
Which AI agents support this skill?
This skill is compatible with multi.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Dune Analytics API
Execute SQL queries on blockchain data, fetch dashboard results, and access curated datasets via the Dune API.
## Base URL
```
https://api.dune.com/api/v1
```
Requires API key: set `DUNE_API_KEY`. Free tier available at https://dune.com/settings/api
Pass via header: `X-Dune-API-Key: {key}`
## Core Workflow
### 1. Execute a Query
```
POST /query/{query_id}/execute
```
Body (optional filters):
```json
{
"query_parameters": {
"wallet_address": "0x...",
"token_address": "0x..."
}
}
```
Returns `execution_id` for polling.
### 2. Check Execution Status
```
GET /execution/{execution_id}/status
```
States: `QUERY_STATE_PENDING`, `QUERY_STATE_EXECUTING`, `QUERY_STATE_COMPLETED`, `QUERY_STATE_FAILED`
Poll every 2-3 seconds until completed.
### 3. Get Results
```
GET /execution/{execution_id}/results
```
Returns rows as JSON with column metadata. Use `?limit=100&offset=0` for pagination.
### Shortcut: Get Latest Results
```
GET /query/{query_id}/results
```
Returns cached results from the last execution without re-running. Fast and free of execution credits.
## Useful Public Query IDs
| Query ID | Description |
| --------- | --------------------------------- |
| `3237721` | Top DEX traders by volume (7d) |
| `3105506` | Whale token transfers (24h) |
| `2030664` | Stablecoin flows by chain |
| `1847958` | NFT marketplace volume comparison |
| `3532352` | Bridge volume across chains |
| `2474310` | Gas spent by protocol (Ethereum) |
Note: Public query IDs may change or become unavailable. Verify before relying on them.
## Writing Custom Queries
### Create a Query
```
POST /query
```
Body:
```json
{
"name": "My Query",
"query_sql": "SELECT * FROM ethereum.transactions WHERE \"from\" = {{wallet_address}} ORDER BY block_time DESC LIMIT 100",
"is_private": false
}
```
### Key Tables
| Table | Chain | Description |
| ----------------------------- | -------- | ---------------------- |
| `ethereum.transactions` | ETH | All transactions |
| `bnb.transactions` | BSC | BSC transactions |
| `polygon.transactions` | Polygon | Polygon transactions |
| `arbitrum.transactions` | Arbitrum | Arbitrum transactions |
| `erc20_ethereum.evt_Transfer` | ETH | ERC-20 transfer events |
| `erc20_bnb.evt_Transfer` | BSC | BEP-20 transfer events |
| `dex.trades` | Multi | Aggregated DEX trades |
| `nft.trades` | Multi | Aggregated NFT trades |
| `prices.usd` | Multi | Token prices (hourly) |
| `tokens.erc20` | Multi | Token metadata |
### DuneSQL Syntax Notes
- DuneSQL is based on Trino (Presto fork)
- Use double quotes for column names with special chars: `"from"`, `"to"`
- Byte arrays (addresses): `0x` prefix works, use `LOWER()` for case-insensitive matching
- Timestamps: `block_time` is TIMESTAMP type, use `NOW() - INTERVAL '7' DAY` for ranges
- Aggregations: standard SQL — `SUM()`, `COUNT()`, `AVG()`, `GROUP BY`
- Use `LIMIT` always — avoid unbounded queries
### Example Custom Queries
Wallet transaction count (last 30 days):
```sql
SELECT COUNT(*) as tx_count, SUM(value / 1e18) as total_eth
FROM ethereum.transactions
WHERE "from" = {{wallet_address}}
AND block_time > NOW() - INTERVAL '30' DAY
```
Top tokens by transfer volume (24h):
```sql
SELECT t.symbol, COUNT(*) as transfers, SUM(evt.value / POW(10, t.decimals)) as volume
FROM erc20_ethereum.evt_Transfer evt
JOIN tokens.erc20 t ON t.contract_address = evt.contract_address AND t.blockchain = 'ethereum'
WHERE evt.evt_block_time > NOW() - INTERVAL '1' DAY
GROUP BY t.symbol
ORDER BY transfers DESC
LIMIT 20
```
## API Limits (Free Tier)
- 10 query executions per day (re-execute)
- 250 datapoints per result
- Cached results (`/query/{id}/results`) do not count against execution limits
- Prefer cached results when freshness is not critical
## Usage Notes
- **Prefer cached results** (`GET /query/{id}/results`) over re-executing queries to conserve credits
- For wallet-specific analysis, pass the address as a `query_parameter` rather than hardcoding
- Always use `LIMIT` in custom SQL to avoid timeouts and large payloads
- Combine with `debank` for real-time portfolio data and `defillama` for protocol-level TVL
- When building custom queries, test with small limits first
- Present results in tables or summaries — raw Dune output can be verbose
## Example Interactions
User: "Show top DEX traders this week"
→ Fetch cached results from query 3237721, present top 10 by volume
User: "How many transactions has my wallet done?"
→ Execute custom query with wallet_address parameter, report count and total value
User: "What are the biggest token transfers today?"
→ Fetch cached whale transfer query, present top movers
User: "Write a query to find all USDT transfers over $100k on BSC"
→ Create custom SQL on `erc20_bnb.evt_Transfer`, filter by USDT address and amount threshold