curl --request POST \
--url https://api.sim.dune.com/beta/evm/subscriptions/webhooks \
--header 'Content-Type: application/json' \
--header 'X-Sim-Api-Key: <api-key>' \
--data '
{
"name": "USDC Balance Monitor",
"url": "https://example.com/webhooks/usdc-balances",
"type": "balances",
"addresses": [
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
],
"chain_ids": [
1,
8453
],
"asset_type": "erc20",
"token_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}
'const options = {
method: 'POST',
headers: {'X-Sim-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'USDC Balance Monitor',
url: 'https://example.com/webhooks/usdc-balances',
type: 'balances',
addresses: ['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'],
chain_ids: [1, 8453],
asset_type: 'erc20',
token_address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
})
};
fetch('https://api.sim.dune.com/beta/evm/subscriptions/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sim.dune.com/beta/evm/subscriptions/webhooks"
payload = {
"name": "USDC Balance Monitor",
"url": "https://example.com/webhooks/usdc-balances",
"type": "balances",
"addresses": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"],
"chain_ids": [1, 8453],
"asset_type": "erc20",
"token_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}
headers = {
"X-Sim-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "019a81c2-d84b-7141-85e8-86b072a59142",
"team_id": "01K7RVMRT0BXQ9DRC8BK87MK39",
"name": "Balance Changes Tracker",
"type": "balances",
"url": "https://example.com/webhooks/balances",
"active": true,
"created_at": "2025-11-14T09:47:01.580104Z",
"updated_at": "2025-11-14T09:47:01.580104Z",
"chain_ids": [
1,
8453,
84532
]
}Failed to deserialize the JSON body into the target type: missing field `name` at line 1 column 2{
"error": "Too many requests. Please contact sales@dune.com to increase your limit."
}Create Webhook
Create a new webhook subscription to receive realtime onchain data.
curl --request POST \
--url https://api.sim.dune.com/beta/evm/subscriptions/webhooks \
--header 'Content-Type: application/json' \
--header 'X-Sim-Api-Key: <api-key>' \
--data '
{
"name": "USDC Balance Monitor",
"url": "https://example.com/webhooks/usdc-balances",
"type": "balances",
"addresses": [
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
],
"chain_ids": [
1,
8453
],
"asset_type": "erc20",
"token_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}
'const options = {
method: 'POST',
headers: {'X-Sim-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'USDC Balance Monitor',
url: 'https://example.com/webhooks/usdc-balances',
type: 'balances',
addresses: ['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'],
chain_ids: [1, 8453],
asset_type: 'erc20',
token_address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
})
};
fetch('https://api.sim.dune.com/beta/evm/subscriptions/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sim.dune.com/beta/evm/subscriptions/webhooks"
payload = {
"name": "USDC Balance Monitor",
"url": "https://example.com/webhooks/usdc-balances",
"type": "balances",
"addresses": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"],
"chain_ids": [1, 8453],
"asset_type": "erc20",
"token_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}
headers = {
"X-Sim-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "019a81c2-d84b-7141-85e8-86b072a59142",
"team_id": "01K7RVMRT0BXQ9DRC8BK87MK39",
"name": "Balance Changes Tracker",
"type": "balances",
"url": "https://example.com/webhooks/balances",
"active": true,
"created_at": "2025-11-14T09:47:01.580104Z",
"updated_at": "2025-11-14T09:47:01.580104Z",
"chain_ids": [
1,
8453,
84532
]
}Failed to deserialize the JSON body into the target type: missing field `name` at line 1 column 2{
"error": "Too many requests. Please contact sales@dune.com to increase your limit."
}- name: A descriptive name for your webhook
- url: The endpoint where webhook payloads will be sent
- type: The type of events to subscribe to (
transactions,activities, orbalances) - addresses: An array of wallet addresses to monitor
Optional Filters
You can narrow down the events you receive by adding optional filters:- chain_ids: Monitor only specific chains (e.g.,
[1, 8453]for Ethereum and Base) - transaction_type: For transaction webhooks, filter by
senderorreceiver - counterparty: Filter transactions by counterparty address
- activity_type: For activity webhooks, filter by specific types (
send,receive,swap, etc.) - asset_type: Filter by asset type (
native,erc20,erc721,erc1155) - token_address: Monitor only a specific token contract
Example Use Cases
Monitor USDC Balance Changes
{
"name": "USDC Balance Monitor",
"url": "https://example.com/webhooks/usdc",
"type": "balances",
"addresses": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"],
"chain_ids": [1, 8453],
"asset_type": "erc20",
"token_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}
Track All Incoming Transactions
{
"name": "Incoming Transactions",
"url": "https://example.com/webhooks/txns",
"type": "transactions",
"addresses": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"],
"transaction_type": "receiver"
}
Monitor Swap Activities
{
"name": "Swap Monitor",
"url": "https://example.com/webhooks/swaps",
"type": "activities",
"addresses": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"],
"activity_type": "swap"
}
Authorizations
API key for authentication. Obtain your key from the Dune dashboard at sim.dune.com.
Body
A descriptive name for the webhook.
The URL where webhook payloads will be sent.
The type of onchain event to subscribe to.
transactions, activities, balances List of addresses to monitor.
EVM address.
Filter events to specific chain IDs. If omitted, all supported chains are included.
ONLY for 'transactions' type webhooks. Filter by sender or receiver. Cannot be used with other webhook types.
sender, receiver ONLY for 'transactions' type webhooks. Filter transactions by counterparty address.
ONLY for 'activities' type webhooks. Filter by specific activity type. Cannot be used with other webhook types.
approve, mint, burn, receive, send, swap, call Filter by asset type.
native, erc20, erc721, erc1155 Filter events to a specific token address.
Response
Webhook created successfully.
The unique identifier for the webhook.
The team ID that owns this webhook.
A descriptive name for the webhook.
The type of onchain event to subscribe to.
transactions, activities, balances The URL where webhook payloads will be sent.
Whether the webhook is currently active.
When the webhook was created.
When the webhook was last updated.
Filter events to specific chain IDs. If null, all supported chains are included.
For transaction webhooks, filter by sender or receiver.
sender, receiver Filter transactions by counterparty address.
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
For activity webhooks, filter by specific activity type.
approve, mint, burn, receive, send, swap, call Filter by asset type.
native, erc20, erc721, erc1155 Filter events to a specific token address.
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
Was this page helpful?