Farbeam

Data API

A public REST API for large on-chain transfers, wallet balances, token checks, decoded transactions, curated labels and market context on Ethereum, Base, BNB Chain, Arbitrum, OP Mainnet, Polygon and Solana. Reading needs no sign-up. A free key, created after a wallet sign-in, raises the limit.

Base URL: https://farbeamlabs.com/api/v1. The API reference covers every parameter, and the OpenAPI file is machine-readable. You can send requests from the playground.

#Endpoint groups

GroupEndpointsCost in unitsWhat it returnsReference
Service30, 0, 1Health, poller and source status, 30 days of samplesstatus
Chains51Coverage, recent blocks, gas, priceschains
Transfers31, or 0 for the streamStored transfers of $100,000 or more, totals, live SSEtransfers
Wallets23Balances on six EVM chains or Solana, recent activitywallet
Tokens13Market data, contract checks, holders, poolstoken
Transactions12Status, fee, parties, decoded token movementstx
Labels21The curated address label setlabels
Markets41Chain TVL, stablecoin supply, DEX volume, trending poolsstablecoins
Account70 or 1Solana wallet sign-in, session, account view, Telegram linksign-in
Keys40Create a key after sign-in, read usage, revokecreate
Alert rules81Validate, store and test rules, read deliveriescreate

#Example request

This call asks for the newest USDT transfer on Ethereum of at least $1,000,000.

curl -s "https://farbeamlabs.com/api/v1/transfers?chain=ethereum&token=USDT&min_usd=1000000&limit=1"
const url = new URL("https://farbeamlabs.com/api/v1/transfers");
url.search = new URLSearchParams({ chain: "ethereum", token: "USDT", min_usd: "1000000", limit: "1" });

const res = await fetch(url);
const { data, meta, error } = await res.json();
if (error) throw new Error(`${error.code}: ${error.message}`);
console.log(data[0].uid, data[0].usd, "next:", meta.next_cursor);
import requests

res = requests.get(
    "https://farbeamlabs.com/api/v1/transfers",
    params={"chain": "ethereum", "token": "USDT", "min_usd": 1000000, "limit": 1},
    timeout=30,
)
body = res.json()
if "error" in body:
    raise RuntimeError(body["error"]["code"])
print(body["data"][0]["uid"], body["data"][0]["usd"], body["meta"]["next_cursor"])

#Real response

This response was captured from the running API at 2026-11-04T19:24:11Z. It is complete and unedited. The call also returned the headers x-ratelimit-limit: 120, x-ratelimit-remaining: 119 and x-request-id: req_9e666357141a.

JSON
{
  "data": [
    {
      "id": 1217,
      "uid": "ethereum:0x5fe8bf27f732de57e963cb92a0f17173c1e2cdadfdabb241e7d3dc25a346c342:335",
      "ts": "2026-11-04T19:12:59.000Z",
      "chain": "ethereum",
      "block": 26343466,
      "tx": "0x5fe8bf27f732de57e963cb92a0f17173c1e2cdadfdabb241e7d3dc25a346c342",
      "kind": "token",
      "token": "USDT",
      "token_address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
      "amount": 2500000,
      "usd": 2498505,
      "from": "0x8c5d0c5339c282b3e7f22a207e47d73d0227cba9",
      "to": "0x8b820fe67e8367d322d0c1bfc809cd9fe478df52",
      "sampled": false,
      "from_label": null,
      "from_type": null,
      "to_label": null,
      "to_type": null
    }
  ],
  "meta": {
    "request_id": "req_9e666357141a",
    "as_of": "2026-11-04T19:24:11.890Z",
    "next_cursor": 1217,
    "min_stored_usd": 100000,
    "retention_days": 7
  }
}

The fields worth reading first:

#Limits

LimitValue
Without a key30 units per minute per network
With a free key120 units per minute and 20,000 units per UTC day, per key
WindowFixed one-minute windows, reset on the minute
Keys per account5 active keys
Sign-in attempts30 per hour per network
Rows per page100 on /transfers
Request body32,768 bytes
Open SSE streams6 per network, 400 in total
Transfer history7 days
Stored threshold$100,000

Cost per call: wallet and token endpoints cost 3 units, transaction lookup costs 2, health, status, key endpoints and /me cost 0, and most other endpoints cost 1. The cost is charged before the handler runs, so a request with a bad parameter still spends units. See rate limits.

#Error format

Every error has one shape. This one is real, from GET /chains/fantom at 2026-11-04T19:23:10Z, with HTTP status 400.

JSON
{
  "error": {
    "code": "invalid_chain",
    "message": "Unknown chain. Use one of: ethereum, base, bnb, arbitrum, optimism, polygon, solana.",
    "request_id": "req_fddb4d074326"
  }
}
HTTPCodesWhat to do
400invalid_chain, invalid_address, invalid_hash, invalid_parameter, invalid_jsonFix the request
401missing_key, invalid_keySend a valid key. A revoked key returns 401 even on public endpoints
401sign_in_required, invalid_challenge, invalid_signatureSign in again with a Solana wallet
404not_foundThe item does not exist, or the address has no label
405method_not_allowedUse another method
409rule_limit, key_limit, telegram_not_linkedRemove a rule or a key, or link Telegram first
413payload_too_largeSend a smaller body
422invalid_rule, invalid_urlFix the rule or webhook URL. The message gives the position
429rate_limited, daily_limitWait for Retry-After seconds, or for the next UTC day
502upstream_unavailableA public source failed and no saved copy exists. The source field names it. Retry later
503telegram_not_configuredThe Telegram bot is not connected

Details are on the errors page.

#What makes it different

This API is small, and these are the choices that shape it.

#What it lacks

Check this list before you build on it.

If you need any of these today, see the RPC provider comparison and the explorer comparison.

#Start

  1. Send a request without a key to confirm the shape.
  2. Sign in to the console with a Solana wallet, and create a free key. Save it, because it is shown once.
  3. Send it as Authorization: Bearer <key>.
  4. Read the quickstart.

Farbeam data is for information only. It is not financial advice.