Access & Authentication
All historical data is free — no key, no sign-up. The full catalogue, every strategy's
stats / returns / curve, the aligned export matrix, and book-level summary are open so you
can verify every track record against your own model before you commit to anything. Aliases only —
the strategy mechanism stays sealed.
The live signals are the product. Real-time, actionable trade signals are served by a separate, keyed API — that's what you subscribe for.
The two APIs live on branded hosts:
| API | Base URL | Auth |
|---|---|---|
| Historical data | https://api.btcalpha.com.au | none (free) |
| Live signals + Gaia | https://signals.btcalpha.com.au | X-API-Key |
:::note Legacy hosts still work
The original hosts — https://btc-strategy-data-api.fly.dev and
https://btc-signal-distribution.fly.dev — remain valid and resolve to the same services. New
code should use the branded hosts above; existing integrations don't need to change.
:::
Historical data — open, no key
| Endpoint | Access |
|---|---|
GET /v1/strategies (catalogue + headline stats) | ✅ free |
GET /v1/strategies/{id} (metadata, provenance) | ✅ free |
GET /v1/correlation (cross-strategy matrix) | ✅ free |
GET /v1/summary (incl. equal_weight_book) | ✅ free |
GET /v1/strategies/{id}/stats · /returns · /curve | ✅ free |
GET /v1/export (aligned returns matrix) | ✅ free |
Just call them — no header required:
curl https://api.btcalpha.com.au/v1/strategies/helios/stats
curl "https://api.btcalpha.com.au/v1/export?period=daily"
That's the whole point: pull every series, drop it into your optimiser, reconcile it against your own book — for free. The evaluate-against-your-book recipe walks the full flow.
Live signals — the subscription (keyed)
The live signals API is the product. It delivers actionable signals as your strategies fire
(mode: "LIVE", is_test: false), gated by a per-client X-API-Key scoped to what you
subscribe to. Send the key in the X-API-Key header — server-side only, never in a URL or a
browser bundle:
curl https://signals.btcalpha.com.au/v1/signals/latest \
-H "X-API-Key: btca_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Live signals are request-based today — contact for access. (There's a commercial/compliance gate before signals are sold; no public pricing yet.)
How signals are priced
Live-signal pricing is value-based and capacity-aware, not a flat fee. Each strategy is priced on its deployable capacity (finite — bounded by real market liquidity and how it deploys) and its conservative, risk-adjusted expected value (tapered, haircut, provisional pending verification). You pay a fair fraction of the value the edge generates — the majority stays with you. Capacity is capped per strategy to keep the edge sharp for subscribers (protection, not restriction). Verify the full record free, no key, before subscribing. Pricing is bespoke — request-based.
:::warning Leverage — signals imply leveraged positions
Following a signal at its base_risk_pct implies a leveraged position, not a 1:1 deployment.
Each strategy publishes leverage_typical (~1×) and leverage_max (historically up to ~15×
on tight-stop trades) in its metadata; each live signal carries implied_leverage for that specific
trade (base_risk_pct ÷ stop-distance). You execute on your own venue at your own size — size to your
book and cap leverage at your discretion. Backtested / modelled, provisional — not advice.
:::
Sizing a position from a signal
Each signal gives you the inputs to size by risk — you compute the size to your capital. We do not prescribe an absolute size (that would assume your capital and be advice-like).
position_size = (your_capital × base_risk_pct) ÷ | signal_price − stop |
equivalently: position_notional = your_capital × implied_leverage
Worked example — a long signal: signal_price = 64,000, stop = 61,000, base_risk_pct = 0.025,
implied_leverage = 0.53. You deploy $1,000,000:
risk budget = 1,000,000 × 0.025 = $25,000 (what you risk if stopped)
stop distance = |64,000 − 61,000| ÷ 64,000 = 4.69%
position notional= 25,000 ÷ 0.0469 ≈ $533,000 (= 1,000,000 × 0.53 implied_leverage)
So you'd open ~$533k of BTC-PERPETUAL — about 0.53× your deployed capital on this (wide-stop) trade.
On a tight-stop trade the same risk budget produces a much larger, more leveraged position (see the
warning above). signal_price is a reference, not a guaranteed fill — work in around it on your venue.
Response codes
| Code | Meaning |
|---|---|
200 | Historical data — always, no key. |
401 unauthorized | Signals API only: missing or invalid/revoked key. Historical endpoints never need a key. |
429 rate_limited | Reserved; not enforced yet. |
Every error uses the unified { error, meta } envelope.
CORS
Browser access is restricted to an explicit allowlist (never *):
https://btcalpha.com.au
https://www.btcalpha.com.au
https://docs.btcalpha.com.au # this docs site (so the reference playground works)
http://localhost:5173, :3000, :8100 # local development
Requests from an allowed Origin receive the matching Access-Control-Allow-Origin; others receive
none. Server-to-server calls (no Origin) are unaffected. The methods are GET only.
Using the reference playground
Because docs.btcalpha.com.au is allowlisted, the "Send" button in the
API Reference calls production directly — and since all historical data is
open, every endpoint works with no key.