Developers
Ocellus API
What Ocellus has found, for your bot, dashboard or site: token risk checks, creator records and live Robinhood Chain launches. Free and read-only.
Try it
No key needed for a first look. Paste this:
curl https://ocellus.app/api/v1/tokens/0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430With a key, send it in a header:
curl -H "Authorization: Bearer YOUR_KEY" "https://ocellus.app/api/v1/launches?column=new&limit=5"const res = await fetch('https://ocellus.app/api/v1/tokens/0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430', {
headers: { Authorization: 'Bearer ' + process.env.OCELLUS_KEY },
});
const token = await res.json();
console.log(token.symbol, token.risk?.level, token.urls.token);Keys and limits
| How you ask | Allowance |
|---|---|
With a key (Authorization: Bearer … or x-api-key: …) | 60 requests a minute |
| Without a key | 10 requests a minute per address |
- A key is free: sign in and make one on your Account page. It is shown once; keep it on your server, never in a web page or an app people can open.
- Every answer from the API says where you stand:
x-ratelimit-limit,x-ratelimit-remaining,x-ratelimit-reset(Unix seconds). Over the limit is429withretry-after. - Browsers on other sites can call the API (CORS is open). Do that without a key: a key in a page is a key anyone can copy.
- The allowance belongs to your account: making a new key does not reset it.
- Need more? Write to [email protected] and say what you are building.
GET /api/v1/tokens/{address}
The newest public scan of a token on Robinhood Chain, BNB Chain or Solana: the risk level and the findings behind it, holders, the creator and their record, and links to its page and report. 404 when Ocellus has no public scan yet; the error carries a scanUrl where a free Quick Scan can be started.
{
"network": "robinhood",
"address": "0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430",
"symbol": "OCELLUS",
"name": "Ocellus",
"scannedAt": "2026-10-02T09:41:12.000Z",
"scanStatus": "completed",
"scans": 30,
"risk": {
"level": "moderate",
"points": 31,
"flags": ["top10_concentrated"],
"notes": [{ "label": "Top 10", "text": "The ten largest wallets hold 31.5%.", "serious": false }],
"unknowns": []
},
"holders": { "count": 412, "exact": true, "top10Share": 0.315 },
"creator": { "wallet": "0xb00a…7187", "share": 0.02, "launches": 1, "dead": 0, "serial": false },
"whales": 3,
"smartWallets": 1,
"liquidity": "locker",
"canSell": "sells_seen",
"sellCost": 0.012,
"marketCapAtScanUsd": 84000,
"launchedAt": "2026-09-18T14:02:11.000Z",
"dexPaidAt": null,
"links": [{ "kind": "x", "url": "https://x.com/ocellusapp" }],
"urls": {
"token": "https://ocellus.app/token/0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430",
"report": "https://ocellus.app/investigations/…",
"badge": "https://ocellus.app/badge/0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430.svg"
},
"attribution": "Data by Ocellus (https://ocellus.app). …"
}risk.levelislow,moderate,highorsevere: a count of the risk signals the scan read, not a prediction.riskis null on a scan too old to carry one.- Shares (
top10Share,creator.share,sellCost) are fractions from 0 to 1. Times are ISO 8601, UTC. - A field Ocellus could not read is
null, never a guess.
GET /api/v1/creators/{address}
The launches credited to one address on the Robinhood Chain launchpad since 1 October 2026, and what became of them: how many died, how many graduated, and the newest 50, newest first. A launch made through a launcher contract is credited to the wallet that sent it.
{
"network": "robinhood",
"creator": "0x…",
"launches": 37,
"dead": 35,
"graduated": 1,
"firstLaunchAt": "2026-09-20T08:11:00.000Z",
"lastLaunchAt": "2026-10-02T07:49:00.000Z",
"recent": [
{ "address": "0x…", "symbol": "ABC", "launchedAt": "2026-10-02T07:49:00.000Z",
"graduated": false, "fate": "young", "riskLevel": null, "url": "https://ocellus.app/token/0x…" }
],
"truncated": false,
"url": "https://ocellus.app/creator/0x…",
"attribution": "Data by Ocellus (https://ocellus.app). …"
}fateisdead,aliveoryoung(under a day old, too early to say).- The counts are of every launch on record.
truncatedis alwaysfalse; it is kept so nothing built on it breaks.
GET /api/v1/launches
The live launches page as data, a few seconds behind the chain. Optional: column=new|almost|bonded for one column, limit=1…60 for fewer.
{
"asOf": "2026-10-02T07:50:01.008Z",
"today": { "launches": 1259, "graduated": 11 },
"columns": {
"new": [
{ "address": "0x…", "symbol": "ABC", "name": "Alphabet", "launchedAt": "2026-10-02T07:49:36.256Z",
"graduatedAt": null, "raised": 0.12, "target": 4.2, "payToken": "ETH", "progress": 0.0286,
"marketCapUsd": 4600, "creator": { "launches": 3, "dead": 2 },
"links": { "x": "https://x.com/…" }, "riskLevel": null, "dexPaidAt": null,
"url": "https://ocellus.app/investigate?network=robinhood&address=0x…&quick=1" }
],
"almost": [],
"bonded": []
},
"attribution": "Data by Ocellus (https://ocellus.app). …"
}new: launched in the last hour.almost: the closest to graduating (every launch at 60% or more, and the next closest above 10% when those are fewer than ten;progresssays how far each is).bonded: graduated in the last day.raisedandtargetare in the curve's own pay token (payToken).dexPaidAtis when DexScreener approved a paid profile.- The data changes every few seconds; asking more than once every three seconds returns the same answer.
The badge
For a project's own site: the level at the token's newest Ocellus scan, as a small picture that links to its report. It is read from the newest scan each time it is shown, so a rescan reaches the badge within a minute or so. No key.
<a href="https://ocellus.app/token/0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430"><img src="https://ocellus.app/badge/0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430.svg" alt="Ocellus scan" height="22"></a>[](https://ocellus.app/token/0xbf8e5f9068ff68183b0c09bcc35b5a80aa60a430)The badge states the level Ocellus read and nothing more. It is not an endorsement, an audit or advice, and a site must not present it as one.
Errors
{ "error": { "code": "rate_limited", "message": "This key has used its 60 requests for this minute.", "details": { "retryAfterSeconds": 23 } } }| Status | code | Means |
|---|---|---|
| 400 | invalid_address, invalid_request | The address or a parameter is not one the API reads. |
| 401 | not_authenticated | The key is unknown or was revoked. |
| 404 | not_found | No public scan of this token yet. |
| 429 | rate_limited | Over the allowance for this minute. |
| 500 | internal | Something broke on our side. The answer carries a ref to quote to support. |
| 503 | service_unavailable | Ocellus is having trouble; try again shortly. |
The rules
- Credit Ocellus. Where you show the data, show “Data by Ocellus” linked to ocellus.app or to the token's page (
urls.token). - Do not present it as advice. A level is a reading of risk signals at one moment. Show when it was scanned (
scannedAt). - Read-only. The API serves what Ocellus has already scanned; it does not start scans. Send people to
urls.tokenor thescanUrlfor a fresh one. - Stable. Under
/v1fields may be added, never renamed or removed. Ignore fields you do not know. - Do not resell the data on its own, and do not use several keys or addresses to get around the limits.