CRIUS Docs
API status Get API key
Use cases

Robinhood Chain API for Telegram and Discord bots

Build a Robinhood Chain token scanner, buy bot or launch-alert channel for Telegram or Discord with the Crius API, with real replies and credit costs.

Updated 3 min read

Community bots are often the first place a Robinhood Chain token gets looked at: someone pastes a contract address into a Telegram group or Discord channel, and the bot replies with price, market cap, holders, the launchpad, the security score and links. Others post every buy of a community’s token, or alert a channel the moment a token launches or graduates. The Crius API answers a scanner reply in two anonymous calls and pushes buys and launches over one WebSocket, so the bot needs no indexer and no RPC node.

Endpoints a chat bot uses

Suggested architecture

  1. Detect an address in the message. Match 0x followed by 40 hex characters. Anything else that looks like a ticker goes to /search.

  2. Build the card from two calls. /token/{address} and /token/{address}/security cost 1 credit each and work without a key. Send them in parallel.

  3. Cache per token for a short time. In a busy group ten people paste the same token within a minute. A 30-second cache keyed by address answers them all for one pair of calls.

  4. Push, don’t poll, for alerts. One stream connection (Free key, 1 credit) carries a buy bot’s trades:<token> and an alert channel’s launches:all and graduations:all. Free allows 10 subscriptions per connection, Starter 100.

  5. Rate-limit users, not the API. Per-user cooldowns keep one member from spending the bot’s credits.

A scanner answering 5,000 pastes a day with profile + security uses 10,000 credits a day, about 300,000 a month, within the Free plan. With the 30-second cache, repeated pastes cost nothing.

Resolve a name to an address

Three different tokens called CHARGE

A user types /scan charge. Which token do they mean?

GET/v1/robinhood/search?q=charge&limit=3
curl "https://api.crius.sh/v1/robinhood/search?q=charge&limit=3"
Real response 200 Captured Oct 28, 2026 · 73 lines (arrays trimmed)
{
"data": [
{
"address": "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8",
"label": null,
"launchpad": "pons",
"launchpad_name": "Pons",
"links": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": "https://x.com/chargeairh",
"website": "https://chargeai.bid/"
},
"liquidity_usd": 5611.81,
"logo": "https://api.crius.sh/v1/robinhood/logo/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8.png?size=128",
"name": "Charge AI",
"price_usd": 0.00000388948,
"symbol": "CHARGE",
"type": "token"
},
{
"address": "0x202e72dcbc815ca222f1a0674dd08755545b1329",
"label": null,
"launchpad": "pons",
"launchpad_name": "Pons",
"links": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": "https://x.com/chargeitdotfun",
"website": "https://chargeit.fun/"
},
"liquidity_usd": 4869.43,
"logo": "https://api.crius.sh/v1/robinhood/logo/0x202e72dcbc815ca222f1a0674dd08755545b1329.png?size=128",
"name": "CHARGE",
"price_usd": 0.00000293605,
"symbol": "CHARGE",
"type": "token"
},
{
"address": "0xc15f9324d2742387f98e2dba6b3745e5390113ec",
"label": null,
"launchpad": "pons",
"launchpad_name": "Pons",
"links": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": "https://x.com/chargeitdotfun",
"website": "https://chargeit.fun/"
},
"liquidity_usd": 2490.27,
"logo": "https://api.crius.sh/v1/robinhood/logo/0xc15f9324d2742387f98e2dba6b3745e5390113ec.png?size=128",
"name": "CHARGE",
"price_usd": 0.00000683926,
"symbol": "CHARGE",
"type": "token"
}
],
"meta": {
"block": 100406952,
"block_age_ms": 1260,
"block_ts": 1793225093000,
"chain": "robinhood",
"finalized_block": 100397649,
"lag_ms": 11,
"safe_block": 100401329
}
}

What this tells you

  • Three tokens match, all launched on Pons (launchpad: "pons"): Charge AI 0x7b8892cea949bc60d494681d1bc3ea96071ab0b8 and two tokens named CHARGE, 0x202e72dcbc815ca222f1a0674dd08755545b1329 and 0xc15f9324d2742387f98e2dba6b3745e5390113ec.
  • All three have the symbol CHARGE. Their liquidity_usd (5611.81, 4869.43 and 2490.27) and links differ, which is what the user needs to tell them apart.
  • The two CHARGE tokens share the same twitter and website links (https://x.com/chargeitdotfun), so a bot must not assume one link means one token.
  • Reply with a short list (symbol, name, liquidity and the full address) and scan the one the user picks.
Search reference Runs from your browser on the anonymous plan Data looks wrong? Report it

The scanner card

Everything for a Telegram scan reply

What should the bot reply when someone pastes 0x7b8892cea949bc60d494681d1bc3ea96071ab0b8?

GET/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8"
Real response 200 Captured Oct 28, 2026 · 320 lines (arrays trimmed)
{
"data": {
"address": "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8",
"admin_flags": null,
"bundles": {
"see": "/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/bundles"
},
"burned": 29840058.774195638068253872,
"chain_id": 4663,
"circulating_supply": 970159941.225804361931746128,
"creation": {
"attribution": "known_launchpad",
"block": 88385886,
"deployed_via": "pons_v2",
"deployer": "0x3ac82d45ff9e4963cefbc3f74dbe293f34c927ca",
"factory": "0x7ed598bcef8bd9edd8c97a195c6d13f40801ec7e",
"launchpad_name": "Pons",
"tx": "0x4d9536e81ce418070e93b72f46f1d91afdd6a9ed34141b8e3773926b0d863747"
},
"decimals": 18,
"dexscreener": {
"boosts": {
"active_amount": null,
"active_seen_ts": null,
"count": 0,
"last_ts": null,
"total_amount": 0
},
"checked_ts": 1793040659244,
"community_takeover": false,
"community_takeover_ts": null,
"confirmed": true,
"dex_paid": true,
"dex_paid_ts": 1791988981764,
"orders": [
{
"payment_ts": 1791988981764,
"status": "approved",
"type": "tokenProfile"
}
],
"profile": {
"description": null,
"header": "https://cdn.dexscreener.com/cms/images/JcxosvISKHoUITBu?width=1500&height=500&quality=95&format=auto",
"icon": "https://cdn.dexscreener.com/cms/images/DjTh8_NirbFrIzjW?width=800&height=800&quality=95&format=auto",
"links": [
{
"label": "Website",
"type": "website",
"url": "https://chargeai.bid/"
},
{
"type": "twitter",
"url": "https://x.com/chargeairh"
}
]
},
"url": "https://dexscreener.com/robinhood/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8"
},
"first_seen_block": 88385886,
"history": "complete",
"holders": {
"burned_pct": 2.98401,
"count": 179,
"dev_holding": false,
"dev_pct": 0,
"locked_pct": 8.16327,
"top10_pct": 13.436
},
"launch": {
"creator": "0x3ac82d45ff9e4963cefbc3f74dbe293f34c927ca",
"creator_label": null,
"curve": "0x2b0943bf947b54df526047b6fec8183a4fdeb3c3",
"curve_state": null,
"graduated_block": 88461321,
"graduation_threshold": 4.2,
"launched_block": 88385886,
"launchpad": "pons",
"launchpad_name": "Pons",
"pair_token": "0x0000000000000000000000000000000000000000",
"progress_pct": 100,
"raised": null,
"status": "graduated"
},
"liquidity": {
"locked_pct": 100,
"lockers": [
"pons_v2_launch_locker"
],
"next_unlock_ts": null,
"permanent": true,
"status": "locked"
},
"locked": 81632653.061224486519511236,
"market": {
"fdv_usd": 3889.48,
"liquidity_usd": 5611.8,
"market_cap_usd": 3773.42,
"pools_count": 10,
"quote_liquidity_usd": 2805.9
},
"metadata": {
"banner": "https://cdn.dexscreener.com/cms/images/JcxosvISKHoUITBu?width=1500&height=500&quality=95&format=auto",
"description": "hf:charge-ai/charge-30b@9ff2ef1e98ea4d9745a70b33ea02b80dba26c582",
"links": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": "https://x.com/chargeairh",
"website": "https://chargeai.bid/"
},
"logo": "https://api.crius.sh/v1/robinhood/logo/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8.png?size=128",
"logo_original": "https://api.surplusllm.com/api/launchpad/logos/bb4315cb9506ef872830b1dab25ffdb6694df1b8b8e32cc2c8d083208f26baab.png",
"socials": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": {
"source": "pons_launch",
"url": "https://x.com/chargeairh"
},
"website": {
"source": "pons_launch",
"url": "https://chargeai.bid/"
}
},
"source": "pons_launch",
"sources": {
"links": "pons_launch",
"logo": "pons_launch"
}
},
"name": "Charge AI",
"price": {
"ath_market_cap_usd": 68675.8,
"ath_scope": "all_time",
"ath_ts": 1792055400000,
"ath_usd": 0.0000707881,
"change_pct": {
"1h": 0.896103,
"1m": 0.896103,
"1s": 0.896103,
"24h": -0.171971,
"30s": 0.896103,
"4h": 0.896103,
"5m": 0.896103,
"6h": 0.896103
},
"confidence": "medium",
"dex": "uniswap_v4",
"eth": 0.00000000165124,
"liquidity_usd": 5604.57,
"quote": "0x0000000000000000000000000000000000000000",
"quote_liquidity_usd": 2802.29,
"source_pool": "0x871b166182fd708d5d16a4daa9a42f05a653fa51ee2b195097f425e0d9ca4913",
"thin_liquidity": false,
"usd": 0.00000388948
},
"security": {
"see": "/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/security"
},
"standard": "erc20",
"stats": {
"all_time": {
"buy_volume_usd": 143046,
"buys": 2893,
"first_trade_ts": 1791982835000,
"sell_volume_usd": 137621,
"sells": 2250,
"since": "chain_start",
"trades": 5143,
"volume_usd": 280667
},
"avg_trade_usd": {
"1h": null,
"1m": null,
"1s": null,
"24h": 2.96366,
"30s": null,
"4h": null,
"5m": null,
"6h": null
},
"buy_volume_usd": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 0,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"buyers": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 0,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"buys": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 0,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"last_trade_ts": 1793196204000,
"sell_volume_usd": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 5.92732,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"sellers": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 2,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"sells": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 2,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"traders": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 2,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"trades": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 2,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"txns": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 2,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"volume_eth": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 0.00252958,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
},
"volume_usd": {
"1h": 0,
"1m": 0,
"1s": 0,
"24h": 5.92732,
"30s": 0,
"4h": 0,
"5m": 0,
"6h": 0
}
},
"symbol": "CHARGE",
"total_supply": 1000000000,
"type": "launchpad",
"ui_multiplier": null,
"verification": {
"compiler": null,
"contract_name": null,
"implementation": null,
"is_proxy": null,
"sourcify": null
}
},
"meta": {
"block": 100406769,
"block_age_ms": 400,
"block_ts": 1793225075000,
"chain": "robinhood",
"finalized_block": 100397649,
"lag_ms": 38,
"pending": [],
"safe_block": 100401329
}
}

What this tells you

  • Header: name: "Charge AI", symbol: "CHARGE", launch.launchpad_name: "Pons" and launch.status: "graduated".
  • Price line: price.usd: 0.00000388948, price.change_pct["24h"]: -0.171971 and price.confidence: "medium".
  • Market line: market.market_cap_usd: 3773.42, market.liquidity_usd: 5611.8. Against price.ath_market_cap_usd: 68675.8 the token is about 95% below its peak.
  • Holders line: holders.count: 179, holders.top10_pct: 13.436, holders.dev_pct: 0.
  • Liquidity line: liquidity.status: "locked", permanent: true, locker pons_v2_launch_locker.
  • Links: metadata.links.website and metadata.links.twitter; metadata.logo is an image URL the bot can attach.
Token profile reference Runs from your browser on the anonymous plan Data looks wrong? Report it
// Scanner reply for Telegram (Markdown) from two anonymous calls.
const API = "https://api.crius.sh/v1/robinhood";
const cache = new Map();
async function scan(address) {
const hit = cache.get(address);
if (hit && Date.now() - hit.at < 30_000) return hit.text;
const [t, s] = await Promise.all([
fetch(`${API}/token/${address}`).then((r) => r.json()),
fetch(`${API}/token/${address}/security`).then((r) => r.json()),
]);
if (!t.data) return "Not a token on Robinhood Chain.";
const d = t.data, sec = s.data;
const text = [
`*${d.name}* (${d.symbol})${d.launch ? ` · ${d.launch.launchpad_name} · ${d.launch.status}` : ""}`,
`Price $${d.price?.usd ?? "?"} · 24h ${d.price?.change_pct?.["24h"] ?? "?"}%`,
`MC $${d.market.market_cap_usd ?? "?"} · Liq $${d.market.liquidity_usd}`,
`Holders ${d.holders.count ?? "?"} · Top 10 ${d.holders.top10_pct}%`,
sec ? `Score ${sec.score}/100 (${sec.risk}) · Tax ${sec.tax.buy_pct ?? "?"}% / ${sec.tax.sell_pct ?? "?"}%` : "",
`\`${d.address}\``,
].filter(Boolean).join("\n");
cache.set(address, { at: Date.now(), text });
return text;
}

The full bot, with commands and the buy feed, is in Build a Telegram token scanner. Alert channels are covered in Get new tokens and graduations in real time and price commands in Build price alerts.

Frequently asked questions

Can a Telegram bot use the Crius API without a key?

Yes, for the scanner itself: search, token profile, price, security and candles are on the anonymous plan at 2 requests per second. A bot in busy groups should use a Free key (10 requests per second, 1,000,000 credits a month), which also unlocks the WebSocket stream for buy and launch alerts.

How does a buy bot post every buy of a token?

Subscribe to trades:<token> on the WebSocket stream and post messages whose type is buy, above a minimum value_usd. Each message has the attributed trader, the amounts and the USD value. A Free key allows one connection with 10 subscriptions.

What should the bot do when several tokens share a symbol?

Show them all. /search?q=charge returns three different tokens named CHARGE or Charge AI, with their addresses and liquidity. Let the user pick by address, and treat the contract address as the only identifier.

Is a Discord bot any different?

No. The endpoints and the flow are the same; only the message formatting differs (embeds instead of Markdown). Everything on this page applies to both.

Get your free Crius API key

Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.

  • Robinhood Chain (4663) only, from our own archive nodes
  • REST + WebSocket
  • Pay on-chain or by card