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 newsinvest-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 ordersGET /v1/orders?page=N&per_page=N— paginated order listGET /v1/portfolio— consolidated portfolio with live valuesGET /v1/positions?page=N— paginated holdingsGET /v1/notifications?page=N— notification inboxGET /v1/watchlists?page=N,GET /v1/alerts?page=N— watchlists and price alertsGET /v1/news?page=N&class=equity— market news feedGET /v1/social/leaderboard— public copy-trading strategiesGET /v1/robo/goals— robo-advisor goalsGET /docs— Swagger UIGET /docs/openapi.yaml— raw OpenAPI 3.0 specGET /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}}