Build with Orbyt
Everything the app does is available over a small JSON API and an MCP server, so you can run agents from scripts or straight from your coding assistant.
Overview
- Brain — Claude (when the server has an Anthropic key) or built-in rules proposes one action per decision.
- Risk engine — deterministic code checks every proposal: whitelist, allowed side for the preset, max order size, cash, position size, daily loss stop. Only it can approve.
- Executor — fills approved orders at the live price with 0.04% paper slippage and records a receipt.
Presets: DCA (buys only), PROTECT (sells only), TREND, REBALANCE, MOMENTUM. Cadences: 1m (rules only), 15m, 1h, 1d, 1w. Strategies read closing prices at a timeframe matching the cadence: 1-minute bars for 1m, 15-minute for 15m, 1-hour for 1h/1d/1w.
Quickstart
1. Open the app, sign in (wallet or guest), go to Account → API keys and create a key. 2. Call the API:
# draft an agent from a sentence (nothing is created yet)
curl -s /v1/drafts \
-H "Authorization: Bearer $ORBYT_API_KEY" -H "Content-Type: application/json" \
-d '{"prompt":"buy $50 of SPY every week, max 10% per trade"}'
# deploy it
curl -s /v1/agents \
-H "Authorization: Bearer $ORBYT_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"SPY weekly","preset":"DCA","assets":["SPY"],"cadence":"1w",
"limits":{"budget":1000,"maxTrade":5,"daily":3},"brain":"rules"}'
Authentication
Scripts and MCP use an API key: Authorization: Bearer orb_…. The web app uses an HTTP-only session cookie. Keys can only be created and revoked from a signed-in browser session (an API key can't mint keys). Keys are stored hashed; the full key is shown once.
Wallet sign-in: POST /v1/auth/nonce {address} returns a message, the wallet signs it with personal_sign, then POST /v1/auth/verify {address, signature}. The message states it authorizes no transaction. POST /v1/auth/guest creates a guest account whose agents move to the wallet on first wallet sign-in.
Markets
/v1/marketsAll active USDG pairs: sym, name, px, chg24h, vol24h, hist[]. Add ?lite to skip history. No auth./v1/statusServer capabilities: AI on/off and model, market status, storage, presets, cadences. No auth.Agents
/v1/drafts{prompt} → proposed config {preset, assets, weights, limits, cadence, name, summary, warnings, source}. Creates nothing./v1/backtestReplay a config over real Lighter candles with the built-in rules and the same risk engine. Body: same fields as create, plus optional days. Bars match the cadence (1m → 1-minute, 15m → 15-minute, 1h/1d/1w → 1-hour); max history 1 / 7 / 30 days. Returns returnPct, buyHoldPct, maxDrawdownPct, fills, rejects, trades, curve, benchmark./v1/agentsCreate. Body: name, preset, assets[], limits{budget 100–25000, maxTrade 1–30, daily 1–15, floor 2–30}, cadence, brain ("rules"|"ai"), weights[] (REBALANCE), prompt. AI agents need cadence ≥ 15m. Max 20 active agents./v1/agentsYour agents with equity, pnl, pnlPct, positions, fills, rejects, status./v1/agents/:idOne agent plus equityCurve (5-minute points; ?equity=N), last 60 events and its listing./v1/agents/:id/eventsDecision log: DEPLOY, PROPOSE, REJECT, FILL, HOLD, HALT, PAUSE, RESUME, CLOSE, AI ERR. ?limit= up to 500./v1/agents/:id/pauseStop deciding. /resume restarts and resets the daily-loss baseline. /close sells all positions and stops permanently./v1/fillsYour paper fills (receipts), newest first. ?limit= up to 500.Marketplace
/v1/listingsListed agents with full strategy, stats{returnPct, maxDrawdownPct, fills, since} and an equity curve. ?preset= filter. No auth./v1/listings{agentId, title, description, priceMonth} — list (or update) one of your agents./v1/listings/:id/copyStart your own agent with that strategy; optional {limits} overrides (e.g. budget). Paid listings cost nothing in paper mode./v1/listings/:idUnlist your agent.Account
/v1/meCurrent user (guest or wallet)./v1/me/balancesRead-only Lighter (Robinhood Chain) accounts for your wallet: collateral, asset balances, perp positions./v1/keysList keys. POST /v1/keys {name} creates one (session only). DELETE /v1/keys/:id revokes.Errors & limits
Errors are JSON {"error": "…"} with a 4xx/5xx status. POST bodies must be application/json, max 64 KB. The server caps Claude calls per hour (AI_MAX_CALLS_PER_HOUR); when the cap is hit, AI agents fall back to rules for that decision.
MCP server
The MCP server exposes these tools to any MCP client: list_markets, draft_agent, backtest_agent, create_agent, list_agents, get_agent, pause_agent, resume_agent, close_agent, list_fills, browse_marketplace, copy_listing.
Claude Code
claude mcp add orbyt \
--env ORBYT_API_KEY=orb_your_key --env ORBYT_URL= \
-- node /path/to/orbyt/mcp/orbyt-mcp.mjs
Codex (~/.codex/config.toml)
[mcp_servers.orbyt]
command = "node"
args = ["/path/to/orbyt/mcp/orbyt-mcp.mjs"]
env = { ORBYT_API_KEY = "orb_your_key", ORBYT_URL = "" }
Then ask things like "create an agent that buys $50 of SPY every week" or "how are my agents doing?". The assistant drafts first and should confirm before creating or closing anything.
Self-hosting
cd orbyt
npm install
cp .env.example .env # add keys (all optional)
npm start # http://localhost:5173
ANTHROPIC_API_KEY— enables Claude for drafting and AI agents.SUPABASE_URL+SUPABASE_SECRET_KEY— store data in Supabase Postgres. Without them, data goes todata/db.json.- Agents only run while the server process is running — host it on an always-on service for 24/7 operation.