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.
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.
| Surface | What you get | new | known | trusted | pack |
|---|---|---|---|---|---|
Trade setupsPOST /agenten/signal | Up to 10 setups: entry, stop, tp1, tp2, rr, confidence, gate (1h + 4h agree) | 0.075 | 0.05 | 0.035 | 1 |
Validate a setupPOST /agenten/signal/validate | Your setup against the live market: geometry, ATR stop, RR, trend, RSI — valid | weak | invalid | 0.03 | 0.02 | 0.014 | 1 |
Historical gatePOST /agenten/signal/historical-gate | The gate replayed on 30 days of 1h candles: win rates and average R | 0.15 | 0.10 | 0.07 | 2 |
validate batchPOST /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.15 | 0.10 | 0.07 | 2 |
market regimePOST /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.075 | 0.05 | 0.035 | 1 |
liquidationsPOST /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.075 | 0.05 | 0.035 | 1 |
funding ratesPOST /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.075 | 0.05 | 0.035 | 1 |
order-flow imbalancePOST /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.075 | 0.05 | 0.035 | 1 |
correlation matrixPOST /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.075 | 0.05 | 0.035 | 1 |
slippage estimatePOST /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.075 | 0.05 | 0.035 | 1 |
gas windowPOST /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.075 | 0.05 | 0.035 | 1 |
sentiment gatePOST /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.075 | 0.05 | 0.035 | 1 |
USDC reconciliationPOST /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.075 | 0.05 | 0.035 | 1 |
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