API Reference
LeadEdge detects when ETH, BTC, LINK, XRP, or DOGE moves on Binance Futures and predicts follow-through on other exchanges. Integrate via REST API or WebSocket for real-time signals.
Quick start
- 1.Sign up at leadedge.dev/login
- 2.Generate an API key in your dashboard
- 3.Make your first request:
curl -H "Authorization: Bearer le_live_your_key_here" \
https://leadedge.dev/api/v1/signals/latestimport requests
headers = {"Authorization": "Bearer le_live_your_key_here"}
response = requests.get("https://leadedge.dev/api/v1/signals/latest", headers=headers)
signal = response.json()
print(signal)const res = await fetch("https://leadedge.dev/api/v1/signals/latest", {
headers: { "Authorization": "Bearer le_live_your_key_here" }
});
const signal = await res.json();
console.log(signal);Base URL: https://leadedge.dev/api/v1
Authentication
All API requests require an API key sent in the Authorization header:
Authorization: Bearer le_live_your_key_hereAPI keys are generated in your dashboard. Keys are prefixed for identification:
le_live_Production keysle_test_Test keys (return sample data)Keep your API keys secret. Never expose them in client-side code, public repositories, or browser requests.
Get latest signal
/api/v1/signals/latestReturns the most recent signal.
Free tier receives signals with a 30-second delay. Pro tier receives real-time signals.
curl -H "Authorization: Bearer le_live_..." \
https://leadedge.dev/api/v1/signals/latestResponse:
{
"signal": {
"id": "sig_a1b2c3d4e5f6",
"timestamp": 1680000000123,
"asset": "ETH",
"leader_exchange": "binance",
"leader_market_type": "futures",
"leader_pair": "ETH/USDT",
"leader_direction": "up",
"leader_magnitude_pct": 0.1654,
"leader_price_before": 2000.50,
"leader_price_after": 2003.81,
"signal_quality": "medium",
"threshold_triggered": 0.1,
"predictions": [
{
"exchange": "coinbase",
"market_type": "spot",
"pair": "ETH/USD",
"expected_direction": "up",
"confidence": 0.907,
"expected_magnitude_pct": 0.1223,
"expected_follow_within_ms": 300,
"breakeven_fee_pct": 0.1223
}
],
"outcome": {
"coinbase-spot": {
"followed": true,
"actual_magnitude_pct": 0.105,
"follow_time_ms": 283,
"profitable_at_fee": 0.08
}
}
},
"meta": {
"tier": "pro",
"delay_ms": 0
}
}Signal history
/api/v1/signals/historyReturns paginated signal history with optional filters.
Query parameters:
limitintNumber of results (default 50, max 200)offsetintPagination offset (default 0)qualitystringFilter by quality: strong, medium, weakmin_thresholdfloatMinimum leader move (e.g., 0.1)sinceintUnix timestamp — signals after this timecurl -H "Authorization: Bearer le_live_..." \
"https://leadedge.dev/api/v1/signals/history?quality=strong&limit=20"Response:
{
"signals": [ ... ],
"total": 1234,
"limit": 20,
"offset": 0,
"meta": { "tier": "pro" }
}Free tier: last 24 hours only. Pro tier: full history.
Get signal by ID
/api/v1/signals/:idReturns a specific signal by ID, including outcome if resolved.
curl -H "Authorization: Bearer le_live_..." \
https://leadedge.dev/api/v1/signals/sig_a1b2c3d4e5f6Performance stats
/api/v1/stats/performanceReturns aggregate signal performance metrics.
Query parameters:
periodstringTime period: 24h, 7d, or 30d (default 7d)curl -H "Authorization: Bearer le_live_..." \
"https://leadedge.dev/api/v1/stats/performance?period=7d"Response:
{
"period": "7d",
"period_window_hours": 168,
"total_signals_resolved": 412,
"quality_breakdown": {
"strong": 38,
"medium": 210,
"weak": 164
},
"follow_through_rates": {
"coinbase-spot-ETH": { "rate": 0.907, "avg_magnitude_pct": 0.0958, "sample_size": 312 },
"bybit-spot-BTC": { "rate": 0.886, "avg_magnitude_pct": 0.0623, "sample_size": 128 },
"bybit-spot-LINK": { "rate": 0.833, "avg_magnitude_pct": 0.0712, "sample_size": 84 }
},
"profitable_rates": {
"at_0.04_fee": 0.78,
"at_0.08_fee": 0.64,
"at_0.12_fee": 0.39,
"at_0.2_fee": 0.07
},
"avg_follow_time_ms": {
"coinbase-spot-ETH": 283,
"bybit-spot-BTC": 36,
"bybit-spot-LINK": 36
},
"note": "Stats include only signals with resolved outcomes; aggregated from all live signals in the period, not tier-restricted."
}Account info
/api/v1/accountReturns your account details, tier, and rate limit status.
curl -H "Authorization: Bearer le_live_..." \
https://leadedge.dev/api/v1/accountResponse:
{
"account": {
"email": "[email protected]",
"tier": "pro",
"subscription_status": "active"
},
"api_keys": {
"active": 2,
"max": 5
},
"rate_limit": {
"daily_limit": 10000,
"used_today": 142,
"remaining": 9858,
"resets_at": "2026-04-15T00:00:00.000Z"
}
}API keys
/api/v1/keysList all your API keys (prefix only, never the full key).
curl -H "Authorization: Bearer le_live_..." \
https://leadedge.dev/api/v1/keys/api/v1/keysGenerate a new API key. The full key is returned only once.
curl -X POST \
-H "Authorization: Bearer le_live_..." \
-H "Content-Type: application/json" \
-d '{"name": "My Trading Bot"}' \
https://leadedge.dev/api/v1/keysResponse:
{
"key": "le_live_7fb46256e72353a754cb...",
"prefix": "le_live_7fb46256...",
"name": "My Trading Bot",
"message": "Save this key — it will not be shown again"
}Save your API key immediately after creation. It cannot be retrieved later. Maximum 5 keys per account.
/api/v1/keys/:idRevoke an API key. This action is permanent.
curl -X DELETE \
-H "Authorization: Bearer le_live_..." \
https://leadedge.dev/api/v1/keys/key_id_hereWebSocket stream
Connect to the real-time signal stream for instant notifications. Signals are pushed the moment they are detected — no polling needed.
Endpoint: wss://api.leadedge.dev/v1/stream?api_key=le_live_...
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
if data["type"] == "signal":
signal = data["data"]
direction = signal["leader"]["direction"]
magnitude = signal["leader"]["magnitude_pct"]
confidence = signal["predictions"][0]["confidence"]
print(f"Signal: ETH {direction} {magnitude}% (conf: {confidence})")
if confidence > 0.85:
place_order(signal)
elif data["type"] == "outcome":
print(f"Outcome: {data['data']}")
elif data["type"] == "heartbeat":
pass # Connection alive
def on_open(ws):
# Subscribe to specific quality levels
ws.send(json.dumps({
"type": "subscribe",
"channels": ["signal:strong", "signal:medium", "outcome"]
}))
ws = websocket.WebSocketApp(
"wss://api.leadedge.dev/v1/stream?api_key=le_live_...",
on_message=on_message,
on_open=on_open
)
ws.run_forever()const ws = new WebSocket(
"wss://api.leadedge.dev/v1/stream?api_key=le_live_..."
);
ws.onopen = () => {
ws.send(JSON.stringify({
type: "subscribe",
channels: ["signal:strong", "signal:medium", "outcome"]
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === "signal") {
const { leader, predictions } = data.data;
console.log(`ETH ${leader.direction} ${leader.magnitude_pct}%`);
console.log(`Confidence: ${predictions[0].confidence}`);
}
if (data.type === "outcome") {
console.log("Outcome:", data.data);
}
};Message types
signalNew signal detected. Contains full signal data with predictions.outcomeSignal resolved. Shows whether followers actually followed and by how much.heartbeatSent every 30 seconds. Confirms the connection is alive.connectedSent on initial connection with your client ID.Subscription channels
Subscribe to specific signal quality levels to filter what you receive:
signal:strongLeader move ≥ 0.2%signal:mediumLeader move 0.1% – 0.2%outcomeOutcome updates for all signalsConnection limits
Signal format
Every signal contains the leader move details, predictions for follower exchanges, and (once resolved) the actual outcome.
Signal fields
idstringUnique signal identifier (sig_...)timestampintUnix timestamp in millisecondsassetstringAsset symbol — ETH, BTC, LINK, XRP, or DOGEleader_directionstringPrice direction: up or downleader_magnitude_pctfloatSize of the leader move in percentsignal_qualitystringSignal strength: strong, medium, weakpredictionsarrayPredicted follow-through for each follower exchangeoutcomeobjectActual result after time window (null if pending)Prediction fields
exchangestringFollower exchange nameconfidencefloatHistorical follow-through probability (0-1)expected_magnitude_pctfloatExpected size of follower moveexpected_follow_within_msintExpected time for follower to reactbreakeven_fee_pctfloatMaximum round-trip fee for profitabilityQuality levels
Confidence values reflect historical probability based on collected data. They are not guarantees. Past performance does not predict future results.
Rate limits
| Resource | Free | Pro |
|---|---|---|
| REST API calls | 100/day | 10,000/day |
| WebSocket connections | 1 | 3 |
| Signal history | 24 hours | Unlimited |
| Signal delay | 30 seconds | Real-time |
Rate limit headers are included in every response:
X-RateLimit-Remaining: 9857
X-RateLimit-Limit: 10000
X-RateLimit-Reset: 2026-04-15T00:00:00.000ZErrors
All errors return a JSON object with an error code and message:
{
"error": "RATE_LIMITED",
"message": "Daily API limit exceeded",
"limit": 100,
"reset_at": "2026-04-15T00:00:00.000Z"
}| Status | Code | Description |
|---|---|---|
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 401 | INVALID_KEY | API key not found or wrong format |
| 401 | KEY_REVOKED | API key has been revoked |
| 404 | NOT_FOUND | Signal or resource not found |
| 429 | RATE_LIMITED | Daily API limit exceeded |
| 500 | QUERY_ERROR | Server-side error |
Questions? Contact us