What a strategy actually contains, how a screener page becomes a position, what closes it, and which limits bind before any capital moves. Every number here is quoted from the engine, and every field name is the strategy's own — so you can go from this page to the strategy form without a translation step. Building an integration? The partner API reference below covers authentication, query parameters and every response field.
Something unclear, or not on this page? Ask in the Discord — the team reads it.
01 — Start here
What the thing is, the objects you need to hold in your head, and how to get in.
What Orus is
An autonomous desk for Robinhood Chain and Solana, running in the open.
Orus discovers tokens across the chain's DEXes and launchpads, waits for one to fall far enough from its all-time high, buys the dip, and manages the position until a target, a stop or a time limit closes it. No part of that requires anyone to be at a screen.
It runs on two chains, and a strategy names its chain when it is written. Robinhood Chain — an Arbitrum Nitro L2, chain id 4663, gas paid in ETH — is the first. Two chain facts shape everything downstream there. USDG, not WETH, is the dominant quote asset, so every price in the system is denominated in USD and a "price in native" is meaningless across venues. Blocks land in about 100 ms with first-come-first-served sequencing, so there is no priority-fee auction to win: the race is on data freshness, not on tips.
Every decision an agent makes — every candidate looked at, every rejection and the measurement behind it, every entry and exit — is written to an event log. The public desk reads that log. Refusals and losses are published on the same page as the wins.
Strategies and agents
A strategy is the rulebook. An agent is one copy of it, running on a clock.
A strategy is a set of parameters covering every step of the pipeline: what to screen for, which holder profiles to reject, how deep and how recent a dip has to be, how much to spend, and when to sell. It holds no wallet and takes no action on its own. Every one of its fields is documented in the pipeline sections below, at the step that reads it.
An agent runs one strategy at regular intervals, in simulation or through its trading wallet. Its cadence depends on your account tier. Each cycle checks for new entries and monitors held positions; a cycle still in progress is not started again.
Two agents using two strategies that share every entry rule and differ only in their exits attribute any difference in results to the exit policy alone. That is how the desk's strategies are compared.
Pausing an agent stops new entries. It does not stop the exits: an agent that is paused or stopped but still holds positions gets a monitor-only pass on its own cadence, so the stop loss, the hold limit and the take profit keep working on what is already held.
nameStrategy Name
What the strategy is called on your console and, for the house's, on the public desk.
descriptionDescription
One line on what the strategy is for. Shown on the strategy card.
frequency_seconds
How often the agent runs. Your account tier determines this interval.
execution_mode
Choose Simulation or Automatic for your agent — see the next section.
status
running, paused or stopped. Paused and stopped agents still monitor what they hold.
Execution modes
Simulation and automatic differ in exactly one thing: whether a transaction is sent.
Simulation needs no funds. The agent runs the full pipeline, including the guard rails and the round-trip check, and books each position at the fill the real routers quote — tokens received, price implied — not at the oracle price. Nothing is broadcast. A simulated exit is quoted out through the same router and booked at the native it would return. It is how a strategy earns the right to hold money.
Automatic does the whole thing: quotes, wraps ETH, approves the router for the exact amount, swaps, and records the position from the fill it actually got. Switching an agent to automatic runs a pre-flight — a wallet, automated trading enabled on it, and enough ETH for one entry plus gas — and refuses with the numbers when one is missing.
Your agent can run in Simulation or Automatic. Choose Simulation to evaluate a strategy without funds, then enable Automatic when you are ready to trade through your wallet.
simulation
No funds required. Simulated positions use the quoted trade price.
automatic
Quotes, wraps, approves, swaps, records the real fill. Needs automated trading enabled and a funded wallet.
Wallets and keys
Your agents trade from a wallet you hold. Orus signs within a policy you can read, and revoke.
Your trading wallet is an embedded wallet on Robinhood Chain, created at your first sign-in and held for you by Privy: the key lives in Privy's enclave, never on Orus's servers and never in your browser. The wallet page shows its address and a QR code to fund it, lets you send ETH from a wallet you already own, and lets you withdraw — by signing yourself, through Privy's confirmation, to an address you choose. Sells return WETH; a withdrawal converts it on the way out.
Automated trading is a delegation: with one click you add Orus's signer to your wallet, under a policy. The policy is the whole of what Orus may sign — wrap ETH up to 0.05 ETH per transaction, approve the listed routers, and call those routers. It has no rule for another chain, for a plain ETH transfer, or for an approval to anyone but a router; a request outside it is refused by Privy before it is signed. The console confirms the delegation, and you can turn it off at any time. While it is off, an automatic agent can neither open nor close positions.
What that policy does not bound, said plainly: an approval of a token you hold carries no cap, because token amounts have no common scale, and a wrap is bounded by its amount rather than by what the WETH contract does with it. So a compromise of Orus's signing key would be bounded by those per-transaction limits and by the listed routers — not by zero. The wallet stays yours throughout, and turning automated trading off removes the signer.
Before any real entry the engine checks the wallet again: the delegation stands, the account is enabled, and the balance covers the stake plus gas for the round trip. A wrap keeps a gas reserve as ETH so the exit can always pay for itself. The public desk's agents use separate wallets from your own.
Fund it with ETH, on Robinhood Chain, and with nothing else. Your wallet holds the same address on every EVM chain, so a deposit sent on Ethereum or Base does arrive — at an address where Orus has no router to trade it and no permission to move it, because the policy is refused on every chain but this one. The wallet page reads Robinhood Chain, and also asks Privy what the address holds elsewhere, so a deposit that went to the wrong network is named rather than silently absent. Getting it back is yours to do: export your private key from the wallet page, import it into a wallet of your own, and move the funds — that chain will want its own gas first.
/app/wallet
Address, balance, QR, fund from your own wallet, withdraw, export your key, automated trading on/off.
fund with
ETH, on Robinhood Chain only. Anything else reaches the same address and is stranded there.
Solana
When available on your account, the same page offers a separate Solana wallet with its own address, QR code and SOL balance. It has its own trading authorization, limited to supported swaps, token accounts, wrapping and fees. You confirm withdrawals yourself. Solana agents use this wallet; Robinhood Chain agents use their Robinhood Chain wallet.
policy
Wrap ≤ 0.05 ETH · approve and call listed routers · this chain only. Anything else is refused before signing.
fees
3% of the net gain on each winning real trade, funding the daily contest, referrals and the project.
Access
Sign in, copy a strategy, run it in simulation, then fund your wallet and go live. The desk itself needs no account.
The console at /app sits behind a login: an email one-time code, or a wallet you already own. The first sign-in creates your account and your trading wallet — an embedded wallet held for you, on Robinhood Chain only. Pressing the button on that page is where you accept the terms it states: Orus runs the strategies you define on a volatile market, nothing here guarantees a profit, and funds you send to your wallet can be lost.
Your console shows what is yours: your strategies, your agents, their radar, signals, positions, history and reports. The desk's own agents are not in it; they are on /live, and their strategies are the templates you can copy. Every account may generate 3 reports a day and send 30 messages a day to a report; how many agents it may run, how many strategies it may hold and whether it may ask its agent to write one are tiers — see $ORUS below. A user's strategy is bounded — min_liquidity_at_dip at least 1,000 $; buy_amount_native at most 0.05 ETH; slippage_pct at most 15 %; max_price_impact_pct at most 10 %; max_open_positions at most 25; website_regex is not available — whenever it is created or changed.
An agent's cadence is its account's tier, and the tier is the $ORUS in its wallet: Free runs every 60 seconds, Pro every 30 seconds on 1M $ORUS held, Premium every 10 seconds on 3M $ORUS held. Nothing is chosen and nothing is bought with a card — the balance is read from the chain every few hours, and an agent follows it both ways: buy more and it speeds up, sell and it slows down. The thresholds are token amounts rather than dollar ones so a price move cannot take an account's tier away overnight. Going live is four steps, all in the console: copy or write a strategy, deploy an agent on it, fund the wallet on the wallet page and enable automated trading there, then set the agent to automatic. Changing the stake, the caps, the stop or the slippage under a live agent moves it back to simulation — it went live on the old numbers, and the new ones need a new decision.
The public desk shows recorded agent activity and results, including refusals and losses. Figures refresh regularly and may lag the latest trade.
/app
Your console. Sign in required.
/app/wallet
Your trading wallet: fund, withdraw, automated trading.
/leaderboard
Every wallet and every strategy on Orus, ranked, the house included. Every UTC day, the three best P&L, the house included, split half of the fees received and finalized that day, a quarter of those paid by a referred trader. No account needed.
/live
The public desk. No account needed.
/pricing
The three tiers and what each holds. No account needed.
/docs
This page.
/llms.txt
This documentation for machines — see Machine-readable docs below.
$ORUS
The token does two things: it takes a share of what a winning real trade makes, and holding it sets what your account can do.
It earns. Orus keeps 3% of the realised profit of a winning real trade — the figure net of the gas both legs paid, read from the receipt — and nothing at all on a losing one; a loss never offsets a later win. Simulated positions and the house's own agents pay nothing. Every UTC day, half of the fees received and verified as final that day funds prizes for the three best net P&L, and Orus keeps the other half. On a fee paid by a referred trader, their referrer receives 50% first, and the rest is split equally between the prizes and Orus. Fees still pending or failed fund neither. Late confirmations fund the confirmation day, never an older prize pool.
It opens. Your tier is the $ORUS in your wallet, and it is the only thing that sets how often your agents run: Free runs every 60 seconds, Pro every 30 seconds on 1M $ORUS held, Premium every 10 seconds on 3M $ORUS held. Pro and above also open the AI reports — the agent report and the token report. It also sets how many agents you may run at once (1 on Free, 3 on Pro, 20 on Premium), how many strategies you may hold (1 on Free, 10 on Pro, unlimited on Premium), and whether "Ask your agent" — the assistant that writes a strategy from a conversation — is open, which it is from Pro up, with no message count on it. Going over is never possible by surprise and never destructive — an account that drops a tier keeps every agent it built and simply cannot add another. Everything else is in every tier: every desk template to copy, simulation on live data, real trading, and your own tape.
The thresholds are token amounts, not dollar ones, and deliberately so: a dollar threshold on a young token would take your tier away overnight without you selling anything. The consequence is the honest one — if the price runs, a tier costs more in dollars than it did; if it falls, less. The amounts are a constant we can recalibrate, and changing them is announced.
Jev contextual validation is Premium only (3M $ORUS held), in simulation or live trading at the owner’s choice. Enable it per agent for entries, take-profit exits, or both, with optional written conditions. Below this tier, Jev reviews stop and delegated entries and take profits wait until access is restored or Jev is disabled; stop loss, maximum hold and manual exits remain available. Saved strategies and decision history are kept.
Your balance is read from the chain every few hours and stored; your wallet page shows the figure your tier was decided on. Nothing is ever moved: the tokens stay in the same wallet your agent trades from, and Orus only ever reads the balance. It works both ways — buy more and your agents speed up within hours, sell and they slow to the tier you still hold, with a line on each agent's own tape saying so.
Free
1 agent and 1 strategy, a run every 60 seconds.no token
Pro
3 agents and 10 strategies, a run every 30 seconds, Ask your agent, AI reports.1M $ORUS held
Premium
20 agents and unlimited strategies, a run every 10 seconds, Ask your agent, AI reports, and Jev validation in simulation or live trading.3M $ORUS held
Referrals
Invite traders: up to 5 bonuses of $50, plus 50% of collected performance fees.
Generate a link on your Referrals page, share it with new traders, and track their progress and your rewards there.
Joining
A new account created in the same browser within 30 days of following your link becomes your referral. Existing accounts cannot be attached later, and an account cannot refer itself. Opening a second account through your own link is self-referral, and is treated as abuse.
Qualifying wins
Each referral needs 10 individually winning real trades, closed with positive native profit after gas and performance fees. All their personal agents and strategies count, including copies; vault trades do not. Wins need not be consecutive: losses, paper trades and pauses do not reset the count.
Minimum stake
Each winning trade must stake at least 0.01 ETH on Robinhood Chain or 0.1 SOL on Solana. Smaller trades do not count.
Bonus limit
You earn $50 once per qualifying referral, for at most 5 referrals over the lifetime of your account ($250 in bonuses). The cap limits bonuses, not the number of people you can invite. A cancelled bonus does not free a slot.
Fee sharing
You earn 50% of performance fees Orus actually collects from all your referrals, even before they qualify for a bonus and after the bonus cap; the rest of each of those fees is split 50/50 between the daily prizes and Orus. Only on-chain receipts verified as final count, for fees booked from the programme’s activation onward. The balance stays in ETH on Robinhood Chain or SOL on Solana; it is never converted into a dollar entitlement. Pending, failed and unverified transfers earn nothing.
Claiming fees
Claim each coin separately on Referrals, from 0.0001 ETH or 0.001 SOL. The full available balance goes to the linked account wallet shown beside the button, on that same chain. Orus pays network fees separately. Payouts go out one at a time per chain; an ETH payment first converts WETH and waits for final confirmation twice, which can take about an hour. Closing the page or retrying does not create another payment. A confirmed failure restores the balance; after a transfer that failed on-chain, the next claim waits 60 minutes. If claims are unavailable, the balance remains recorded.
Manual payments
The $50 bonuses are paid manually from a separate Orus marketing budget, on request on the Orus Discord, once Orus has checked the referral for abuse. Earned, Paid and Awaiting payment refer only to these USD bonuses. They are never deducted from the contest or referral fee balances. If a paid bonus is cancelled, the page shows the excess already paid without automatically charging you.
Progress and changes
Progress is checked after a real close and when you open Referrals. Deleting agents or strategies can remove in-progress trades, and rule changes may reset progress towards an unearned bonus. Later losses or deletion do not remove an acquired bonus.
Abuse and privacy
Any suspicion of cheating, including multiple accounts or reward farming, cancels the referral's bonus and the fee share it earned, any part already paid being deducted from later shares, and suspends the referrer's fee claims until Orus has reviewed them. The referrer never sees the referred trader's identity, wallet or individual positions: only join dates, progress towards the bonus and its status. The fee share is a fixed fraction of the fees referrals pay, so with a single referral it reflects their realised profit; claim payouts are public on-chain.
Google Analytics on the public pages, with advertising switched off, and nothing else.
The site runs Google Analytics 4. It records the pages you open, where you arrived from, and six events on the way to an account: a call to action pressed, the sign-in dialog opened, the sign-in completed, a sign-in stopped at the terms, an account created, and a returning sign-in. That is the whole list. Nothing about what your agents scan, hold or trade is sent anywhere — public results are available on /live and /leaderboard, but are not sent to Google Analytics.
Advertising is off: the tag is configured with Google's advertising signals and ad personalisation both disabled, so the data is not used to build an advertising profile and no ad network is contacted. Once you are signed in, the console attaches your account's internal identifier so a funnel can be followed end to end. Never your email, never your wallet address, never your Privy identifier.
Analytics sets cookies in your browser. To refuse them, use your browser's tracking protection, an ad blocker, or Google's own opt-out extension — none of it changes how the product works, and none of it is required to sign in, deploy an agent or trade.
Where the numbers come from
Market observations and trade quotes, checked against the rules you choose.
Orus screens the chain's token list against the strategy's thresholds, then gathers token observations: price, market cap, launch date, pool, all-time high, holder concentration, bundler and sniper shares, launchpad state and security flags. Orus also uses price candles, earliest-trade samples and execution quotes. Wallet balances and transaction confirmations are read from the relevant blockchain.
Orus checks each candidate against your strategy's filters even when the initial scan already applied them. Changing a data source does not change the thresholds you selected. Missing required observations are reported as unavailable, not treated as a passing result. The volume floor and pre-scan use the screener’s available 24-hour volume, falling back to enriched volume when unavailable. Ratios retain the volume from the same source as their other measurements.
Every price is in USD. Execution quotes are normalised to the same economics before the engine compares them: expected output in token units, USD in and out, and price impact.
02 — The pipeline
Scan, filter, launch check, radar, dip detection, signal, execution. Every stage can reject, and every rejection is logged with the test that failed and how far off it was. Each strategy field is listed at the step that reads it.
Scan
Narrow the chain to a few hundred candidates, then enrich them.
The scan first selects tokens that meet the strategy's 24-hour volume, liquidity, market-cap and trade-count thresholds. On Robinhood Chain, the native coin and the two quote assets, WETH and USDG, are excluded from trading candidates.
Each candidate is then assessed using its available price history, activity, holder distribution and risk observations. Passing the initial scan does not authorize a purchase: the remaining filters and entry conditions still apply.
Output: up to 200 candidates per run.
chain_idChain
The chain the strategy trades on: evm:4663 (Robinhood Chain, stake in ETH) or solana:mainnet (Solana, stake in SOL). Set when the strategy is written and never changed; every agent deployed on it trades that chain.choices: evm:4663, solana:mainnet
min_volumeMin Volume ($)
Minimum 24-hour volume in USD. A rolling 24 hours, not volume since launch. Passed to the screener and re-checked locally on the screener's own figure, so a token the screener admits is never refused on another provider's count.default 100,000 $ · ≥ 0
prescan_volumePre-scan Volume ($)
Optional 24-hour volume floor, strictly below min_volume, from which a token is watched in pre-scan: shown on the radar with a PRE-SCAN tag, never bought. If its price is at or past the dip threshold when the agent looks while it is in pre-scan, it is skipped for that dip (prescan_dip), because the volume that would make it a candidate comes after the move. If its volume reaches min_volume first, it leaves pre-scan and the usual rules apply. A new all-time high starts a new dip, and a skipped token is watched again. Unset turns pre-scan off.default unset · ≥ 0
min_market_capMin Market Cap ($)
Minimum market cap in USD. Passed to the screener and re-checked locally.default 20,000 $ · ≥ 0
min_transactions_24hMin Transactions 24h
Minimum 24-hour trade count. Passed to the screener and re-checked locally.default 200 · ≥ 0
Filters and risk
Every candidate must pass your configured filters before an entry is considered.
Three checks are fixed and cannot be loosened: a token with no pool is out, a token that cannot be sold — a honeypot — is out, and a buy or sell tax above 10% is out. There is no mint or freeze authority on an ERC-20, so the Solana-era checks do not apply; taxes and honeypots are the equivalent traps, and they are rejected rather than scored.
The venue whitelist matches the venue key, its name or the launchpad the token graduated from, so a strategy that names a launchpad admits its graduated tokens on whichever DEX they now trade. Bonding state can be required either way.
The rest is activity and holder distribution. A token whose supply sits with bundler wallets, launch snipers, insiders or the deployer is a token whose price is somebody's decision rather than a market's. Each has its own ceiling, and a wash-trading floor compares organic volume against reported volume.
Missing data fails the check it is missing from. A strategy that sets a threshold is asking a question, and "unknown" is not the answer it wants: a token with no creation date fails an age-bounded strategy, one with no sniper figure fails the sniper ceiling. These rejections carry their own codes — missing_age, missing_snipers, missing_holders — so the tape shows what was absent rather than what was exceeded. A strategy that leaves a threshold unset asks nothing and is unaffected.
A candidate that fails a numeric test still produces an event with the value and the threshold. That distance is what the near-miss board on the activity page is built from.
allowed_dexesAllowed Venues
Venue whitelist, e.g. pons, noxafun, uniswap-v3. Each entry is matched, case-insensitively and as a substring, against the venue key (uniswap-v4), the venue name (Uniswap) and the launchpad the token came from (pons-v2), so a launchpad name admits its graduated tokens on whichever DEX they now trade. Empty accepts any venue.default pons
require_bondedLaunchpad State
true admits graduated tokens only, false admits tokens still on their bonding curve only, unset admits both.default unset
max_age_hoursMax Age (hours)
Maximum token age, in hours since creation. A token with no creation date fails an age-bounded strategy.default 168 hours · ≥ 0, ≤ 8760
min_age_hoursMin Age (hours)
Minimum token age, in hours since creation. 0.083 is five minutes.default 0.083 hours · ≥ 0, ≤ 8760
min_volume_liquidity_ratioMin Volume/Liquidity Ratio
Floor on 24-hour volume divided by liquidity. High turnover on thin liquidity is a token being traded rather than parked.default unset · ≥ 0
max_volume_fees_ratioMax Volume/Fees Ratio
Ceiling on 24-hour volume divided by the fees that volume paid. On an AMM the two are proportional — fees are a fixed share of every trade — so the ratio is one over the fee rate and was near 220 in the measured Robinhood Chain sample whatever the token's size — measured as the median of 1,000 signalled tokens. That is the normal value, not a target: a ceiling belongs well above it, and at 2,000 it refuses about one token in twenty where 220 would refuse half. A far higher ratio is volume that reached no pool: wash trading, or an accounting that has lost track. Both figures are the same 24-hour window; dividing by the fees a pool has earned since launch would measure its age instead. A pool under three hours old can read high because the provider's fee counter lags its volume counter, and a token with no fee figure fails this check when it is set. On Solana the fee figure is what the token's traders paid over the same 24 hours in validator tips and trading-platform fees — the day's figure carries no network or priority fee — converted to USD at the current SOL price on every run, so the ratio is recomputed each time. It is not a fixed share of each trade, so the Robinhood figures above do not carry over, and the default of 2,000 rests on Solana's own measurement: on 2026-09-29 the tokens with retail trading read 215 to 962 and the wash-traded ones 2,767 and up, often with no fees at all. A launch in its first hour reads a median of 2,618 to 8,286, so a tight ceiling on a launch strategy filters youth rather than fraud. On Robinhood Chain the fee figure comes from the optional labelling feed only; unmeasured without it. Not enforced while the operator has set `risk_labels_required` off and no feed measures it: the tape counts the token as unmeasured instead of refusing it.default 2,000 · ≥ 1
min_buysMin Buys
Minimum 24-hour buy count.default 100 · ≥ 0
min_sellsMin Sells
Minimum 24-hour sell count. A token that is only bought has nobody able to sell it.default 100 · ≥ 0
min_total_feesMin Total Fees ($)
Floor on the cumulative fees paid to trade the token, in USD. A proxy for how much real trading it has seen. On Solana the figure is what its traders have paid in network and priority fees, validator tips and trading-platform fees, converted to USD at the current SOL price on every run. On Robinhood Chain it is measured only by the optional labelling feed; unmeasured without it. Not enforced while the operator has set `risk_labels_required` off and no feed measures it: the tape counts the token as unmeasured instead of refusing it.default unset · ≥ 0
max_bundled_buy_pctMax Bundled Buy (%)
Ceiling on the share of supply held by bundler wallets — buys bundled into the launch transaction. Without the optional labelling feed it is the engine's own reading, on both chains: what the wallets that bought in the same second as the token's first swap, the deployer excluded, still hold, read on-chain from the first fifty swaps. Not enforced while the operator has set `risk_labels_required` off and no figure exists: the tape counts the token as unmeasured instead of refusing it.default 40 % · ≥ 0, ≤ 100
max_snipers_pctMax Snipers (%)
Ceiling on the share of supply held by wallets that sniped the launch. Without the optional labelling feed it is the engine's own reading, on both chains: what the wallets that bought within the first minute after the token's first swap, the deployer and the launch-second buyers excluded, still hold, read on-chain from the first fifty swaps. Not enforced while the operator has set `risk_labels_required` off and no figure exists: the tape counts the token as unmeasured instead of refusing it.default unset · ≥ 0, ≤ 100
max_insiders_pctMax Insiders (%)
Ceiling on the share of supply held by insider wallets. Measured only by the optional labelling feed; unmeasured without it. Not enforced while the operator has set `risk_labels_required` off and no feed measures it: the tape counts the token as unmeasured instead of refusing it.default unset · ≥ 0, ≤ 100
max_dev_holdings_pctMax Dev Holdings (%)
Ceiling on the deployer's own holdings. The deployer is the wallet that created the token, the creation transaction's sender on Robinhood Chain and the mint's creator on Solana, and its share is read on-chain, its balance over the total supply.default unset · ≥ 0, ≤ 100
max_top10_holdings_pctMax Top-10 Holdings (%)
Ceiling on the top ten holders combined. Measured on Solana; on Robinhood Chain only by the optional labelling feed. Not enforced while the operator has set `risk_labels_required` off and no feed measures it: the tape counts the token as unmeasured instead of refusing it.default unset · ≥ 0, ≤ 100
min_organic_volume_ratioMin Organic Volume Ratio
Floor on organic volume over reported volume, from 0 to 1 — the wash-trading floor. Measured only by the optional labelling feed; unmeasured without it. Not enforced while the operator has set `risk_labels_required` off and no feed measures it: the tape counts the token as unmeasured instead of refusing it.default unset · ≥ 0, ≤ 1
min_holdersMin Holders
Minimum holder count, from the chain's token audit. On Robinhood Chain a token the audit has not counted yet is counted from its transfer logs while it is under a week old, pools included. A token with no holder figure fails this check when it is set.default unset · ≥ 0
website_regexWebsite Regex
A text pattern matched against the token's social links and description. Available only to the public desk's strategies; it cannot be configured on a user strategy.users: not available
Launch market cap and the radar
Survivors are tracked over time rather than judged in one frame.
A token's market cap one second after its first trade says something its current cap does not: a launch at a high cap is usually sniped or bundled, and the dip pattern is unreliable on it. The clock starts at the first trade, not at contract creation — on a launchpad the two coincide, on a DEX listing made after deployment they do not. Supply is read from the token.
What survives lands on the radar — the watchlist — where it is tracked across runs with its last known all-time high, the instant of that high, the current dip and the liquidity behind it. Nothing is bought from the radar; it is the pool the chart analyser reads every cycle.
A strategy with a volume floor can also watch tokens that have not reached it yet. With a pre-scan volume set below the minimum volume, a token whose 24-hour volume sits between the two lands on the radar in pre-scan: tagged, measured like the rest, never bought. If it reaches the dip threshold while in pre-scan, it is set aside for that dip — the volume that would make it a candidate is arriving after the move, and an entry would too — and it comes back on a new all-time high. If its volume reaches the floor first, it leaves pre-scan and the ordinary rules apply.
A token leaves the radar for a recorded reason — for example, it dropped out of the scan, its entry window expired, its dip bounced back before the buy, its buy was refused or waited too long, or its launch cap exceeded the ceiling. It comes back on its own terms. One that dropped out returns when it reappears, keeping the dip it was tracking. One whose window expired, whose signal was retired without a buy, or that has already been signalled, returns only on a new all-time high — a new high starts a new dip — and only if nothing is still open on it. A launch-cap rejection, or a token hidden by hand, is permanent. The hidden tab lists the most recently hidden first.
Eviction only happens on a scan that observed the market. When the screener returns nothing — an outage, a rate limit — nothing is evicted, because a blind scan is indistinguishable from an empty market.
max_launch_mcapMax Launch Market Cap ($)
Ceiling on the market cap one second after the token's first trade. A launch at a high cap is usually sniped or bundled, and the dip pattern is unreliable on it; the exclusion is permanent. Supply is read from the token. Unset skips the check.default 50,000 $ · ≥ 0
Dip detection
The entry test, and the window it opens.
For each radar token, Orus compares the current price with its recorded all-time high and uses one-minute candles to identify when the dip threshold was first crossed. The high itself is stamped to the minute.
Depth alone is not enough. A dip that happened in ninety seconds is a flash crash, and one that took two days is a dead token — so timing is bounded on both sides, measured from the high and, optionally, from launch. Liquidity at entry and, optionally, the market cap at the high have floors of their own. A ceiling on the dip itself separates a discount from a rug.
The first-dip rule is what makes an entry expire. The analyser walks candles forward from the high to the first close below the threshold; that instant starts the clock. With a window set, the entry is valid for that many minutes after the crossing and then written off — which is why a token can be rejected for being too late on a dip that is still deep. A crossing belongs to its high: a new high clears it.
dip_threshold_pctDip Threshold (%)
Minimum fall from the all-time high before an entry is considered. The analyser walks candles forward from the high to the first close below ATH × (1 − threshold/100); that instant is the first dip.default 75 % · ≥ 1, ≤ 99
max_dip_pctMax Dip (%)
Ceiling on the dip at entry. A token down more than this from its high is treated as dead rather than dipped. Unset means no ceiling.default unset · ≥ 1, ≤ 100
min_dip_timing_minutesMin Dip Timing Since ATH (min)
Floor on the time from the all-time high to the dip — the flash-crash guard. A dip that took ninety seconds is not a dip.default 5 min · ≥ 0
max_dip_timing_minutesMax Dip Timing Since ATH (min)
Ceiling on the time from the all-time high to the dip — the dead-token guard. 600 is ten hours.default 600 min · ≥ 0
min_dip_timing_launch_minutesMin Dip Timing Since Launch (min)
Floor on the time from launch to the dip.default unset · ≥ 0
max_dip_timing_launch_minutesMax Dip Timing Since Launch (min)
Ceiling on the time from launch to the dip.default unset · ≥ 0
max_first_dip_minutesMax Time After First Dip (min)
How long the entry stays valid after the first crossing of the threshold. The crossing opens a window; past it the entry is written off, which is why a token can be rejected for being too late on a dip that is still deep. A pending signal expires on it too. This is the only bound on the AGE of a crossing — max_dip_timing_minutes bounds the ATH-to-crossing duration, which is a different quantity. Left empty the window never closes, and one all-time high keeps producing entries as the price falls away beneath it.default 60 min · ≥ 1
min_liquidity_at_dipMin Liquidity at Dip ($)
Minimum USD liquidity in the pool at entry. Also passed to the screener as its liquidity floor. What decides whether you can get back out.default 5,000 $ · ≥ 0 · users: ≥ 1,000 $
min_ath_market_capMin ATH Market Cap ($)
Minimum market cap at the all-time high, in USD. A dip from a high that never meant anything is not a dip worth buying.default unset · ≥ 0
Signals
One entry per dip regime. A regime starts at an all-time high.
A buy signal carries the price at signal, the all-time high it was measured from, the dip depth and duration, the liquidity behind it and the venue it would trade on.
An agent's latest signal on a token — executed, expired or dismissed — blocks a new one only while it was raised at or after the high this dip is measured from. A signal older than the high belongs to a previous regime: the token has since made a new high and dipped again, and the strategy that entered the first dip has the same case for entering this one. A held position blocks regardless.
When a buy signal is created, the radar marks that opportunity as signalled. Sell signals come from monitoring held positions when an exit condition is met.
A pending signal does not live forever. It expires on the strategy's own window measured from the crossing, and on a global ceiling of 60 minutes regardless. And it is executed only while the dip still exists: the dip is checked against a refreshed market price at execution time and against the price implied by the buy quote, and a token that has bounced back above the threshold on either expires its signal with a dip-recovered event instead of being bought, and moves to the hidden tab until a new all-time high. So does a token whose signal expires on either clock, or whose buy is refused at the last moment — no route, no sale, a round trip or an impact past its cap — with the reason beside it. The clocks run at the start of every cycle, whatever the agent's mode or stake, and a signal past them cannot be executed by hand either.
HEY Research · optional entry filters
Public research for the rules you choose. Every HEY filter starts off.
These filters are available only on Robinhood Chain. Open the HEY Research card in your strategy, expand a group and configure only the criteria you want. Empty fields, Not used and empty state selections disable that criterion. HEY has no influence on your strategy until you configure a filter. All HEY filters start disabled. Use Clear HEY filters to turn them all off again.
All configured filters must pass. Multiple states selected within one filter mean any of those states is accepted. Yes and No are both active requirements; zero is an active numeric threshold. For example, selecting Verified token and at least 2 meaningful ships in 30 days checks exactly those two requirements. It does not enable any deployer, market or lock filter.
HEY links a Robinhood Chain contract to a published project, then supplies public building activity, token-to-project verification, recorded contract and deployer observations, pool sell depth, distribution and token locks. These are source-backed observations, not a developer reputation score. A shared deployer may be a service; an unknown project is not automatically unsafe. Coverage is limited to the projects and sources HEY has indexed.
Checks run before opening a position in automatic, simulation and manual modes. A known failed criterion refuses the entry and expires an automatic or simulated signal. Missing, unindexed, malformed or unavailable required data refuses the entry and leaves the signal pending until its normal expiry, so a later attempt can retry. A provider outage never silently bypasses an active filter. HEY never controls exits.
Builder activity is usable only when HEY explicitly says it applies to this token; a token-to-project mismatch cannot satisfy an activity requirement. Unmeasured counts are unavailable, not zero. Launch inventory is not sell depth. Token locks cover HoodLock only and are distinct from LP locks. HEY observations can lag current market conditions; each metric has its own observation time when available.
The signal keeps a HEY check containing only configured thresholds, observed values, pass/fail or unavailable reasons, observation times when supplied, and HEY source links. The activity log records refused automatic entries. These snapshots support a prospective comparison of the same strategy with and without chosen HEY filters. Current HEY data cannot reconstruct what was known before a historical entry, and no ROI improvement is claimed.
Open the HEY project link in a signal’s check to review the original research and its sources.
hey_token_verificationToken verification
Accept only these HEY token-to-project verification states. Verification establishes the link to the project; it is not a safety rating. Unset disables this HEY filter.default unset · choices: verified, unverified, mismatch
hey_verified_builderVerified builder
Require or exclude HEY’s verified-builder status. A verified builder has documented public building activity, not a guaranteed trading outcome. Unset disables this HEY filter.default unset
hey_min_project_age_daysMin time tracked by HEY (days)
Minimum days since HEY first recorded this project. This is research coverage age, not token age or the developer’s age. Unset disables this HEY filter.default unset · ≥ 0
hey_activity_statusActivity states
Accept only these HEY public activity states. Unknown means insufficient sources; dormant does not mean abandoned. Token-mismatched activity cannot satisfy this filter. Unset disables this HEY filter.default unset · choices: shipping, active, resumed, quiet, dormant, unknown
hey_min_ships_30dMin meaningful ships (30 days)
Minimum meaningful shipping events HEY measured in the last 30 days. Unmeasured activity and activity belonging to a mismatched token are unavailable. Unset disables this HEY filter.default unset · ≥ 0
hey_min_releases_30dMin releases (30 days)
Minimum releases HEY measured in the last 30 days. Unmeasured activity and activity belonging to a mismatched token are unavailable. Unset disables this HEY filter.default unset · ≥ 0
hey_max_last_ship_daysMax time since last ship (days)
Maximum days since the last public ship HEY recorded. Missing dates and activity belonging to a mismatched token are unavailable. Unset disables this HEY filter.default unset · ≥ 0
hey_min_build_momentumMin build momentum
Minimum HEY Build Momentum score, from 0 to 100. This measures recorded building activity, not reputation, safety or expected ROI. Unset disables this HEY filter.default unset · ≥ 0, ≤ 100
hey_still_buildingStill building
Require the selected HEY Still Building observation: verified activity through a tracked market drawdown. Missing or unmeasured activity is unavailable. Unset disables this HEY filter.default unset
hey_proxy_statusProxy detection
Require HEY to have detected a proxy or to have detected none. Not proxy is limited to HEY’s supported patterns; errors are unavailable. Unset disables this HEY filter.choices: proxy, not_proxy
hey_deployer_sharedShared deployer
Require the selected shared-deployer observation. A shared launch service or factory does not establish the identity or reputation of a human developer. Unset disables this HEY filter.default unset
hey_max_deployer_other_projectsMax other deployer projects
Maximum other published projects HEY associates with the deployment address. Coverage is limited to HEY’s catalog; this is not a count of all launches or rugs. Unset disables this HEY filter.default unset · ≥ 0
hey_market_statusMarket states
Accept only these market states HEY observed. These describe market conditions rather than a verdict on the team. Unset disables this HEY filter.default unset · choices: active_market, low_liquidity, no_liquidity, trading_inactive, liquidity_removed, market_abandoned, insufficient_data
hey_min_depth_usdMin sell depth at 1% ($)
Minimum USD sell depth before a 1% price move, from HEY’s decoded pool reading. This is not launch inventory or quoted current liquidity. Unset disables this HEY filter.default unset · ≥ 0
hey_max_top10_share_pctMax top 10 share (%)
Maximum top-10 address share reported in HEY’s distribution reading. Address concentration does not identify the beneficial owners. Unset disables this HEY filter.default unset · ≥ 0, ≤ 100
hey_min_locked_supply_pctMin locked supply (%)
Minimum supply percentage in HEY’s measured token locks. Coverage is HoodLock only; token locks are not LP locks. An expired lock cannot satisfy a positive threshold. Unset disables this HEY filter.default unset · ≥ 0, ≤ 100
hey_min_lock_daysMin time to next unlock (days)
Minimum days until the next measured token unlock. If several locks exist, the earliest upcoming unlock determines the remaining duration. Coverage is HoodLock only. Unset disables this HEY filter.default unset · ≥ 0
Execution
Check the buy and sell quotes, then track the trade through to its actual fill.
With Jev enabled for entries, an eligible proposal also goes to its contextual review in the same cycle: by default it needs Jev's approval, and with Jev as a veto it goes through unless Jev refuses it. Jev cannot restore a candidate rejected by the strategy. Its answer is short-lived and is checked again before execution; the price, quote, exposure and wallet checks below still apply.
Three limits are asserted first — see guard rails below. Then the token is quoted both ways: a buy of the strategy's size, and the sale of what that buy would return. No buy route, no sell route, or an immediate round trip losing more than 25% refuses the entry outright. The signal is retired, not retried, and the reason — no route, unsellable, round-trip loss — goes on the tape. This runs in every mode, so a simulation declines what a real agent would decline. The provider's honeypot and tax flags are absent on many tokens; a router quote measures the trap directly.
On Robinhood Chain, ETH is converted to WETH before a buy, and selling a token requires authorization for the swap router. Orus compares available routes before preparing the trade. A token with no route is refused before these transactions begin.
A submitted trade remains pending until its transaction outcome is known. A confirmed entry uses the amount actually received to determine the fill price. The signal retains the price observed when the opportunity was identified. Multipliers, the stop and the target are measured from the fill, so a fill above the signal price affects the position's return from the start.
An exit sells only the tokens assigned to that position, up to the amount available in the wallet. Tokens held for another position are not included. Transactions sharing a wallet are handled in sequence, and Orus checks that the position is still held before selling it.
03 — Running it
Exits, the limits that bind before capital moves, and how to read the desk.
Exits and position monitoring
Three conditions, checked in order, first match wins — and none of them trusts a single number.
At the start of every run, before the scan, each position that still holds tokens has its price, multiplier and P&L refreshed. A quote more than 100× the entry is a bad print: that tick is skipped and recorded rather than acted on.
Stop loss first. It fires when the drawdown reaches the strategy's stop — but only once a second feed agrees. The details provider is asked once, and the sell proceeds if it shows at least 80% of the way to the stop. Feeds differ by a few percent; a bad print differs by orders of magnitude. If the second feed cannot answer, the stop proceeds: capital protection does not wait on a vendor.
Maximum hold second. This is a clock, not a price: it fires even when the feed has no quote for the token — liquidity pulled, pool abandoned — at a secondary-feed price or, failing that, the last mark, and the event says which. It is the most common exit on the desk by a wide margin.
Take profit last, and for a real position the fill is checked before the sell: the router is asked what the exit would return, and the sell proceeds only if it delivers at least half the promised gain and never less than the stake. A fill that fails the check is neither an exit nor a failure; the position stays open and the next tick asks again.
With anti-dip ticked, a position that falls 50% or more below its fill — confirmed by the second feed, as a stop is — has its take profit lowered to the entry for the rest of its life: entered at $100K of market cap, a fall to $50K makes $100K the exit instead of the strategy's multiple. Arming waits if the second feed is unavailable. A real exit needs a usable router quote projecting at least the stake; fees and execution slippage can still leave a net loss. Untick it and every position goes back to the strategy's target.
With Jev enabled for take-profit exits, that proposed exit needs its contextual approval by default; with Jev as a veto, it goes through unless Jev defers it. A deferral is reviewed again on a later cycle, even below the original target, and the real fill check still applies. Jev cannot veto a stop loss, the maximum holding deadline or an explicit manual exit.
Exits sharing a wallet are processed in sequence. Separate wallets can trade independently. A failed exit does not close the position: if the swap reverts or is never confirmed, the position is marked sell-failed with the error and an attempt counter, and retried on later runs up to 3 times. Closing it would report a realised P&L for tokens the wallet still holds.
When an exit settles, realised P&L is the native the swap returned against what was spent, less the gas both legs paid, including attempts that reverted. Not oracle prices. When a position closes on the hold limit with no usable quote at all, it closes with no P&L rather than a made-up one, and the desk skips it.
anti_dipAnti-dip
Guards a position against a second dip. Once a held position has traded 50% or more below its fill price — confirmed by a second price feed — its take-profit target drops from min_sell_multiplier to 1×, the entry itself: entered at $100K of market cap, a fall to $50K makes $100K the exit. The lower target stays for the rest of that position's life while the box is ticked, and for a real position a usable router quote must project at least the stake. Fees and execution slippage can still leave a net loss. The stop loss and the hold limit are unchanged, and a stop loss at 50% or less fires before the anti-dip does. Off leaves the take profit at min_sell_multiplier.default off
min_sell_multiplierMin Sell Multiplier (x)
Take profit at this multiple of the fill price. For a real position the router is asked what the exit would return first, and the sell proceeds only if it delivers at least half the promised gain and never less than the stake.default 2 x · ≥ 1.01, ≤ 100
stop_loss_pctStop Loss (%)
Sell when the position is down this much from the fill — once a second price feed agrees the drawdown is real. Unset disables it.default unset · ≥ 1, ≤ 99
stop_loss_max_hoursMax Hold Duration (hours)
Sell after holding this long, at whatever the market pays — quote or no quote. A clock, not a price, and the most common exit on the desk by a wide margin. Unset disables it.default unset · ≥ 0.1, ≤ 720
jev_exit_instructionsJev take-profit condition
Additional condition for Jev's Premium-only take-profit review in simulation or live trading. Jev may approve an exit or defer it for another observation; deferred exits are reviewed even below the original target. Stop loss, maximum hold and explicit manual exits remain outside Jev's veto.
Guard rails
Checked before any capital is committed, in every mode.
Three limits are asserted on every buy, before the quote and before the wrap. The buy size must be greater than zero — set it to zero and the agent produces signals and never spends. The open-position cap counts open, simulated-open and sell-failed positions together, and an entry still waiting for its receipt, so a stuck exit still occupies a slot rather than quietly freeing one and a buy in flight holds its slot before it settles. The daily spend cap is a rolling 24-hour window, not a calendar day.
They are strategy fields, so two agents on the same rules can carry different ceilings by using separate strategies. Leaving one unset disables that particular limit, which is a choice worth making deliberately. A user's stake is capped at 0.05 ETH per entry whenever the strategy is created or changed.
buy_amount_nativeBuy Amount (ETH)
ETH to spend per entry. 0 means the strategy produces signals and never spends. The engine wraps it to WETH before the buy and keeps a gas reserve aside.default 0 ETH · ≥ 0 · users: ≤ 0.05 ETH · on Solana: ≤ 2 SOL
slippage_pctSlippage (%)
Slippage tolerance passed to the router, on both legs.default 5 % · ≥ 0.1, ≤ 50 · users: ≤ 15 %
max_price_impact_pctMax Price Impact (%)
Ceiling on the price impact of the entry itself: the router's estimate, or, when the router gives none, how much worse the stake fills than a twentieth of it quoted at the same moment. A buy whose own size would move the pool more than this is refused and its signal retired: the round trip would start from a hole no dip pays for. Unset disables the check.default 5 % · ≥ 0.1, ≤ 50 · users: ≤ 10 %
max_open_positionsMax Open Positions
Cap on positions held at once. Open, simulated-open and sell-failed positions all count, and so does an entry still waiting for its receipt: a stuck exit occupies a slot rather than freeing one, and a buy in flight takes its slot before it settles. Unset means no cap — the wallet becomes the limit.default unset · ≥ 1 · users: ≤ 25
max_daily_spend_nativeMax Daily Spend (ETH)
Cap on ETH committed to entries per rolling 24 hours, not per calendar day. Unset means no cap.default unset · ≥ 0
jev_vetoJev as a veto
How Jev's answer is used, when Jev is enabled on the agent. Off, Jev is a gate: an entry goes through only when Jev approves it, and a take profit only when Jev confirms it; an uncertain answer or a market too quiet to read waits. On, Jev is a veto: an entry goes through unless Jev refuses it, and a take profit unless Jev defers it; an uncertain answer or a quiet market does not block. When Jev cannot answer at all (an outage, a timeout, no time left in the cycle), the veto does what lowers exposure: an entry waits for the next cycle, a take profit goes through. Stop loss, maximum hold and manual exits are never Jev's.default off
jev_entry_instructionsJev entry condition
Additional condition for Jev's Premium-only contextual entry review in simulation or live trading. Jev evaluates observed transactions and participant histories after the quantitative filters. The condition can only add to Jev's rules, never relax them; a condition that needs observations Jev does not receive reads as uncertain. With jev_veto off, missing evidence means waiting, never automatic approval; with it on, only a refusal blocks. Enable Jev on the agent.
Reading the public desk
Everything above, live, without an account — and how each number is made.
The desk publishes the book, the trades table, the strategy board with every rule each strategy runs on, the analyses, and the decision tape — one row per decision the engine made, including the rejections and the measurement behind each one. Consecutive decisions with the same reason collapse into one row that says how many it stands for. The activity feed and summary figures refresh regularly and may update at different times. Summary figures cover the full closed book.
The book is an index. These trades never shared a wallet, so the line is what a single 12 ETH float would have done taking every one of them, indexed to 1,000 — 12 ETH because it is above the most the desk ever had deployed at once and above its deepest drawdown, so the floor holds and the slope is profit. Below 1,000 the desk is down.
A closed trade whose only exit price was a quote more than 100× its entry is withheld from the book and from the trades table, and the note under the ribbon says how many. A trade that closed on its hold limit with no usable quote counts as closed and carries no P&L. Headline figures come from the receipt when there is one; a simulated trade is marked at the routed quote.
Results are forward-tested, not backtested. A backtest with no stop loss and no maximum hold can only close a trade by hitting its target, so every closed trade is a winner by construction — which is why the numbers on the desk come from running it live instead.
04 — Your agent
Writing a strategy with your agent, what you can do by hand while an agent runs, and where a machine can read all of this.
Writing a strategy with your agent
Describe what you want; your agent drafts the rules onto the form. You read them, change what you like, and save.
On the strategies page, New strategy opens as a drawer with the form; Ask your agent unfolds a conversation beside it. You say what you are after — how much risk, how much per entry, launches or established tokens, how long you are willing to hold — and the agent answers in prose and hands back a complete strategy. It lands on the form field by field, each one marked until you edit it, and you can ask for a change as many times as you like: the next proposal replaces the last, and any earlier one can be put back with one click.
The assistant uses the supported strategy fields, their limits and the desk's published results to explain its proposal. It describes the choices that matter and the opportunities the strategy may accept or miss. It responds in the language you use. Review the proposed rules before saving them.
A proposal does not create or change a saved strategy on its own. What it proposes is validated field by field before it touches the form — a value the engine would refuse is dropped and named, a required field it left out is filled from the default and named, and a user's proposal is brought inside the same bounds as any other — and it is your Save, not the agent, that creates the strategy. Each message counts against the account's 30 chat messages a day.
Write it
The form on its own, every field editable, the same rules as always.
Ask your agent
Unfolds the conversation beside the form. The latest proposal is applied as it arrives.
Apply to form
On an earlier proposal's card: put that one back on the form.
set by your agent
The mark on a field the agent just filled; it clears the moment you edit the field.
to fit your limits
A value the agent proposed above a bound, and what it was brought down to.
Sell a position by hand
Every held position has a Sell button. It runs the same exit the monitor runs on a stop loss, now.
On an agent's page and on the dashboard, a position that still holds tokens — open, simulated, or waiting on a failed exit — can be sold on demand. The sale is not a shortcut around the engine: it raises the sell signal, quotes the router, sends the swap, reads what came back from the receipt and books the P&L net of gas, exactly as an automatic exit would, with the reason recorded as manual. A simulated position is quoted out through the router and closed at what it would have returned.
A sale starts when you request it and can take seconds or minutes to confirm. If your wallet is already processing another trade, you may see Wallet busy; retry once that transaction has finished. This message means the requested sale has not started and has not been queued for later.
A position whose exit already failed 3 times shows Retry exit instead: asking again resets its attempt budget. A user's real position sells through the delegated wallet, so automated trading must be enabled on the wallet page; restrictions on new entries do not disable exits. A sale still requires a valid wallet authorization and a successful transaction.
closed
Settled on-chain; what came back was read from the receipt.
pending
Broadcast; the receipt has not arrived yet. The next pass reads it and closes the position.
failed
The swap did not settle. The position is still held; the agent retries on its next pass.
wallet_busy
Another transaction was being signed from the wallet. Nothing was tried; try again in a moment.
Machine-readable docs
The same reference, written for a language model to read.
Everything on this page — the pipeline, the limits the engine holds itself to, every strategy field with its default, its unit and its bounds — is published at /llms.txt as a short index and at /llms-full.txt in full, following the llms.txt convention. Use these references when asking an assistant to explain Orus or help configure a strategy.
They exist so that an assistant helping you write a strategy, on Orus or elsewhere, describes the system that will actually run it: which fields exist, what each one means, what a user's strategy may not do, and what the engine refuses before any capital moves.
/llms.txt
The index: what Orus is, the chain, the pipeline stage by stage, every field in one line, the account limits, the links.
/llms-full.txt
The index plus every section of this page and the full field reference with defaults, ranges and user bounds.
04 — Vaults
Strategies open to other people's deposits: what a share is, why a withdrawal waits, and what it costs.
Current availability
Explore vaults publicly; sign in to manage your position inside the Orus app. The deposit form shows whether a new deposit is available to you.
You can compare public vaults and read their terms without an account. Once signed in, Vaults opens the catalogue inside the app, with your user menu and wallet. My positions shows your recorded deposits, holdings, withdrawal requests and vaults you curate. Vaults are in beta: the Beta label opens a short explanation and links to this guide. Creating and funding a vault requires an invited account during the beta. Creating a vault prepares a private draft if your account is eligible and creation is available. The draft does not accept deposits until the vault is opened to them.
Use the deposit form when it is enabled; do not send funds manually to a published address. A displayed capacity or wallet balance is not an invitation to transfer. Use Withdraw on the vault detail page inside the app to request all or part of your available shares and follow payments. New deposits are available only when the vault and your account are eligible and the required checks pass.
Reading the animated chart
The curve replays recorded valuations. Its movement is not a stream of new market prices.
Capital shows the vault's estimated net value in ETH: liquid assets plus the marked value of open positions, less reserved amounts and fees. Deposits and withdrawals change this total. Performance instead follows the recorded value of a share relative to the first visible observation; a deposit is not presented as trading profit.
The chart keeps a known observation ahead of its playback and moves towards it over 30 seconds. If another observation arrives sooner, playback finishes the current endpoint before continuing. It stops at the last known value and never invents future prices. The sidebar and recorded-observations table show the latest stored estimates, so they can be ahead of the animated amount.
Choose a period from 10 minutes to 30 days, pause the animation, or open the recorded-observations table. Longer histories are sampled while preserving highs, lows and interruption markers. Only the latest continuous segment is drawn after a valuation interruption. Reduced-motion preferences disable the replay animation.
The page reports delayed observations, unavailable valuations and interrupted connections. Animation pauses when open-position quote ages are missing or exceed two minutes. This display threshold does not change the engine's pricing rules. Animated amounts are never used to price deposits, withdrawals or fees, and estimated position values are not guaranteed sale proceeds.
What a vault is
A strategy somebody has opened to deposits. You hold a share of the pool, not a balance in it.
An agent normally trades its owner's money and nothing else. A vault opens one to deposits: other people send ETH, the agent trades it, and each depositor holds a share of the result. It is a different object from the agent — a frozen copy of the strategy, a new agent on that copy, and a wallet of its own with an empty book. The curator's original agent keeps running, unchanged, on their own money.
You do not own ETH in a vault; you own a proportion of it. What you are paid is your shares multiplied by what a share is worth when you are served — more than you put in if the vault has gained since, less if it has lost. The amount you deposited is kept only to show you a profit and loss line; it is never used in any conversion.
A vault can only be opened by a Premium account, on a strategy that has run unchanged for at least 24 hours and has at least 10 real closed trades. Real, not simulated: a simulated book never fails to fill and never pays more slippage than the quote, and booking the trades it could not have exited moved one desk strategy from +7.53% to −0.11% per trade.
/vaults
Every open vault, what it holds, and what a share has done. No account needed.
/vaults/terms
What you are agreeing to when you deposit. No account needed.
/app/vaults
The catalogue inside the app. Open a vault to deposit, recover a transfer or request a withdrawal. Sign in required.
/app/vaults/positions
My positions: what you hold, pending deposits and withdrawals, and vaults you curate. Sign in required.
Depositing
A deposit needs an eligible linked wallet, a verified transaction report and a successful pricing pass.
Sign in from the public vault page to open that same vault inside the app. Connect the wallet linked to your account and enter an amount in ETH. If you need to fund your wallet first, the wallet page provides a return link to this vault. The 25%, 50% and Max buttons use the smaller of your spendable native balance, available vault capacity and the per-deposit limit. ETH is kept for network fees; WETH is not automatically unwrapped. Review the amount and terms, then confirm the transfer in your wallet on Robinhood Chain.
Before each confirmation, Orus rechecks the account balance, network, vault status and a valid valuation no older than two minutes, including open-position mark ages. This is an availability check, not a reservation. A competing deposit or market move can fill the vault before allocation; an over-cap transfer receives no shares and is owed back, with no promise of an immediate refund.
Follow the deposit status on the same page: a recorded or confirmed transfer is still waiting; only 'Deposit complete · shares credited' means shares exist. If the page closes after sending, return using the same wallet to resume tracking. If the wallet's response was lost, use 'Recover an existing transfer' with its transaction hash. Recovery never sends another transfer and remains available when new deposits are disabled.
The vault's address is printed on its page and you can read its balance on the explorer — that is the point of publishing it. Your deposit is credited to the address the ETH actually came from, read off the chain rather than from anything your browser said: the address is public, and whoever reported a transaction first would otherwise take the shares for a transfer somebody else made.
A deposit must receive the required blockchain confirmations before it can be priced. Unresolved transactions or inconsistent balances pause pricing. A successful valuation turns the deposit into shares at that valuation, rather than the figure on screen when you sent it. Market prices can change while you wait.
Open positions contribute an estimated market value to the vault. Pricing uses recorded position values up to 2 minutes old and does not obtain an executable sale quote for the whole position during pricing. Older or missing marks pause deposit and withdrawal pricing. A mark within that age limit can still be wrong after a fast market move, and the displayed value is not guaranteed sale proceeds.
Verified transfers without an identified depositor are held aside. Native transfers still need their transaction hash to identify the owner. Until attribution, excess ETH or WETH is excluded from share value, fees and spendable cash. After a vault closes to deposits, a valid report waits for confirmations and a canonical-block check, then records a refund owed without issuing shares. Recording a refund owed does not mean it has been paid. Payment may require assistance from Orus support.
minimum
0.001 ETH. Below that a deposit can round to no shares at all.
per deposit
Maximum 5 ETH, also limited by available capacity and spendable balance. This matches the current refund transfer limit; larger rejected transfers cannot be returned automatically in one payment.
from
An eligible wallet linked to your account. Do not use an exchange withdrawal address. The withdrawal destination is pinned to your first accepted funding address.
cap
A strict limit on new capital, checked at pricing. A deposit that would put the vault's net value above the cap receives no shares and is owed back in full. At 9 ETH under a 10 ETH cap, 1 ETH fits and 2 ETH does not. A rejected deposit leaves room for smaller deposits. Later market gains can take the vault above its cap.
Withdrawing
You ask, and you are paid from the vault's free cash, pro rata with everyone else asking.
On the vault detail page, sign in, choose a percentage of your available shares (100% for all), review the estimated ETH amount and your original funding address, then confirm. The estimate is not a guaranteed payout. You can follow each payment on the explorer and cancel only the unpaid remainder before its payment starts. A lost response can be retried as the same request.
When cash is held in WETH, the vault converts the needed amount to ETH, waits for confirmation, and takes a new valuation before paying. Fees, pending deposits and gas reserves remain protected. A payment is capped at 5 ETH and larger requests are paid in instalments. The final holder can still have a residual claim on the gas reserve; vault closure is not yet enabled for public funding.
A withdrawal request joins a queue. The vault never force-sells a position to pay you faster. On a book where an immediate round trip can lose a quarter of its value and exits already fail, selling on demand destroys more than it releases. Cash comes back as positions close on their own clock, which is why a vault's strategy must have a maximum holding time: that number, plus processing allowance, is a configuration value, not a promised or observed withdrawal time. Failed exits or outages can extend the queue indefinitely.
The queue is pro rata rather than first-come. In a strict queue a ten ETH request ahead of a small one blocks it until ten whole ETH have accumulated, which makes your wait a function of somebody else's size. Pro rata makes everyone's wait the same multiple of their own claim. The curator's own shares are served after every depositor's, and are frozen entirely while a rule change of theirs is pending.
Your shares are burned when you are paid, not when you ask, so you stay exposed while you wait — in both directions. Locking the price at the moment of asking would let somebody leave at the top and hand the fall to whoever stayed. Cancellation is allowed before a payment starts. A new request has a new timestamp; allocation is still pro rata, not first-come.
queued
Waiting for free cash. Priced and paid at the next pass that has some.
served
Paid in full and the shares burned. The transaction is on the explorer.
cancelled
The request was cancelled. Asking again creates a new request; allocation remains pro rata.
What it costs
6% of what a vault gains above its own record, and nothing at all on what it loses.
3% to the curator and 3% to Orus, charged only on the rise in the value of a share above the last per-share peak used to settle fees. That rise includes the estimated value of open positions. A vault that falls twenty per cent and climbs back twenty per cent is charged nothing: its record has not been beaten. The value per share you see is always net — the fee is subtracted from it as it accrues, whether or not it has been collected yet.
Fees become payable every 30 days, before a new deposit is turned into shares, and before a funded withdrawal is paid. Between those events the estimated fee can fall back to zero. Once made payable, a fee is not reversed by a later loss: a vault can therefore finish a period down after paying fees on an earlier gain. Recovering below the high-water mark does not itself create another fee.
Measuring it before a deposit is what keeps a newcomer out of a fee they did not earn. The fee accrues on every share against one record, so shares struck at the net price would otherwise carry a slice of a rise that came before them; settling the fee first moves the record to the price they paid, and nothing above it is left to charge them on. The holders already in pay exactly what was already subtracted from their value, and no more.
One consequence worth stating because it runs against us: somebody who joins after a fall pays nothing until the old record is passed, even though the vault gained while they were in it. That is a known cost of measuring per share, it favours the depositor, and we are not going to fix it in the direction that does not.
A vault's agent pays no per-trade fee, and it is not on the leaderboard or in the daily prize. It carries its curator's account, so every position it opened would otherwise land in the curator's personal record — showing depositors' money as their own, and letting them win a prize with capital that is not theirs.
What can go wrong
It is custodial, the curator picks the tokens, and a vault can go to zero.
Orus keeps the register of shares, not a contract. The wallet uses Privy infrastructure. Orus authorizes transactions and administers its policies; the curator has no direct access to the key. A compromised Orus authorization key can put funds at risk. Per-transaction caps are not cumulative limits and do not prove that a payment's recipient is a depositor. But your shares are rows in our database. If you need a guarantee that outlives this company, this is not yet it.
The curator chooses what it buys and you do not see the rules. That is what they are bringing. They have no direct signing access and cannot change the rules without a notice period, during which you can request a withdrawal subject to the cash queue — and the notice tells you which parts of the strategy are changing, in plain words, without the numbers. What they can do is lose your money by trading badly, or on purpose, and no arrangement described here prevents that.
Positions nothing will buy are valued at zero, for a deposit and for a withdrawal alike. A token whose exit has failed its last attempt is worth nothing to whoever arrives and nothing to whoever leaves, so neither of them can trade against the other's optimism. The share of a vault in that state is published on its page.
This is a directional trading strategy on newly launched tokens. It is not a rate, nothing about it is annualised, and you should deposit only what you can lose entirely.
05 — Jev validation
What Jev adds to your strategy, when to use it, and how to read its decisions. Optional for Premium, in simulation or live trading at your choice.
What is Jev?
An AI model that makes a specific decision from the observations it receives.
Jev is an evaluation model from TypeSafe AI. It interprets observations against written criteria and returns one of a defined set of answers. In Orus, that answer can approve, refuse or delay an entry, or approve or defer a take-profit exit.
Think of it as a contextual reviewer inside your agent. Your strategy first checks its numeric rules, such as dip depth, liquidity and position limits. If you enable Jev for the proposed trade, the agent waits for its decision in the same trading cycle. By default only an approval continues to execution; with Jev as a veto, any answer but a refusal or a deferral does. Price, quote and wallet checks still apply.
The strategy assistant helps you write rules before you save them. Jev instead evaluates a trading opportunity while your agent runs. It does not rewrite your strategy, choose your stake, predict a target price or receive permission to sign transactions.
When the order and persistence of trading activity matter more than another threshold.
Two tokens can pass the same volume and dip filters while showing different activity. In one, purchases follow an initial sell-off and remain held across observations. In the other, recent buyers quickly sell back out. A volume total hides that sequence; Jev can assess it against your entry criteria.
At a take-profit trigger, you can ask whether observed purchases are still being retained while selling is absorbed. Jev may allow the exit or defer it for another review. Deferring keeps the position exposed: a later exit can be worse than taking the original profit.
Use ordinary strategy fields for exact requirements such as minimum liquidity, maximum stake or a holding deadline. Use Jev for a question about the supplied sequence of events. If that question needs facts Orus does not provide, Jev should return insufficient evidence. More reviews or fewer trades do not by themselves mean a better strategy; any improvement needs a comparison.
Enable Jev on an agent
Choose the decisions you delegate. Your execution mode remains your choice.
Jev is Premium only, unlocked by holding 3M $ORUS. In the agent form, open Jev contextual validation and choose Entries, Take-profit exits, or Entries and take-profit exits. Disabled keeps the ordinary strategy behavior. Save the form to apply your choice.
Simulation uses simulated positions. Automatic uses real trades through your configured wallet. Enabling Jev does not switch between them or start an agent. New agents initially use simulation; changing an existing agent to Automatic follows the usual wallet setup.
The switch belongs to each agent. Optional written conditions belong to its strategy, under Buy Position and Sell Criteria. Saving a condition does not activate Jev, and agents sharing that strategy read the same conditions. Leaving both conditions blank uses the standard review criteria, which you can expand in the form. Jev and Fly cannot be enabled together on the same agent.
Changing a saved condition is a strategy risk change. For a user-owned strategy, its automatic agents return to simulation when that condition changes, just as when the stake or stop changes. Review the new criteria before choosing Automatic again. Simply changing the agent's Jev scope does not change its execution mode.
You can turn Jev off to return to ordinary strategy decisions on subsequent cycles. This does not close positions or erase the journal. Pausing an agent stops new entries; held positions remain monitored. If Premium access is lost, Jev reviews stop and delegated entries and take profits wait until access returns or Jev is disabled. Stop loss, maximum holding time and manual exits remain available.
Gate or veto
Decide whether Jev must approve a trade, or may only stop one.
By default Jev is a gate: an entry goes through only when Jev approves it, and a take profit only when Jev confirms it. An uncertain answer, a market too quiet to read or an unavailable review all mean waiting. Expect few trades: on memecoin dips Jev rarely sees enough to approve.
Tick Jev as a veto, under Buy Position, and Jev can only block: an entry goes through unless Jev refuses it, and a take profit unless Jev defers it. An uncertain answer or a quiet market no longer blocks. Your strategy's rules decide, and Jev stops the trades it can see going wrong.
When Jev cannot answer at all, because of an outage, a timeout or no time left in the cycle, the veto does what lowers exposure: the entry waits for the next cycle, and the take profit goes through. Stop loss, maximum hold and manual exits are never Jev's, in either mode.
The mode belongs to the strategy, like the written conditions. Switching it is a strategy risk change: automatic agents on a user-owned strategy return to simulation.
Write an entry condition
Describe the evidence you want before accepting a dip that already passed your rules.
The standard entry review looks for demand that persists after initial selling. It can refuse an opportunity when purchases are rapidly reversed or selling continues, wait when an observed transition needs another sample, or report insufficient evidence when the available history cannot distinguish those readings.
Example: “Require purchases after the initial sell-off to remain held across the available observations; rapidly reversed purchases should not count as persistent demand.” This asks about event order and changes in observed holdings, rather than repeating a volume threshold.
Write one clear, observable requirement in the Jev entry condition field, up to 500 characters. It adds to the standard criteria and cannot relax them. Avoid requests such as “only buy tokens that will double” or “prove the wallets are independent”: future returns and unknown wallet relationships are not evidence Jev has. With the gate, a condition that cannot be established may leave an entry waiting until its window expires; with the veto, it can still refuse an entry on the evidence it has.
Write a take-profit condition
State what would justify keeping the position after the profit target is reached.
The standard exit review validates the proposed take profit unless the observations sufficiently support continuing the position. Holding requires purchases retained over time and selling being absorbed; a higher price alone is not enough. With the gate, missing or contradictory evidence does not authorize the delegated exit; with the veto, it does not stop it.
Example: “Defer the take profit only while successive observations show retained purchases and absorption of selling; do not defer on price strength alone.” Write this in Jev take-profit condition, up to 500 characters. The condition helps qualify a deferral; the stop-loss percentage and holding deadline still belong in their normal strategy fields.
A deferred take profit is reviewed again on a later cycle, even if the price has fallen below the original target. A real sale must still pass the existing take-profit fill check. Stop loss, maximum holding time and an explicit manual exit bypass Jev's decision, while retaining their normal execution checks. Jev can delay a take profit, but it cannot veto those exits.
Read the decision journal
A model decision and a completed trade are two separate events.
Open Jev on the agent page to see the latest reviews. Decision is the model's answer or the review's status. Applied action records what the engine subsequently did. An approval can still expire or be stopped by a changed setting, a price or quote check, unavailable funds or a failed transaction. A pending action is not a settled trade; No recorded action is not proof of execution.
No reviews yet can mean there has been no eligible entry or take-profit trigger for the enabled scope. Jev does not run on every scanned token. When a review cannot run because of a timeout, unavailable service or a cycle's time budget, an entry is never approved by default: it waits within its existing window. A take profit remains open for a later review with the gate, and goes through with the veto. Protective and manual exits remain available.
View under Evidence opens the captured observations, saved criteria and structured answer. It lets you inspect what was actually available at decision time. Any returned choice probabilities describe the model's assessment of those choices, not the chance of making a profit.
Mode says how each answer was applied, gate or veto: the same Insufficient evidence waits under the gate and goes through under the veto. When an entry Jev let through does not complete, Applied action gives the engine's own reason, for example an approval that expired before the quote was ready, a busy wallet or an unavailable on-chain rehearsal; that is the engine, not Jev refusing. Signals waiting for Jev lists the agent's pending entries and the last review each one had; Not reviewed yet means none has been recorded so far, because the cycles that looked at it had no time left or no price to review it at.
Entry approved
The proposed entry may continue through execution checks. It is not yet a confirmed purchase.
Entry refused
This opportunity is retired. It does not permanently ban all future opportunities in the token.
Waiting for another observation
An observed transition needs another sample. With the gate, the signal can be reconsidered while its entry window remains valid; with the veto, the entry continues to its execution checks.
Exit approved
The proposed take profit may continue through the exit checks.
Take profit deferred
Keep the position for another review. Stop loss and maximum hold still apply.
Insufficient evidence / insufficient data
The observations cannot support the required decision. With the gate the trade waits; with the veto it goes through. Insufficient data means the market was read and was too quiet; an unreadable market is Unavailable.
Unavailable / budget exhausted
The review could not complete in this cycle. This is an operational outcome, not a negative judgment on the token.
What evidence does Jev use?
Recent transactions and changes in observed holdings, with gaps kept visible.
Orus supplies the last thirty minutes of buys and sells, up to 150, with times, amounts and pseudonymous participant identifiers, the dip the strategy measured (the all-time high, how deep and how long the fall, where the price stands against that high now), the largest traders of the last 24 hours with their purchases and sales over that window (and their holdings where the data provider reports them), and earlier observations when available. The proposed trade's context includes the current price, entry or dip information, and whether a take profit was already deferred.
The sample is bounded and can miss trades or holders. A single balance cannot prove that someone retained a recent purchase; that requires observations over time. Unknown wallet relationships remain unknown, and different identifiers do not prove independent traders. Missing values are kept missing rather than treated as zero or a sign of safety.
Jev only evaluates the observations supplied for that review. It does not independently browse social media, inspect private chats or see future trades. Your optional text cannot add a data source. The journal exposes coverage information so you can distinguish an uncertain market reading from incomplete input.
Compare with and without Jev
Measure whether contextual decisions help your strategy, including the opportunities they miss.
Public agent, strategy and account pages identify the current JEV scope and how many agents use it. The With JEV leaderboard filter selects current configurations; it does not turn the historical P&L into a JEV performance measurement. Public activity covers the last 24 hours and follows the selected real/simulation filter, independently of the chart period.
Public activity separates model responses, missing data before a review, and unavailable or expired reviews. Repeated reviews of one signal or held position count as one distinct opportunity. An approval is separate from a confirmed execution. Detailed examples are published only for ORUS agents; user instructions, tokens under review and individual observations remain private.
For a comparison, create two agents using the same strategy, execution mode, cadence and starting conditions. Leave Jev disabled on one and enable a chosen scope on the other. Run them over the same period without changing the parameters midway. Simulation lets you do this without risking funds; it is a testing option, not a restriction on Jev access.
Compare net realized results after trading costs, open exposure and drawdown, trade count, entries refused or missed, and exits deferred. Read the journal for unavailable or insufficient reviews and added latency. A higher average profit per completed trade can hide fewer opportunities or losses still held open. Different holdings can also make the agents encounter different later opportunities, despite identical rules.
If a frozen experiment comparison is attached to the agent, its table also shows review errors, latency and reported inference costs. Open marks are estimates, and the displayed inference cost is not the total cost of market data. Frozen comparison agents remain in simulation to keep the experiment consistent; ordinary Premium agents may use live trading.
Jev can misread context, miss an entry or postpone an exit that would have been better taken. Its availability and structured answers do not establish a performance benefit. Judge results over enough opportunities and different market conditions before attributing a difference to the model.
07 — Personal API · private beta
Read your data, edit strategies, create paused simulations and control your agents with scoped personal keys, from a script or from an AI assistant connected through MCP and OAuth.
Create and revoke a key
Personal keys last 90 days. Up to 5 active keys per account.
Every signed-in account can see Connections. Issuing or using a key still requires the service to be switched on. An administrator's personal key never inherits operator access or reads another account's data. An administrator's own console agents and strategies belong to the house, not to a personal account, so an administrator's key lists nothing: test the API with a personal account.
Open Connections, name the key and select the permissions you need. Only agents:read and strategies:read are selected initially; additional reads and writes are optional. Existing keys keep their original scopes. Save the secret immediately: it is shown only once. There are at most 20 creations per rolling 24 hours. If key creation times out, refresh the list, revoke the new key and create a replacement; the secret cannot be recovered.
Send the key in the Authorization header as Bearer followed by the secret. Never put it in a URL, chat or repository. Cookies and partner scan keys cannot authenticate this API. Example with securely supplied environment variables: curl --fail-with-body -H "Authorization: Bearer $ORUS_API_KEY" "$ORUS_ORIGIN/api/v1/agents?limit=25".
Revocation asks you to confirm the key's name and blocks new requests. Already admitted reads may finish. Writes recheck the credential inside their transaction; a transaction that wins the lock before revocation may complete. Revocation does not stop agents or erase third-party copies. Invited accounts can still revoke keys while the API is switched off.
Read only your resources, plus explicitly published strategy templates. Every data family has a separate permission.
Responses contain data and request_id. Lists contain data.items and data.next_cursor; send the cursor as after. The default limit is 25 and the maximum is 100. IDs, revisions and base-unit amounts are strings: do not convert large integers to JavaScript numbers. Results are ordered by ID; pages are not a point-in-time snapshot. Activity, position, fee and report lists accept an optional agent_id. Unknown or repeated query parameters are rejected.
Events and alerts cover a rolling seven-day window returned in data.window; older events are outside this endpoint's contract. Alerts are entry, exit and signal events, not the console's aggregated alert cards. Watchlist results include historical states and have no reliable price observation timestamp. Positions return stored marks and price_at; a missing or old timestamp is not a fresh quote.
Wallet reads return read_started_at and read_completed_at, nullable balances and individual read errors. ORUS balance can be cached; price_observed_at is null because the source does not supply a reliable per-price timestamp. Amounts are decimal strings in the named asset's units, converted from the existing balance reader, not exact on-chain base units. No reconciliation, signing or delegation is performed. Unknown values are never replaced with zero.
Saved reports do not trigger paid generation. Detailed token summaries stop at 100 entries and declare tokens_truncated; raw provider payloads are omitted. JEV returns stored decisions, hashes, available probabilities and usage, not the policy or raw context. Strategy rules include your own JEV instructions. Optional strategy fields may be absent during a compatible rollout; treat them as unavailable, never zero or default.
GET /api/v1/me
Account ID, tier, allowances, key ID and granted scopes. No additional read scope.
GET /api/v1/agents
Personal agents and configuration revisions. agents:read.
GET /api/v1/agents/{id}
One personal agent. agents:read.
GET /api/v1/strategies
Personal strategy rules and revisions. strategies:read.
GET /api/v1/strategies/{id}
One personal strategy. strategies:read.
GET /api/v1/strategies/templates
Available house templates, without private account strategies. strategies:read.
GET /api/v1/strategies/schema
Field types, descriptions, choices, defaults and account bounds by chain. strategies:read.
GET /api/v1/positions
Personal positions with chain, stored marks and units. positions:read.
GET /api/v1/positions/{id}
One position owned through your agent. positions:read.
GET /api/v1/runs
Run summaries without raw engine errors. activity:read.
GET /api/v1/events
Event summaries from the last seven days; no raw detail payload. activity:read.
GET /api/v1/signals
Stored entry signals without raw metadata. activity:read.
GET /api/v1/watchlist
Stored watchlist including historical states, not just active radar tokens. activity:read.
GET /api/v1/alerts
Entry, exit and signal events from the last seven days. activity:read.
GET /api/v1/wallet
Read-only ETH, WETH, ORUS and SOL balance snapshot. wallet:read.
GET /api/v1/wallet/fees
Your recorded performance fees. wallet:read.
GET /api/v1/reports
Saved report metadata and status. reports:read.
GET /api/v1/reports/{id}
Saved analysis when ready, plus selected report summary fields. reports:read.
GET /api/v1/jev
Stored JEV decisions and proof hashes. reports:read.
GET /api/v1/jev/{id}
One JEV decision, available probabilities and usage; no policy or raw context. reports:read.
Writes require explicit scopes and a separate service switch. New API agents are paused simulations with JEV off; a dry run only needs the read scope.
strategies:write can alter the future behavior and trades of an already running agent. Changes to buy_amount_native, slippage_pct, max_open_positions, max_daily_spend_native, stop_loss_pct or JEV instructions switch affected personal automatic agents to simulation and return their IDs and names. Other rule changes keep the current mode. Existing positions remain real. Review this permission as a sensitive capability even though no order endpoint is available.
For a PATCH, read revision first, then include expected_revision as the same decimal string. Example: {"expected_revision":"12","name":"My strategy"}. A stale value returns 409 revision_conflict with current_revision and resource. Reload, reconsider the change, and use the new revision; do not retry blindly. Strategy editing and risk disarming are one transaction. Validation previews reserve nothing and return normalized fields, risk_fields and would_disarm.
All POST operations that create or copy resources require a unique Idempotency-Key (1–128 letters, digits, dot, underscore, colon or hyphen). Keep it and the original request unchanged for a retry after a timeout. First creation returns 201; replay returns 200, replayed: true, and the same IDs with their current representation. Reusing the key with different parameters returns 409 idempotency_conflict. Deleted results return 409 creation_gone. Revalidation may reject a replay if source access, account limits or schema constraints changed; do not switch to a new key until checking the original resources.
Creation requires a complete strategy rules object; use /strategies/schema to obtain defaults and bounds, or clone an available template. Copy requests accept an optional name; send {} if omitted. Requests require application/json and at most 32 KiB. Agent creation accepts exactly one of strategy_id or strategy. Creating an inline strategy or duplicating an agent requires both write scopes. Owner, chain identity, vault flags, live mode, status and JEV mode cannot be supplied as overrides.
agents:write creates paused simulations and edits names or the tier-defined cadence. Start, pause, run and sale are separate action scopes (next section); there is no external go-live, withdrawal, delegation, vault mutation or paid report generation. Frozen or vault-backed resources cannot be edited through these controls. Copying readable strategy rules creates fresh personal settings without copying vault identity, performance history or activation. Write responses reveal the resulting resource configuration, even when a separate read scope was not granted.
POST /api/v1/strategies
Create a strategy from a complete rules object. strategies:write; Idempotency-Key required.
PATCH /api/v1/strategies/{id}
Edit rules with expected_revision; returns disarmed_agents. strategies:write.
POST /api/v1/strategies/validate
Validate {strategy}, or {strategy_id, expected_revision, strategy} for an edit, without saving: a dry run is a read. strategies:read.
POST /api/v1/strategies/{id}/clone
Copy a house template into your account; optional name. strategies:write; Idempotency-Key required.
POST /api/v1/strategies/{id}/duplicate
Copy your own strategy; optional name. strategies:write; Idempotency-Key required.
POST /api/v1/agents
Create with name and either your strategy_id or inline strategy. agents:write; inline creation also needs strategies:write. Idempotency-Key required.
PATCH /api/v1/agents/{id}
Rename or align frequency_seconds to your tier; expected_revision required. agents:write.
POST /api/v1/agents/{id}/duplicate
Copy your own agent and strategy; optional name. agents:write + strategies:write; Idempotency-Key required.
Control, run and sell
Three actions behind their own switch and their own scopes, never preselected. Each one re-checks the key right before acting.
agents:control pauses or stops any agent, live included, starts a simulation, or moves an agent back to simulation. It never sets automatic: going live is a decision about money and stays in the console with its funding pre-flight, and a key cannot start an agent that is still automatic unless the same call moves it to simulation. Exits keep running on a paused agent, as they always do. Send expected_revision from the agent you read; a stale one answers 409 revision_conflict.
agents:run runs one cycle now, under the same claim the cron takes, so a cycle already in flight answers 409 run_in_progress and a call less than the engine's floor after the last one answers 429 too_soon with Retry-After. A cycle on an automatic agent can buy: treat this scope as exposure. The response says whether a full cycle or a monitor pass ran, and what it scanned, found and signalled.
positions:exit sells one position now, through the same exit the stop loss takes: the wallet lease, the re-read under it, the router, the receipt, the P&L net of gas. It is irreversible. A row already closed answers 409 not_sellable with its status, a sell already on its way 409 exit_in_flight with its transaction, a wallet signing elsewhere 409 wallet_busy; retry the same call, nothing is sold twice. The mark returned is what seeded the sell signal, not a guaranteed price; a real exit prices itself from the receipt. A call can take up to five minutes.
All three are refused with 503 disabled while the actions switch is off, and count against the same account budget as every other request. Rejected calls leave no position, agent or wallet changed.
Run one cycle now; no body. agents:run. Can buy on an automatic agent.
POST /api/v1/positions/{id}/exit
Sell one position now; no body. positions:exit. Irreversible.
Connect Claude or ChatGPT (MCP)
Paste one of the messages below into a new Claude or ChatGPT conversation: the assistant walks you through the connection and checks it. Every endpoint of this API is a tool, authorized by OAuth with the permissions you approve.
Server: https://www.orusagent.xyz/api/mcp, one JSON-RPC message per POST, no session. Nothing is granted before you approve on the consent page. A script can call it too, with a personal key as Bearer.
Each tool is the endpoint it names — orus_list_agents is GET /api/v1/agents — with the same permissions, quotas, audit and answers; the assistant sees only the tools its permissions allow. No tool can go live, buy, withdraw, delegate or change a wallet. orus_run_agent and orus_exit_position are irreversible, and the assistant is told to ask you first.
OAuth follows the MCP specification: resource metadata at /.well-known/oauth-protected-resource/api/mcp, PKCE S256, fifteen-minute access tokens bound to this endpoint, rotating refresh tokens. Revoke an assistant on Connections and every token it holds stops at once.
Connect to Orus, my trading desk on Robinhood Chain and Solana, through its MCP server.
Server URL: https://www.orusagent.xyz/api/mcp
Authorization: OAuth. No client id, no secret: Orus will ask me to sign in and approve permissions.
1. Walk me through adding it in Claude: Settings → Connectors → Add custom connector, name "Orus", the URL above, advanced fields empty, then Connect. Wait until I say it is connected.
2. Then call orus_get_account and orus_list_agents and tell me what you see.
3. From then on: read before you write, validate a strategy before saving it, keep the revision you read, and always ask me before orus_run_agent or orus_exit_position — they are irreversible.
Reference: https://www.orusagent.xyz/mcp-agents.txt
Orus MCP Guard is an optional local connector for preparing new strategies and simulation agents in Claude Code. Beta version: 0.1.0-beta.2, MIT licensed.
Requires macOS or Linux, Node.js 22.12+ and Claude Code 2.1.286+. Install Eyebrow 0.5.6 separately from its official release and verify the release checksums. This beta supports that exact Eyebrow version and checks the official binary fingerprint before execution. Install Eyebrow outside ~/.orus-mcp-guard.
Create a dedicated key in Connections using the Reads, and design strategies and simulations (no actions) preset: exactly agents:read, strategies:read, positions:read, activity:read, wallet:read, reports:read, agents:write and strategies:write. Leave control, run and sale permissions off. Setup refuses missing or extra permissions. Enter the key only at the hidden terminal prompt, never in your assistant conversation.
Close other Claude Code sessions and run the installation commands below. Setup registers orus-guarded through the Claude CLI and respects CLAUDE_CONFIG_DIR. If Eyebrow is not on PATH, add --eyebrow /absolute/path/to/eyebrow. Restart Claude Code, check /mcp, disable any separate Orus connector for that session, and check that a project configuration does not override orus-guarded.
Calls follow Claude Code → local Eyebrow → Orus MCP. Reads, validation and creation of new strategies or agents are allowed. New agents stay paused in simulation with Jev off and use normal account quotas. Edits to existing resources, agent duplication, controls, runs, sales and unknown tools are blocked. Start simulations in the Orus console. Writes are not retried automatically; after a timeout, check Orus and reuse the same idempotency key if retrying.
The key is stored as plaintext in ~/.orus-mcp-guard/credential with file permissions 0600 and directory permissions 0700, then sent to Orus over TLS. Local Eyebrow processes tool traffic; the assistant sees requested data. No remote Eyebrow service or audit upload is configured. Audit files record tool names, timestamps, status, argument hashes and network metadata; hashes are not anonymization and logging is best effort.
On macOS, Eyebrow's sandbox lets the connector reach the network only through its proxy. On Linux, Eyebrow 0.5.6 provides no sandbox for this connector: it cannot start it where bubblewrap is installed and runs it unconfined elsewhere; the connector still sends every request through the proxy. session_start records the backend. Local software running as you can read the key or bypass these controls. This connector does not certify the private Orus engine or protect direct Claude.ai or ChatGPT connections.
Run orus-mcp doctor to check the connection without changing resources. Close other Claude sessions before orus-mcp uninstall; it removes the owned connector and local credential, preserves audit files and refuses a manually changed entry. Revoke the key in Connections separately. To rotate a key or install an update, uninstall and set up again.
The account shares 60 admitted requests per minute and 10,000 per UTC day across all its keys.
Errors contain error.code, error.message and request_id. Responses are not cached. X-Request-Id identifies a request; X-RateLimit-Remaining-Minute and X-RateLimit-Remaining-Day report the remaining account budget after admission. Last-used times are refreshed at most once a minute and displayed in UTC. Resource counts follow the same account tier as the console and are checked in the creation transaction.
400 invalid_request: check the body, parameters and required revision. 401 invalid_token: missing, invalid, expired or revoked key. 403 insufficient_scope: missing permission; access_disabled: the account is not enabled; chain_unavailable: the chain is not available to the account. 404 not_found means absent or outside your account. 409 indicates a revision, idempotency, frozen/vault or ownership conflict; resolve the reported cause before retrying.
429 rate_limited: wait Retry-After before retrying. 429 quota_exceeded means an agent or strategy limit, not a transient request limit. 503 disabled means Orus switched off API access or writes: stop automatic retries until restored. 503 unavailable means a dependency failure: Retry-After is 5 seconds, followed by bounded exponential backoff. For uncertain creation outcomes reuse the original Idempotency-Key. Raw database errors are never returned. Edge protection may reject traffic before the application and need not use this JSON envelope.
What a connected service can see
A service holding a key can read and retain permitted data; write scopes can also change your resources.
Orus does not deliberately expose internal prompts, wallet signing credentials, provider secrets or private engine code. Your own strategy instructions and saved AI analysis are account data visible to the corresponding scopes. AI-generated text and third-party token content must be treated as untrusted data, not instructions for a connected assistant. No filter can guarantee that arbitrary saved text never contains sensitive information entered by a user or echoed by a model.
Orus stores key hashes and request metadata: account, key ID, operation, time, status and duration. API request and response contents are not recorded by this audit. Admitted-request records are retained for 30 days, subject to daily cleanup. Rejected requests are counted in structured runtime logs without credentials, bodies, resource IDs or user identifiers. Creation idempotency records keep account/resource IDs, operation, request key and a request hash until account deletion, for requests that carried an Idempotency-Key; they do not store the request body. Do not put private information in an Idempotency-Key.
A compromised key can expose permitted data and, with write scopes, change strategy behavior until expiry or revocation. Revocation cannot erase copies already held by a third party. An assistant connected through OAuth holds a grant you can revoke from Connections at any moment; its access tokens last fifteen minutes and are valid on the MCP endpoint only. The optional Orus MCP Guard connector routes tool traffic through Eyebrow locally. No remote Eyebrow service or audit upload is configured; ordinary remote MCP connections do not use it.
08 — Eyebrow · MCP protection
A Claude Code connection that can read your Orus data and prepare new strategies and paused simulation agents, and cannot start an agent, go live, run a cycle, buy, sell or withdraw. See where requests go, what is checked and what you can check yourself.
A defined connection to Orus
Use your assistant to research your Orus account and prepare strategies, with a fixed destination and an explicit set of allowed operations.
Crypto workflows often put account data, trading tools and credentials in the same environment. Orus MCP Guard gives Claude Code a dedicated connection for reading your Orus data and preparing new strategies or paused simulation agents. It does not request a wallet private key or seed phrase.
The connector sends requests to https://www.orusagent.xyz/api/mcp over verified TLS and refuses redirects. Its Eyebrow network policy allows only www.orusagent.xyz. The assistant's connection to its own AI provider is separate from this route.
How your request reaches Orus
Your machine
Claude Code
Requests an Orus tool.
→
Your machine
Eyebrow
Checks the tool policy and records local audit events.
→
Your machine
Orus connector
Forwards allowed requests to the fixed Orus endpoint through Eyebrow's network proxy.
→
Orus service
Orus MCP
Checks your key, permissions and account ownership, then returns the result.
Responses return along the same path. Forbidden tool calls are refused locally. No remote Eyebrow service receives this traffic.
The API key, the connector and Eyebrow each enforce part of the boundary.
Your dedicated Orus key excludes agent controls, manual runs and sales. The local connector and Eyebrow also block edits to existing agents and strategies, agent duplication and unknown tools. This matters because the key's write permissions also permit edits: the local preparation policy narrows them to the supported creation operations.
You can read account data, validate a strategy, create or copy a strategy, and create an agent. New agents remain paused in simulation with Jev off. Review and start them in Orus. Adding a new tool to the remote Orus server does not automatically add it to this connector's allowlist.
At startup, Orus MCP Guard checks that its saved policy matches the profile bundled with the installed connector and that the Eyebrow executable matches both its saved fingerprint and the official 0.5.6 binary pinned for your platform. Setup verifies those official bytes before executing the binary. A policy mismatch or an unrecognized Eyebrow binary prevents this connector from starting. Install Eyebrow outside ~/.orus-mcp-guard. Review updates before installing and setting up again.
Eyebrow applies the local tool policy, records audit events and limits the destinations reachable through its network proxy. On macOS, its Seatbelt sandbox lets the connector process reach the network only through that proxy, write only to ~/.orus-mcp-guard/run and temporary files, keeping its next-launch settings and audit files outside that workspace, and not read a fixed list of credential folders such as ~/.ssh and ~/.aws. On Linux, Eyebrow 0.5.6 confines nothing for this connector: where bubblewrap is installed, Eyebrow cannot start the connector, because its profile mounts over credential paths such as ~/.npmrc and fails when one is missing or is a file; elsewhere the connector runs unconfined, and goes through the proxy only because it is built to. Other files you can read remain readable to the connector. The session_start audit event records which backend was used.
Who sees your data
Eyebrow runs locally in this integration. No Eyebrow account, cloud API key or BROW token is needed.
The local Eyebrow process handles MCP requests and responses. Orus receives authenticated requests, and your assistant receives the data it asks for within the allowed scope. Your AI provider handles that data according to your assistant's settings and terms. No remote Eyebrow service or audit upload is configured.
The Orus key is stored as plaintext in ~/.orus-mcp-guard/credential, protected by file permissions. Audit files stay in ~/.orus-mcp-guard/audit and record tool names, timestamps, status, argument hashes and network metadata. Raw arguments are not written to those audit records; hashes are not anonymization, and audit writes are best effort.
Eyebrow's own offline check can inspect the exact connector archive. It needs no account or key, runs nothing and sends nothing.
On 2026-10-02, Orus ran eyebrow check from Eyebrow 0.5.6, the version this connector requires, on the published 0.1.0-beta.2 archive. Result: pass, with no high or critical finding. Two medium EXEC-PRIMITIVE findings mark the first line of dist/claude.js and dist/launcher.js, which import Node's child_process: the connector starts the Claude CLI and Eyebrow by design. Its runtime dependency i18next 26.4.2 returned no finding. This check ran before publication. Orus compared the staged archive with the tested archive before approval, then compared the public registry archive after publication.
To repeat it, download the exact archive with npm pack, check that its SHA-256 matches the record linked below, extract it and run the check, as in the commands below. The same check on an installed copy should report the same two findings. The record is Orus's account of a check anyone can repeat, not an Eyebrow badge or attestation.
Future releases are checked the same way before publication: the release workflow runs Eyebrow 0.5.6 on the exact archive and its installed dependency, and refuses any finding that has not been reviewed by rule, severity, file, line and file hash.
npm pack @orusagent/mcp-guard@0.1.0-beta.2
shasum -a 256 orusagent-mcp-guard-0.1.0-beta.2.tgz
# expected: a58b0bde4acd8d3f01e6e47f7ca3b6095c577ecb643b43d8e47b2edf742dc31b
tar -xzf orusagent-mcp-guard-0.1.0-beta.2.tgz
eyebrow check package --json
This beta provides a constrained connection to Orus. It is not a guarantee that every future version or every remote response is safe.
Eyebrow also offers scan, lockfile and verification workflows for detecting changes to approved software. This beta uses Eyebrow's local MCP controls. Nothing in it fingerprints the connector's own files after installation: if you run eyebrow scan, it records this connector as your Node.js executable, not its code. Use the check above to inspect an installed copy. The connector does not attest Orus's remote deployment and carries no public Eyebrow verification badge. The startup integrity check covers the Eyebrow executable; the policy check compares local configuration with the installed connector's profile.
These controls apply to the orus-guarded connection in Claude Code. Direct Claude.ai or ChatGPT connections, other connectors and shell commands do not pass through it. Software running as your user may read the Orus key or bypass the connector. Orus remains responsible for its remote service and private trading engine; neither is certified by these local checks.
Use the pinned package version in the installation guide and review updates before adopting them. Run orus-mcp doctor to check the local configuration, the Eyebrow fingerprint and a direct read-only connection to Orus; that request does not pass through Eyebrow. The check does not certify sandbox isolation or establish that code is free of vulnerabilities.
Base URL: https://www.orusagent.xyz. Send your partner key in the Authorization: Bearer <key> header. No request body is needed.
Whitelisted partners only
Request access from @Orus_agent on X ↗ with your product and expected traffic. Orus approves your account and issues a private key with its expiry and quotas.
Keep the key in your backend secret manager as ORUS_PARTNER_API_KEY. Console cookies do not authenticate API calls. Never put the key in client-side code, a URL, or a Telegram message.
Replace the illustrative 0x111…111 contract with the token to scan. These examples request chart and launch indicators explicitly. Use include=none for a token card without those extra reads.
Five query parameters. Defaults and bounds are part of the contract.
Two networks are supported: Robinhood Chain mainnet (chainId=4663) and Solana mainnet (chainId=101). Robinhood testnet (46630) and Solana devnet return 400 unsupported_chain. A bot running in testnet mode must not scan its testnet contracts as mainnet addresses, and must never infer the chain from the shape of an address: send the chainId the token was issued on. Enable live scans on mainnet cards; use the clearly labeled synthetic response examples to test the renderer offline. There is no testnet scan endpoint.
Scan query parameters
Parameter
Type / required
Default
Values & behavior
chainId
integerRequired
—
Robinhood Chain mainnet (4663) or Solana mainnet (101). Robinhood testnet (46630) and Solana devnet return 400 unsupported_chain. Never relabel a testnet contract as mainnet, and never infer the chain from the address.
4663 · 101
token
stringRequired
—
On 4663, a non-zero EVM contract address, normalized to lowercase. On 101, a base58 Solana mint address; its case is part of the key and is kept.
Percent decline from ATH that defines a dip. Used when chart is included.
1–99 inclusive
lookbackHours
numberOptional
48
Hours of five-minute candle history. Used when chart is included; does not change the fixed 24h agent window.
1–168 inclusive
Unknown parameters, repeated parameters, invalid addresses, unsupported chains and out-of-range values return 400. Decimal values are accepted for dipThresholdPct and lookbackHours; send plain numbers without units.
Choose what to include
Include options
include
Dip / chart
Launch
Use case
none
No
No
Token cards: core data and agents only.
chart
Yes
No
Default. Add dip timing and chart coverage.
launch
No
Yes
Add the earliest-trade launch sample.
chart,launch
Yes
Yes
Request all available indicators. launch,chart is equivalent.
Token, market, pool, security, risk, ATH/ATL, deployer, socials, agents and card data are always returned. include only controls chart and launch reads. Candles have a fixed five-minute interval; raw OHLCV arrays are not returned.
A successful request can still contain unavailable observations.
These complete JSON responses use synthetic values to illustrate the contract. The partial example shows missing security observations and an agent-data failure while the market scan remains available. Always inspect availability, warnings and checkedAt.
null means unknown or unavailable. It never means zero, false or safe. dip and launch are null when not requested; their availability is not_requested. Requested but missing indicators can contain null fields.
Security coverage, taxes & v4 pools
Security is always requested, including include=none. Orus combines token observations with a dedicated security check when available. Inspect availability.security.status: available means all five security fields are known, partial means some are known, and unavailable means none are known. None of these statuses is a safety verdict. missingFields names exactly which security values are null. security_data_incomplete means that list is nonempty, even if honeypot and taxes are known but liquidity burn is not.
Coverage varies by token; Uniswap v4 does not by itself imply missing data or a safe contract. null means no usable observation, a timeout, or conflicting observations. conflictingFields names disagreements; those fields remain null and raise security_data_conflict. A missing check does not fail the entire scan. Display the known fields and preserve unknown values; never turn null into false or 0.
buyTaxPct and sellTaxPct describe reported token taxes, not the total cost of a trade. They exclude pool fees, v4 hook fees, price impact, slippage and gas. A reported 0/0 therefore does not mean a free swap. isHoneypot=false means no honeypot was reported by the available checks, not that every wallet, route or future trade can sell. This endpoint does not simulate a specific trade, and checkedAt is collection time rather than the underlying audit time.
Every response field, grouped by subject, with its JSON type and meaning.
Top-level keys are present on success. Child fields apply when their parent object is available. A nullable type permits null; new fields may be added within v1. The eight market.windows keys are 1m, 5m, 15m, 1h, 4h, 6h, 12h, 24h. Each has the same fields shown as {window} below.
›envelopeobjectVersion, chain, collection time and request ID.4 fields
envelope response fields
Field / type
Description
apiVersionstring
Response contract version (1.0).
requestIdstring
Request correlation ID; include this when contacting support.
chainIdinteger
4663 for Robinhood Chain mainnet, 101 for Solana mainnet.
checkedAtstring
Collection start; not the quote timestamp.
›cacheobjectCache hit and observation age.3 fields
cache response fields
Field / type
Description
cache.hitboolean
True when this scan was served from the shared cache.
cache.ageSecondsinteger
Elapsed seconds since checkedAt.
cache.maxAgeSecondsinteger
Maximum cache lifetime: 30 seconds.
›tokenobjectIdentity, supply and creation time.9 fields
token response fields
Field / type
Description
token.addressstring
Requested contract: lowercased on 4663, case kept on 101.
token.namestring | null
Token name.
token.symbolstring | null
Token ticker.
token.imagestring | null
Public image URL, or null when the image cannot be published.
token.createdAtstring | null
Reported token creation timestamp.
token.decimalsnumber | null
Token decimal precision.
token.ageSecondsnumber | null
Seconds since token creation.
token.totalSupplynumber | null
Total supply in token units.
token.circulatingSupplynumber | null
Circulating supply in token units.
›marketobjectUSD price, capitalization, liquidity and rolling activity windows.27 fields
market response fields
Field / type
Description
market.priceUsdnumber | null
Current reported token price in USD.
market.marketCapUsdnumber | null
Reported circulating market capitalization in USD.
market.fdvUsdnumber | null
Fully diluted valuation in USD.
market.liquidityUsdnumber | null
Current reported liquidity in USD.
market.maxLiquidityUsdnumber | null
Maximum reported liquidity in USD.
market.liquidityToMarketCapPctnumber | null
Liquidity / market cap × 100. May exceed 100.
market.volumeChange5mPctnumber | null
Current 5m volume versus the average of the preceding two 5m periods, derived from 15m volume.
market.totalFeesUsdnumber | null
Cumulative reported pool fees in USD.
market.secondsSinceLastTradenumber | null
Seconds since latestTradeAt.
market.latestTradeAtstring | null
Timestamp of the latest reported trade, separate from quote freshness.
market.priceUpdatedAtnull
Exact quote timestamp is unavailable; latestTradeAt is separate.
›poolobjectVenue, launchpad and bonding state.10 fields
pool response fields
Field / type
Description
pool.addressstring | null
Dominant pool address.
pool.dexstring | null
Venue display name.
pool.dexKeystring | null
Venue identifier.
pool.launchpadstring | null
Originating launchpad.
pool.factorystring | null
Pool factory address.
pool.bondedboolean | null
Whether the token has graduated from its bonding curve.
pool.bondingPctnumber | null
Bonding-curve progress in percent.
pool.bondedAtstring | null
Reported graduation timestamp.
pool.bondingCurveAddressstring | null
Bonding-curve contract address.
pool.launchpadUrlstring | null
Launchpad token page URL.
›securityobjectHoneypot, proxy, taxes and liquidity burn observations.5 fields
security response fields
Field / type
Description
security.isHoneypotboolean | null
Reported honeypot flag; null is unknown. false is not a safety guarantee or an execution simulation.
security.isProxyboolean | null
Reported proxy-contract flag; null is unknown.
security.buyTaxPctnumber | null
Reported token buy tax in percent: 1 means 1%. Excludes pool fees, hook fees, slippage and gas. null is unknown.
security.sellTaxPctnumber | null
Reported token sell tax in percent: 1 means 1%. Excludes pool fees, hook fees, slippage and gas. null is unknown.
security.liquidityBurnPctnumber | null
Reported liquidity burn percentage; null is unknown. Independent of honeypot and tax coverage.
›riskobjectHolder concentration and wallet classifications.16 fields
risk response fields
Field / type
Description
risk.bundlersPctnumber | null
Supply held by wallets classified as bundlers.
risk.snipersPctnumber | null
Supply held by wallets classified as launch snipers.
risk.insidersPctnumber | null
Supply held by wallets classified as insiders.
risk.devHoldingsPctnumber | null
Supply held by the developer.
risk.top10Pctnumber | null
Supply held by the top 10 holders.
risk.top50Pctnumber | null
Supply held by the top 50 holders.
risk.top100Pctnumber | null
Supply held by the top 100 holders.
risk.top200Pctnumber | null
Supply held by the top 200 holders.
risk.freshTradersPctnumber | null
Supply held by wallets classified as fresh traders.
risk.proTradersPctnumber | null
Supply held by wallets classified as pro traders.
risk.smartTradersPctnumber | null
Supply held by wallets classified as smart traders.
risk.holdersCountnumber | null
Reported number of holders.
risk.bundlersCountnumber | null
Reported number of bundler wallets.
risk.snipersCountnumber | null
Reported number of sniper wallets.
risk.insidersCountnumber | null
Reported number of insider wallets.
risk.laggedFieldsstring[]
Risk field names whose classifications can change after launch.
›athobjectAll-time high, drawdown and elapsed time.7 fields
ath response fields
Field / type
Description
ath.priceUsdnumber | null
Reported all-time high price in USD.
ath.ageSecondsnumber | null
Seconds elapsed since the ATH.
ath.marketCapUsdnumber | null
ATH price × current circulating supply (total supply fallback). Approximation.
ath.changeFromAthPctnumber | null
(current price / ATH − 1) × 100. Negative below the ATH.
ath.drawdownPctnumber | null
Decline from the ATH in percent, clamped at zero.
ath.atstring | null
Timestamp of the reported ATH.
ath.supplyBasisstring
current_supply: the market-cap approximation uses current supply.
›atlobjectAll-time low price and date.2 fields
atl response fields
Field / type
Description
atl.priceUsdnumber | null
Reported all-time low price in USD.
atl.atstring | null
Timestamp of the reported ATL.
›dipobject | nullCandle-based dip timing; null when chart was not requested.19 fields
dip response fields
Field / type
Description
dip.thresholdPctnumber | null
Requested drawdown threshold; defaults to 30%.
dip.thresholdPriceUsdnumber | null
ATH × (1 − thresholdPct / 100).
dip.firstDipAgeSecondsnumber | null
Seconds elapsed since firstDipAt.
dip.athToFirstDipSecondsnumber | null
Seconds between the ATH and firstDipAt.
dip.secondsSinceLastObservedDipnumber | null
Seconds elapsed since lastObservedDipAt.
dip.requestedLookbackHoursnumber | null
Requested candle history window in hours.
dip.candleCountnumber | null
Closed, valid five-minute candles in the window.
dip.lastCandleAgeSecondsnumber | null
Seconds since the latest closed candle ended.
dip.windowLowUsdnumber | null
Lowest candle low in the returned window.
dip.windowHighUsdnumber | null
Highest candle high in the returned window.
dip.reboundFromWindowLowPctnumber | null
(current price / window low − 1) × 100.
dip.isCurrentlyBelowThresholdboolean | null
Whether the current reported price is at or below the threshold.
dip.firstDipAtstring | null
First qualifying closed-candle crossing since the ATH; null without complete history.
dip.lastObservedDipAtstring | null
Latest observed crossing from above to below the threshold, not a local low.
dip.windowStartstring | null
First retained candle open timestamp.
dip.windowEndstring | null
Last retained candle close timestamp.
dip.historyStatusstring
covers_ath, partial or unavailable. Only covers_ath supports a first-dip claim.
dip.hasGapsboolean
Whether the observed post-ATH candles contain missing intervals.
dip.intervalstring
Fixed five-minute candles (5m).
›launchobject | nullEarliest-trade sample; null when launch was not requested.7 fields
launch response fields
Field / type
Description
launch.firstTradeAtstring | null
Earliest returned trade timestamp.
launch.sampleWindowSecondsnumber | null
Launch sampling interval: one second from the first trade.
launch.priceUsdnumber | null
Price of the last sampled trade within that first second.
launch.marketCapUsdnumber | null
Launch sample price × current total supply (circulating supply fallback).
launch.sampledTradesnumber | null
Number of earliest valid trades inspected, up to 100.
launch.supplyBasisstring
current_supply: historical market cap is an approximation.
launch.mayBeTruncatedboolean
True when the sample reaches 100 trades; other trades may be missing.
›deployerobjectReported launches and migrations; rug count remains unknown.6 fields
deployer response fields
Field / type
Description
deployer.statusstring
partial when an address is known, otherwise unavailable.
deployer.addressstring | null
Reported deployer address.
deployer.launchesnumber | null
Reported token launches by this deployer.
deployer.migrationsnumber | null
Reported migrations by this deployer.
deployer.rugsnull
Always null: rug classification is unavailable. Never display 0 rugs.
deployer.reasonstring
Explanation of deployer coverage.
›socialsobjectReported metadata and external links.5 fields
socials response fields
Field / type
Description
socials.websitestring | null
Reported website URL.
socials.twitterstring | null
Reported X/Twitter URL.
socials.telegramstring | null
Reported Telegram URL.
socials.discordstring | null
Reported Discord URL.
socials.descriptionstring | null
Reported token description. Treat metadata and links as untrusted.
›agentsobjectAggregate real and simulated agent activity.17 fields
agents response fields
Field / type
Description
agents.statusstring
available or unavailable. Unavailable means null counts, not zero.
agents.scopestring
Desk and customer agents on the requested chain, regardless of current agent status or mode. Aggregates only.
agents.coveragestring
Current retained positions, not guaranteed lifetime history. Real entries require a recorded entry transaction hash; pending purchases are excluded. Mode is determined by position status, not current agent settings.
agents.asOfstring | null
Observation timestamp for agent activity; null if unavailable. Cached with the scan for at most 30 seconds from checkedAt.
agents.windowHoursinteger
Fixed 24-hour activity window; independent of lookbackHours.
agents.real.tradedAgentsinteger | null
Distinct agents with eligible entries in retained history, including agents currently holding. Not a count of trades or independent strategies.
agents.real.holdingAgentsinteger | null
Distinct agents with open positions in the recorded book. Real includes positions awaiting a failed exit and paused or stopped agents. No on-chain balance verification.
agents.real.entries24hinteger | null
Eligible position entries in [asOf - 24h, asOf]. Counts positions, not distinct agents; uses recorded entry times.
agents.real.exits24hinteger | null
Position closures in [asOf - 24h, asOf], using recorded exit times for closed positions. Includes simulated write-offs; not proof of a successful on-chain sale.
agents.real.lastEntryAtstring | null
Latest eligible recorded entry time in retained history, or null if none.
agents.real.lastExitAtstring | null
Latest recorded exit time of a closed eligible position, or null if none. Failed exits are excluded.
agents.simulation.tradedAgentsinteger | null
Distinct agents with eligible entries in retained history, including agents currently holding. Not a count of trades or independent strategies.
agents.simulation.holdingAgentsinteger | null
Distinct agents with open positions in the recorded book. Real includes positions awaiting a failed exit and paused or stopped agents. No on-chain balance verification.
agents.simulation.entries24hinteger | null
Eligible position entries in [asOf - 24h, asOf]. Counts positions, not distinct agents; uses recorded entry times.
agents.simulation.exits24hinteger | null
Position closures in [asOf - 24h, asOf], using recorded exit times for closed positions. Includes simulated write-offs; not proof of a successful on-chain sale.
agents.simulation.lastEntryAtstring | null
Latest eligible recorded entry time in retained history, or null if none.
agents.simulation.lastExitAtstring | null
Latest recorded exit time of a closed eligible position, or null if none. Failed exits are excluded.
›availabilityobjectAvailability of each requested data section.7 fields
availability response fields
Field / type
Description
availability.details.statusstring
Core token details availability. available on a successful scan.
availability.chart.statusstring
available, unavailable or not_requested for the chart analysis.
availability.launch.statusstring
available, unavailable or not_requested for the launch sample.
availability.agents.statusstring
available or unavailable for agent activity; always requested.
availability.security.statusstring
Coverage of the five security fields: available = all known, partial = some known, unavailable = none known. Not a safety verdict. Always requested, including include=none.
availability.security.missingFieldsstring[]
Names of security fields that are null. security_data_incomplete is emitted when this list is nonempty.
availability.security.conflictingFieldsstring[]
Fields with conflicting observations, returned as null and also listed in missingFields. Raises security_data_conflict. Empty when no conflict was observed.
›warningsstring[]Coverage and freshness caveats.1 field
warnings response fields
Field / type
Description
warningsstring[]
Machine-readable caveats. May be nonempty on HTTP 200; clients should tolerate new codes.
›attributionobjectOrus label and public token link.2 fields
attribution response fields
Field / type
Description
attribution.textstring
Attribution label: checked by orus.
attribution.urlstring
Public Orus token intelligence URL, without a partner key.
›cardobjectTelegram-ready summary and attribution link.2 fields
Public token deep link for the card's attribution arrow.
Reading ATH, dips and launch values
A dip is a closed five-minute candle at or after the reported ATH whose close is at or below ATH × (1 − dipThresholdPct / 100). Wicks and the unfinished candle do not qualify. firstDipAt is populated only when the history covers the ATH without gaps. athToFirstDipSeconds measures the ATH-to-first-crossing duration; firstDipAgeSeconds measures time elapsed since that crossing.
lastObservedDipAt is the latest observed transition from above to below that same threshold. It is not the most recent local low. secondsSinceLastObservedDip measures its age. A later recovery does not erase the observation. A truncated window or a gap may hide other crossings: inspect historyStatus, hasGaps, windowStart, windowEnd and lastCandleAgeSeconds. Times label candle opens, with five-minute resolution. A missing crossing is null, not proof that no dip occurred.
launch samples the last trade in the first second after the earliest returned trade, using at most 100 earliest trades. mayBeTruncated identifies samples reaching the cap. Its price and implied market cap follow the strategy engine's launch metric. No individual customer positions, strategy thresholds, wallets or private reports are included.
Rug classification is unavailable: deployer.rugs is always null. Wallet classifications can change after launch; risk.laggedFields lists affected fields.
Measure recorded agent activity alongside the market scan.
agents.real and agents.simulation each contain the following fields. Both include house and customer agents on the requested chain, including paused or stopped agents. Mode follows the recorded position, not the agent's current settings.
Agent activity counters
Field
Meaning
tradedAgents
Distinct agents with eligible entries in retained history, including agents currently holding. Not a count of trades or independent strategies.
holdingAgents
Distinct agents with open positions in the recorded book. Real includes positions awaiting a failed exit and paused or stopped agents. No on-chain balance verification.
entries24h
Eligible position entries in [asOf - 24h, asOf]. Counts positions, not distinct agents; uses recorded entry times.
exits24h
Position closures in [asOf - 24h, asOf], using recorded exit times for closed positions. Includes simulated write-offs; not proof of a successful on-chain sale.
lastEntryAt
Latest eligible recorded entry time in retained history, or null if none.
lastExitAt
Latest recorded exit time of a closed eligible position, or null if none. Failed exits are excluded.
holdingAgents is a subset of tradedAgents; do not add them. Entries and exits count position records, not distinct agents. Real entries require a recorded entry transaction hash; pending entries are excluded. Failed sells still count as holdings.
coverage=retained_history is the history still in the position book. It is not a guaranteed lifetime history or a fresh wallet-balance check. Closed simulations may include write-offs. The 24-hour window is anchored to agents.asOf and does not change with lookbackHours.
When agents.status=available, zero means no eligible records. When unavailable, counts and dates are null. No customer identifiers, wallets, amounts or strategy settings are exposed. Refusal counts and acceptance rates are unavailable because the existing logs do not cover every evaluation.
Temporarily unavailable. Honor Retry-After; retry at most twice with jitter.
405
Method not allowed
Use GET. This response does not use the JSON error envelope.
GET errors use { error: { code, message }, requestId }. On 401, stop retrying and contact Orus. HEAD uses the same authentication and quota as GET; OPTIONS is handled automatically.
Headers & quotas
Request and response headers
Header
Where
Meaning
Authorization
Request
Bearer <partner key>. Required; send from your backend over HTTPS.
X-Request-Id
Response
Correlation ID on every GET response.
X-RateLimit-Limit
Response
Partner minute quota, after admission.
X-RateLimit-Remaining
Response
Remaining admitted requests this minute.
X-RateLimit-Day-Remaining
Response
Remaining admitted requests this UTC day.
Retry-After
429 / 503
Seconds to wait before retrying.
Cache-Control
Response
private, no-store. Use checkedAt and cache.ageSeconds to assess observation freshness.
Default allowance: 30 admitted requests per minute · 5,000 per UTC day. Limits are configured per partner and shared across keys. Cache hits, validation failures and upstream failures consume admitted requests.
A successful scan is cached for at most 30 seconds from checkedAt. agents.asOf retains its original timestamp on cache hits. market.priceUpdatedAt is null because the exact quote timestamp is unavailable; latestTradeAt is a separate trade timestamp.
Security, chart, launch or agent-data failures can return HTTP 200 with explicit coverage and warnings. Missing core details fail the scan. Public token pages refresh observations for tokens already scanned or traded by Orus, show their age, and request updates every 30 seconds while visible.
Place card.text above your buy/sell controls and link “checked by orus ↗” to card.url. Send plain text or escape dynamic content for your Telegram parse mode. Preserve unknown values and the observation time.
When retained public desk reports exist, the token page lists dated snapshots with their UTC collection time. Open a report to see its saved market figures, chart and available analysis. Historical data is not refreshed when opened; private customer reports and strategy context are excluded.
You can add Agents (real): 8 traded · 3 holding · 5 entries / 24h from the corresponding agents.real fields when activity is available. Label simulation separately. If the scan fails, omit the badge or show “orus: scan unavailable”.
This page is the reference. For everything it does not cover — why your agent refused a token, which threshold to move first, or anything that looks wrong — ask in the Discord. The team is in there, and so are the people running the same strategies.