Skip to main content

Pricing Tiers

LaserSell offers four tiers. Each tier determines your rate limits for both the REST API and the Exit Intelligence Stream.
TierNamePrice
0PersonalFree
1Professional$99/mo
2Advanced Exit Engine$249/mo
3EnterpriseCustom

Exit Intelligence Stream Limits by Tier

LimitPersonal (Free)ProfessionalAdvancedEnterprise
Wallets per session15200Custom
Positions per wallet2100100Custom
Positions per session250020,000Custom
Sessions per API key111Custom
High priority buffer (hi_capacity)256256256Custom
PnL flush interval (pnl_flush_ms)100 ms100 ms100 msCustom
Inactivity timeout45 minNoneNoneNone
Liquidity snapshotsNoYesYesYes
Partner feesNoNoYesYes

REST API Rate Limits

The REST API (/v1/sell, /v1/buy) enforces a per key request limit using a sliding window.
TierRequests per minute
Personal (Free)60
Professional60
Advanced60
EnterpriseCustom

Reading Your Limits on Connect

When you connect to the Exit Intelligence Stream, the hello_ok message includes a limits object that reflects your API key’s tier:
{
  "type": "hello_ok",
  "session_id": 42,
  "server_time_ms": 1706000000000,
  "limits": {
    "hi_capacity": 256,
    "pnl_flush_ms": 100,
    "max_positions_per_session": 500,
    "max_wallets_per_session": 5,
    "max_positions_per_wallet": 100,
    "max_sessions_per_api_key": 1
  }
}

LimitsMsg Schema

FieldTypeDescription
hi_capacitynumberMaximum high priority messages the server will buffer.
pnl_flush_msnumberInterval in milliseconds between pnl_update flushes.
max_positions_per_sessionnumberMaximum positions tracked in a single session.
max_wallets_per_sessionnumberMaximum wallets that can be monitored in a single session.
max_positions_per_walletnumberMaximum positions tracked per wallet.
max_sessions_per_api_keynumberMaximum concurrent stream sessions per API key.

Reading Limits in Code

StreamSession.connect() consumes the hello_ok message internally during the handshake. To read the limits, use the low-level StreamClient directly:
const client = new StreamClient(apiKey);
const connection = await client.connect(configure);
const [sender, receiver] = connection.split();

const helloOk = await receiver.recv();
if (helloOk?.type === "hello_ok") {
  const limits = helloOk.limits;
  console.log("Max positions:", limits.max_positions_per_session);
  console.log("Max wallets:", limits.max_wallets_per_session);
  console.log("PnL interval:", limits.pnl_flush_ms, "ms");
}

Handling 429 Responses

When you exceed the REST API rate limit, the server responds with HTTP 429 Too Many Requests. The SDKs automatically retry 429 responses using the built in retry policy. If you see persistent 429 errors:
  1. Check your request frequency. Reduce the rate of API calls.
  2. Batch requests. If building multiple transactions, space them out.
  3. Increase retry backoff. Configure a longer backoff to give the server time to recover.
See Error Handling for details on customizing the retry policy.

Exit Intelligence Stream Capacity

If you exceed the Exit Intelligence Stream’s capacity limits (e.g., too many positions or wallets), the server sends an error message:
{
  "type": "error",
  "code": "capacity_exceeded",
  "message": "max_positions_per_session limit reached"
}
The stream connection remains open. Remove positions with close_position or reduce wallets with update_wallets to free capacity.

Best Practices

  • Read limits on connect. Use the limits object to validate your configuration before sending positions.
  • Monitor for capacity errors. Log and alert on error messages with capacity related codes.
  • Use lane splitting (TypeScript). For high position counts, use connectLanes() to prevent pnl_update messages from blocking time sensitive events.
  • Respect 429 responses. Do not retry immediately; use exponential backoff.