EyesOnAssets Public API

Paid B2B access via API key to the same data users see on the site: the live screener (price/change/volume across crypto, forex and stocks) and the Analytics module (technical + fundamental score from −100 to +100 per asset). No site account required — just a key.

REST / JSON Base URL: /api/v1/public Auth: X-API-Key header

Authentication

Every request must include an X-API-Key header with your key. Keys are issued manually after agreeing on a tier/contract — there is no self-service signup for this API (see "Getting access").

Keep your key secret. Never embed it in client-side (browser/mobile) code — server side only. A compromised key can be revoked immediately on request.

Quickstart

# Check your tier, limits and remaining monthly quota
curl -H "X-API-Key: eoa_live_YOUR_KEY" \
  https://your-domain/api/v1/public/usage
# Analytics score for every asset on the crypto market
curl -H "X-API-Key: eoa_live_YOUR_KEY" \
  https://your-domain/api/v1/public/analytics/crypto/list

Pricing

TierPriceMarketsRate limitQuota/mo
Starter $250/mo 1 of your choice (crypto / forex / stocks) 30 req/min 20,000
Business $500/mo All three (screener + analytics bundle) 120 req/min 150,000
Enterprise custom All three + priority support 600 req/min unlimited

You can check your current tier, market restrictions and contract term at any time via GET /usage.

Limits & quota

There are two independent limits:

TypeWhat it countsWhat happens when exceeded
Rate limit Requests per minute, depends on tier 429 Too Many Requests, retry later
Monthly quota Total requests for the calendar month 429 Monthly quota exceeded — upgrade your tier or wait for next month
Both limits apply per key (more precisely, per client if you have several keys), not per IP address — you can safely call the API from multiple servers behind NAT.

Endpoint reference

GET/api/v1/public/usage

Your current tier, allowed markets, limits and how many requests you've used this month. Doesn't cost more than a regular request against your monthly quota.

{
  "org_name": "Acme Trading LLC",
  "tier": "business",
  "status": "active",
  "allowed_markets": ["crypto", "forex", "stocks"],
  "rate_limit": "120/minute",
  "monthly_quota": 150000,
  "used_this_month": 4213,
  "contract_expires_at": null
}

GET/api/v1/public/screener/{market_type}/{exchange}/{instrument}

Live screener data: price, % change, volume for every instrument in the market/exchange/type combination.

ParameterTypeDescription
market_typepathcrypto / forex / stocks
exchangepathbybit, binance, okx, moex, nasdaq, etc. — depends on the market and deployment region
instrumentpathspot, perpetual, futures, stock, major, etc.
volume_min / volume_maxquery, optionalVolume filter
change_min / change_maxquery, optional% change filter
# Example
curl -H "X-API-Key: ..." \
  ".../api/v1/public/screener/crypto/bybit/spot?volume_min=1000000"

GET/api/v1/public/ohlcv/{market_type}/{exchange}/{symbol}/{timeframe}

OHLCV candles for a specific symbol.

ParameterTypeDescription
symbolpathE.g. BTC_USDT or BTC/USDT
timeframepath1m, 5m, 15m, 1h, 4h, 1d, etc.
limitquery, optionalNumber of candles, default 200, max 1000

GET/api/v1/public/analytics/{market}/list

Analytics score for every scored asset on a market: verdict, overall score, price, change, price mini-chart.

GET/api/v1/public/analytics/{market}/{symbol}

Full report for a single asset: every factor (technical + fundamental) with weights and explanations, technical/fundamental/overall score, and a text summary.

{
  "market": "crypto", "symbol": "BTC",
  "overall_score": 16, "verdict": "neutral",
  "factors": [
    { "name": "rsi", "value": "54.1", "sentiment": "neutral", "explanation": "RSI 54 — within normal range" }
    // ...
  ]
}

GET/api/v1/public/analytics/top-setups

Top ideas by strength of factor imbalance right now, rather than a single-asset breakdown — sorted by |overall_score| for one market or across every market your tier allows.

ParameterTypeDescription
marketquery, optionalcrypto/forex/stocks — omitted = all markets on your tier
verdictquery, optionalgrowth/decline — omitted = both
limitquery, optionalDefault 10, max 100

GET/api/v1/public/analytics/{market}/stats

Historical verdict performance on this market: win rate and average return by horizon (1/5/21/30 days), with a 95% Wilson confidence interval. win_rate: null means there isn't enough data yet to show a number — not that it's 0.

[
  { "verdict": "growth", "horizon_days": 21, "sample_size": 142,
    "is_significant": true, "win_rate": 0.61,
    "win_rate_ci_low": 0.54, "win_rate_ci_high": 0.68,
    "avg_return_pct": 3.2, "source": "backfill" }
]

GET/api/v1/public/analytics/{market}/{symbol}/history

Historical score/verdict snapshots for a single asset — for running your own backtest on your side.

ParameterTypeDescription
limitquery, optionalDefault 90, max 1000 (newest first)

Webhooks — push instead of polling

Instead of polling /analytics/{market}/{symbol} on a schedule, you can subscribe to a notification whenever the verdict changes (growth ↔ decline ↔ neutral).

POST /api/v1/public/webhooks
{ "callback_url": "https://your-server/hook", "market": "crypto" }
// the response contains "secret" — shown once, save it

GET /api/v1/public/webhooks       // list your subscriptions
DELETE /api/v1/public/webhooks/{id} // cancel a subscription

Each delivery is a POST to your callback_url with an X-Webhook-Signature header (HMAC-SHA256 of the request body using your secret — verify it to tell us apart from a forgery). callback_url must be https://. After 10 consecutive failed deliveries the subscription is automatically disabled.

{
  "event": "verdict_changed", "market": "crypto", "symbol": "BTC",
  "old_verdict": "neutral", "new_verdict": "growth",
  "overall_score": 24, "timestamp": "2026-07-26T04:00:00+00:00"
}

Error codes

CodeReason
400Invalid market_type (only crypto/forex/stocks allowed)
401Missing, invalid or revoked key
403Client suspended/contract expired, or the market isn't included in your tier
404No analytics computed yet for this symbol
429Rate limit or monthly quota exceeded
502Temporary error from a data provider (exchange/quote feed) — retry later
503Data service not initialized yet (right after a server restart)

Markets & exchanges

The API covers crypto, forex and stocks (no bonds yet — not included in the bundle). The exact set of exchanges available for a given exchange/instrument combination depends on the server's deployment region; if you're unsure which exchanges are available, ask us when we issue your key, or start with crypto/bybit/spot, which is available in every region.

Getting access

Access is issued manually after agreeing on a tier — write to us describing your use case and expected request volume, and we'll help you pick a tier and send you a key. There is deliberately no self-service signup or instant key issuance on the site — it protects both you (personal onboarding) and us (control over data usage).