03 — Technical & Legal

Technical & Legal.

Performance, browser support, the developer API, legal compliance, roadmap, and support channels.

K
11

Technical & Performance

Browsers, latency, WebSocket, downtime, hardware

Two categories:

Web app (logged-in browser sessions): generous limits that you'd only hit if scripting against the app (which is against ToS — use the API instead).

API access(Pro/Enterprise): -Pro Layer 1: 50,000 calls/month, 60 calls/minute -Enterprise Layer 1-4: 1,000,000 calls/month (soft cap), 500 calls/minute, unlimited WebSocket subscriptions

Enforced via Redis-backed sliding window. Headers on every response: -X-RateLimit-Limit: your tier's limit -X-RateLimit-Remaining: calls remaining in current window -X-RateLimit-Reset: when the window resets (Unix timestamp)

429 responses include aRetry-Afterheader. The right behavior is to back off — repeated 429s without backoff can lead to temporary key suspension.

Graceful degradation. If one exchange's data feed goes down:

1.System Healthin Pulse turns yellow/red for that source 2. Modules that aggregate (Liquidity Map, Order Flow) continue with surviving exchanges; a footer note explains which sources are down 3. Market Intelligence engines that depend on the affected source note "operating on partial data" anddemote confidencein their output 4. Aggregated verdicts continue but with lower confidence — the math reflects reality 5. Exchange-specific views (e.g., "Binance funding") show a clear error state with the last successful update time

We don't fake data or interpolate during outages. The system is honest about what it has and doesn't have.

Not native. The web app is responsive down to ~1024px, so it works on tablets and large phones in landscape, but isn't optimized for phone-sized screens.

PWA (Progressive Web App): you can install FOCSAL to your home screen on iOS and Android, getting a near-native feel with offline cache for settings and last-loaded reports.

Native iOS and Android apps are on the roadmap for post-public-launch (Q4 timeframe). They'll cover Pulse, alerts, and Market Intelligence summaries — not the full module set, because some modules (Liquidity Map, Footprint) require screen real estate that doesn't translate to phone.

Yes, at multiple layers:

  • In transit: TLS 1.3 (HTTPS) for every connection. HSTS enabled. No HTTP fallback.
  • At rest: AWS EBS encryption (AES-256) for application disks. Database backups encrypted before upload to Backblaze B2.
  • Passwords: bcrypt cost = 12. Never stored in plain text.
  • API keys (yours): stored as SHA-256 hashes. We can verify a key when you use it but cannot recover its plain-text form.
  • Refresh tokens: stored as SHA-256 hashes, never in plain text
  • JWT signing key: 256-bit secret in a restricted environment file, never in source control

Deeper encryption (TDE on Postgres, customer-managed keys) is available for Enterprise customers on request.

Measured production latencies (P99):

  • REST endpoints (cached): <50ms TTFB
  • REST endpoints (full compute): ~300ms worst case (e.g., full Deribit options chain)
  • WebSocket lag from exchange: <100ms (network + processing)
  • Frontend render after data arrival: <50ms for most modules; ~200ms for full Liquidity Map repaint

Servers in AWS Frankfurt (eu-central-1). Connect from EU: 10-30ms RTT. From US East: 80-120ms. From APAC: 200-300ms.

For sub-millisecond strategy needs, FOCSAL isn't the right tool — co-located trading infrastructure is. But for analytics and human-speed decisions, latency is fine.

Target: 99.5%+ for Pro, 99.9% for Enterprise (with SLA credits for breaches on Enterprise).

We publish real-time status atstatus.focsal.com— per-service uptime, incident history, planned maintenance windows.

Factors that affect uptime: - Our infrastructure (AWS EC2, managed by us): historically 99.9%+ - Exchange APIs (out of our control): each exchange has its own uptime; we degrade gracefully when individual sources fail - Stripe (billing): 99.99% historically; affects billing actions only, not platform access

Monthly status reports for Enterprise customers detail any incidents and root causes.

Yes, with trade-offs.

  • WebSocket auto-reconnects with exponential backoff if the connection drops
  • ETag / 304 caching reduces repeat data transfers
  • Free tier uses 60-second depth updates instead of sub-second (less bandwidth)
  • The frontend gracefully degrades — if WebSocket fails, REST polling kicks in

Minimum usable: 1 Mbps for everything except live Liquidity Map. Live Liquidity Map needs 5 Mbps+ for sub-second updates without dropped frames.

If you're on a flaky connection, theSystem Healthwidget in Pulse shows your connection quality in real-time.

Auto-reconnect with exponential backoff: 1s, 2s, 4s, 8s, capped at 30s.

After successful reconnect: 1. Frontend pulls a REST snapshot to catch up 2. WebSocket stream resumes from current state 3. Visual indicator (green badge in the corner) confirms recovery

Connection registry is per(exchange, asset)— one broken WebSocket session doesn't block others. If Binance's WebSocket dies, Bybit's keeps working.

If the disconnect lasts > 5 minutes, you'll see a yellow warning banner suggesting you refresh.

A few possible reasons:

1.Latency— exchange data goes through our pipeline (ingest → aggregate → serve). For real-time numbers, our value can be 100-500ms behind your exchange's own UI.

2.Aggregation— for cross-exchange metrics (aggregated funding, total OI), we use specific methodologies that differ from any single exchange's display. The aggregated value is the weighted sum; per-venue values match the source exactly.

3.Timezone normalization— we present timestamps in UTC by default. Exchange UIs sometimes use local time, which can cause apparent discrepancies on time-based metrics.

4.Decimal precision— we may round at different decimals than the exchange. The raw values match; the displayed precision can differ.

If you see a discrepancy that doesn't fit these explanations, emailsupport@focsal.comwith a screenshot — we'll investigate.

Minimum: - 8 GB RAM - Dual-core CPU (last 5 years) - Integrated graphics OK; Liquidity Map and Footprint use WebGL but degrade gracefully - 10 Mbps internet connection

Recommended for heavy use (multi-monitor traders running 5+ modules simultaneously): - 16 GB RAM - Modern CPU (Intel 11th gen+, AMD Ryzen 5000+, Apple M-series) - Discrete GPU for smooth Canvas/WebGL rendering - 50 Mbps connection

We optimize aggressively for browser performance — the JS bundle is code-split per module, so you only load what you use. Even on the minimum spec, FOCSAL runs better than most traditional crypto trading platforms.

Right now: single EC2 m6i.xlarge handles up to ~200 paid users comfortably. Scaling plan is staged:

  • Stage 1 (current, 0-50 users): single instance
  • Stage 2 (50-200): vertical upgrade to m6i.2xlarge / 4xlarge as needed
  • Stage 3 (200-1000): split DB to RDS Postgres, Redis to ElastiCache, workers on separate instances
  • Stage 4 (1000-5000): Kubernetes (EKS), Postgres Multi-AZ, multi-region read replicas
  • Stage 5 (5000+): global Postgres, active-active multi-region, dedicated infrastructure for Enterprise tenants

The roadmap is in our Master Deployment Plan. Customers don't see these transitions — the application interface stays the same; performance improves as we scale.

AWS, eu-central-1 (Frankfurt).

Stack: - EC2 m6i.xlarge for application (FastAPI backend, workers) - PostgreSQL (self-hosted on the same instance for now) - Redis (cache + Pub/Sub) - Nginx (TLS termination, reverse proxy) - Cloudflare in front (DDoS protection, DNS)

Frontend on Vercel (Frankfurt edge), backups on Backblaze B2 (EU region).

We deliberately host in the EU for GDPR alignment and EU customer latency. Multi-region expansion (US East, APAC) is planned as we scale.

Modern evergreen browsers:

  • Chrome 120+— fully supported, primary development target
  • Firefox 120+— fully supported
  • Safari 17+— fully supported (some WebGL features fall back to canvas)
  • Edge 120+— fully supported (Chromium-based)

We don't test on older versions. If you're on Chrome 110 or Safari 15, things will mostly work but we won't fix browser-specific issues.

Mobile browsers (Chrome Mobile, Safari Mobile) work for basic features. Heavy modules (Liquidity Map, Footprint Canvas) are designed for desktop and tablet — phone screens are too small for usable rendering.

12

Developer & API

API access, rate limits, webhooks, OpenAPI, SDKs

Yes, on Pro and Enterprise plans:

  • Pro ($100/mo)— API Layer 1 (Foundation/Markets endpoints): funding, OI, liquidations, basis, options chain, options instruments, orderbook snapshot, OHLCV. 50,000 calls/month, 60/min, 5 WebSocket subscriptions.
  • Enterprise ($500/mo)— API Layer 1-4 (full Foundation + Analytics + Intelligence + Strategy/Copilot): everything in Layer 1 plus dealer positioning, gamma exposure, IV surface, regime detection, scenario verdicts, smart money flows, strategy simulation, copilot review. 1M calls/month soft cap, 500/min, unlimited WebSocket, MCP server access.

Free and Plus don't include API access — they're web-app only.

Generate keys atapp.focsal.com/developer/keys.

Layer 1 — Foundation/Markets(Pro+): -GET /v1/markets/funding— funding rates with context -GET /v1/markets/open-interest— OI by venue and aggregated -GET /v1/markets/liquidations— recent liquidation events -GET /v1/markets/basis— futures-spot basis -GET /v1/markets/ohlcv— candlestick data -GET /v1/options/chain— full options chain -GET /v1/options/instruments— list of options instruments -GET /v1/orderbook/snapshot— point-in-time orderbook

Layer 2 — Analytics(Enterprise): -GET /v1/options/gamma-exposure— dealer GEX by strike -GET /v1/options/dealer-positioning— net dealer gamma/vanna/charm/delta -GET /v1/options/iv-surface— full implied vol surface -GET /v1/futures/liquidity-walls— large liquidity clusters -GET /v1/pulse/snapshot— aggregated market state

Layer 3 — Intelligence(Enterprise): -GET /v1/intelligence/market-state— current regime + verdict -GET /v1/intelligence/regime— regime history -GET /v1/intelligence/scenarios— current scenario probabilities -GET /v1/intelligence/divergences— flagged divergences -GET /v1/intelligence/smart-money— CFTC TFF analysis

Layer 4 — Strategy/Copilot(Enterprise): -POST /v1/strategy/simulate— run a strategy on historical data -POST /v1/copilot/review— get AI interpretation of a payload -POST /v1/strategy/historical-analog— find similar historical setups

Full OpenAPI spec atdocs.focsal.com.

API key in a request header:

X-API-Key: fk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keys are generated at app.focsal.com/developer/keys. Each key: - Inherits permissions from your subscription tier - Is shownonceat creation — save it somewhere safe (we store only a hash) - Can be named for organizational tracking - Can be revoked anytime; revocation is immediate

Key prefixfk_live_identifies them as production keys. We may addfk_test_for sandbox use in the future.

Keys should be kept secret. Don't commit them to source control. If you accidentally leak a key, revoke and regenerate immediately — we'll forensically check usage logs on request.

Yes, on Pro (limited) and Enterprise (full).

Pro webhooks: - Market Intelligence bias change (on configured asset/timeframe) - Gamma flip cross - Custom alert trigger

Enterprise webhooksadd: - Multi-condition rule triggers (AND/OR logic) - Regime transitions - Scenario verdict updates - Smart Money state changes

Configure atapp.focsal.com/alerts/webhooks. We POST a JSON payload to your URL with signed HMAC-SHA256 for verification. Retry on failure with exponential backoff (3 attempts over 30 minutes); persistent failure disables the webhook with email notification.

Destinations: any HTTPS endpoint. Pre-built integrations for Discord, Slack, Telegram (via URL).

Yes, on Pro and Enterprise plans. Connect towss://ws.focsal.com/v1/streamwith your API key in theX-API-Keyheader or query string.

Subscriptions: -markets:{asset}— orderbook, trades, funding for an asset -intelligence:{asset}:{timeframe}— verdict updates as engines recompute -pulse— global pulse widget data -alerts:{user}— your configured alert triggers (Pro+)

Subscription limits: - Pro: 5 simultaneous subscriptions - Enterprise: unlimited

Messages are JSON, withevent_typeandpayloadfields. Ping/pong every 30 seconds; close after 60s of silence. Full protocol documented atdocs.focsal.com/websocket.

Yes, with retention limits per endpoint:

  • Funding, OI, basis, liquidations: 1 year via?from=and?to=parameters
  • OHLCV: full available history per venue (typically 1 year+ for spot, 2-5 years for futures)
  • Options chains and gamma snapshots: 90 days
  • Market Intelligence verdicts: 1 year of historical verdicts
  • Smart Money / CFTC: full history from 2017 (BTC) / 2021 (ETH) / 2024 (SOL)
  • Macro (FRED): full available history from FRED

Long-range backtesting datasets are an Enterprise add-on — we can provide raw data dumps for institutional research use cases.

Three principles:

1.Check headers: every response includesX-RateLimit-RemainingandX-RateLimit-Reset. Use them to pace your requests, not blindly retry.

2.Respect 429s: on429 Too Many Requests, read theRetry-Afterheader and wait that long before retrying. Exponential backoff for repeated 429s.

3.Use WebSocket for live data: if you're polling REST every 5 seconds for the same data, you're wasting calls. Subscribe to the WebSocket equivalent instead.

Client pattern (Python): <pre><code>python response = client.get(&#x27;/v1/markets/funding&#x27;, params={&#x27;asset&#x27;: &#x27;BTC&#x27;}) remaining = int(response.headers[&#x27;X-RateLimit-Remaining&#x27;]) if remaining &lt; 10: sleep(60 - (time.time() % 60)) # wait until window resets</code></pre>

Repeated rate-limit violations without backoff can result in temporary API key suspension. We send email warnings before any suspension.

Publicly available athttps://api.focsal.com/openapi.json. Also rendered as readable docs atdocs.focsal.com(powered by Mintlify).

The spec is auto-generated from the FastAPI backend, so it's always in sync with what's actually running in production. We version the API explicitly:/v1/is the current stable version; we'll keep it backward-compatible. Breaking changes go to/v2/with a 6-month deprecation window on/v1/.

Client libraries: Python and JavaScript SDKs are on the roadmap (Q3). Until then, the OpenAPI spec works with auto-generators (openapi-generator-cli, swagger-codegen) for any language.

Not yet in production. Both Python and JavaScript SDKs are on the Q3 roadmap.

In the meantime: the OpenAPI spec atapi.focsal.com/openapi.jsonis comprehensive. Most languages have auto-generators that produce a working client from it.

Examples for common patterns (auth, pagination, error handling) are in the docs atdocs.focsal.com/examplesin Python, JavaScript, and cURL.

If you build something useful, we feature community SDKs in our docs and Discord.

MCP = Model Context Protocol, an open standard from Anthropic for connecting AI agents to data sources.

FOCSAL's MCP server lets you connect AI clients (Claude Desktop, custom agents) directly to your FOCSAL data. Your AI can query Market Intelligence, fetch Smart Money state, run scenario analyses — all through structured tool calls.

Use cases: - AI-assisted research workflows ("Claude, what's the current state of BTC options positioning?") - Custom trading agents with FOCSAL as a data source - Integration with internal LLM-based dashboards

Enterprise-tier feature. Setup instructions atdocs.focsal.com/mcp.

14

Roadmap & Updates

Changelog, future features, release cadence

Quarterly themes (no committed ETAs because crypto moves):

Q3 2026 (active): - Python and JavaScript API SDKs - TradingView widget integration - More assets (top 50 by demand) - Enhanced Strategy Lab with AI optimization - Mintlify-powered docs site

Q4 2026 (planned): - Native iOS app (pulse, alerts, MI summaries) - Full equity-curve backtest with execution costs - Multi-region infrastructure (US East primary failover) - More options engines (vega-weighted positioning, IV term-structure analytics)

2027 H1 (concept): - DEX coverage (Uniswap V4, Hyperliquid spot) - Macro overlay deepening (real-time Fed signals) - White-label Enterprise offering - Custom alert engine (rule scripting)

We share progress monthly on Discord and quarterly themes by email. Major shipping news always by email and changelog.

Yes — published atfocsal.com/changelog(and as GitHub Releases for the public-facing side of the platform).

Every release includes: - What's new (features) - What's improved (refinements) - What's fixed (bugs) - What's deprecated (migration guidance) - API changes (with backward-compatibility notes)

We ship multiple times per week. Subscribers can opt into changelog emails (weekly digest) in profile settings.

Major releases also get a post-mortem document with rationale for design choices and methodology refinements — useful for users who want depth.

Yes. Some features ship behind feature flags during beta:

  • Pro users get automatic access to most betas unless they opt out
  • Beta features are clearly labeled in the UI with aBETApill
  • Feedback is collected via in-app prompts and is highly valued — it shapes the GA design
  • Betas can break or change without notice; we don't recommend depending on them for critical workflows

Enterprise customers can request early access to features in development by reaching out tosales@focsal.com.

Multiple times per week for the web app, including:

  • Patches and bug fixes: continuous deployment, typically same-day after testing
  • Minor features: weekly
  • Major features: monthly themes (new modules, methodology updates)
  • Methodology updates(engine logic changes): announced 1-2 weeks in advance with explanation, applied in a labeled version, with comparison docs for users who want the detail

API changes follow stricter discipline: backward-compatible additions anytime; breaking changes only with 6-month deprecation notice and a new version path (/v2/).

15

Support & Community

Contact, status page, bug reports, response times

By plan tier:

  • Free: emailsupport@focsal.com. Best-effort response, typically within 72h.
  • Plus: emailsupport@focsal.com. Target 48h response.
  • Pro: emailsupport@focsal.comor chat (in-app widget). Target 4h response during business hours (Mon-Fri 9-17 CET).
  • Enterprise: dedicated Slack channel + email + phone (provided at onboarding). Target 1h response 24/7.

For specific concerns: -Security issues:security@focsal.com(PGP key on the site) -Privacy / GDPR:privacy@focsal.com-Billing:billing@focsal.com-Sales / Enterprise inquiries:sales@focsal.com-Legal / press:legal@focsal.com-General:hello@focsal.com

We answer every email. Promise.

status.focsal.com— real-time uptime per service (API, WebSocket, workers, auth), incident history, and planned maintenance windows.

Subscribe to status updates by email or RSS to be notified of incidents and resolutions.

During incidents we post updates every 15-30 minutes with: what's affected, root cause (when known), workaround if any, expected resolution time. Post-incident reports are published within 5 business days.

That's a healthy outcome, not a bug.The thresholds are deliberately calibrated so that only genuinely strong setups fire. Typical pace for a Plus subscriber watching 3 hot assets is2-5 alerts per day.

Quiet markets — chop, low conviction across timeframes, divergent engines — deliberately produce no alerts. If you got an email every hour, the system would be useless; you'd start ignoring them within a week.

ASend test alertbutton in the Alerts module emails you a sample at any time so you can confirm the channel works. The Recent alerts table shows the last 20 fires so you can verify the evaluator is running even when no real signal triggered recently.

If the market is genuinely flat for a week, you'll get nothing — that's the platform telling you to stay flat too.

Yes — public Discord server atdiscord.gg/focsal(link on our site).

Channels: -#announcements— product updates from the team -#general— community chat -#feature-requests— request and vote on features -#strategy-share— community-shared strategies (use at your own risk) -#market-talk— discussion of current market conditions -#help— peer-to-peer support -#methodology— deep discussions about the engines and methodology -#api-developers— for developers building with FOCSAL API

The team is active in Discord. We don't replace official support there (don't ask private account questions in public channels), but for general discussion and community, it's the best place.

Absolutely. Two channels:

1.Discord— our public Discord server has a#feature-requestschannel. Discussions are open to the whole community, which helps us see which requests have broader interest.

2.Email:hello@focsal.com. Especially good for detailed Enterprise-specific requests that benefit from private conversation.

We maintain an internal roadmap influenced heavily by user requests. Pro users' votes weight slightly more than Free; Enterprise customers can request features as part of their relationship and get priority development consideration.

We can't commit to ETAs publicly — too many crypto-side variables — but we share quarterly roadmap themes with subscribers.

Two paths:

General bugs: emailsupport@focsal.comwith: - What you expected - What actually happened - Steps to reproduce - Screenshot if visual - Browser/OS

Security bugs:security@focsal.com— please use our PGP key (on the site) for anything sensitive. We have a responsible disclosure policy and acknowledge security reports within 24h.

We don't run a paid bug bounty program yet, but we do recognize security researchers in our Hall of Fame and offer FOCSAL credits or swag for valid reports.

For in-app issues, the help widget (bottom-right corner of the dashboard) opens a quick bug report flow with auto-captured technical context.

Emailsupport@focsal.comwith: - The specific report or value you're questioning - Asset, timeframe, timestamp - What you think is correct, and why (source you're cross-referencing against)

We take data accuracy seriously. If you've found a genuine bug or methodology issue, we'll: 1. Acknowledge within 24h 2. Investigate and respond with findings within 5 business days 3. Issue a correction in the changelog if confirmed 4. Credit your account if the issue affected your subscription experience

If the difference is methodological (we calculate something differently than another source), we'll explain our methodology. We're transparent about how things are computed — the Compendium and code-level documentation cover most cases.

Interface and Co-Pilot: -English(default) -Polish(full) -Spanish(in progress, ETA Q3) -German(in progress, ETA Q3)

Set your language preference in profile settings; the Co-Pilot responds in the same language. Trading terminology (gamma flip, basis, BOS) stays in English even in localized interfaces — translating these would lose precision.

Support email: -English(always) -Polish(always) - Others: we use machine translation for routing; native-speaker response when available

Legal documents (Terms, Privacy, Cookies): -Polishis the binding version -Englishtranslation provided for convenience

Partially. Our Journal exports trade data as CSV with full context — entry/exit prices, sizes, dates, regime snapshots, notes. You can plug this into your accountant's tax tool of choice.

Wedon'tgenerate jurisdiction-specific tax reports (like a US Form 8949 or a German Anlage KAP) because: 1. We don't see your actual exchange fills (those happen on the exchange) 2. Tax law differs by country and we're not licensed to provide tax advice 3. Off-the-shelf crypto tax tools (Koinly, CoinTracker, Accointing) integrate with exchanges directly and do this better than we could

The Journal complements those tools — it gives you the why for each trade, alongside the what they pull from your exchange.

Two channels:

1.In-app banner: 48 hours before any planned maintenance, a yellow banner appears at the top of the dashboard with the time window.

2.Email: for active paid subscribers, an email is sent 48h before with details.

Thestatus page(status.focsal.com) lists planned maintenance windows up to 30 days in advance.

We schedule maintenance during low-traffic windows (Sunday 02:00-04:00 UTC) when possible. Critical hotfixes can happen anytime but are kept brief.

Nothing matches that.

Try a different keyword, or reach us directly —hello@focsal.com.

Still have questions?
We answer every email — usually within a day for Free and Plus, within 4 hours for Pro.
Get in touch