---
search:
  tags:
    - Market Data
    - SEND
seo:
  description: >-
    The exchange's live stats for each subscribed market, complete on subscribe
    and again whenever… Reference for the send operation on /ws in the WebSocket
    API.
sidebar:
  label: Stream Stats
  badge: SEND
title: Stream Stats
type: openapi-operation
---
The exchange's live stats for each subscribed market, complete on subscribe and again whenever they change.

### Operation

- Action and channel: `SEND /ws`
- Operation ID: `sendStatsData`
- API reference: [SEND /ws](/api-reference/websocket/market-data/send-stats-data)
- Complete specification: [AsyncAPI (YAML)](/asyncapi.yml)
- Spec location (JSON Pointer): `#/operations/sendStatsData`

#### Authorization

- Credential: `UDX-Access-Key`, `UDX-Access-Timestamp`, `UDX-Access-Signature` headers on the WebSocket upgrade request
- Details: [Connecting](/reference/connecting?api=websocket) and [Authentication](/reference/authentication?api=websocket)

Upgrade headers schema:

```yaml
$ref: "#/components/schemas/WebSocketUpgradeHeaders"
```


#### Messages

##### Stats

Deliver one market's complete current stats.

Payload schema:

```yaml
$ref: "#/components/schemas/StatsEnvelope"
```

Example: StatsExample

Stats after a trade

```json
{
  "type": "stats",
  "sid": 5,
  "seq": 3,
  "msg": {
    "stats": {
      "ticker": "UDX-EXAMPLE-MARKET",
      "open_interest": "1200",
      "last_price": "0.54",
      "day": {
        "open": "0.51",
        "high": "0.56",
        "low": "0.5",
        "volume": "840",
        "notional": "445.2"
      },
      "updated_at": "2026-01-01T00:00:00.000000Z"
    }
  }
}
```

#### Errors

- permission_denied — The caller lacks required access.
- channel_unavailable — The channel's upstream source cannot serve the operation right now. Retry with backoff; the connection stays usable.
- internal_error — An unexpected failure left connection state safe to continue.

##### Error

Reject one command or end one subscription while leaving the connection usable.

Every server-side rejection is an error frame. One that echoes a command id answers that command and leaves every subscription intact. One that names a sid and carries no id is terminal for that subscription: no further frame arrives for it, the connection and every other subscription stay usable, and you resubscribe when the cause clears. A connection-fatal condition is reported with a WebSocket close frame instead.

Payload schema:

```yaml
$ref: "#/components/schemas/ErrorEnvelope"
```

Example: PermissionDenied

permission_denied

```json
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "permission_denied",
    "detail": "the trade scope is required to create a request for quote",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}
```

Example: ChannelUnavailable

channel_unavailable

```json
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "channel_unavailable",
    "detail": "current market data is unavailable",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}
```

Example: InternalError

internal_error

```json
{
  "id": 4,
  "type": "error",
  "msg": {
    "code": "internal_error",
    "detail": "WebSocket command failed",
    "instance": "urn:request-id:8f14e45f-ceea-4abc-a743-e89a34d3f6ef"
  }
}
```

Example: SubscriptionPermissionDenied

permission_denied

```json
{
  "type": "error",
  "sid": 7,
  "msg": {
    "code": "permission_denied",
    "detail": "the market is no longer visible to this member",
    "instance": "urn:request-id:4ecbe594-50fa-4b7a-950f-5ed74bb8372d"
  }
}
```

Example: SubscriptionChannelUnavailable

channel_unavailable

```json
{
  "type": "error",
  "sid": 7,
  "msg": {
    "code": "channel_unavailable",
    "detail": "current market data is unavailable for this subscription",
    "instance": "urn:request-id:4ecbe594-50fa-4b7a-950f-5ed74bb8372d"
  }
}
```

Example: SubscriptionInternalError

internal_error

```json
{
  "type": "error",
  "sid": 7,
  "msg": {
    "code": "internal_error",
    "detail": "the subscription could not be continued",
    "instance": "urn:request-id:4ecbe594-50fa-4b7a-950f-5ed74bb8372d"
  }
}
```

#### Referenced definitions

The references in the excerpts above resolve to these definitions in the complete specification.

##### `#/components/schemas/WebSocketUpgradeHeaders`

```yaml
type: object
additionalProperties: true
description: Headers required for authentication and version negotiation.
required:
  - UDX-Access-Key
  - UDX-Access-Timestamp
  - UDX-Access-Signature
  - Sec-WebSocket-Protocol
properties:
  UDX-Access-Key:
    type: string
    minLength: 1
    maxLength: 255
    description: Opaque API key ID.
  UDX-Access-Timestamp:
    type: string
    pattern: ^[0-9]{13}$
    maxLength: 13
    description: Unix time in milliseconds, within 30 seconds of server time.
  UDX-Access-Signature:
    type: string
    minLength: 1
    maxLength: 1024
    description: Standard-base64 RSA-PSS/SHA-256 signature with a 32-byte salt. Sign timestamp + "GET" + "/ws"; the upgrade request has no body hash and no idempotency key.
  Sec-WebSocket-Protocol:
    type: string
    const: udx.json.2026-08-11
    description: Negotiated dated WebSocket API version.
```

##### `#/components/schemas/StatsEnvelope`

```yaml
type: object
additionalProperties: false
description: One market's complete current stats.
required:
  - type
  - sid
  - seq
  - msg
properties:
  type:
    type: string
    const: stats
    description: Identifies a market stats frame.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  seq:
    $ref: "#/components/schemas/SequenceNumber"
  msg:
    $ref: "#/components/schemas/StatsPayload"
```

##### `#/components/schemas/SubscriptionId`

```yaml
type: integer
format: int64
minimum: 1
maximum: 9007199254740991
description: Exchange-assigned subscription ID whose lifetime is this WebSocket connection.
```

##### `#/components/schemas/SequenceNumber`

```yaml
type: integer
format: int64
minimum: 1
maximum: 9007199254740991
description: Gap-detection sequence local to one subscription. It starts at 1 and increments once per frame on that subscription.
```

##### `#/components/schemas/StatsPayload`

```yaml
type: object
additionalProperties: false
description: One market's stats.
required:
  - stats
properties:
  stats:
    $ref: "#/components/schemas/MarketStatsUpdate"
```

##### `#/components/schemas/MarketStatsUpdate`

```yaml
type: object
additionalProperties: false
description: The exchange's live figures for a market.
required:
  - ticker
  - open_interest
  - day
  - updated_at
properties:
  ticker:
    $ref: "#/components/schemas/Ticker"
  open_interest:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,2})?$
    maxLength: 24
    description: Contracts held long, which equals contracts held short.
    example: "100"
  last_price:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Price of the most recent trade on any day. Absent until the market has traded.
    example: "0.55"
  day:
    $ref: "#/components/schemas/MarketDayStats"
  updated_at:
    type: string
    format: date-time
    maxLength: 40
    description: When the exchange last updated these figures.
    example: 2026-01-01T00:00:00.000000Z
```

##### `#/components/schemas/Ticker`

```yaml
type: string
minLength: 1
maxLength: 128
description: A human-meaningful natural key naming a single-leg or multi-leg market.
example: UDX-EXAMPLE-MARKET
```

##### `#/components/schemas/MarketDayStats`

```yaml
type: object
additionalProperties: false
description: Trading activity in the current trade day. Prices are absent until the market trades in the day.
required:
  - volume
  - notional
properties:
  open:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Price of the day's first trade.
    example: "0.55"
  high:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Highest trade price of the day.
    example: "0.55"
  low:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Lowest trade price of the day.
    example: "0.55"
  volume:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,2})?$
    maxLength: 24
    description: Contracts traded in the day.
    example: "100"
  notional:
    type: string
    pattern: ^[0-9]+(\.[0-9]{1,6})?$
    maxLength: 24
    description: Dollars traded in the day.
    example: "0.55"
```

##### `#/components/schemas/ErrorEnvelope`

```yaml
oneOf:
  - $ref: "#/components/schemas/InvalidMessageCommandErrorEnvelope"
  - $ref: "#/components/schemas/CorrelatedCommandErrorEnvelope"
  - $ref: "#/components/schemas/SubscriptionConflictCommandErrorEnvelope"
  - $ref: "#/components/schemas/SubscriptionErrorEnvelope"
description: Every error frame the exchange sends. A frame with an id answers that command; a frame with a sid and no id ends that subscription.
```

##### `#/components/schemas/InvalidMessageCommandErrorEnvelope`

```yaml
type: object
additionalProperties: false
description: Invalid-message error.
required:
  - type
  - msg
properties:
  id:
    $ref: "#/components/schemas/CommandId"
  type:
    type: string
    const: error
    description: Identifies a rejected command.
  msg:
    $ref: "#/components/schemas/InvalidMessageErrorPayload"
```

##### `#/components/schemas/CommandId`

```yaml
type: integer
format: int64
minimum: 1
maximum: 9007199254740991
description: Client-assigned command correlation identifier, unique among commands in flight on this connection.
```

##### `#/components/schemas/InvalidMessageErrorPayload`

```yaml
type: object
additionalProperties: false
description: The JSON or common command envelope is invalid.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: invalid_message
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
  field:
    type: string
    minLength: 1
    maxLength: 255
    description: JSON path to the invalid field when one can be identified.
```

##### `#/components/schemas/ErrorDetail`

```yaml
type: string
minLength: 1
maxLength: 500
description: Human-readable occurrence detail that clients must not parse.
```

##### `#/components/schemas/ErrorInstance`

```yaml
type: string
format: uri-reference
pattern: ^urn:request-id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
maxLength: 100
description: Request identifier for troubleshooting with exchange support.
```

##### `#/components/schemas/CorrelatedCommandErrorEnvelope`

```yaml
type: object
additionalProperties: false
description: Rejected command correlated by its trustworthy client identifier.
required:
  - id
  - type
  - msg
properties:
  id:
    $ref: "#/components/schemas/CommandId"
  type:
    type: string
    const: error
    description: Identifies a rejected command.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  msg:
    $ref: "#/components/schemas/CorrelatedCommandErrorPayload"
  rate_limit:
    type: object
    additionalProperties: false
    description: Present on rate_limit_exceeded and omitted for uncharged command failures, capacity failures, and unavailable admission.
    required:
      - bucket
      - capacity
      - refill_tokens_per_minute
      - remaining
      - full_after_ms
    properties:
      bucket:
        type: string
        enum:
          - read
          - write
          - cancel
        description: Shared member bucket consulted for this command.
      capacity:
        type: integer
        format: int64
        minimum: 1
        maximum: 10000000
        description: Maximum tokens held by the bucket.
      refill_tokens_per_minute:
        type: integer
        format: int64
        minimum: 1
        maximum: 10000000
        description: Tokens restored per minute.
      remaining:
        type: integer
        format: int64
        minimum: 0
        maximum: 10000000
        description: Tokens remaining after th decision.
      full_after_ms:
        type: integer
        format: int64
        minimum: 0
        maximum: 86400000
        description: Milliseconds until the bucket is full if no more work is admitted.
```

##### `#/components/schemas/CorrelatedCommandErrorPayload`

```yaml
oneOf:
  - $ref: "#/components/schemas/UnknownCommandErrorPayload"
  - $ref: "#/components/schemas/InvalidParamsErrorPayload"
  - $ref: "#/components/schemas/CommandIdInUseErrorPayload"
  - $ref: "#/components/schemas/MarketNotFoundErrorPayload"
  - $ref: "#/components/schemas/QuoteNotFoundErrorPayload"
  - $ref: "#/components/schemas/OrderNotFoundErrorPayload"
  - $ref: "#/components/schemas/PermissionDeniedErrorPayload"
  - $ref: "#/components/schemas/SubscriptionNotFoundErrorPayload"
  - $ref: "#/components/schemas/SubscriptionNotReadyErrorPayload"
  - $ref: "#/components/schemas/SnapshotInProgressErrorPayload"
  - $ref: "#/components/schemas/RateLimitExceededErrorPayload"
  - $ref: "#/components/schemas/CapacityExceededErrorPayload"
  - $ref: "#/components/schemas/AdmissionUnavailableErrorPayload"
  - $ref: "#/components/schemas/ChannelUnavailableErrorPayload"
  - $ref: "#/components/schemas/InternalErrorPayload"
description: Closed set of command errors that may optionally identify a sid.
```

##### `#/components/schemas/UnknownCommandErrorPayload`

```yaml
type: object
additionalProperties: false
description: The command is unsupported by the negotiated protocol version.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: unknown_command
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/InvalidParamsErrorPayload`

```yaml
type: object
additionalProperties: false
description: Command params fail schema or semantic validation.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: invalid_params
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
  field:
    type: string
    minLength: 1
    maxLength: 255
    description: JSON path to the invalid param when one can be identified.
```

##### `#/components/schemas/CommandIdInUseErrorPayload`

```yaml
type: object
additionalProperties: false
description: Another command with the supplied identifier is still in flight.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: command_id_in_use
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/MarketNotFoundErrorPayload`

```yaml
type: object
additionalProperties: false
description: The market is absent from the caller-visible market catalog.
required:
  - code
  - detail
  - instance
  - ticker
properties:
  code:
    type: string
    const: market_not_found
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
  ticker:
    $ref: "#/components/schemas/Ticker"
```

##### `#/components/schemas/QuoteNotFoundErrorPayload`

```yaml
type: object
additionalProperties: false
description: The addressed quote or RFQ is unknown, or is not the caller's to act on.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: quote_not_found
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/OrderNotFoundErrorPayload`

```yaml
type: object
additionalProperties: false
description: The addressed order is unknown, or is not the caller's to act on.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: order_not_found
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/PermissionDeniedErrorPayload`

```yaml
type: object
additionalProperties: false
description: The caller lacks required access.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: permission_denied
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/SubscriptionNotFoundErrorPayload`

```yaml
type: object
additionalProperties: false
description: The subscription identifier is not active on this connection.
required:
  - code
  - detail
  - instance
  - sid
properties:
  code:
    type: string
    const: subscription_not_found
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
  sid:
    $ref: "#/components/schemas/SubscriptionId"
```

##### `#/components/schemas/SubscriptionNotReadyErrorPayload`

```yaml
type: object
additionalProperties: false
description: Current state is not yet established for the requested operation.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: subscription_not_ready
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/SnapshotInProgressErrorPayload`

```yaml
type: object
additionalProperties: false
description: The subscription already has a snapshot command in flight.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: snapshot_in_progress
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/RateLimitExceededErrorPayload`

```yaml
type: object
additionalProperties: false
description: A command rate limit was exceeded.
required:
  - code
  - detail
  - instance
  - retry_after_ms
properties:
  code:
    type: string
    const: rate_limit_exceeded
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
  retry_after_ms:
    type: integer
    format: int64
    minimum: 1
    maximum: 86400000
    description: Minimum delay in milliseconds before another attempt.
```

##### `#/components/schemas/CapacityExceededErrorPayload`

```yaml
type: object
additionalProperties: false
description: A standing-resource limit prevents command admission.
required:
  - code
  - detail
  - instance
  - scope
  - resource
  - limit
properties:
  code:
    type: string
    const: capacity_exceeded
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
  scope:
    type: string
    enum:
      - connection
      - member
      - process
    description: Boundary at which the standing-resource limit applies.
  resource:
    type: string
    enum:
      - in_flight_commands
      - active_subscriptions
      - market_data_streams
    description: Retained or concurrent resource that reached its limit.
  limit:
    type: integer
    format: int64
    minimum: 1
    maximum: 10000000
    description: Enforced maximum for the identified scope and resource.
```

##### `#/components/schemas/AdmissionUnavailableErrorPayload`

```yaml
type: object
additionalProperties: false
description: Shared admission policy or state is temporarily unavailable.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: admission_unavailable
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/ChannelUnavailableErrorPayload`

```yaml
type: object
additionalProperties: false
description: The channel's upstream source cannot serve the operation right now. Retry with backoff; the connection stays usable.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: channel_unavailable
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/InternalErrorPayload`

```yaml
type: object
additionalProperties: false
description: An unexpected failure left connection state safe to continue.
required:
  - code
  - detail
  - instance
properties:
  code:
    type: string
    const: internal_error
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
```

##### `#/components/schemas/SubscriptionConflictCommandErrorEnvelope`

```yaml
type: object
additionalProperties: false
description: Rejected subscribe command identifying the conflicting subscription.
required:
  - id
  - type
  - sid
  - msg
properties:
  id:
    $ref: "#/components/schemas/CommandId"
  type:
    type: string
    const: error
    description: Identifies a rejected command.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  msg:
    $ref: "#/components/schemas/SubscriptionConflictErrorPayload"
```

##### `#/components/schemas/SubscriptionConflictErrorPayload`

```yaml
type: object
additionalProperties: false
description: The ticker already belongs to the identified subscription.
required:
  - code
  - detail
  - instance
  - ticker
properties:
  code:
    type: string
    const: subscription_conflict
    description: Stable machine-readable error code.
  detail:
    $ref: "#/components/schemas/ErrorDetail"
  instance:
    $ref: "#/components/schemas/ErrorInstance"
  ticker:
    $ref: "#/components/schemas/Ticker"
```

##### `#/components/schemas/SubscriptionErrorEnvelope`

```yaml
type: object
additionalProperties: false
description: Terminal failure for one subscription.
required:
  - type
  - sid
  - msg
properties:
  type:
    type: string
    const: error
    description: Identifies an error frame.
  sid:
    $ref: "#/components/schemas/SubscriptionId"
  msg:
    oneOf:
      - $ref: "#/components/schemas/PermissionDeniedErrorPayload"
      - $ref: "#/components/schemas/ChannelUnavailableErrorPayload"
      - $ref: "#/components/schemas/InternalErrorPayload"
    description: Closed set of terminal subscription failures.
```
