Appearance
Integration checklist
Use these rules when building a production consumer.
Amounts
Token amounts use a pair of fields:
json
{
"mint": "So111...",
"amountRaw": "14841398823",
"amount": "14.841398823"
}amountRawis an integer string in the token's smallest units.amountis a decimal string adjusted for token decimals.
Keep both as strings or use an arbitrary-precision decimal library. JavaScript number cannot represent every raw token amount exactly.
USD values
valueUsd is populated when one side of a trade is SOL or a stablecoin. It is null for trades where neither side can be priced that way.
minUsdAmount lets events with valueUsd: null through. Do not assume that setting the filter removes every unpriced event.
Time and finality
- Only successful transactions are streamed.
blockTimecan benullwhen Solana has not supplied it yet.- Tessium emits as soon as the network processes a transaction; it does not wait for block time to become available.
Subscription overlap
If you subscribe both to a token and to a wallet trading that token, one on-chain trade produces two events: one for each subscription. Deduplicate only when your application wants to merge those two views.
Use signature plus the cursor's event index when you need a stable event identity. A route can contain multiple events in one transaction.
New tokens
A newly created token is available for mint-scoped subscriptions immediately.
Reconnects
- Persist the last fully processed cursor per subscription.
- Reconnect with exponential backoff and jitter.
- Recreate each subscription with its saved cursor.
- Reorder replay and live events by cursor.
- Handle
gap,dropped, andreplay_rate_limitedexplicitly.
See Cursor & replay for replay windows and limits.
Slow consumers
Read continuously; move CPU-heavy work and database writes off the WebSocket reader. A dropped notice means data was already lost. A slow_consumer notice means the connection is closing.
Narrow broad subscriptions with server-side filters before scaling consumers.
Message size
Client messages may be at most 64 KB. Lists accept at most 50 values and strings at most 64 characters.