Read the chain
from code.
The same reads the site makes, as a public HTTP API. Launches, outcomes, scans and reports, with the machine-readable spec below.
First
request.
curl https://cyclopslabs.dev/api/v1/launches?limit=5Base URL: https://cyclopslabs.dev/api. Public reads need no key.
Authentication: send a session token as Authorization: Bearer … after verifying a wallet on the site, or an API key as x-api-key. Keys are created on the account page, one or more per tier, and a key counts against the lower of its own tier and your wallet’s current tier. To start without a form, get a free key in 30 seconds; AI agents can use the MCP server and x402 pay-per-scan.
Limits: scans are limited to 10 an hour without a key and 120 an hour at the Holder tier. A limited request answers 429 with a Retry-After header. Public feeds are cached for 30 seconds.
TypeScript
and Python.
import { Cyclops } from '@cyclops/sdk';
const cx = new Cyclops({ apiKey: process.env.CYCLOPS_API_KEY });
const { launches } = await cx.launches({ limit: 5 });
const scan = await cx.inspect('0x…');from cyclops import Cyclops
cx = Cyclops(api_key=os.environ.get("CYCLOPS_API_KEY"))
launches = cx.launches(limit=5)
scan = cx.inspect("0x…")Both clients are thin wrappers over the endpoints below and return the same JSON.
Fifty at
a time.
curl -X POST https://cyclopslabs.dev/api/v1/bulk/inspect \
-H 'x-api-key: $CYCLOPS_API_KEY' -H 'content-type: application/json' \
-d '{"addresses": ["0x…", "0x…"]}'Send 1 to 50 token or wallet addresses. Every address that already has a stored scan comes back at once with status: "cached" and the full scan. Up to 5 uncached addresses per call (20 on Pro) are queued and come back "queued"; ask again a minute later and they are cached. The rest come back "not_scanned".
The response also carries the queue state, the same as GET /v1/queue. Bulk calls never wait on a scan, so they stay fast.
Download
the record.
Every Torch launch Cyclops has indexed on Robinhood Chain, one row each, oldest first. Add ?since=2026-10-01 for launches on or after a date. Outcomes describe what happened on-chain, not intent, and keep updating while a launch is young. Credit “Cyclops Labs” when you publish with it.
| Column | Meaning |
|---|---|
token | Token contract address |
symbol | Ticker as written in the launch event |
name | Name as written in the launch event |
creator | Wallet that created the launch |
block | Block of the launch |
launched_at | Launch time, ISO 8601 UTC |
tax_bps | Launch tax setting in basis points |
swaps | Swaps counted so far |
volume_eth | Traded volume in ETH |
first_eth | Price of the first trade, ETH per token |
ath_eth | Highest observed price, ETH per token |
last_eth | Latest observed price, ETH per token |
last_swap_at | Time of the latest swap |
dev_sold_pct | Share of the creator’s tokens sold, percent |
outcome | alive, inactive, dev_dumped or collapsed; empty while too new to judge |
outcome_at | When the outcome was recorded |
Every
endpoint.
Cyclops Labs API · version 2026.10 · generated from /v1/openapi.json
- GET
/v1/healthLiveness check
- GET
/v1/statusJob freshness and response times
- GET
/v1/configToken, tiers and public settings
- GET
/v1/queueScan queue: running, waiting, de-duplicated
- GET
/v1/chainsChains the scanner reads
- GET
/v1/changelogEngine changelog
- GET
/v1/openapi.jsonThis document
- POST
/v1/a/hitCookie-free page view (path and referrer host only)
- POST
/v1/discord/interactionsDiscord interactions endpoint (signed by Discord)
- GET
/v1/incidentsPublic incident log
- POST
/v1/feedbackLab feedback; signed-in Holder bug reports enter the Eyes bug bounty
- POST
/v1/auth/nonceStart wallet sign-in
- POST
/v1/auth/verifyFinish wallet sign-in; returns a session token
- GET
/v1/inspect/{q}qPoint it anywhere: token, wallet, contract or transaction
- GET
/v1/inspect/{q}/streamqThe same read as server-sent events: progress, then done or error
- GET
/v1/scan/{address}addressToken scan (includes `extra`: locks, tax history, wash trading and more where available)
- GET
/v1/scan/wallet/{address}addressWallet report
- GET
/v1/scan/{address}/receiptaddressSigned receipt for the latest scan
- GET
/v1/receipts/keyPublic key that signs scan receipts
- GET
/v1/tx/{hash}hashExplain a transaction
- GET
/v1/searchq?Tokens by name or ticker, wallets by label
- GET
/v1/trail/{address}address · hops?Funding trail, several hops back
- GET
/v1/creator/{address}addressA creator’s launches and their outcomes
- GET
/v1/smart-moneyWallets ranked by the outcomes of what they bought
- POST
/v1/bulk/inspectUp to 50 addresses: cached results now, the rest queued
- GET
/v1/explorer/{address}addressCompact cached read for explorers: score, label, top observations, badge and link (never starts a scan)
- GET
/v1/flags/accuracyHow often each flag preceded a collapse
- GET
/v1/score/changelogChanges to the scoring, versioned
- POST
/v1/flags/reportReport a flag as a false positive
- GET
/v1/flags/reportsaddress?False-positive reports per flag
- GET
/v1/score/calibrationScore bucket against the share of launches that later ended badly
- GET
/v1/score/biasFalse-positive rate for first-time against repeat creators
- GET
/v1/token/{address}/historyaddress · days?Daily holders, price and liquidity
- GET
/v1/token/{address}/holders/historyaddressHolder concentration over time
- GET
/v1/badge/token/{file}fileEmbeddable scan badge (SVG); file is <address>.svg
- GET
/v1/labels/{address}addressTeam label for an address
- GET
/v1/labelsaddress?Team and community labels for an address
- POST
/v1/labels/proposePropose a community label with evidence
- POST
/v1/labels/{id}/voteidAgree or disagree; weight follows Eyes rank
- GET
/v1/launchesoutcome? · creator? · limit?Torch launches with stats and outcomes
- GET
/v1/launches/statsOutcomes of the last 30 days
- GET
/v1/radarScored new launches (15 minutes delayed below Holder)
- GET
/v1/devsCreators with collapsed or sold-out launches
- GET
/v1/firehoseLive launches with first-minute stats (server-sent `launch` events)
- GET
/v1/firehose/recentlimit?The latest launches with first-minute stats
- GET
/v1/collapsesdays?Launches that collapsed or saw the creator sell out recently, with the score each had before
- GET
/v1/reportsWeeks with a public report
- GET
/v1/reports/weeklyweek?Weekly report
- GET
/v1/reports/quartersQuarters with a public report
- GET
/v1/reports/quarterlyq?State of Robinhood Chain launches for a quarter
- GET
/v1/datasetsDownloadable datasets
- GET
/v1/datasets/{file}file · since?launches.csv or launches.jsonl
- POST
/v1/ai/summaryCase summary; every sentence cites observation ids ({enabled:false} when switched off)
- POST
/v1/ai/askAsk a scan a question in plain language
- GET
/v1/meYour wallet, tier and settings
- POST
/v1/me/settingsUpdate settings
- POST
/v1/me/telegramTelegram link code
- POST
/v1/me/data/deleteDelete watchlists, saved cases, rules, follows, inbox and alert settings; returns a signed receipt
- POST
/v1/data/receipt/verifyCheck a data-deletion receipt
- GET
/v1/me/watchWatched tokens
- POST
/v1/me/watchWatch a token
- DELETE
/v1/me/watch/{token}tokenStop watching
- GET
/v1/me/rulesYour alert rules and recent alerts
- POST
/v1/me/rulesCreate or update (with id) a rule: conditions combined with all/any. Also accepts the short form {token, when: [creator_sells|lp_unlock_near|new_cluster_wallet|tax_change|holder_spike], match}
- DELETE
/v1/me/rules/{id}idDelete a rule
- GET
/v1/me/alertsAlerts sent to you
- GET
/v1/me/inboxfilter? · limit? · before?In-app alert inbox, newest first, with unread counts
- GET
/v1/me/inbox/countUnread alerts (and how many are Act tier)
- POST
/v1/me/inbox/readMark alerts read (or unread)
- POST
/v1/me/inbox/deleteDelete alerts by id, or everything already read
- GET
/v1/me/alert-prefsQuiet hours, folding window, minimum tier for outside channels, weekly recap
- POST
/v1/me/alert-prefsUpdate alert preferences
- GET
/v1/me/mutesMuted and snoozed tokens
- POST
/v1/me/mutesMute a token (no hours) or snooze it for 1 to 720 hours
- DELETE
/v1/me/mutes/{token}tokenUnmute or end a snooze
- POST
/v1/me/alerts/testSend a test alert to one channel; says why it did not deliver
- GET
/v1/me/alerts/recordhours?Your alerts against launch fates: collapse within N hours, hit rate, base rate
- GET
/v1/me/rules/{id}/templateidShare a rule as a template link (?target=1 keeps the token)
- GET
/v1/rules/template/{code}codeOpen a shared rule template
- GET
/v1/me/wallet-watchWallets connected read-only to the watchlist
- POST
/v1/me/wallet-watchRead a wallet’s balances and watch every indexed launch it holds
- DELETE
/v1/me/wallet-watch/{wallet}walletDisconnect a wallet and unwatch what it added
- POST
/v1/fates/changesTokens you scanned whose launch outcome changed since you last looked
- GET
/v1/me/followsFollowed wallets
- POST
/v1/me/followsFollow a wallet; alerted when it buys a launch
- DELETE
/v1/me/follows/{wallet}walletUnfollow
- GET
/v1/me/webhooksYour webhooks
- POST
/v1/me/webhooksAdd a webhook (https, signed with HMAC-SHA256)
- POST
/v1/me/webhooks/{id}/testidQueue a test delivery
- DELETE
/v1/me/webhooks/{id}idRemove a webhook
- GET
/v1/push/keyWeb push public key ({enabled:false} when off)
- POST
/v1/me/pushStore this browser’s push subscription
- DELETE
/v1/me/pushRemove a push subscription
- POST
/v1/digest/subscribeDaily digest and weekly newsletter, double opt-in
- GET
/v1/digest/confirmtoken?Confirm an email address
- GET
/v1/digest/unsubscribetoken?Unsubscribe
- GET
/v1/me/investigationsSaved investigations for your wallet
- PUT
/v1/me/investigationsReplace your saved investigations (up to 200 items, 256 KB)
- GET
/v1/me/labelsYour private address book
- PUT
/v1/me/labelsReplace your private address book (up to 2000 labels, 256 KB)
- GET
/v1/me/keysYour API keys with usage
- POST
/v1/me/keysCreate a key at or below your tier
- DELETE
/v1/me/keys/{id}idRevoke a key
- POST
/v1/keys/instantOne wallet signature in, a free-tier (or your tier) key and a session out
- POST
/v1/keys/anonymousA free-tier key with no wallet (two per network per day)
- DELETE
/v1/keys/currentRevoke the key sent as x-api-key
- GET
/v1/eyes/leaderboardThis week and all time
- GET
/v1/eyes/seasonscount?Monthly seasons with leaders
- GET
/v1/eyes/bountiesInvestigation bounty board
- GET
/v1/eyes/profile/{address}addressA contributor’s public record
- GET
/v1/eyes/claimsYour payouts with on-chain receipts
- GET
/v1/eyes/evidence/{address}addressObservations from a token’s latest scan, to cite as evidence
- POST
/v1/eyes/reportFile a case report, a scanner miss or a false flag with cited observations
- POST
/v1/eyes/submitSubmit to a Cyclops Eyes program
- GET
/v1/eyes/mineYour submissions
- GET
/v1/eyes/prescreenPre-screen queue (Sight rank and above)
- POST
/v1/eyes/prescreen/{id}idPre-screen a report
- GET
/v1/eyes/appealsPublic appeals log
- POST
/v1/eyes/appealsAppeal a label, flag, listing or decision
- GET
/v1/bountiesOpen bounties
- GET
/v1/rewardsRewards pool, burns and payouts
- GET
/v1/rewards/reserveRewards reserve wallet and payout history
- GET
/v1/referrals/termsReferral rules and whether rewards are live
- GET
/v1/me/referralYour invite code, link and referral record
- POST
/v1/referrals/claimAccept an invite as a new wallet
- GET
/v1/me/creditsApproved rewards awaiting payout and Pro time redeemed from them
- POST
/v1/me/credits/redeemTake awaiting rewards as Pro time instead of tokens
- GET
/v1/roadmap/votesRoadmap votes
- POST
/v1/roadmap/votes/{item}itemVote for a roadmap item
- DELETE
/v1/roadmap/votes/{item}itemRemove your vote
- GET
/v1/requestsHolder requests
- POST
/v1/requestsRequest something
- GET
/v1/recordCall record
- GET
/v1/signalsOpen calls
- GET
/v1/calls/{id}idOne call
- GET
/v1/feed.jsonSigned call feed
- GET
/v1/whalesLarge trades
- GET
/v1/wallet/{address}addressPrediction-market wallet
- POST
/v1/prelaunch/checkCreator self-check before launch; ends in a “scanned” record, never a safety rating
- POST
/v1/partner/prelaunchThe same check for launchpads, with an API key
- GET
/v1/prelaunch/{id}idA stored pre-launch check
- GET
/v1/prelaunch/{id}/badge.svgidBadge for a pre-launch check (SVG)
- GET
/v1/x402Pay-per-scan terms ({enabled:false} when off)
- GET
/v1/x402/scan/{address}addressToken scan paid per request: 402 with requirements, then retry with X-PAYMENT
- GET
/v1/correctionsPublic corrections log with SLA performance
- POST
/v1/correctionsAsk for a correction, a takedown or a privacy removal
- GET
/v1/me/teamsYour teams, seats and roles
- POST
/v1/teamsCreate a team (Holder: 1 team, Pro: 3)
- GET
/v1/teams/{id}idMembers, open invites and investigated targets
- POST
/v1/teams/{id}/invitesidOne-use invite code for a seat (owner)
- DELETE
/v1/teams/{id}/invites/{code}id · codeWithdraw an invite (owner)
- POST
/v1/teams/joinJoin with an invite code
- DELETE
/v1/teams/{id}/members/{address}id · addressRemove a member (owner) or leave
- GET
/v1/teams/{id}/notesid · target?Shared notes, optionally for one target
- POST
/v1/teams/{id}/notesidAdd a shared note to an address or transaction
- DELETE
/v1/teams/{id}/notes/{note}id · noteDelete a note (author or owner)