Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

SPOT : UserDataStreamEventsResponse does not deserialize correctly, instance is always None

Open
#477 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
45/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Stale
Tech stack
python
Domain
api

Research direction

Start with UserDataStreamEventsResponse.model_validate and the related concrete event models, then compare the discriminated-union behavior with the SymbolFilters issue in #476 and the related issue #405. Done means an event such as balanceUpdate produces a typed event instance and preserves its fields instead of leaving actual_instance as None.

Written by the indexing model from the issue text.

Description

Answered
Description

The UserDataStreamEventsResponse model fails to parse user data stream events into their concrete event types (BalanceUpdate, ExecutionReport, OutboundAccountPosition, EventStreamTerminated, etc.). All input results in None and the event data is completely lost.

Expected Behavior

When validating a user data stream event, the model should:

  1. Parse the event dictionary into the appropriate concrete event type based on the "e" field
  2. Return a strongly-typed instance (e.g., BalanceUpdate, ExecutionReport)
  3. Preserve all event data fields

Example:

from binance_sdk_spot.websocket_api.models import UserDataStreamEventsResponse

event = {
    "e": "balanceUpdate",
    "E": 1573200697110,
    "a": "BTC",
    "d": "100.00000000",
    "T": 1573200697068
}

result = UserDataStreamEventsResponse.model_validate(event)
# Expected: result is a BalanceUpdate instance with all fields accessible
# Expected: result.a == "BTC"
# Expected: result.d == "100.00000000"
# Expected: result.E == 1573200697110
# Expected: result.e == "balanceUpdate"
# Expected: result.T == 1573200697068
Actual Behavior

The parsing always fails and returns None, losing all event data:

result = UserDataStreamEventsResponse.model_validate(event)
# Actual: result.actual_instance is None
# Actual: All event data is lost
# Actual: Cannot access event fields
Possible Root Cause

The model uses Pydantic's discriminated union pattern but fails to properly discriminate between event types. Issues include:

  1. Schema Validation Failure: The discriminator field or schema mapping is not correctly configured
  2. Type Resolution Failure: The model cannot resolve which concrete event type to instantiate
  3. Silent Failure: Instead of raising validation errors, it silently returns None

This is similar to the SymbolFilters discriminated union issue that was previously identified, where filter type discrimination failed.

Impact
  • Complete Data Loss: All user data stream events are lost when using this model
  • No Balance Updates: Balance changes from outboundAccountPosition events cannot be processed
  • No Order Updates: Order status changes from executionReport events cannot be tracked
  • No Stream Monitoring: Stream termination events cannot be detected
Related Issues
  • Similar to #476 discriminated union parsing issue
References

Affected Version: >=2.1.0
Related or same as #405

Dominant language
Python
Stars
2.9k
Forks
699
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from binance/binance-connector-python

All issues in binance/binance-connector-python

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.