Koder Invest

  • Area: Industry Solutions (Fintech)
  • Path: products/vertical/invest/engine
  • Kind: Multi-asset trading platform — Go API + Flutter client
  • Version: 0.2.0
  • Status: Active — paper trading live at bull.koder.dev

Role in the stack

Koder Invest is the hyperscale global investment platform — stocks, ETFs, crypto, forex, fixed income, and derivatives unified under a single account, wallet, and tax view. It serves retail investors who want professional-grade tools and power users who demand low-latency execution.

The platform consists of:

  • invest-api — Go HTTP gateway (REST + WebSocket) handling OMS, portfolio, KYC, social trading, robo-advisor, notifications, and news
  • invest-marketdata — Go market data service (quotes, bars, WebSocket fan-out)
  • Flutter app (flutter_app/) — Web, Android, and Linux clients with trading UI, charts, portfolio view, news, and settings

Primary couplings

Module Relationship
services/foundation/id/platform User authentication and KYC via OIDC
infra/jet TLS reverse proxy for invest-api.koder.dev and bull.koder.dev
Binance API Crypto venue adapter (live or paper)
Alpaca API US equities venue adapter (live or paper)
Firebase FCM Push notification delivery

Public Interfaces

REST API (documented at https://invest-api.koder.dev/docs):

  • POST /v1/orders — submit marketlimitstopOCObracket orders
  • GET /v1/orders?page=N&per_page=N — paginated order list
  • GET /v1/portfolio — consolidated portfolio with live values
  • GET /v1/positions?page=N — paginated holdings
  • GET /v1/notifications?page=N — notification inbox
  • GET /v1/watchlists?page=N, GET /v1/alerts?page=N — watchlists and price alerts
  • GET /v1/news?page=N&class=equity — market news feed
  • GET /v1/social/leaderboard — public copy-trading strategies
  • GET /v1/robo/goals — robo-advisor goals
  • GET /docs — Swagger UI
  • GET /docs/openapi.yaml — raw OpenAPI 3.0 spec
  • GET /v1/ws/portfolio — WebSocket live portfolio stream

Pagination Standard

All list endpoints use ?page=1&per_page=50 and return:

{"data": [...], "pagination": {"page":1,"per_page":50,"count":50,"has_more":true}}