Skip to main content

❓ Frequently Asked Questions

Here’s some helpful information to get you started.

Which pools do you support?

We support the following platforms for both trading and data stream APIs:

  • pump.fun
  • pump-amm
  • BONK
  • Raydium Launchpad
  • Raydium CPMM
How can I have more than 2 connections to the data stream?

We send a very large number of transactions, so to avoid overloading our server, there is a strict limit of 1 connection per IP address.

You can use ZeroMQ (highly recommended; it's extremely simple to use). The idea is straightforward:

You run a single instance that receives all transactions from our server. Then, from that instance, you share each transaction using the PUB/SUB method.

Here's how it works: You send data to a specific port, for example, 8939. Then the SUB (subscribers — your two, three, or more bots) connect to this port and receive all the transactions.

This way, you only have one connection for all three bots. ZeroMQ is currently the most efficient solution (latency is practically nonexistent — measured in nanoseconds). But you can also use WebSockets to stream locally (a bit slower — latency in microseconds). This method may be better because you only need to change one URL from "wss://stream.pumpapi.io" to "ws://127.0.0.1:9999":

Here's an example of the data stream sender (just run it and do not close it):

ZeroMQ method. Super fast. Requires a few changes on the bot side
import asyncio
import websockets
import zmq # pip install pyzmq
import sys

ctx = zmq.Context()

if sys.platform == "win32":
sock = ctx.socket(zmq.PUB)
sock.bind("tcp://127.0.0.1:8939")
else:
sock = ctx.socket(zmq.PUB)
sock.bind("ipc://8939") # On Linux, IPC is slightly faster than TCP

async def connect_pumpapi_stream():
while True:
try:
async with websockets.connect("wss://stream.pumpapi.io") as ws:
while True:
msg = await ws.recv()
sock.send(msg)
except Exception as e:
print(e)
await asyncio.sleep(1)

asyncio.run(connect_pumpapi_stream())
Here's an example of your bot that receives transactions (the getter):

Synchronous version:

import zmq # there's also asynchonios package zmq.asyncio
import sys
import orjson # or json

ctx = zmq.Context()
if sys.platform == "win32":
sock = ctx.socket(zmq.SUB)
sock.connect("tcp://127.0.0.1:8939")
else:
sock = ctx.socket(zmq.SUB)
sock.connect("ipc://8939") # On Linux, IPC is slightly faster than TCP

sock.setsockopt_string(zmq.SUBSCRIBE, "")

while True:
msg = sock.recv()
msg = orjson.loads(msg)
print(msg)

Asynchronous version:

import zmq.asyncio
import sys
import orjson
import asyncio

ctx = zmq.asyncio.Context()
if sys.platform == "win32":
sock = ctx.socket(zmq.SUB)
sock.connect("tcp://127.0.0.1:8939")
else:
sock = ctx.socket(zmq.SUB)
sock.connect("ipc://8939") # On Linux, IPC is slightly faster than TCP

sock.setsockopt_string(zmq.SUBSCRIBE, "")

async def runner():
while True:
msg = await sock.recv()
msg = orjson.loads(msg)
print(msg)

asyncio.run(runner())
WebSockets method. Fast. No changes required. You just need to change the link on the bot side to ws://127.0.0.1:9999.
import asyncio
import websockets

clients = set()

async def client_handler(websocket):
clients.add(websocket)
try:
await websocket.wait_closed()
finally:
clients.remove(websocket)

async def relay():
print("Relay started.")
while True:
try:
async with websockets.connect("wss://stream.pumpapi.io") as ws:
async for msg in ws:
for client in list(clients):
asyncio.create_task(client.send(msg))
except Exception as e:
print(e)
await asyncio.sleep(0.2)
print("Reconnecting...")

async def main():
server = await websockets.serve(client_handler, "localhost", 9999)
await relay()

asyncio.run(main())
Why don't you include the Bonding Curve address in the Data Stream?

We do not send the Bonding Curve in order to optimize server communication. (The less data we send, the faster you receive the message.) Additionally, you probably don’t need the Bonding Curve in most cases. However, if you do need it, we have great news: the Bonding Curve address is actually derived from the token address itself. So you can easily compute the Bonding Curve address offline in a very cheap and computationally efficient way:

from solders.pubkey import Pubkey

def get_bonding_curve_from_mint_pump_fun(mint):
mint = Pubkey.from_string(mint)
PUMP_FUN_PROGRAM = Pubkey.from_string("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P")
return str(Pubkey.find_program_address([b"bonding-curve", bytes(mint)], PUMP_FUN_PROGRAM)[0])

def get_pool_from_mint_bonk(mint):
mint = Pubkey.from_string(mint)
LAUNCHPOOL_PROGRAM = Pubkey.from_string("LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj")
wsol = Pubkey.from_string("So11111111111111111111111111111111111111112")
return str(Pubkey.find_program_address([b"pool", bytes(mint), bytes(wsol)], LAUNCHPOOL_PROGRAM)[0])

bonk_pool = get_pool_from_mint_bonk('376CSPnY36SY8Xpz33uKheGQCQeSmt7bVZdYQzspbonk') # BONK_TOKEN_ADDRESS_HERE
print(bonk_pool)
pump_fun_bonding_curve_address = get_bonding_curve_from_mint_pump_fun('WncP229sVH4WmziV2k4cgHwGxXN72bCstPNcADvpump') # PUMP_FUN_TOKEN_ADDRESS_HERE
print(pump_fun_bonding_curve_address)
Why do you send all transactions through the Data Stream? Can my computer handle that?

Some users worry that we're sending too many transactions — but in reality, it’s not as much as it might sound. We send around 90–150 transactions per second, covering all events across all pools, and each transaction is very small in size.

Even older processors can easily handle this load. In fact, most modern servers, desktops, and laptops would be capable of processing over 30,000 of these lightweight transactions per second without any special optimization. So there's no need to worry — your machine can handle it just fine.

We designed it this way to ensure faster delivery and greater flexibility. Instead of requiring you to query us for updates or specific token transfers, you receive everything in real time — instantly, and with much less complexity on your side.

Where is your server located? I want the lowest possible latency!

Our server is located in New York, close to the Solana RPC infrastructure. This helps ensure the lowest possible latency for trading and transaction processing.

If you're running infrastructure or bots, we recommend hosting them as close to New York as possible for the best performance.

Even if you're not in New York — or your server isn't — don’t worry! Thanks to efficient message delivery and lightweight transactions, performance will still be very fast and more than sufficient for most use cases.

Is it true that BONK has surpassed pump.fun in transaction volume and is rapidly gaining popularity? Should I switch to BONK?

Yes! That’s absolutely true. We are the only provider offering a Bonk + Raydium CPMM transaction Data Stream, and we can confidently say that Pump.Fun's dominance has significantly decreased. At the time of writing, BONK has more transactions than Pump.Fun (approximately 60% vs 40%). You should definitely try our Trade API + Data Stream to cover not just Pump.Fun but BONK as well!

Have a question? Ask us in our Telegram group