Farbeam

Community alert bots

A community that wants a feed of large transfers in a Discord channel can point a rule at a Discord webhook, with no server of its own. Telegram delivery is Early access, and it reaches one linked private chat only. A Telegram group or channel needs a small relay of its own today.

#Workflow

  1. In Discord, create a webhook in the target channel, and copy its URL.
  2. Write the rule in the rule tester. Start with a high threshold, because of the hourly cap.
  3. Sign in to the console with a Solana wallet, then save the rule with delivery Discord webhook and the Discord URL. Set the cooldown. The default of 300 seconds limits the feed to 12 messages per hour, and matches in between are dropped.
  4. Send a test delivery, and check that the message appears.
  5. Check the delivery log after a day. Lots of failed rows mean something is wrong with the webhook.

#Rules

Tested with POST /rules/validate at 2026-11-04T19:21:20Z against the newest 1,948 stored rows, about 18 minutes of data. The rate can change quickly.

RuleFeedMatches
usd >= 5m and token in ["USDC","USDT"]Large stablecoin moves on all indexed chains18
chain == "base" and usd >= 1m and kind == "token"One chain community4
chain == "ethereum" and kind == "native" and usd >= 1mLarge native ETH7

A low threshold on Base spends the cooldown on small transfers, and it would drop larger ones that follow. chain == "base" and usd >= 250k matched 487 of the same rows.

#Real message

The server builds this Discord body. The event is a real transfer stored at 2026-11-04T19:19:59Z. The rule name is an example.

JSON
{
  "content": "**Large stablecoin moves**: $20,093,930 USDC on Ethereum from 0xa73b…58af to 0x55fe…44b8\nhttps://farbeamlabs.com/tx/ethereum/0xa078c4223c7126a9cb7a0af4df133c1756f64e2284a2b04166fcc5e7cfc635ab",
  "allowed_mentions": { "parse": [] }
}

If an address has a label, the label replaces the short address. allowed_mentions blocks mentions, so a message cannot ping a role. The link opens the Farbeam transaction page. The message format is fixed. For a custom format, use json and your own relay.

#Relay for other platforms

For a chat platform without a direct format, run a small handler that verifies the signature and forwards the text. This pattern uses the JSON format and the verify function on the alerts page.

import express from "express";
import { verify } from "./verify.js";

const app = express();
const seen = new Set();

app.post("/hooks/farbeam", express.raw({ type: "application/json" }), async (req, res) => {
  const ok = verify(req.body.toString(), req.get("x-farbeam-signature"), process.env.FARBEAM_SECRET);
  if (!ok) return res.sendStatus(401);
  res.sendStatus(200); // reply within 6 seconds, then do the work
  const event = JSON.parse(req.body);
  if (event.type !== "transfer.matched" || seen.has(event.data.uid)) return;
  seen.add(event.data.uid);
  await postToChat(`${event.data.token} $${Math.round(event.data.usd).toLocaleString("en-US")} on ${event.data.chain}`);
});
import json, os
from flask import Flask, request, abort
from verify import verify

app = Flask(__name__)
seen = set()

@app.post("/hooks/farbeam")
def hook():
    raw = request.get_data()
    if not verify(raw, request.headers.get("x-farbeam-signature", ""), os.environ["FARBEAM_SECRET"]):
        abort(401)
    event = json.loads(raw)
    if event["type"] == "transfer.matched" and event["data"]["uid"] not in seen:
        seen.add(event["data"]["uid"])
        post_to_chat(f"{event['data']['token']} ${event['data']['usd']:,.0f} on {event['data']['chain']}")
    return "", 200

postToChat and post_to_chat are yours to write. The code is a pattern, not a package.

#Text for your channel

Unlabeled does not mean anonymous, and a move does not imply a market view. Please tell your members that:

#What this will not do