Farbeam
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

PurposeRule
At least $1m on any chainusd >= 1m
Same, with an underscore formusd >= 1_000_000
At least $2.5musd >= 2.5m
A bandusd >= 100k and usd < 500k
A very large moveusd >= 1b

#Chains

PurposeRule
One chainchain == "ethereum"
Two chainschain in ["base", "arbitrum"]
Everything but Solanachain != "solana"
Exclude sampled rowsnot sampled
Only sampled rowssampled
Exclude sampled rows, long formsampled == false

#Native assets

PurposeRule
Native rows onlykind == "native"
Token rows onlykind == "token"
Large ETH on Ethereumkind == "native" and chain == "ethereum" and usd >= 1m
Native rows through the address fieldtoken_address == ""
SOL on Solana (sampled)chain == "solana" and token == "SOL"

#Tokens

PurposeRule
One symboltoken == "USDT"
Large stablecoin movestoken in ["USDC", "USDT", "DAI"] and usd >= 5m
Everything that is not a USD tokentoken not in ["USDC", "USDT", "DAI", "USDbC"]
BTC wrapperstoken in ["WBTC", "cbBTC", "BTCB"]
One contracttoken_address == "0xdAC17F958D2ee523a2206206994597C13D831ec7"
By units of WETHamount >= 1000 and token == "WETH"
By units of BTC wrappersamount >= 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 >= 250k
Single quotes also worktoken == 'USDC' and chain == 'bnb'

#Labels

PurposeRule
To a labeled exchangeto_type == "exchange"
From a labeled exchangefrom_type == "exchange"
Leaving exchanges, to a non-exchangefrom_type == "exchange" and to_type != "exchange"
Reaching exchanges from elsewhere, largeto_type == "exchange" and from_type != "exchange" and usd >= 1m
Between labeled exchanges, stablecoinstoken in ["USDC", "USDT"] and from_type == "exchange" and to_type == "exchange"
From bridges or DEX contractsfrom_type in ["bridge", "dex"]
One exchange group, as recipientto_label contains "binance"
One exchange group, either sideto_label contains "binance" or from_label contains "binance"
By name prefixfrom_label startswith "Coinbase"
Both sides labeledfrom_label != "" and to_label != ""
Neither side labeledfrom_label == "" and to_label == ""

#Mints and burns

PurposeRule
Mints on indexed tokensfrom_label == "Null address"
Burns on indexed tokensto_label == "Null address"

These read the label of the zero address, which is an EVM address. They do not apply on Solana.

#Addresses

PurposeRule
One address, either sidefrom == "0x28C6c06298d514Db089934071355E5743bf21d60" or to == "0x28C6c06298d514Db089934071355E5743bf21d60"
Address prefixto startswith "0x000000"
One transaction, for testingtx == "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.

IntentExpression
Liquidity fell by 30% or morechange_pct <= -30
A fall on a token with depthchange_pct <= -30 and liquidity_usd >= 500k
Liquidity rose by halfchange_pct >= 50
Liquidity below a floor, one chainliquidity_usd < 100k and chain == "solana"
One tokentoken == "JUP" and change_pct <= -20

#Boolean logic

PurposeRule
Negate a groupnot (chain == "solana" or kind == "native") and usd >= 2m
Keywords ignore caseUSD >= 1M AND TOKEN == "usdc"
No spaces neededusd>=1m and(token=="USDC")
Trailing comma in a listtoken in ["USDC",]
Double negativenot not sampled
Block floor on one chainblock >= 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
{
  "data": {
    "valid": true,
    "tested": 2000,
    "matched": 1,
    "sample": [
      {
        "id": 1691,
        "uid": "ethereum:0x440e4b8540c1b0f08013ffafc4de7bd0ae3571fc35cadc3090cc3a4d237a5369:346",
        "ts": "2026-11-04T19:18:11.000Z",
        "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.603Z"
  }
}
FieldUse
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

RuleProblemFix
usd < 50kRows at this size are not storedNothing to match. The floor is $100,000.
chain == "polygon"No index on this chainPoll 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 exactlyUse a range
to_type == "exchange" meaning "selling"A transfer is not a tradeRead transfers vs trades