Docs / Alerts and webhooks
Beamline examples
Each expression on this page was sent to POST /rules/validate on 2026-11-04 UTC and returned valid: true. Copy them and change the values. Valid means the rule parses. How often it matches depends on the data, so test before you save. Match counts are not listed here, because they change every minute and the store held less than an hour of rows at test time.
# Size
Purpose Rule At least $1m on any chain usd >= 1mSame, with an underscore form usd >= 1_000_000At least $2.5m usd >= 2.5mA band usd >= 100k and usd < 500kA very large move usd >= 1b
# Chains
Purpose Rule One chain chain == "ethereum"Two chains chain in ["base", "arbitrum"]Everything but Solana chain != "solana"Exclude sampled rows not sampledOnly sampled rows sampledExclude sampled rows, long form sampled == false
# Native assets
Purpose Rule Native rows only kind == "native"Token rows only kind == "token"Large ETH on Ethereum kind == "native" and chain == "ethereum" and usd >= 1mNative rows through the address field token_address == ""SOL on Solana (sampled) chain == "solana" and token == "SOL"
# Tokens
Purpose Rule One symbol token == "USDT"Large stablecoin moves token in ["USDC", "USDT", "DAI"] and usd >= 5mEverything that is not a USD token token not in ["USDC", "USDT", "DAI", "USDbC"]BTC wrappers token in ["WBTC", "cbBTC", "BTCB"]One contract token_address == "0xdAC17F958D2ee523a2206206994597C13D831ec7"By units of WETH amount >= 1000 and token == "WETH"By units of BTC wrappers amount >= 10 and token in ["WBTC", "cbBTC", "BTCB"]Stablecoins on two chains, with a floor (token == "USDC" or token == "USDT") and (chain == "base" or chain == "arbitrum") and usd >= 250kSingle quotes also work token == 'USDC' and chain == 'bnb'
# Labels
Purpose Rule To a labeled exchange to_type == "exchange"From a labeled exchange from_type == "exchange"Leaving exchanges, to a non-exchange from_type == "exchange" and to_type != "exchange"Reaching exchanges from elsewhere, large to_type == "exchange" and from_type != "exchange" and usd >= 1mBetween labeled exchanges, stablecoins token in ["USDC", "USDT"] and from_type == "exchange" and to_type == "exchange"From bridges or DEX contracts from_type in ["bridge", "dex"]One exchange group, as recipient to_label contains "binance"One exchange group, either side to_label contains "binance" or from_label contains "binance"By name prefix from_label startswith "Coinbase"Both sides labeled from_label != "" and to_label != ""Neither side labeled from_label == "" and to_label == ""
# Mints and burns
Purpose Rule Mints on indexed tokens from_label == "Null address"Burns on indexed tokens to_label == "Null address"
These read the label of the zero address, which is an EVM address. They do not apply on Solana.
# Addresses
Purpose Rule One address, either side from == "0x28C6c06298d514Db089934071355E5743bf21d60" or to == "0x28C6c06298d514Db089934071355E5743bf21d60"Address prefix to startswith "0x000000"One transaction, for testing tx == "0x2fd0a81d922a37e7401c511da3efadb5937439bcb0ff9c9c62b519db50f354fc"
An address rule still sees only rows of at least $100,000 in curated tokens. It is not a full wallet watch. See the wallet watch recipe .
# Liquidity
These rules run on liquidity samples and do not run on transfers. They returned valid: true from POST /rules/validate, with matched: 0, because that endpoint tests stored transfers only.
Intent Expression Liquidity fell by 30% or more change_pct <= -30A fall on a token with depth change_pct <= -30 and liquidity_usd >= 500kLiquidity rose by half change_pct >= 50Liquidity below a floor, one chain liquidity_usd < 100k and chain == "solana"One token token == "JUP" and change_pct <= -20
# Boolean logic
Purpose Rule Negate a group not (chain == "solana" or kind == "native") and usd >= 2mKeywords ignore case USD >= 1M AND TOKEN == "usdc"No spaces needed usd>=1m and(token=="USDC")Trailing comma in a list token in ["USDC",]Double negative not not sampledBlock floor on one chain block >= 26000000 and chain == "ethereum"
# Reading a validate response
Use the validate call to see which rows match. This response was captured on 2026-11-04 UTC, for to_type == "exchange" and usd >= 500k.
JSON Copy
{
"data" : {
"valid" : true ,
"tested" : 2000 ,
"matched" : 1 ,
"sample" : [
{
"id" : 1691 ,
"uid" : "ethereum:0 x440e4b8540c1b0f08013ffafc4de7bd0ae3571fc35cadc3090cc3a4d237a5369:346 " ,
"ts" : "2026-11-04T19:18 :11.000 Z" ,
"chain" : "ethereum" ,
"block" : 26343492 ,
"tx" : "0x440e4b8540c1b0f08013ffafc4de7bd0ae3571fc35cadc3090cc3a4d237a5369" ,
"kind" : "token" ,
"token" : "USDT" ,
"token_address" : "0xdAC17F958D2ee523a2206206994597C13D831ec7" ,
"amount" : 748621.3 ,
"usd" : 748178.1161904 ,
"from" : "0x26249a094ac4af105020793b6d3fc8240a6a9834" ,
"to" : "0xa9d1e08c7793af67e9d92fe308d5697fb81d3e43" ,
"sampled" : false ,
"from_label" : null ,
"from_type" : null ,
"to_label" : "Coinbase 10" ,
"to_type" : "exchange"
}
],
"fields" : ["chain", "token", "token_address", "kind", "from", "to", "from_label", "to_label", "from_type", "to_type", "tx", "usd", "amount", "block", "sampled"]
},
"meta" : {
"request_id" : "req_88b705d90583" ,
"as_of" : "2026-11-04T19:38 :28.603 Z"
}
}
Field Use testedRows read, up to the newest 2,000 matchedRows that matched among those sampleUp to 10 of the newest matches
matched divided by tested gives a rough rate. Compare it with the cap of 120 deliveries per rule per hour. If a rule matches too often, raise the usd floor.
# Common traps
Rule Problem Fix usd < 50kRows at this size are not stored Nothing to match. The floor is $100,000. chain == "polygon"No index on this chain Poll Wallet activity token == "USDC" or token == "USDT" and usd >= 1mand binds tighterAdd parentheses, or use in from_label not contains "x"not before contains is an errornot from_label contains "x"usd == 1000000Doubles rarely match exactly Use a range to_type == "exchange" meaning "selling"A transfer is not a trade Read transfers vs trades