API Reference

REST API & WebSocket

120+ endpoints tersedia untuk tier Quant dan Institutional. Base URL: https://bandaralert.com/api/v1

Authentication

Dua metode autentikasi tersedia (dicek berurutan). Gunakan salah satu:

# Option 1: API Key (recommended)
X-API-Key: ba_live_xxxx_xxxx
# Option 2: JWT Bearer Token
Authorization: Bearer <JWT_TOKEN>
API key bisa di-generate di Settings → API Keys. Jaga keamanan API key Anda - jangan share di repository publik.

Rate Limits

Rate limit berlaku per API key. Response header X-RateLimit-Remaining menunjukkan sisa request.

TierRate LimitBurstConcurrent
Free60 req/jam10 req/min2
Pro600 req/jam30 req/min5
Quant6,000 req/jam100 req/min10
InstitutionalUnlimitedUnlimited50

Signals

Prefix: /api/v1/signals

MethodEndpointDescriptionParameters
GET/volume-anomalyAnomali volume hari ini (semua saham)severity=warning|severe
GET/broker-accumulationSemua BASS scores terbarumin_score=0&sort=desc
GET/broker-accumulation/{ticker}BASS detail per ticker dengan komponen breakdowndays=30
GET/smart-money-v2Smart Money Score semua sahammin_score=0
GET/market-regimeStatus regime saat ini (Bull/Neutral/Bear) + probabilitas
GET/liquidity-stressLiquidity shift scores per saham
GET/sector-rotationSector rotation analysis + heatmap datadays=20
GET/convergenceSaham dengan multiple sinyal convergemin_signals=2
GET/insider-activityInsider trading activity terbarudays=30
GET/multibagger-scanHasil multibagger scannermin_bass=65

Market Data

Prefix: /api/v1/data

MethodEndpointDescriptionParameters
GET/ohlcv/{ticker}Historical OHLCV datadays=30
GET/broker-summary/{ticker}Broker buy/sell per sahamdays=5
GET/earnings/{ticker}Earnings data dan analyst consensus
GET/fundamentals/{ticker}Data fundamental (P/E, P/B, ROE, margins)
GET/correlationCorrelation matrix antar sahamtickers=BBCA,BBRI&days=90
GET/sectorsList semua sektor dan subsector IDX

Brokers

Prefix: /api/v1/brokers

MethodEndpointDescriptionParameters
GET/List semua broker aktif (filterable by tier)tier=foreign|domestic|retail
GET/leaderboardTop brokers by total flowdays=20&limit=20
GET/{code}Profil broker detail + batting average
GET/{code}/holdingsTop holdings broker saat inilimit=10
GET/{code}/activityActivity timeline brokerdays=30

Portfolio & Tools

Prefix: /api/v1

MethodEndpointDescriptionParameters
GET/watchlistGet user watchlist
POST/watchlistAdd ticker ke watchlistbody: {ticker: string}
DELETE/watchlist/{ticker}Remove ticker dari watchlist
GET/portfolioGet user portfolio positions
POST/portfolioAdd posisi ke portfoliobody: {ticker, lots, price}
GET/risk-calculatorCalculate position sizing & risk-rewardentry=9200&sl=8900&tp=9800&capital=10000000
POST/backtestRun backtest strategibody: {strategy config}

AI Agents

Prefix: /api/v1/ai

MethodEndpointDescriptionParameters
POST/stock-reportGenerate AI Stock Report untuk 1 tickerbody: {ticker, timeframe, language}
POST/bull-bearBull vs Bear debate + verdictbody: {ticker, timeframe, language}
GET/daily-briefRingkasan pasar harian terbaru
POST/generate-briefTrigger generate daily brief (admin)
POST/report-pdfDownload AI Stock Report sebagai PDFbody: {ticker, timeframe}
POST/debate-pdfDownload Bull/Bear debate sebagai PDFbody: {ticker, timeframe}
GET/brief-pdfDownload Daily Brief sebagai PDFdate=2026-04-18
POST/portfolio-riskAI analyze risiko portfolio userbody: {holdings: [{ticker, weight}]}
GET/quotaCek quota AI yang tersisa hari ini

Network (Broker Flow)

Prefix: /api/v1/network

MethodEndpointDescriptionParameters
GET/broker-graphBipartite graph broker↔tickerdays=20
GET/broker-bubblesData untuk visualisasi bubble (ukuran + warna)limit=30

Computed (Aggregates)

Prefix: /api/v1/computed

MethodEndpointDescriptionParameters
GET/enriched-listKey ratios + BASS + flow untuk semua 874 saham
GET/broker-leaderboardTop broker berdasarkan aktivitasdays=1&limit=30 (max 200)
GET/broker-portfolio/{code}Komposisi portfolio broker
GET/correlationCorrelation matrix untuk beberapa tickertickers=BBCA,BBRI&days=60
GET/risk-reward/{ticker}Auto risk-reward analysis dengan scenariodays=30&risk_percent=1
GET/stock-enrichment/{ticker}Mega endpoint: semua data untuk 1 ticker
GET/financials/{ticker}Laporan keuangan lengkap

Trail (Dana Tracking)

Prefix: /api/v1/trail

MethodEndpointDescriptionParameters
GET/stock/{ticker}Jejak arus dana per sahamdays=20
GET/broker/{code}Jejak arus dana per brokerdays=20
GET/reversalsSinyal reversal dari tracking dana

Backtest

Prefix: /api/v1/backtest

MethodEndpointDescriptionParameters
GET/runJalankan backtest strategisignal_type=bass&threshold=70&hold_days=10&ticker=BBCA

Watchlists

Prefix: /api/v1/watchlists

MethodEndpointDescriptionParameters
GET/List semua watchlist user
POST/Create/update watchlistbody: {name, tickers: [...]}

Alerts

Prefix: /api/v1/alerts

MethodEndpointDescriptionParameters
GET/Riwayat alert yang pernah dikirimlimit=50

Preferences

Prefix: /api/v1/preferences

MethodEndpointDescriptionParameters
GET/Get user preferences (bahasa, theme, indicator settings)
PUT/Update user preferencesbody: {language, theme, indicators}
GET/presetsList preset indicator yang tersedia
POST/apply-presetApply preset ke user settingsbody: {preset_id}
GET/impact-previewPreview dampak perubahan indikator ke BASS score

Auth

Prefix: /api/v1/auth

MethodEndpointDescriptionParameters
POST/registerRegister akun barubody: {email, password, display_name, referral_code?}
POST/loginLogin email + password, returns JWTbody: {email, password}
POST/googleLogin via Google OAuthbody: {id_token}
POST/forgot-passwordKirim link reset password ke emailbody: {email}
POST/reset-passwordReset password dengan token dari emailbody: {token, new_password}
PUT/passwordChange password (harus login)body: {current_password, new_password}
POST/refreshRefresh JWT access tokenbody: {refresh_token}
POST/logoutLogout + revoke refresh tokenbody: {refresh_token}
GET/meProfile user + tier info

Billing & Payments

Prefix: /api/v1/billing

MethodEndpointDescriptionParameters
GET/plansList subscription plans + harga
POST/subscribeBuat invoice subscribe + amount unik untuk QRISbody: {plan_id}
GET/invoicesRiwayat invoice userpage=1&limit=10
POST/upload-proofUpload bukti transfer QRIS (auto-verified by AI Vision)multipart file

Referral Program

Prefix: /api/v1/referral

MethodEndpointDescriptionParameters
GET/codeGet kode referral user + statistik
GET/creditsBalance kredit referral (20% first-sub, 5% renewal)
POST/applyApply kode referral saat checkout (diskon 10%)body: {referral_code}

Helpdesk

Prefix: /api/v1/helpdesk

MethodEndpointDescriptionParameters
POST/ticketsBuat tiket support (auto-forward ke Telegram admin)body: {category, subject, message, screenshot?}
GET/ticketsRiwayat tiket user
GET/tickets/{id}Detail tiket + replies
POST/tickets/{id}/replyReply tiketbody: {message}

Response Format

Semua response menggunakan format JSON yang konsisten:

// Success response
{
  "success": true,
  "data": { ... },
  "meta": {
    "timestamp": "2026-03-19T10:30:00Z",
    "count": 874,
    "page": 1,
    "total_pages": 1
  }
}

// Error response
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded. Try again in 60 seconds.",
    "retry_after": 60
  }
}

Contoh Penggunaan

import requests

API_KEY = "ba_live_xxxx_xxxx"
BASE = "https://bandaralert.com/api/v1"
headers = {"X-API-Key": API_KEY}

# 1. Get semua BASS scores
resp = requests.get(f"{BASE}/signals/broker-accumulation", headers=headers)
signals = resp.json()["data"]

for s in signals[:5]:
    print(f"{s['ticker']}: BASS={s['bass_score']:.0f}, Confidence={s['confidence']}")

# 2. Get OHLCV data untuk BBCA (30 hari)
ohlcv = requests.get(f"{BASE}/data/ohlcv/BBCA?days=30", headers=headers).json()
print(f"BBCA: {len(ohlcv['data'])} data points")

# 3. Get market regime
regime = requests.get(f"{BASE}/signals/market-regime", headers=headers).json()
print(f"Regime: {regime['state']} (prob: {regime['probability']:.0%})")

WebSocket API

Real-time streaming untuk tier Quant dan Institutional. Menerima update sinyal segera setelah pipeline harian selesai.

ChannelDescriptionFrequency
bass_updatesBASS score updates setelah pipeline harian1x/hari (17:30 WIB)
volume_anomalyVolume anomaly alerts real-timeEvent-driven
regime_changeMarket regime transitionsEvent-driven
convergenceMulti-signal convergence alerts1x/hari (17:30 WIB)

Contoh WebSocket

// WebSocket connection (Quant tier)
const ws = new WebSocket("wss://bandaralert.com/ws");

ws.onopen = () => {
  // Authenticate
  ws.send(JSON.stringify({
    type: "auth",
    api_key: "ba_live_xxxx_xxxx",
  }));

  // Subscribe to channels
  ws.send(JSON.stringify({
    type: "subscribe",
    channels: ["bass_updates", "volume_anomaly", "regime_change"],
    tickers: ["BBCA", "BBRI", "TLKM"],  // optional filter
  }));
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  switch (data.type) {
    case "bass_update":
      console.log(`${data.ticker}: BASS ${data.bass_score}`);
      break;
    case "volume_anomaly":
      console.log(`Alert: ${data.ticker} volume z-score ${data.z_score}`);
      break;
    case "regime_change":
      console.log(`Regime changed to: ${data.new_state}`);
      break;
  }
};
Connection URL: wss://bandaralert.com/ws. WebSocket mendukung auto-reconnect. Ping/pong heartbeat setiap 30 detik untuk menjaga koneksi tetap aktif.

Error Codes

HTTPCodeDescription
400BAD_REQUESTRequest parameter tidak valid atau missing
401UNAUTHORIZEDAPI key atau JWT token tidak valid atau expired
403FORBIDDENTier Anda tidak memiliki akses ke endpoint ini
404NOT_FOUNDResource tidak ditemukan (ticker, broker code, dll)
429RATE_LIMIT_EXCEEDEDRate limit tercapai. Tunggu sesuai retry_after
500INTERNAL_ERRORServer error. Coba lagi dalam beberapa saat
503PIPELINE_RUNNINGData sedang diproses. Coba lagi dalam 15-30 menit
OpenAPI Spec: Dokumentasi lengkap tersedia dalam format OpenAPI 3.0 di https://bandaralert.com/openapi.json. Gunakan untuk generate SDK di bahasa apa pun menggunakan tools seperti openapi-generator.