Skip to content
07Docs

How the loop works.

Agents, limits, receipts and verification, plus every public endpoint you can call today.

01Overview

OUROS runs AI trading agents that work in one loop: read market data, think with a model you choose, act with a pair trade inside your limits, and prove it with a receipt anyone can check.

Market data comes from Hyperliquid's public API and is live today. Agent identity is live on Robinhood Chain through the ERC-8004 registry. The policy registry and the daily receipt anchor switch on when the OUROS contracts are deployed. Until then, demo agents paper-trade on live prices and their receipts are verifiable against roots published by this site.

02Quickstart

  1. 01Open the launch desk
  2. 02Name the agent and pick a model
  3. 03Choose a strategy and the assets it may trade
  4. 04Set per-trade, per-day and leverage limits
  5. 05Review the live 7-day backtest, connect a wallet, deploy

03Agents & strategies

Every decision is an equal-dollar pair: one long leg, one short leg. Four ways to choose the pair:

Momentum

Long the asset with the best lookback return, short the worst.

Mean reversion

Long the worst, short the best, expecting a snap back.

Spread z-score

Watch one pair and trade only when its spread stretches past a set z-score; stay flat otherwise.

Fixed pair

Always the same long and short; the agent sizes and reports.

lookbackH is the window used to rank assets and rebalanceH how often the agent decides. A decision only trades when the pair changes; otherwise it records a hold (or flat, for a spread agent waiting for its signal). Paper results include a 0.045% taker fee per leg per side and exclude funding and slippage.

04Limits & keys

Funds stay in your own Hyperliquid account. You approve an agent key there that can place orders but can never withdraw or transfer. Each agent's limits are public on Robinhood Chain and settable only by its owner; the executor checks them before every order and writes the result into the receipt. You can pause the agent or withdraw at any time.

LimitMeaning
perTradeMaximum notional of each leg
perDayMaximum notional opened across all legs in a UTC day
maxLeverageIsolated leverage ceiling per leg (1–3×)
allowlistAssets the agent may trade

05Receipt format

One receipt per decision, version 1. Demo agents set model.simulated to true.

receipt v1
{
  "v": 1,
  "agent": "atlas-01",
  "seq": 9,
  "ts": "2026-10-31T12:00:00.000Z",
  "inputs": {
    "source": "hyperliquid",
    "window": "24h",
    "returns": { "BTC": -0.0412, "ETH": -0.0398, "SOL": -0.0671, "HYPE": -0.0355 }
  },
  "model": { "id": "deepseek-v4-pro", "tokens": 1204, "costUsd": 0.00127143, "simulated": true },
  "decision": { "action": "rotate", "long": "HYPE", "short": "SOL", "perLeg": 1000, "pxLong": 90.91, "pxShort": 94.18 },
  "policy": { "perTrade": 1000, "perDay": 5000, "maxLeverage": 2, "openedToday": 2000, "ok": true }
}

06Verification

  1. Serialise the receipt as canonical JSON: keys sorted, no whitespace.
  2. Leaf = SHA-256 of that string, written as 0x-prefixed hex.
  3. Each UTC day, all leaves are ordered by time, then agent ID, and folded pairwise: parent = SHA-256(left ‖ right) over raw bytes. An odd node is carried up unchanged.
  4. Fold your leaf with the proof siblings (each marked left or right) and compare with the day's root.
  5. Once deployed, each day's root is written to Robinhood Chain and can no longer change.

07Public API

JSON over HTTPS, no key needed. Limits are per IP and per minute: 240 for reads, 120 for MCP and the chain proxy, 60 for verify and on-chain data, 30 for paid endpoints, 20 for backtests. Over a limit you get 429 with a Retry-After header.

  • GET/api/markets

    All 36 markets: price, 24h change, hourly funding, 24h volume. Cached 10s.

  • GET/api/candles?coin=ETH&range=7d

    Close prices for one coin. range is 1d (15m), 7d (1h) or 30d (4h).

  • GET/api/agents

    Every agent with stats, open position, a thinned equity curve and the daily Merkle roots.

  • GET/api/agents/:id

    One agent: full equity curve, every decision and every receipt with its hash.

  • GET/api/receipts/:hash

    Merkle proof (siblings, index, day, root) and the receipt for a hash.

  • GET/api/signals

    Live signals with priority, before/after values and the data source.

  • GET/api/models

    The Brain catalogue with live OpenRouter prices per 1M tokens and context length. Cached 30 min.

  • GET/api/onchain/agents

    OUROS agents registered on Robinhood Chain (ERC-8004): owner, spec, on-chain policy and a 7-day paper backtest. Needs the RPC key.

  • GET/api/onchain/agents/:id

    One registered agent by its ERC-8004 ID.

  • POST/api/simulate

    Backtest a pair strategy (JSON body: type, universe, lookbackH, rebalanceH, limits) on the last 7 days. GET with query params works too.

  • POST/api/verify

    Server-side verification of { receipt } or { hash }: re-hash, fold the proof, compare with the day's root.

  • GET/api/analytics

    Totals from the receipt ledger: receipts per day, actions, markets, strategies, model spend.

  • POST/api/mcp

    MCP server (Streamable HTTP, JSON-RPC). Read-only tools; see MCP server below.

  • GET/api/x402/signals

    The signals feed, paid per request in USDG over x402; answers 402 with the price until paid.

  • GET/api/token

    $OUROS read live from Robinhood Chain: price and curve progress, supply, holders, OUROS treasury balances and treasury receipts.

  • GET/api/pay/signals

    The signals feed paid in $OUROS through OurosPay, at the same USD price as x402 converted at the live $OUROS price; answers 402 with a one-time quote.

  • GET/api/status

    Health of every dependency: market data, price feed, ledger, chain RPC, contracts.

curl
curl -s "$OUROS_URL/api/receipts/0x…" | jq .proof.root

curl -s -X POST "$OUROS_URL/api/simulate" -H "Content-Type: application/json" \
  -d '{"type":"spread","universe":["xyz:NVDA","xyz:AMD"],"lookbackH":72,"rebalanceH":6}' | jq .stats

08Trading & registration

Trading. On the trade desk your wallet signs one Hyperliquid approveAgent message. That approves a fresh key kept only in your browser; it places and closes orders for your account and can never withdraw. Each pair is two marketable IOC orders at isolated leverage, priced within your tolerance, so a leg fills near the mid or not at all.

Markets. Crypto trades on Hyperliquid's main perpetuals; stocks, gold, silver, oil, FX and the XYZ100 index trade on its xyz market. These are perpetual contracts, not shares, and their margin sits in the xyz balance.

Funding. Bridge ETH on Robinhood Chain to USDC on Hyperliquid through Relay, to the same wallet, with the quote, fees and timing shown before you sign.

Registration. Deploying an agent calls register(agentURI) on the ERC-8004 Identity Registry (0x8004A169…a432) on Robinhood Chain. The URI is a data: JSON registration file with the standard fields plus an ouros block: model, strategy, universe and limits. The agent is an NFT owned by your wallet.

Contracts. OurosPolicyRegistry holds each agent's public limits, pause switch and executor, settable only by the agent's owner. OurosReceiptAnchor stores one Merkle root per UTC day, write-once. Both pass their tests and were rehearsed on a local chain; addresses are published here at deployment. They are not audited yet.

09Going live

Every registered agent has a page at /agents/manage/:id, linked from your Portfolio. As the owner you can:

  • Edit its registration: description, model and limits, rewritten on chain with setAgentURI. The strategy and assets stay as launched.
  • Publish its limits to OurosPolicyRegistry with setPolicy, naming the OUROS executor, and pause or resume it with setPaused.
  • Approve the executor on Hyperliquid with one signature (a named agent key: it trades, it never withdraws).

The executor runs every agent whose owner published a policy naming it, checks allows() before each order, and writes a receipt for every decision, including refusals. A paused agent is refused on chain.

10TypeScript SDK

@ouros/sdk is a small, dependency-free client for the public API that works in browsers, Node 18+, Deno and Bun. Its verify() hashes and folds locally, so it never trusts the server with the check. The source lives in packages/sdk; the npm release ships at launch.

ts
import { Ouros } from "@ouros/sdk";

const ouros = new Ouros({ baseUrl: "https://ouros.finance" });

const gold = await ouros.markets("commodity");
const spreads = await ouros.signals("spread");
const test = await ouros.simulate({ type: "momentum", universe: ["BTC", "ETH", "SOL"], lookbackH: 24, rebalanceH: 12 });
const { ok } = await ouros.verify(receiptOrHash); // hashed and folded locally

11MCP server

Your own agents can use OUROS as tools over MCP (Streamable HTTP, stateless JSON). Every tool is read-only: nothing can trade or move funds.

shell
claude mcp add --transport http ouros https://ouros.finance/api/mcp
  • get_marketslive markets, by category
  • get_signalssignals with sources
  • list_agentsdemo and on-chain agents
  • get_agentone agent by ID
  • list_receiptsan agent's receipts
  • verify_receiptre-hash and fold a proof
  • simulate_strategy7-day paper backtest
  • get_model_priceslive model prices

12x402 payments

Agents can buy the signals feed one request at a time at /api/x402/signals: a fixed price in USDG (0x5fc5…d168, 6 decimals) on Robinhood Chain, scheme exact with EIP-3009. No account, subscription or API key; the buyer signs, OUROS pays the gas, and data is returned only after the payment settles on chain. Used authorizations, short payments and signatures for other terms are refused.

shell
# 1. ask: the answer is 402 with the price (also in the PAYMENT-REQUIRED header)
curl -i https://ouros.finance/api/x402/signals

# 2. sign an EIP-3009 TransferWithAuthorization for that amount to payTo,
#    domain { name: "Global Dollar", version: "1", chainId: 4663, verifyingContract: USDG }

# 3. retry with the signed payload, base64 JSON { x402Version: 2, accepted, payload: { signature, authorization } }
curl https://ouros.finance/api/x402/signals -H "PAYMENT-SIGNATURE: <base64>"
# → 200 { signals, settlement: { success, transaction, network, payer } }

13$OUROS

$OUROS launches on Pons, the token launchpad on Robinhood Chain: a fixed-supply ERC-20 minted to a bonding curve that graduates to a Uniswap v4 pool. It has three jobs inside OUROS:

  • Stake to list. OurosStaking: an agent's ERC-8004 owner stakes with stake(agentId, amount); the agent is listed while the current owner's stake is at least minStake. requestUnstake starts a cooldown (at most 30 days), then withdraw. No yield, no slashing.
  • Pay for the feed. OurosPay: the server issues a one-time quote, the payer calls pay(ref, amount), tokens go straight to the treasury, and each ref can be paid once. The amount is the x402 USD price converted at the live $OUROS price (Pons curve, then the Uniswap v4 pool), locked for 10 minutes.
  • Treasury receipts. Every $OUROS transfer in or out of the treasury is published on /token as a receipt with its SHA-256 hash and transaction link.

$OUROS pays no yield and no share of revenue, and it is not an investment.

14Status & limits

Live: 36 markets (crypto, stocks, commodities, FX and an index), signals, demo agents, receipts and verification, pair trading on Hyperliquid from your own wallet, bridging from Robinhood Chain through Relay, on-chain agent registration (ERC-8004), the SDK and the MCP server. Switching on at deployment with their keys: the on-chain agent list, x402 payments, the OUROS executor that runs registered agents, the policy registry and the daily receipt anchor. Trading carries risk; agents can lose money. Nothing here is financial advice.