Live price cache fed by WebSocket ingress workers for forex, crypto, and selected market symbols.
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.
RSS ingestion, article scraping, deduplication, analysis metadata, and real-time distribution.
JWT and API-key authentication with plan limits, usage tracking, and centralized tenant configuration.
Dedicated WebSocket channels for market data, news, calendar reminders, X posts, and system events.
First request in minutes
Create or sign in to an account
Use the portal registration or OAuth flow. Registration returns a JWT session and an initial API key.
Store the API key once
Raw keys are only displayed during creation. Keep the key in server-side environment variables.
Call the core API
Start with market prices, latest forex news, or the economic calendar before moving to WebSocket streams.
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"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.
HTTP endpoints and authentication model
Core data API
CORE_REST_URLAPI key for protected routes; public market/news routes can be used by the web client.
/api/v1/market/prices List all cached live prices./api/v1/market/prices/{symbol} Fetch a single cached symbol, case-insensitive./api/v1/forex/news?page=1&page_size=20 Paginated forex article history./api/v1/forex/news/latest?limit=10 Latest processed forex news with analysis fields./api/v1/forex/news/{id} Fetch one stored forex article./api/v1/forex/calendar?impact=high&limit=10 Upcoming Forex Factory calendar events./api/v1/stock/news?limit=10 Latest processed stock news./api/v1/content/scrape Private article scraping endpoint.{
"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"
}PUT /api/v1/config/tv_symbols
Authorization: Bearer <jwt>
Content-Type: application/json
{
"value": ["XAUUSD", "EURUSD", "BTCUSDT"]
}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.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.{ "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 }{ "method": "LIST_SUBSCRIPTIONS", "id": 3 }
{ "result": ["forex_news"], "id": 3 }
{ "method": "PING", "id": 4 }
{ "result": "pong", "id": 4 }{
"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.statusOperational 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.
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.
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.