Notifications: Filtering
Filter webhook notifications using conditions to receive only the events that matter to your application.
Conditions let you control which notifications reach your webhook. Instead of receiving every event on a monitored address, you define rules only events that satisfy all rules trigger a webhook delivery.
Conditions are available on v4 subscriptions only. Use the v4 REST API endpoint.
Quick Start
Add a conditions array inside the attr object when creating a subscription via POST /v4/subscription:
{
"type": "ADDRESS_EVENT",
"attr": {
"chain": "ethereum-mainnet",
"address": "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6",
"url": "https://your-app.com/webhook",
"conditions": [
{
"field": "value",
"operator": ">",
"value": "1000000000000000000"
}
]
}
}This subscription fires only when a transfer exceeds 1 ETH (1000000000000000000 wei).
Condition Structure
Each condition is an object with three properties:
| Property | Type | Description |
|---|---|---|
field | string | The webhook payload field to evaluate |
operator | string | The comparison operator |
value | string | The value to compare against (always a string) |
When multiple conditions are provided, all must match (AND logic). If any condition fails, the notification is not sent.
Available Fields
| Field | Description | Example Use Case |
|---|---|---|
value | Transfer amount in the chain's smallest unit (e.g. wei for ETH, lamports for SOL) | Only notify for transfers above a threshold |
contractAddress | Token contract address (ERC-20 / ERC-721 / ERC-1155) | Only notify for a specific token |
from | Sender address | Only notify when a specific wallet sends |
to | Receiver address | Only notify when a specific wallet receives |
tokenId | Token ID (ERC-721 / ERC-1155) | Track a specific NFT |
tokenMetadata.type | Token type — one of native, fungible, nft, multitoken | Only notify for NFT transfers |
tokenMetadata.symbol | Token symbol (e.g. USDT, WETH) | Only notify for a specific token symbol |
Available Operators
| Operator | Meaning |
|---|---|
> | Greater than |
>= | Greater than or equal to |
< | Less than |
<= | Less than or equal to |
== | Equal to |
!= | Not equal to |
Important: Thevaluefield uses the raw amount in the chain's smallest unit.
- 1 ETH =
"1000000000000000000"(18 decimals)- 1 USDT =
"1000000"(6 decimals)- 1 SOL =
"1000000000"(9 decimals)Always pass the value as a string, not a number.
Supported Subscription Types
Conditions work with all v4 address-based subscription types:
| Subscription Type | Description |
|---|---|
ADDRESS_EVENT | Any address-level event |
INCOMING_NATIVE_TX | Incoming native currency transfers |
OUTGOING_NATIVE_TX | Outgoing native currency transfers |
INCOMING_FUNGIBLE_TX | Incoming ERC-20 / token transfers |
OUTGOING_FUNGIBLE_TX | Outgoing ERC-20 / token transfers |
INCOMING_NFT_TX | Incoming NFT transfers |
OUTGOING_NFT_TX | Outgoing NFT transfers |
INCOMING_MULTITOKEN_TX | Incoming ERC-1155 transfers |
OUTGOING_MULTITOKEN_TX | Outgoing ERC-1155 transfers |
INCOMING_INTERNAL_TX | Incoming internal (trace) transfers |
OUTGOING_INTERNAL_TX | Outgoing internal (trace) transfers |
OUTGOING_FAILED_TX | Failed outgoing transactions |
PAID_FEE | Fee payments |
FAILED_TXS_PER_BLOCK | Failed transactions per block |
CONTRACT_ADDRESS_LOG_EVENT | Smart contract log events |
Examples
Filter by transfer amount
Only notify when a transfer exceeds 1 ETH:
{
"type": "ADDRESS_EVENT",
"attr": {
"chain": "ethereum-mainnet",
"address": "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6",
"url": "https://your-app.com/webhook",
"conditions": [
{
"field": "value",
"operator": ">",
"value": "1000000000000000000"
}
]
}
}Filter by token contract
Only notify for incoming USDT transfers:
{
"type": "INCOMING_FUNGIBLE_TX",
"attr": {
"chain": "ethereum-mainnet",
"address": "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6",
"url": "https://your-app.com/webhook",
"conditions": [
{
"field": "contractAddress",
"operator": "==",
"value": "0xdAC17F958D2ee523a2206206994597C13D831ec7"
}
]
}
}Filter by token type
Only notify for NFT transfers on a watched address:
{
"type": "ADDRESS_EVENT",
"attr": {
"chain": "ethereum-mainnet",
"address": "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6",
"url": "https://your-app.com/webhook",
"conditions": [
{
"field": "tokenMetadata.type",
"operator": "==",
"value": "nft"
}
]
}
}Filter by sender
Only notify when a specific wallet sends to your address:
{
"type": "INCOMING_NATIVE_TX",
"attr": {
"chain": "ethereum-mainnet",
"address": "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6",
"url": "https://your-app.com/webhook",
"conditions": [
{
"field": "from",
"operator": "==",
"value": "0x8ba1f109551bD432803012645Ac136Ddd64DBA72"
}
]
}
}Combine multiple conditions (AND logic)
Only notify for incoming USDT transfers above 1,000 USDT:
{
"type": "INCOMING_FUNGIBLE_TX",
"attr": {
"chain": "ethereum-mainnet",
"address": "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6",
"url": "https://your-app.com/webhook",
"conditions": [
{
"field": "contractAddress",
"operator": "==",
"value": "0xdAC17F958D2ee523a2206206994597C13D831ec7"
},
{
"field": "value",
"operator": ">=",
"value": "1000000000"
}
]
}
}
Both conditions must match. If the transfer is USDT but below 1,000 USDT, no notification is sent.
Updating Conditions
Update conditions on an existing subscription using PUT /v4/subscription/{id}:
{
"conditions": [
{
"field": "value",
"operator": ">=",
"value": "5000000000000000000"
}
]
}
Passing a newconditionsarray replaces all existing conditions. To remove all conditions, pass an empty array[].
Best Practices
- Use the most specific subscription type. Instead of
ADDRESS_EVENTwith atokenMetadata.type == "fungible"condition, preferINCOMING_FUNGIBLE_TXit's more efficient. - Combine conditions to reduce noise. Filter by both contract address and minimum amount to receive only high-value transfers for a specific token.
- Use raw units carefully. Always verify the token's decimal count before setting amount thresholds. A mistake in decimals can result in missed notifications or excessive alerts.
- Use different webhook URLs to monitor the same address with different filter configurations.
Updated about 3 hours ago