Public Reference

JSON Contract

This page shows the public request messages, system messages, real response formats, and what a client can safely rely on.

Overview JSON Contract Create Trade Migration CreatePool Liquidity Burn

Field guarantees

LevelMeaning
Key presentThe property is included in every object of that family.
Value reliableThe client can treat the value as reliable on the current public message path.
Value conditionalThe key is present, but the value can still be null or depend on the pool, event type, or current message path.

WebSocket request types

quick mode
{
  "type": "subscribe",
  "mode": "all"
}
quick mode + create detail
{
  "type": "subscribe",
  "mode": "mints",
  "create": {
    "detail": "mid"
  }
}
focused mode
{
  "type": "subscribe",
  "events": ["create", "trade"],
  "pools": ["letsbonk.fun"],
  "create": {
    "detail": "min"
  }
}
unsubscribe
{
  "type": "unsubscribe",
  "events": ["trade"],
  "pools": ["letsbonk.fun"]
}
current_state
{
  "type": "current_state"
}
  • If mode is present, the server expands it into the internal filter automatically.
  • Supported quick modes are all, mints, trades, migrations, and pools.
  • Mode must not be combined with events or pools in the same message.
  • If events are omitted, the request means all currently deliverable events.
  • If pools are omitted, the request means all currently available pools.
  • trade is an alias that expands to buy plus sell.
  • create.detail affects only create events and accepts min, mid, and full. If omitted, the server uses full.

System messages

handshake
{
  "type": "service",
  "name": "handshake",
  "state": {
    "status": "connected",
    "availablePools": ["bags.fm", "pump.fun", "pump.swap", "raydium.amm", "raydium.cpmm", "meteora.dlmm", "letsbonk.fun", "meteora.damm-v1", "meteora.damm-v2"],
    "availableEvents": ["create", "trade", "buy", "sell", "migration", "createPool", "addLiquidity", "removeLiquidity", "burn"],
    "supportedModes": ["all", "mints", "trades", "migrations", "pools"],
    "supportedMessages": ["subscribe", "unsubscribe", "current_state"],
    "effectiveFilter": {
      "mode": "none",
      "subscriptions": {},
      "createDetail": "full",
      "graceActive": true
    },
    "subscriptionGraceMs": 3000
  }
}
subscription_ack
{
  "type": "service",
  "name": "subscription_ack",
  "action": "subscribe",
  "state": {
    "availablePools": ["bags.fm", "pump.fun", "pump.swap", "raydium.amm", "raydium.cpmm", "meteora.dlmm", "letsbonk.fun", "meteora.damm-v1", "meteora.damm-v2"],
    "availableEvents": ["create", "trade", "buy", "sell", "migration", "createPool", "addLiquidity", "removeLiquidity", "burn"],
    "supportedModes": ["all", "mints", "trades", "migrations", "pools"],
    "supportedMessages": ["subscribe", "unsubscribe", "current_state"],
    "effectiveFilter": {
      "mode": "all",
      "subscriptions": {},
      "createDetail": "mid",
      "graceActive": false
    }
  }
}
current_state
{
  "type": "service",
  "name": "current_state",
  "state": {
    "availablePools": ["bags.fm", "pump.fun", "pump.swap", "raydium.amm", "raydium.cpmm", "meteora.dlmm", "letsbonk.fun", "meteora.damm-v1", "meteora.damm-v2"],
    "availableEvents": ["create", "trade", "buy", "sell", "migration", "createPool", "addLiquidity", "removeLiquidity", "burn"],
    "supportedModes": ["all", "mints", "trades", "migrations", "pools"],
    "supportedMessages": ["subscribe", "unsubscribe", "current_state"],
    "effectiveFilter": {
      "mode": "custom",
      "subscriptions": {
        "create": ["bags.fm", "letsbonk.fun", "pump.fun"],
        "createPool": ["bags.fm", "pump.swap"]
      },
      "createDetail": "min",
      "graceActive": false
    }
  }
}
error
{
  "type": "service",
  "name": "error",
  "state": {
    "availablePools": ["bags.fm", "pump.fun", "pump.swap", "raydium.amm", "raydium.cpmm", "meteora.dlmm", "letsbonk.fun", "meteora.damm-v1", "meteora.damm-v2"],
    "availableEvents": ["create", "trade", "buy", "sell", "migration", "createPool", "addLiquidity", "removeLiquidity", "burn"],
    "supportedModes": ["all", "mints", "trades", "migrations", "pools"],
    "supportedMessages": ["subscribe", "unsubscribe", "current_state"],
    "effectiveFilter": {
      "mode": "none",
      "subscriptions": {},
      "createDetail": "full",
      "graceActive": true
    }
  },
  "error": {
    "code": "invalid_subscription",
    "message": "Unknown create detail level.",
    "details": {
      "invalidCreateDetail": "wide",
      "supportedCreateDetails": ["min", "mid", "full"]
    }
  }
}
NamePurpose
handshakeInitial connection state and available public messages.
subscription_ackConfirmation after subscribe or unsubscribe changes.
current_stateSnapshot of the current filter.
errorStructured error response for invalid requests or rejected actions.

Create detail levels

LevelWhat it keepsBest fit
minLaunch identity: signature, mint, signer, pool, short token metadata, block and timestamp.Fast mint feeds, watchlists, and low-bandwidth routing.
midEverything from min plus market, metadata, supply, and risk fields.Ranking, alerting, and UI cards that need context but not the full reserve block.
fullEverything from min and mid plus reserves, fees, pool mechanics, and extended create diagnostics.Deep analytics, execution logic, and debugging real create paths.

Observed family examples

FamilySignature / sourceWhat it validates
Create2i4j3aNSP4y6usMHwf4k8Gf5v8Cir6TcNiS7NK8CQsfcdwAGqXkrWKRPthCw7T9JpjsNo9hhzYzqDEYS6n4cMi6nThe live create shape contains more than marketing-level core fields.
Trade5GL8LJGm6gcRFRRCd6ss5eyHLV1yipJnovh6zQWUASJTdUJVE2ZKRmJ2KpDxRwTdPmCUeZGzCmd11WwjeqfbHv8VTrade schema is transport-sensitive and keeps nullable values nullable.
Migrationpump-migration-testMigration is resolved from parsed transaction, not flattened into logs-only.
CreatePool4ViJScYg612DtdnV1iZKBDc2ZVnWwX1QAfurTcHNNNGkAoR3E2FnWdXXo34MAvk3TK8ux2mXKZPs5RHnhKN9uN4dPool-side lifecycle events are already first-class in the public contract.
Liquidity29VK4NCy6Z9V4p5FfMfRkrBbAUuqohM94FFMKZyGBk3TcZMMvfTSVPAZAhjZVLwqyA9dbHxysr5zg6RAgxURjAetRemove liquidity payload is real; add liquidity still has an honest gap.
BurnReserved contract onlyThe public docs stay honest and do not invent burn production payloads.

Client rule

Do not assume too much: branch on type, name, and txType. Treat null as a valid result for conditional fields, read effectiveFilter.createDetail from system messages, and do not guess undocumented pool families from other pages.
Previous Page Reference Overview
Current Page JSON Contract
Next Page Create Event