DOSSIER // API DOCS // HANDLER TIER
DOSSIER
HOME  /  API DOCS
UPGRADE TO HANDLER →
★ HANDLER TIER ONLY v1 · STABLE REST + WEBSOCKET

API DOCUMENTATION.

Programmatic access to wallet intelligence, convergence detection, and the live signal stream. Build your own UI, automate your workflow, integrate Dossier into your existing trading stack.

BASE URL https://api.dossier.io/v1
01

AUTHENTICATION

All API requests require a Handler-tier key, generated from the settings page. Pass it as a Bearer token in the Authorization header. Keys are scoped to your account and can be rotated at any time. Lost or compromised keys should be revoked immediately.

SHELL
# Bearer token authentication
curl https://api.dossier.io/v1/wallets \
  -H "Authorization: Bearer dsr_live_HK4m9PqR8n2WtY2k4Zx" \
  -H "Accept: application/json"
JAVASCRIPT
const response = await fetch('https://api.dossier.io/v1/wallets', {
  headers: {
    'Authorization': `Bearer ${process.env.DOSSIER_KEY}`,
    'Accept': 'application/json'
  }
});
const wallets = await response.json();
PYTHON
import requests, os

response = requests.get(
    "https://api.dossier.io/v1/wallets",
    headers={
        "Authorization": f"Bearer {os.environ['DOSSIER_KEY']}",
        "Accept": "application/json"
    }
)
wallets = response.json()
// SECURITY Never commit API keys to source control or expose them client-side. The API supports CORS for your registered domains only — request additional origins from the settings page.
02

RATE LIMITS

Rate limits are per-key, applied as token-bucket rolling windows. Limits reset on the second. Every response includes X-RateLimit-Remaining and X-RateLimit-Reset headers so you can pace requests.

ENDPOINT CLASSLIMITNOTES
REST · read 120 / min Standard endpoints. Caches respected.
REST · write 30 / min Watchlist creation, custom rule edits.
WebSocket 4 connections Per key. No message rate limit beyond fair-use.
Search 30 / min Wallet/token search endpoints.
// HEADERS Hitting a limit returns 429 Too Many Requests with a Retry-After header indicating seconds to wait.
03

ERRORS

Errors return standard HTTP status codes with a JSON body containing error.code, error.message, and a request_id for support.

400
invalid_request
Malformed request — missing required field or invalid value.
401
unauthorized
Missing, expired, or revoked API key.
403
tier_required
Endpoint requires Handler tier; current key is Operative.
404
not_found
Wallet, token, or convergence ID not found in our index.
429
rate_limited
Request rate exceeded. Check Retry-After header.
503
data_lag
Upstream Helius/Birdeye lag. Retry with backoff.
04

LIST WALLETS

Paginated list of tracked wallets, sortable by performance metrics. Returns scored wallets only — sub-50% win rate wallets and insider patterns are filtered server-side.

GET /v1/wallets
// QUERY PARAMETERS
sort string OPT One of: pnl_7d, pnl_30d, win_rate, grads. Default pnl_7d.
mc_band string OPT Filter by entry MC band: sub_100k, 100k_2m, 2m_10m, 10m_plus.
min_winrate number OPT Minimum win rate, 0-1. Default 0.5.
limit integer OPT Page size, max 100. Default 50.
cursor string OPT Pagination cursor from previous response.
// RESPONSE · 200 OK
JSON
{
  "data": [
    {
      "file_no": "0001",
      "address": "7xK4m9PqR8n2WtY2k4ZxH6q8Lm",
      "alias": "RAYDIUM HUNTER",
      "pnl_7d": 284432.18,
      "pnl_pct_7d": 0.5688,
      "win_rate": 0.89,
      "trades_30d": 87,
      "avg_hold_minutes": 142,
      "grads_30d": 22,
      "signal_score": 5,
      "last_active": "2026-04-25T13:42:14Z"
    }
  ],
  "next_cursor": "eyJyYW5rIjo1MH0",
  "has_more": true
}
05

GET WALLET

Detailed dossier for a single wallet — full position list, behavioral profile, intel notes.

GET /v1/wallets/{address}

Returns the full wallet object including current open positions, trade history aggregates, and the behavioral classification (scalper / swing / position holder). Address can be a full Solana address or a Dossier file number (e.g. #0001).

// CACHING Wallet detail responses are cached for 30 seconds. For real-time position changes, use the WebSocket stream (see section 11).
06

LIST CONVERGENCES

Active convergence events. The flagship signal — 3+ tracked wallets independently buying the same token within a 6-hour window. This endpoint is what powers the Hot Signals strip on the dashboard.

GET /v1/convergences
// QUERY PARAMETERS
window string OPT Lookback window. active, 24h, 7d. Default active.
min_wallets integer OPT Minimum wallets in cluster. Default 3.
mc_band string OPT Filter by current MC band.
// RESPONSE
JSON
{
  "data": [
    {
      "id": "conv_4421",
      "alert_id": "A47",
      "token": {
        "ticker": "WAKE",
        "name": "Wake Protocol",
        "mint": "WaKeP...jY9k",
        "current_mc_usd": 847000
      },
      "wallet_count": 4,
      "avg_entry_mc": 342000,
      "window_minutes": 90,
      "detected_at": "2026-04-22T15:48:11Z",
      "severity": "high",
      "wallets": ["#0001", "#0008", "#0006", "#0017"]
    }
  ]
}
07

CREATE WATCHLIST

Define a custom convergence rule. Subscribe to alerts when specific wallets, tokens, or patterns match. Watchlists are persistent and trigger both REST list filters and WebSocket events.

POST /v1/watchlists
// REQUEST BODY
JSON
{
  "name": "RAYDIUM HUNTER moves",
  "rule": {
    "wallets": ["#0001"],
    "event": "buy",
    "min_position_usd": 10000,
    "mc_band": "sub_500k"
  },
  "deliver_via": ["telegram", "webhook"]
}
08

WEBSOCKET STREAM

Real-time event stream for convergences, big moves, cluster exits, and individual tracked wallet activity. Sub-second latency from on-chain confirmation. Subscribe to specific event types or get the firehose.

WSS wss://stream.dossier.io/v1?key=YOUR_KEY

Authenticate with your API key as a query parameter or via the Authorization header on connection. The server will close the connection on auth failure with code 4401.

JAVASCRIPT
const ws = new WebSocket(
  `wss://stream.dossier.io/v1?key=${process.env.DOSSIER_KEY}`
);

ws.addEventListener('open', () => {
  // Subscribe to convergence + big move events
  ws.send(JSON.stringify({
    action: 'subscribe',
    events: ['convergence', 'big_move'],
    filters: { mc_band: '100k_2m' }
  }));
});

ws.addEventListener('message', (e) => {
  const event = JSON.parse(e.data);
  console.log(event.type, event.payload);
});
PYTHON
import asyncio, json, os
import websockets

async def stream():
    url = f"wss://stream.dossier.io/v1?key={os.environ['DOSSIER_KEY']}"
    async with websockets.connect(url) as ws:
        await ws.send(json.dumps({
            "action": "subscribe",
            "events": ["convergence", "big_move"],
            "filters": {"mc_band": "100k_2m"}
        }))
        async for raw in ws:
            event = json.loads(raw)
            print(event["type"], event["payload"])

asyncio.run(stream())
// HEARTBEAT The server sends a {"type":"ping"} frame every 30 seconds. Reply with {"action":"pong"} within 60 seconds or the connection will be closed. Most client libraries handle this automatically.
09

EVENT REFERENCE

All events are JSON objects with type, id, timestamp, and a type-specific payload. Subscribe to specific types or use "events": ["*"] for the full firehose.

convergence.detected
3+ wallets enter the same token within 6h. Highest priority signal. Payload includes the token, wallet list, average entry MC, and window duration.
convergence.expanded
A 4th, 5th, or Nth wallet joins an active convergence. Useful for "is this getting stronger" tracking.
big_move.detected
Single top-quartile wallet enters a position more than 2× their median size. Often precedes convergence.
cluster.exit
2+ wallets in a previously-converged token sell within 90 minutes. Counter-signal — read with care.
wallet.trade
Any trade by a watchlisted wallet (requires watchlist subscription). Includes buy/sell, token, USD value, MC at execution.
watchlist.match
A custom watchlist rule fires. Payload includes the rule ID, matched event, and full event context.