API Documentation

v1.0 - Coming Soon

Access 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.
New to the API?Quick-start guide →|Entry + exit payloads, Python executor, integration paths

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

ParameterTypeDefaultDescription
pageint1Page number
per_pageint50Results per page
min_scorefloat-Filter by minimum combined score
signalstring-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

ParameterTypeDefaultDescription
daysint14Lookback window in days
symbolstring-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

ParameterTypeDefaultDescription
daysint7Lookback 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

PlanRequests / dayBurstHistory access
Free (preview)10010 / min7 days
Pro1,00060 / min90 days
EnterpriseUnlimitedCustomFull 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 StatusCodeDescription
401UnauthorizedMissing or invalid API key. Check your Authorization header.
429Rate LimitedYou have exceeded your plan's rate limit. Check X-RateLimit-Reset for when your quota resets.
503UnavailableThe 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.