Production-oriented market intelligence platform

Build with real-time market data, news intelligence, and tenant-aware APIs.

Fio is the public product experience for the ATLSD platform: a service-oriented market information system combining Rust data pipelines, HTTP APIs, WebSocket streams, a management portal, and Discord delivery workflows.

Market data aggregation

Live price cache fed by WebSocket ingress workers for forex, crypto, and selected market symbols.

News intelligence

RSS ingestion, article scraping, deduplication, analysis metadata, and real-time distribution.

Tenant-aware access

JWT and API-key authentication with plan limits, usage tracking, and centralized tenant configuration.

Realtime delivery

Dedicated WebSocket channels for market data, news, calendar reminders, X posts, and system events.

Getting Started

First request in minutes

1

Create or sign in to an account

Use the portal registration or OAuth flow. Registration returns a JWT session and an initial API key.

2

Store the API key once

Raw keys are only displayed during creation. Keep the key in server-side environment variables.

3

Call the core API

Start with market prices, latest forex news, or the economic calendar before moving to WebSocket streams.

Example request
curl "$CORE_REST_URL/api/v1/market/prices/XAUUSD" \
  -H "x-api-key: $FIO_API_KEY"

curl "$CORE_REST_URL/api/v1/forex/news/latest?limit=5" \
  -H "x-api-key: $FIO_API_KEY"
Portal Guide

Manage access, plans, and tenant configuration

Dashboard

Review account status, current plan, usage summary, and service activity from a single operational view.

API keys

Create, rename, and revoke API keys. The platform allows up to 10 active keys per user.

Tenant config

Configure market symbols and custom RSS feeds. Validation follows the active plan limits.

The developer portal is where you manage your user identity, plans, API keys, and configuration. These settings are synchronized in real-time so your HTTP and WebSocket access remain consistent.

API Reference

HTTP endpoints and authentication model

Core data API

CORE_REST_URL

API key for protected routes; public market/news routes can be used by the web client.

GET /api/v1/market/prices List all cached live prices.
GET /api/v1/market/prices/{symbol} Fetch a single cached symbol, case-insensitive.
GET /api/v1/forex/news?page=1&page_size=20 Paginated forex article history.
GET /api/v1/forex/news/latest?limit=10 Latest processed forex news with analysis fields.
GET /api/v1/forex/news/{id} Fetch one stored forex article.
GET /api/v1/forex/calendar?impact=high&limit=10 Upcoming Forex Factory calendar events.
GET /api/v1/stock/news?limit=10 Latest processed stock news.
POST /api/v1/content/scrape Private article scraping endpoint.
Market price response
{
  "symbol": "XAUUSD",
  "price": 3400.25,
  "bid": 3399.9,
  "ask": 3400.6,
  "volume": null,
  "source": "market_data",
  "asset_type": "forex",
  "received_at": "2026-05-15T10:00:00Z"
}
Tenant config update
PUT /api/v1/config/tv_symbols
Authorization: Bearer <jwt>
Content-Type: application/json

{
  "value": ["XAUUSD", "EURUSD", "BTCUSDT"]
}
WebSocket Streams

Low-latency event delivery

Provider-style streams

Connect once to /ws/v1 with an api_key, token, or short-lived ticket, then manage streams with JSON commands.

/ws/v1 Provider-style endpoint. Connect once, authenticate, then send stream commands.
market_data All live market trade events allowed by the tenant plan.
market_data:XAUUSD Live market data for one symbol. Counts toward the market symbol subscription limit.
forex_news Forex news events.
stock_news Stock news events, subject to plan access.
calendar Economic calendar reminder events, subject to plan access.
high_impact High-impact macro/news alerts.
volatility Volatility spike alerts.
x All configured X/Twitter feed events allowed by the tenant plan.
x:federalreserve Events for one X/Twitter username. Counts toward the X username subscription limit.
system Operational system messages and status events.
all Compatibility stream for internal/bot clients with full access.
Browser connection
const ticket = await fetch('/api/realtime/session', { method: 'POST' }).then((r) => r.json());
	const ws = new WebSocket(`${CORE_WS_URL}/ws/v1?ticket=${ticket.ticket}`);

ws.onopen = () => {
  ws.send(JSON.stringify({
    method: 'SUBSCRIBE',
    params: ['market_data:XAUUSD', 'forex_news'],
    id: 1
  }));
};

ws.onmessage = (event) => {
  const message = JSON.parse(event.data);
  console.log(message.stream, message.event, message.data);
};

Commands

SUBSCRIBE Add one or more streams to the current connection.
UNSUBSCRIBE Remove one or more streams from the current connection.
LIST_SUBSCRIPTIONS Return the active stream list for the connection.
PING Return a pong response without changing subscriptions.
Subscribe and unsubscribe
{ "method": "SUBSCRIBE", "params": ["market_data:XAUUSD", "forex_news"], "id": 1 }
{ "result": null, "id": 1 }

{ "method": "UNSUBSCRIBE", "params": ["market_data:XAUUSD"], "id": 2 }
{ "result": null, "id": 2 }
List subscriptions and ping
{ "method": "LIST_SUBSCRIPTIONS", "id": 3 }
{ "result": ["forex_news"], "id": 3 }

{ "method": "PING", "id": 4 }
{ "result": "pong", "id": 4 }
Event and plan error
{
  "stream": "market_data:XAUUSD",
  "channel": "market_data",
  "event": "market.trade",
  "data": { "tick": { "symbol": "XAUUSD" } }
}

{
  "error": { "code": 429, "msg": "Market symbol subscription limit reached for your plan (3)" },
  "id": 5
}

Plan enforcement

Core enforces WebSocket connection limits at connect time and stream limits at subscribe time. Symbol streams count against tv_symbols_max, X username streams count against x_usernames_max, and tenant allowlists such as tv_symbols are checked before a subscription is accepted.

Legacy routes under /api/v1/ws/* still work as compatibility wrappers, but new integrations should use /ws/v1.

Event names

market.tradeforex_news.newforex_news.high_impactstock_news.newcalendar.remindergold.volatility_spikex.newheartbeatsystem.status
Discord Bot

Operational alerts inside Discord

/market_alert XAUUSD 3400

Create a direct price alert for a symbol.

/forex_news_setup #channel

Send forex news updates to a Discord channel.

/stocknews subscribe

Subscribe to equity market news.

/calendar_setup #channel

Enable economic calendar reminders.

/twitter_setup #channel

Forward configured X account posts.

/volatility_setup #channel

Enable volatility spike alerts.

Security

Access control is enforced at tenant boundaries

API keys

Keys are generated once, hashed before storage, and synchronized to the core tenant registry.

JWT sessions

Portal and control-plane requests use signed Bearer tokens with user, email, plan, and expiry claims.

Plan limits

Daily quotas, WebSocket connection caps, rate limits, and feature capabilities are evaluated per tenant.

FAQ

Common implementation questions

Is this only a Discord bot?

No. The Discord bot is one delivery surface. The platform also exposes HTTP APIs, WebSocket streams, and a management portal.

How are API keys stored?

Raw API keys are shown once, then stored securely as SHA-256 hashes. Revocation and label updates happen through the developer portal.

Can tenants configure their own sources?

Tenant configuration supports market symbols and custom RSS feeds, subject to plan capabilities and limits.