Angel · Oroboros Design

Crypto trade setups your agent can buy per call.

Trend-aligned setups for Binance spot pairs (entry, stop, two targets, reward-to-risk, confidence) plus 12 more market surfaces. No account, no API key: your agent pays per call in USDC on Base via x402 — or buys a pack once and sends a token.

x402 v2USDC on BaseMCP (streamable HTTP)OpenAPI 3.1JSON < 2 KBevery answer has "next"

Try it free

The best current setup from the full scan (or the market regime when nothing qualifies), no payment: GET https://angel.oroboros-design.com/sample

Surfaces and prices (USDC per call)

Price by payment history — new payers, 1–10 payments, more than 10. Send header X-Payer-Address to be quoted your tier. Last column: calls drawn from a pack.

SurfaceWhat you getnewknowntrustedpack
Trade setups
POST /agenten/signal
Up to 10 setups: entry, stop, tp1, tp2, rr, confidence, gate (1h + 4h agree)0.0750.050.0351
Validate a setup
POST /agenten/signal/validate
Your setup against the live market: geometry, ATR stop, RR, trend, RSI — valid | weak | invalid0.030.020.0141
Historical gate
POST /agenten/signal/historical-gate
The gate replayed on 30 days of 1h candles: win rates and average R0.150.100.072
validate batch
POST /agenten/signal/validate-batch
Up to 10 crypto trade setups checked at once against the live Binance spot market: geometry, stop vs 1h ATR, reward-to-risk, 1h/4h trend, RSI14 and entry distance for each, returning valid, weak or invalid with a 0-100 score and the failed checks per setup.0.150.100.072
market regime
POST /agenten/signal/regime
Market regime per Binance spot pair from closed 1h and 4h candles: trend_up, trend_down, range or volatile, with EMA20/50 trend on both timeframes, 24h efficiency ratio, ATR as percent of price and the ATR percentile against the last 100 hours.0.0750.050.0351
liquidations
POST /agenten/signal/liquidations
Recent forced liquidations on the OKX USDT perpetual for a coin: long and short liquidated notional in USD, counts, the largest prints and the long/short skew over the covered window, from OKX public liquidation orders.0.0750.050.0351
funding rates
POST /agenten/signal/funding-rates
Predicted perpetual funding rates per coin on Binance, Bybit and Hyperliquid: rate per interval, annualized rate, which side pays and the cross-venue spread, from the Hyperliquid predictedFundings feed.0.0750.050.0351
order-flow imbalance
POST /agenten/signal/orderflow-imbalance
Taker order-flow imbalance on a Binance spot pair from the latest aggregated trades plus the order-book imbalance within 0.5 percent of mid: buy and sell volume, imbalance from -1 to 1 and a pressure label.0.0750.050.0351
correlation matrix
POST /agenten/signal/correlation-matrix
Pearson correlation of 1h log returns between up to 12 Binance spot pairs over up to 200 closed hours, with the most and least correlated pairs, for position sizing and hedging.0.0750.050.0351
slippage estimate
POST /agenten/signal/slippage
Estimated slippage for a market order of a given USD size on a Binance spot pair, walking the live order book up to 1000 levels: average fill price, slippage in basis points versus mid, levels consumed and the share that could be filled.0.0750.050.0351
gas window
POST /agenten/signal/gas-window
Whether now is a cheap moment to transact on Base or Ethereum: current base fee against the median of the last 30 blocks, priority fee percentiles and the cost of an ERC-20 transfer in ETH and USD, with a now or wait recommendation.0.0750.050.0351
sentiment gate
POST /agenten/signal/sentiment-gate
Risk gate for a coin from three public signals: the Crypto Fear and Greed index and its change, predicted perpetual funding across venues and the 4h EMA trend on Binance spot, combined into risk_on, neutral or risk_off with the reasons.0.0750.050.0351
USDC reconciliation
POST /agenten/signal/reconciliation
Reconciles expected USDC payments against the incoming USDC transfers of a Base address: each expected amount (optionally sender) matched to one transfer with hash and time, plus what is missing and what arrived unexpected.0.0750.050.0351

Packs — one payment, a token for every surface

500 calls

25.00 USDC

0.05 per call · 30 days · every surface

POST /agenten/signal/pack {"calls":500}

5,000 calls

199.00 USDC

0.0398 per call · 90 days · every surface

POST /agenten/signal/pack {"calls":5000}

50,000 calls

1499.00 USDC

0.02998 per call · 365 days · every surface

POST /agenten/signal/pack {"calls":50000}

Subscriptions — /watch pushes new setups

basic

39.00 USDC / 30 days

/watch, 20 pairs, 60 s poll

POST /agenten/signal/subscription {"plan":"basic"}

pro

99.00 USDC / 30 days

/watch every 30 s + 2,000 calls on every surface

POST /agenten/signal/subscription {"plan":"pro"}

desk

199.00 USDC / 30 days

/watch every 15 s + 10,000 calls on every surface, priority slot

POST /agenten/signal/subscription {"plan":"desk"}

Enterprise — volume, priority, never 429

starter

499.00 USDC

30 days · 20,000 calls · priority slot · desk /watch

POST /agenten/signal/enterprise {"plan":"starter"}

quarter

2500.00 USDC

90 days · 150,000 calls · priority slot · desk /watch

POST /agenten/signal/enterprise {"plan":"quarter"}

year

9900.00 USDC

365 days · 750,000 calls · priority slot · desk /watch

POST /agenten/signal/enterprise {"plan":"year"}

Quick start

1. See the price. Any POST without payment answers 402 with a PAYMENT-REQUIRED header (x402 v2) and a JSON body that names the price, the pack offer and how to pay.

curl -i -X POST https://angel.oroboros-design.com/agenten/signal -H 'content-type: application/json' -d '{"bias":"long"}'

2. Pay and get the answer (TypeScript, viem — EIP-3009 transferWithAuthorization, settled by Circle's facilitator):

import { privateKeyToAccount } from "viem/accounts";
const url = "https://angel.oroboros-design.com/agenten/signal";
const body = JSON.stringify({ bias: "long", symbols: ["BTCUSDT", "ETHUSDT"] });
const r402 = await fetch(url, { method: "POST", headers: { "content-type": "application/json" }, body });
const req = JSON.parse(atob(r402.headers.get("payment-required")!));   // x402 v2
const a = req.accepts[0];                                               // USDC on Base → 0x0CAc7D3c89be4f478E4c8f713C0D3D2D0954678D
const acc = privateKeyToAccount(process.env.AGENT_KEY as `0x${string}`);
const now = Math.floor(Date.now() / 1000);
const auth = { from: acc.address, to: a.payTo, value: a.amount, validAfter: String(now - 60), validBefore: String(now + 240),
  nonce: "0x" + [...crypto.getRandomValues(new Uint8Array(32))].map((b) => b.toString(16).padStart(2, "0")).join("") };
const signature = await acc.signTypedData({
  domain: { name: a.extra.name, version: a.extra.version, chainId: 8453, verifyingContract: a.asset },
  types: { TransferWithAuthorization: [{ name: "from", type: "address" }, { name: "to", type: "address" }, { name: "value", type: "uint256" },
    { name: "validAfter", type: "uint256" }, { name: "validBefore", type: "uint256" }, { name: "nonce", type: "bytes32" }] },
  primaryType: "TransferWithAuthorization",
  message: { ...auth, value: BigInt(auth.value), validAfter: BigInt(auth.validAfter), validBefore: BigInt(auth.validBefore) } });
const proof = btoa(JSON.stringify({ x402Version: 2, resource: req.resource, accepted: a, payload: { signature, authorization: auth } }));
const res = await fetch(url, { method: "POST", headers: { "content-type": "application/json", "PAYMENT-SIGNATURE": proof }, body });
console.log(res.status, await res.json());   // 200: setups + "next"

Or send USDC on Base to 0x0CAc7D3c89be4f478E4c8f713C0D3D2D0954678D and repeat the request with header X-PAYMENT-TX: <tx hash>.

3. MCP. Add the server to any MCP client; tools return a payment request you settle in params._meta["x402/payment"]. get_sample_signal and get_signal_card are free.

{
  "mcpServers": {
    "tradesignal": {
      "type": "http",
      "url": "https://angel.oroboros-design.com/agenten/signal/mcp"
    }
  }
}

For agents

agent.md · openapi.json · llms.txt · /.well-known/x402 · MCP server card · A2A agent card · public stats