Skip to main content

User Data Stream

Manage listen keys for WebSocket user data streams. These endpoints require an API key but not a signature.

Binance API Reference: User Data Streams

Create Listen Key

Start a new user data stream. Returns a listenKey that can be used to subscribe to WebSocket user data events.

val key: F[ListenKey] = client.createListenKey
// ListenKey(listenKey: String)
EndpointPOST /api/v3/userDataStream
AuthAPI Key (no signature)
Weight2

Keep-Alive Listen Key

Extend the validity of an existing listen key. Listen keys expire after 60 minutes without a keep-alive.

val _: F[Json] = client.keepAliveListenKey(key.listenKey)
EndpointPUT /api/v3/userDataStream
AuthAPI Key (no signature)
Weight2
tip

For long-running applications, send a keep-alive every 30 minutes:

import scala.concurrent.duration.*

fs2.Stream
.fixedRate[IO](30.minutes)
.evalMap(_ => client.keepAliveListenKey(key.listenKey))
.compile.drain

Close Listen Key

Close a user data stream.

val _: F[Json] = client.closeListenKey(key.listenKey)
EndpointDELETE /api/v3/userDataStream
AuthAPI Key (no signature)
Weight2

Complete User Data Stream Example

Combining listen key management with WebSocket subscription:

import io.github.rafafrdz.binance4s.ws.client.BinanceWsClient
import io.github.rafafrdz.binance4s.api.ws.UserDataStream

val resources = for
rest <- BinanceClient.resource[IO](config)
ws <- BinanceWsClient.resource[IO](config)
yield (rest, ws)

resources.use { (rest, ws) =>
for
key <- rest.createListenKey
_ <- IO.println(s"Listen key: ${key.listenKey}")
_ <- ws.subscribe(UserDataStream(key.listenKey))
.evalMap(event => IO.println(s"User event: $event"))
.compile.drain
yield ()
}