Archalis Radar API
Ratings from AAA to C for BNB Chain tokens, a SCAM label for confirmed patterns, and on-chain forensics of every rug pull. Built so a trading bot can decide in one request whether a token is worth the risk.
Quick start
Base URL: https://api.archalis.com/v1. No key is needed to try it: requests without a key use the free plan, counted per IP address.
curl https://api.archalis.com/v1/token/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82
With a key:
curl -H "X-API-Key: ark_..." https://api.archalis.com/v1/token/0x...
Keys and plans
Send your key in the X-API-Key header, or as Authorization: Bearer ark_.... For the stream, which browsers open without headers, ?key=ark_... also works.
| Plan | Requests per second | Requests per day | Fresh analyses per day | Stream |
|---|---|---|---|---|
| Free | 1 | 1,000 | 20 | 1 connection, 60 s delay |
| Trial (7 days) | 10 | 20,000 | 100 | 2 connections, real time |
| Pro | 10 | 100,000 | 500 | 3 connections, real time |
| Bot | 30 | 1,000,000 | 5,000 | 10 connections, real time |
Daily counters reset at 00:00 UTC. Every response carries X-RateLimit-Remaining-Day.
Token rating
/v1/token/{address}Returns the latest rating in our archive, with the time it was computed in analyzedAt. If the token is not in the archive, or you add ?fresh=1, the radar analyzes it now: this takes a few seconds and counts against your fresh analyses.
A real response: a token whose liquidity was 100% locked, emptied by insiders 31 minutes after launch (some fields omitted).
{
"chain": "bsc",
"token": "0xd0d87cd37f498b79a9d4f37b7e623bd05ea2db96",
"symbol": "NOKc",
"rating": {
"grade": "D",
"label": "default: rug pull",
"class": "default",
"provisional": false,
"outlook": null,
"score": 19
},
"flags": [
"SIMULATION_NOT_RUN",
"RIGGED_BALANCES",
"LOW_LIQUIDITY",
"NEW_TOKEN",
"INSIDER_DUMP"
],
"market": {
"type": "v2",
"dex": "PancakeSwap V2",
"pair": "0x7f3dadc63ebc3945b1cb981b7e5e30b2d653aec5",
"base": "WBNB",
"liquidityUsd": 0.07
},
"contract": {
"simulated": false,
"honeypot": false,
"sellTaxPct": null,
"ownerRenounced": true,
"upgradable": false,
"ownerPowers": []
},
"liquidity": {
"burnedPct": 0,
"lockedPct": 100,
"inWalletsPct": 0,
"verified": true,
"locks": [
{
"locker": "PinkLock V2",
"pct": 100,
"unlockAt": null,
"permanent": true
}
]
},
"collapse": {
"kind": "insider_dump",
"isRugPull": true,
"liquidityDropPct": 99.99,
"minutesAfterLaunch": 31,
"pulledPct": 0,
"insiderSoldPct": 99.99,
"marketSoldPct": 0
},
"analyzedAt": "2026-10-16T22:34:06.000Z",
"source": "archive"
}
Grades
AAA to BBB are investment grade, BB and B speculative, CCC to C junk. SCAM is a confirmed scam pattern (not a grade). D means the rug pull already happened. Tokens younger than 24 hours get a provisional rating: "provisional": true.
Collapse
When liquidity falls 70% or more from its peak, collapse says why, from on-chain forensics: liquidity_pulled and insider_dump are rug pulls; market_crash and coordinated_selling are not.
Batch
/v1/tokensUp to 50 tokens per request, from the archive only. Each token counts as one request.
curl -X POST https://api.archalis.com/v1/tokens \
-H "X-API-Key: ark_..." -H "content-type: application/json" \
-d '{"tokens": ["0x...", "0x..."]}'
Tokens not yet analyzed come back as {"token": "0x...", "error": "not_in_archive"}: ask for them one by one with GET /v1/token.
Creator
/v1/creator/{address}Everything we know about the wallet that opened a pool: its launches with initial and current grade, which ones ended in a rug pull and how, who funded it, and the network of linked wallets (shared volume bots, cross launches, common funders) with its rug pulls.
Real-time stream
/v1/streamServer-Sent Events. Each event carries the full token object described above.
| Event | When |
|---|---|
new | a new pool receives its first rating |
rating | a grade changes |
rug | a rug pull is confirmed by forensics |
crash | a price crash caused by market selling |
// Node.js 18+ or the browser
const es = new EventSource('https://api.archalis.com/v1/stream?key=ark_...');
es.addEventListener('new', (e) => {
const { token } = JSON.parse(e.data);
const avoid = ['HONEYPOT', 'SERIAL_RUG_LAUNCHER', 'LP_UNLOCKED', 'SUPPLY_OUTSIDE_POOL'];
if (token.flags.some((f) => avoid.includes(f))) return;
console.log(token.symbol, token.rating.grade, token.market?.liquidityUsd);
});
es.addEventListener('rug', (e) => console.log('rug pull', JSON.parse(e.data).token.symbol));
Usage
/v1/usageYour plan, its limits, its expiry and today's consumption. It does not count against your quota.
Default rates
/v1/stats/default-ratesFor each initial grade: how many new pools received it and how many then ended in a rug pull. Public and free, no key and no quota. It is how you can check that the ratings work, the same evidence credit rating agencies publish.
Risk flags
Stable codes, meant to be filtered by a program. New codes may be added; existing ones do not change meaning.
| Flag | Meaning |
|---|---|
HONEYPOT | buying works, selling does not (simulated) |
CONFISCATORY_TAX | sell tax of 50% or more |
SELL_TAX_HIGH / BUY_TAX_HIGH | tax of 10% or more |
BUY_BLOCKED / TRANSFER_BLOCKED | buying or transferring fails right now |
SIMULATION_NOT_RUN | trades could not be simulated (for example, no liquidity) |
OWNER_ACTIVE | the contract has an owner who has not renounced it |
CAN_MINT, CAN_BLACKLIST, CAN_CHANGE_TAX, CAN_HALT_TRADING | powers of the active owner |
UPGRADABLE | the contract code can be replaced |
RIGGED_BALANCES | a wallet holds more than the whole supply |
CREATOR_HOLDS_SUPPLY | creator or owner holds 20% or more of the supply |
SUPPLY_OUTSIDE_POOL | 20% or more of the supply was kept outside the pool at launch |
LP_UNLOCKED / LP_PARTLY_UNLOCKED | 50% / 10% or more of the liquidity can be pulled at any time |
LP_UNVERIFIABLE | who controls the liquidity cannot be fully verified (V3 pools, partial history) |
LP_TO_REMOVER_CONTRACT | liquidity handed to a known liquidity-removal contract |
LOW_LIQUIDITY | less than $10,000 of liquidity |
BONDING_CURVE | still on the four.meme bonding curve |
BOT_VOLUME | half or more of the volume comes from known volume bots |
SERIAL_RUG_LAUNCHER | launched with a service that pulls liquidity in nearly every launch |
CREATOR_PAST_RUGS / CREATOR_NETWORK_RUGS | the creator, or its network of linked wallets, has past rug pulls |
NEW_TOKEN | less than 24 hours old |
LIQUIDITY_PULLED / INSIDER_DUMP | rug pull confirmed |
PRICE_CRASH / COORDINATED_SELLING | crash from market selling, or from one group of linked wallets (not a rug pull) |
Errors
Errors return a JSON body {"error": {"code": "...", "message": "..."}}.
| Status | Code | What to do |
|---|---|---|
| 400 | invalid_address, invalid_batch | fix the request |
| 401 | invalid_key | check the key, or omit it to use the free plan |
| 402 | key_expired | renew the plan |
| 429 | rate_limited | wait for Retry-After seconds |
| 429 | daily_quota, fresh_quota, too_many_streams | wait for 00:00 UTC or move to a larger plan |
| 422 | analysis_failed | the address is not a token we can analyze |
| 504 | analysis_timeout | retry, or read the cached result |
What it does not do
Ratings are automated assessments of structural risk based on public blockchain data. They are not investment advice and not a recommendation to buy or sell.
- Not for same-block sniping. The first rating arrives a few seconds after the pool is created (median about 7 seconds).
- BNB Chain only for now. PancakeSwap Infinity and Uniswap V4 pools are not covered yet.
- A rug pull is confirmed after the fact. Real-time exit alerts for tokens you hold are on the roadmap.
- How every grade is computed is public: methodology.