API Documentation
v1.0 - Coming SoonAccess real-time momentum signals programmatically.
The API is currently in development. This documentation reflects the planned specification. Sign up for early access on the Pricing page.
Authentication
All API endpoints require a Bearer token. Obtain your API key from the Developer Portal once available.
Authorization: Bearer mb_live_XXXXXXXXXXXXXXXXXXXX- mb_live_ prefix + 32 hex chars for live environments
- mb_test_ prefix for sandbox environments
Base URL
Production
https://api.masterbitcoin.com/v1(coming soon)Sandbox
https://sandbox.masterbitcoin.com/v1(for testing)During the demo phase, a read-only preview API is available - base URL shown in your account dashboard once available. No authentication required for public endpoints.
Endpoints
GET
/signals
Returns the current scored signal list.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | int | 1 | Page number |
| per_page | int | 50 | Results per page |
| min_score | float | - | Filter by minimum combined score |
| signal | string | - | Filter by tier: strong | candidate |
Example Response
{
"page": 1,
"per_page": 50,
"total": 312,
"signals": [
{
"symbol": "SOLUSDT",
"price": 183.42,
"price_24h_pct": 4.81,
"combined_score": 87.3,
"xs_score": 91.2,
"ts_score": 79.4,
"ms_score": 88.1,
"signal": "strong",
"funding_rate": 0.0082,
"oi_delta_4h": 3.21,
"ls_ratio": 1.47,
"entry_label": "Optimal",
"chase_risk": "low",
"atr_14_pct": 2.14,
"rr_ratio": 3.2,
"dominant_factor": "xs_momentum",
"hard_screen_fail": false,
"rationale": "Strong XS momentum with rising OI"
},
{
"symbol": "AVAXUSDT",
"price": 39.17,
"price_24h_pct": 3.52,
"combined_score": 82.1,
"xs_score": 85.0,
"ts_score": 74.3,
"ms_score": 80.6,
"signal": "strong",
"funding_rate": 0.0061,
"oi_delta_4h": 1.87,
"ls_ratio": 1.29,
"entry_label": "Good",
"chase_risk": "low",
"atr_14_pct": 3.05,
"rr_ratio": 2.8,
"dominant_factor": "xs_momentum",
"hard_screen_fail": false,
"rationale": "Breakout continuation with sector tailwind"
},
{
"symbol": "LINKUSDT",
"price": 18.94,
"price_24h_pct": 2.17,
"combined_score": 67.4,
"xs_score": 70.2,
"ts_score": 61.8,
"ms_score": 65.0,
"signal": "candidate",
"funding_rate": 0.0043,
"oi_delta_4h": 0.94,
"ls_ratio": 1.12,
"entry_label": "Fair",
"chase_risk": "medium",
"atr_14_pct": 2.88,
"rr_ratio": 2.1,
"dominant_factor": "ts_momentum",
"hard_screen_fail": false,
"rationale": "Developing trend, below top-tier threshold"
}
]
}GET
/picks
Returns the top 10 highest-scoring active signals.
No query parameters required.
Response Schema
{
"picks": Signal[], // top 10 signals ordered by combined_score desc
"count": 10,
"regime": "risk_on",
"scan_time": "2026-06-10T14:32:07Z"
}GET
/regime
Current market regime classification.
{
"regime": "risk_on",
"summary": "BTC trending above VWAP. Altcoin breadth 68%. Funding neutral.",
"btc_price": 105420.0,
"btc_24h_pct": 1.84,
"regime_changed_at": "2026-06-09T08:15:00Z"
}GET
/live-positions
Current open positions on the live trading account.
{
"positions": [
{
"symbol": "SOLUSDT",
"name": "Solana",
"sector": "L1",
"side": "Buy",
"entry_price": 179.20,
"current_price": 183.42,
"pnl_pct": 2.35,
"pnl_usd": 11.75,
"sl_pct_entry": -3.0,
"sl_distance": -5.35,
"sl_consumed": 56.1,
"hold_minutes": 247,
"xs_score": 91.2,
"ts_score": 79.4,
"ms_score": 88.1,
"combined_score": 87.3,
"entry_label": "Optimal",
"leverage": 2
}
],
"aggregate": {
"total_positions": 7,
"total_pnl_usd": 48.32,
"avg_pnl_pct": 1.94,
"avg_hold_minutes": 310
}
}GET
/history
Historical signals with outcome data.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| days | int | 14 | Lookback window in days |
| symbol | string | - | Filter by symbol (e.g. SOLUSDT) |
Response Schema
{
"days": 14,
"count": 847,
"signals": [
{
"id": "sig_9f3c12a",
"symbol": "SOLUSDT",
"signaled_at": "2026-06-08T10:20:00Z",
"price": 174.50,
"combined_score": 84.1,
"xs_score": 88.3,
"signal": "strong",
"regime": "risk_on",
"flags": ["high_oi_delta", "low_funding"],
"rationale": "Breakout with rising open interest",
"outcome": {
"move_1h": 0.82,
"move_4h": 2.41,
"move_24h": 5.12,
"correct_1h": true,
"correct_4h": true,
"correct_24h": true
}
}
]
}GET
/accuracy
Win rate statistics across signal tiers.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| days | int | 7 | Lookback window in days |
Response Schema
{
"overall_wr_1h": 0.614,
"overall_wr_4h": 0.672,
"overall_wr_24h": 0.701,
"n": 423,
"by_tier": {
"strong": { "n": 187, "wr_1h": 0.691, "wr_4h": 0.743, "wr_24h": 0.778 },
"candidate": { "n": 236, "wr_1h": 0.551, "wr_4h": 0.614, "wr_24h": 0.640 }
}
}Webhooks
Pro subscribers can register a webhook URL to receive signal events in real-time. When a qualifying event occurs, MasterBitcoin will POST a signed payload to your endpoint within 200ms.
Event Types
- signal.new - A new signal enters the top-tier list
- signal.updated - A signal score changes by more than 5 points
- regime.changed - Market regime transitions to a new state
Example Payload
POST https://your-server.com/webhook
Content-Type: application/json
X-MB-Signature: sha256=a1b2c3d4e5f6...
X-MB-Timestamp: 1749562800
{
"event": "signal.new",
"ts": "2026-06-10T14:00:00Z",
"data": {
"symbol": "SOLUSDT",
"combined_score": 87.3,
"signal": "strong",
"entry_label": "Optimal",
"regime": "risk_on"
}
}Retry policy: Failed deliveries are retried 3 times with exponential backoff (5s, 25s, 125s). After 3 failures the webhook is paused and you receive an email notification.
Rate Limits
| Plan | Requests / day | Burst | History access |
|---|---|---|---|
| Free (preview) | 100 | 10 / min | 7 days |
| Pro | 1,000 | 60 / min | 90 days |
| Enterprise | Unlimited | Custom | Full history |
Rate limit headers are included in every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Code Examples
Python
Python SDK Examples
import httpx
API_KEY = "mb_live_XXXXXXXXXXXXXXXXXXXX"
BASE_URL = "https://api.masterbitcoin.com/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
def get_signals(min_score: float = 70.0, signal_tier: str = "strong") -> dict:
"""Fetch current scored signals."""
resp = httpx.get(
f"{BASE_URL}/signals",
params={"min_score": min_score, "signal": signal_tier, "per_page": 50},
headers=headers,
)
resp.raise_for_status()
return resp.json()
def get_picks() -> dict:
"""Fetch the top 10 highest-scoring active signals."""
resp = httpx.get(f"{BASE_URL}/picks", headers=headers)
resp.raise_for_status()
return resp.json()
def stream_webhook(event_payload: dict) -> None:
"""Handle incoming webhook events from MasterBitcoin."""
event = event_payload.get("event")
data = event_payload.get("data", {})
if event == "signal.new":
symbol = data["symbol"]
score = data["combined_score"]
print(f"New signal: {symbol} - score {score:.1f}")
elif event == "regime.changed":
print(f"Regime changed to: {data.get('regime')}")
if __name__ == "__main__":
picks = get_picks()
print(f"Regime: {picks['regime']}")
for p in picks["picks"]:
print(f" {p['symbol']:12s} score={p['combined_score']:.1f} {p['signal']}")JavaScript
Node.js SDK Examples
const API_KEY = "mb_live_XXXXXXXXXXXXXXXXXXXX";
const BASE_URL = "https://api.masterbitcoin.com/v1";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
async function getSignals({ minScore = 70, tier = "strong" } = {}) {
const params = new URLSearchParams({
min_score: minScore,
signal: tier,
per_page: 50,
});
const res = await fetch(`${BASE_URL}/signals?${params}`, { headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
async function getPicks() {
const res = await fetch(`${BASE_URL}/picks`, { headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
async function getRegime() {
const res = await fetch(`${BASE_URL}/regime`, { headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
// Express.js webhook handler example
import express from "express";
const app = express();
app.use(express.json());
app.post("/webhook", (req, res) => {
const { event, data } = req.body;
if (event === "signal.new") {
console.log(`New signal: ${data.symbol} - score ${data.combined_score}`);
}
res.sendStatus(200);
});
// Main
(async () => {
const picks = await getPicks();
console.log(`Regime: ${picks.regime}`);
picks.picks.forEach((p) =>
console.log(` ${p.symbol.padEnd(12)} score=${p.combined_score.toFixed(1)} ${p.signal}`)
);
})();Error Codes
| HTTP Status | Code | Description |
|---|---|---|
| 401 | Unauthorized | Missing or invalid API key. Check your Authorization header. |
| 429 | Rate Limited | You have exceeded your plan's rate limit. Check X-RateLimit-Reset for when your quota resets. |
| 503 | Unavailable | The API is temporarily unavailable - retry with exponential backoff. A public status page is on the roadmap; until then, contact support if an outage persists. |
Questions about the API? Contact us or view pricing plans to secure early access.