Skip to content
AtheronDEVELOPERS
← ATON Kestrel API

Kestrel API reference

Every endpoint, what it costs and the lowest seat that may call it.

Sign in to see your own test client ID in the samples.

Base address: https://developers.aton-network.org. Every request sends Authorization: Bearer <API key with the kestrel right>; every answer is JSON.

EndpointCounts asFrom
GET /api/kestrel/v1/signals1 callBuilder
GET /api/kestrel/v1/signals/{symbol}1 callBuilder
GET /api/kestrel/v1/signals/{symbol}/history5 callsBuilder
GET /api/kestrel/v1/signals/stream1 callPro
GET /api/kestrel/v1/sentiment1 callBuilder
GET /api/kestrel/v1/sentiment/history5 callsBuilder
GET /api/kestrel/v1/eye1 callPro
POST /api/kestrel/v1/backtests100 callsStudio
GET /api/kestrel/v1/backtests/{id}1 callStudio
GET /api/kestrel/v1/versions1 callBuilder
POST /api/kestrel/v1/paper/orders1 callBuilder
GET /api/kestrel/v1/paper/bots1 callBuilder
GET /api/kestrel/v1/paper/portfolio1 callBuilder
POST /api/kestrel/v1/live/orders1 callBuilder

Signals

GET /api/kestrel/v1/signals answers the newest signal of each market (?symbol= for one, ?limit= up to 500). GET /api/kestrel/v1/signals/{symbol} answers every strategy and timeframe of one market, and /history?from=&to= its past signals, 30 days kept.

net_bps is the expected return per trade after fees, spread, slippage and funding. A strategy that has not passed its backtest gate shows gate.passed: false: research, not switched on. Builder seats read signals a minute behind and without explanations.

json
{
  "object": "signal",
  "version": "v0.1.0",
  "venue": "bitunix",
  "segment": "usdt-m",
  "symbol": "BTCUSDT",
  "strategy": "trend",
  "interval": "1h",
  "at": "2026-10-20T14:00:00.000Z",
  "valid_until": "2026-10-20T15:00:00.000Z",
  "action": "none",
  "direction": { "down": 0.21, "flat": 0.55, "up": 0.24 },
  "net_bps": { "long": -3.1, "short": -14.0 },
  "cost_bps": 15.2,
  "risk": { "sortino_long": -0.05, "sortino_short": -0.4, "mae_long": 0.012, "mae_short": 0.018 },
  "gate": { "passed": false },
  "readers": { "agree": false, "sentiment": "neutral", "why": "model-no-edge" },
  "explanations": [{ "code": "cost_exceeds_edge", "weight": 0.62, "value": 15.2, "unit": "bps", "facts": { "expected_bps": 4.1 } }]
}

Streams

GET /api/kestrel/v1/signals/stream (Pro and up) is server-sent events: one signal event for each new signal. Each batch sent counts as one call. A stream lasts 15 minutes; reconnect with Last-Event-ID to carry on.

Sentiment

GET /api/kestrel/v1/sentiment answers mood (level from -1 to 1, speed, how unusual), urgency and the veto for each coin, with alerts by kind and state. /history?from=&to= answers past views, 400 days kept. Headlines are not republished.

The Kestrel Eye

GET /api/kestrel/v1/eye (Pro and up) answers every market's newest signal, the opportunities (a gated signal that says long or short) and the sentiment weather in one call.

Backtests

POST /api/kestrel/v1/backtests (Studio and up) with venue, symbol, strategy, interval, from and to (three years at most) queues a backtest; it counts as 100 calls and answers 202 with its id. GET /api/kestrel/v1/backtests/{id} answers its state and, when done, net_bps, holding_bps and excess_bps: every result is measured against simply holding the market, after fees. Five at once for an app.

Paper trading and live orders

POST /api/kestrel/v1/paper/orders, GET /api/kestrel/v1/paper/bots and GET /api/kestrel/v1/paper/portfolio act for a person who signed in to your app with Atheron and granted the trading scope: send their access token as Atheron-User-Token. Nothing reaches an exchange. POST /api/kestrel/v1/live/orders answers 403 live_trading_closed until live trading opens for everyone; then it places orders with that person's own exchange key, locked to our engine's address, through our engine's routing and guardrails.

Ask Atlas

AI assistant

Ask anything about Sign in with Atheron, the API or the portal. You get an answer from our docs, with links to the pages it used.