Real-time pump.fun Data Streams
Get a reliable, low-latency WebSocket stream of every new token creation and trade on pump.fun. Simple, fast and cheap.
Lightning Fast
Get real-time data with verifiable sub-second latency. Our WebSocket stream delivers the raw speed of a dedicated gRPC connection, giving you a critical edge over anyone relying on standard RPCs.
Dead Simple
Skip the expensive and complicated setup of gRPC. Just connect with a standard WebSocket and instantly receive clean, parsed JSON. We do the heavy lifting so you don't have to.
Flexible & Affordable
Ditch expensive monthly subscriptions. Get 30 days of continuous access for just 0.5 SOL—a fraction of the cost of a comparable gRPC feed. Need less? Pay by the hour from 0.001 SOL. Perfect for projects of any scale.
The Complete Firehose
Receive every single transaction from pump.fun - every token creation and every trade, without exception. No need to subscribe to individual mints. Just connect once for total market visibility and complete data freedom.
Live pump.fun Data Stream
This is a throttled example of the live JSON payload you'll receive.
wss://
API Documentation
Integrate with our powerful and simple API.
Introduction
The core of PumpStream is a real-time WebSocket feed. To access it, your Solana public key needs to be funded with 'stream time'. The easiest way to get started is to simply send SOL from your wallet (e.g., Phantom, Solflare) to our deposit address:
EzLsr3kzkUwMAj2M2QphdzpbfZwCGreA1F759CBGubbq
Balance updates run every minute, so please wait a moment after your transaction confirms before connecting to the stream or poll the balance endpoint. If you update your balance using the provided endpoints, it will update straight away.
How Balance Works
Your 'balance' is measured in hours of available stream time. When you deposit SOL, you purchase a block of time e.g., 0.5 SOL grants 720 hours (30 days). This timer starts from the moment of deposit and counts down continuously, regardless of whether you are actively connected to the stream.
For developers who need to programmatically fund accounts, we also provide several utility endpoints. However, using these is entirely optional.
Authentication
API requests are authenticated using a simple message signing mechanism. For endpoints that require it, you must sign a message containing your public key with your corresponding private key. This signature proves ownership of the public key that has been funded.
The signature must be base58 encoded and passed as the signed_message
query parameter.
Rate Limits
To ensure service stability, we enforce the following rate limits:
- Global Limit: 1 request per second, per public key for all HTTP endpoints.
- WebSocket Connections: 1 concurrent connection per public key. If you require more connections, please deposit SOL from a different public key and use that for the additional stream.
Exceeding these limits will result in a 429 Too Many Requests
error or a WebSocket policy violation disconnect.
Base URL
All API endpoints are relative to the following base URLs:
HTTP API
https://pumpstream.io
WebSocket API
wss://pumpstream.io
WSS Connect to Stream
This is the primary endpoint for receiving real-time data. Connects to the WebSocket stream after authenticating.
Authenticating requires signing your public key, which can be complex. We strongly recommend referring to the complete, ready-to-use code in the Code Examples section, which handles the entire signing and connection process for you.
Endpoint
/api/v1/stream
Query Parameters
pubkey
(string, required): Your funded, base58 encoded public key.- Example:
"7gFPcF_YOUR_PUBKEY_HERE_dG3a"
- Example:
signed_message
(string, required): Your pubkey signed by your private key, base58 encoded.- Example:
"4K3V_YOUR_SIGNED_MESSAGE_HERE_7m"
- Example:
Connection Errors
The connection will be closed with a policy violation code if:
- The pubkey already has an active connection.
- The signature is invalid.
- The pubkey has an insufficient balance or has expired.
GET Get Balance
Retrieves the current stream time balance for a given public key.
Endpoint
/api/v1/balance
Query Parameters
pubkey
(string, required): Your base58 encoded public key.- Example:
"7gFPcF_YOUR_PUBKEY_HERE_dG3a"
- Example:
signed_message
(string, required): Your pubkey signed by your private key, base58 encoded.- Example:
"4K3V_YOUR_SIGNED_MESSAGE_HERE_7m"
- Example:
Example Response (200 OK)
{
"success": true,
"data": {
"balance": 0.49,
"expires_in_hours": 718
}
}
Error Responses
401 Unauthorized
: Invalid signature.404 Not Found
: Public key has no balance.
GET Generate Deposit Transaction
Creates an unsigned Solana transaction to fund your account with stream time.
Endpoint
/api/v1/deposit/generate-transaction
Query Parameters
pubkey
(string, required): Your base58 encoded public key.- Example:
"7gFPcF_YOUR_PUBKEY_HERE_dG3a"
- Example:
amount
(float, required): The amount of SOL to deposit.- Example:
0.5
- Example:
Example Response (200 OK)
{
"success": true,
"data": {
"unsigned_message": "AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..."
}
}
GET Submit Deposit Transaction
Submits a signed transaction to the network to credit your account.
Endpoint
/api/v1/deposit/submit-transaction
Query Parameters
pubkey
(string, required): Your base58 encoded public key.- Example:
"7gFPcF_YOUR_PUBKEY_HERE_dG3a"
- Example:
signed_transaction
(string, required): The base58 encoded transaction, signed by your keypair.- Example:
"2pSy_YOUR_SIGNED_TRANSACTION_HERE_k9"
- Example:
Example Response (200 OK)
{
"success": true,
"data": {
"signature": "5s11...",
"balance": 0.5,
"expires_in_hours": 720
}
}
Code Examples
This example shows how to connect to the stream if you have already funded your account.
# pip install requests websockets solders base58 asyncio
import json
from websockets import connect
import asyncio
from base58 import b58encode
from solders.keypair import Keypair
WS_API = "wss://pumpstream.io/api/v1"
PUBKEY = "YOUR_PUBKEY_HERE"
def load_keypair_from_file(pubkey_str: str) -> Keypair:
"""Loads a wallet's keypair from its JSON file."""
with open(f"wallets/{pubkey_str}.json", "r") as f:
keypair_data = json.load(f)
return Keypair.from_bytes(bytes(keypair_data))
def get_auth_signature(keypair: Keypair, message: str) -> str:
"""Signs a string message and returns the base58 encoded signature."""
signature_bytes = keypair.sign_message(message.encode('utf-8')).__bytes__()
return b58encode(signature_bytes).decode('utf-8')
# 1. Load wallet and create the signature needed for API authentication
print("🔐 Loading keypair and creating authentication signature...")
wallet_keypair = load_keypair_from_file(PUBKEY)
auth_signature = get_auth_signature(wallet_keypair, PUBKEY)
# 2. Connect to the WebSocket stream for real-time data
async def receive_stream():
"""Connects to the WebSocket and prints incoming data."""
ws_auth_url = f"{WS_API}/stream?pubkey={PUBKEY}&signed_message={auth_signature}"
print(f"\n📡 Connecting to WebSocket stream...")
async with connect(ws_auth_url) as websocket:
print("✅ Connected! Waiting for new token data...")
while True:
message = await asyncio.wait_for(websocket.recv(), timeout=20.0)
data = json.loads(message)
for tx in data:
print(tx)
if __name__ == "__main__":
asyncio.run(receive_stream())
Changelog
-
2025-09-04: Pumpstream released in open beta